Ruby -> CS

Ha már Ruby-t nem tudom a webre húzni kliens oldalon (Opal sajnos nagyon lassú és nem jó design), akkor sincs gond. Coffeescript-tel közel állok hozzá produktivitásban.

Viszont hiányzik több tömb metódus ami Ruby-ban alap. Elkezdtem megírogatni CS-hez, egyelőre ennyi kell (optimalizálva az alábbi hozzászólások alapján):

http://paste.ubuntu.com/25886797/

Hozzászólások

Nem ertek a CS-hez, de az Array::uniq nem tunik tul optimalisnak. Tomornek tomor, de latszolag eleg sokszor iteral vegig a tombon.
Az Array::sample ugyszinten. Nem lenne egyszerubb generalni egy random szamot a tomb meretetol fuggoen, es azt az indexu elemet visszaadni a this.shuffle().last() helyett?

Szerk: ok, kozben feltunt, hogy a sample() n darab erteket ad vissza :)

A "uniq" sajnos O(n^2) léptékű, erre nem tudok jobb módszert jelenleg :) Bár ugye ez a gyakorlatban normál eloszlást alapul véve kb. ennek fele lesz mert ugye az "indexOf" csak az első találatig vizsgál. Sajnos kell a két darab "reverse" is hogy ne módosítsa a sorrendet.

Viszont Stackoverflow-n méregették az algo-kat és a filter metódusos jól hozott emlékeim szerint. ECMA6-hoz van még jó megoldás, de nyilván tartani szeretnék egy megfelelő szintű visszafelé kompatibilitást.

A "sample" metódussal is Ruby szerű viselkedést szeretnék.

Most ragugliztam, itt egy olyan megoldas van a .uniq()-ra ami O(n) kozeli (off: a C# .Distinct() metodus is ezt a modszert hasznalja):
https://coffeescript-cookbook.github.io/chapters/arrays/removing-duplic…

Csak ugatom a javascriptet, a coffee scriptet meg csak tavolrol lattam, rubyt meg tavolrol sem, ugyhogy nem tudom a fenti megoldas jo-e neked visszafele meg ruby kompatibilitas szempontjabol.

Én egyébként a shuffle-t implementálnám a sample speciális eseteként, és nem a sample-t építeném rá a shuffle-re. Így meg lehet spórolni egy Array létrehozást, miközben az algoritmust egyetlen helyen kell csak módosítani.

Uniq-ot es6-ban így implementáltam amikor kellett (és nem akartam csak ezért behúzni semmilyen libraryt):


function uniq(array) {
	const elements = new Set();
	return array.filter((element) => {
		const duplicate = elements.has(element);
		duplicate || elements.add(element);
		return !duplicate;
	});
}

Ugyanezt egy sima objecttel is meg lehet csinálni és akkor nem es6 függő a dolog, de nem fog működni object elemekre.

Igazad van a "sample"-lel, nem rossz. Felesleges minden egyes "sample" híváshoz az egész tömböt felrázni. Átírtam, lásd:

http://paste.ubuntu.com/25876173/

Szerk.: közben tettem még bele határérték ellenőrzést, ez az egyetlen a metódusok közül ahol borulhat az input alapján:

http://paste.ubuntu.com/25876257/

Megj: a kevésbé hatékony kódokra mutató linkeket eltávolítottam.