Nagyon szigorúan egyenlő… (JavaScript feladvány)
…avagy vannak egyenlők, és vannak egyenlőbbek.
Az ECMAScript 5 szabványt olvasgatva találtam rá, hogy a JavaScriptben két változó lehet:
- különböző (
a != b
, ez a does-not-euals operator) - egyenlő (
a == b
, ez az equals operator) - szigorúan egyenlő (
a === b
, ez a strict equals operator) - nagyon szigorúan egyenlő (
a ==== b
, nincs ilyen operátor)
Ez utóbbi legyen olyan, hogy ha a !== b
, akkor a !=== b
is, és ha a ==== b
, akkor a === b
is, és reméljük, hogy tudunk szigorítani az egyenlőségen.
A feladat a következő: kéretik kitalálni olyan „f” egy változós, visszatérési értékében csak a bemenettől függő függvényt, azaz
a ==== b; // esetén (ha lenne ilyen operátor)
f(a) == f(b);
Valamint olyan a és b változókat melyre
a === b; // de
f(a) != f(b);
Azaz a és b szigorúan egyenlő, azonban megkülönböztethető értékű változók.
(A megfejtést jövő hétfőig várom hozzászólásban.)
■
a === b, f(a) != f(b)
Nem jó a függvény
a ==== b
eseténf(a) == f(b)
(ezt nem teljesíti a tiéd), és kell mutatni olyan esetet, amikora === b
, dea !=== b
, ígyf(a) != f(b)
.ez milyen?
Igazából a Math.random()-ot
Math.random()
-ot felesleges is függvénybe burkolni.Nem jó a függvény.
miert is nem?
Ennyit mondtál el: (a====b :
(A ":" azt jelenti, hogy következik valami valamiből, a "+" pedig az és-nek felel meg.)
Szavakkal: ha "a" szigorúan egyenlő "b"-vel, akkor abból következik, hogy "a" típusa és értéke egyenlő lesz "b" típusával és értékével, és "f(a)" értéke egyenlő lesz "f(b)" értékével, de abból, hogy "f(a)" értéke egyenlő "f(b)" értékével nem következik, hogy "a" típusa és értéke egyenlő "b" típusával és értékével.
Úgy általánosságban bármi olyan megfelel, ami kiválaszt egy típust vagy értéket, és arra mindig olyan eredményt ad, ami az equals-nak megfelel, a többire meg olyan értéket, ami a not equals-nak felel meg. Még csak azt sem szabtad meg, hogy f(a)==f(a) legyen.
pl ez is tökéletesen megfelel:
Hajtasz a tárhelyre? :D
sorry
a ==== a
, ami miattf(a) == f(a)
.http://weblabor.hu/blog/20100805/nagyon-szigoruan-egyenlo#comment-70042
Reméltem, hogy azért mindenki
Ez a feladat leírásából nem következett. Csak azt kaptad, amit kértél, nem többet vagy kevesebbet.
Továbbra sem hiszem, hogy ennek az egésznek bármi értelme lenne, majd elolvasom a megoldást, abból talán kiderül, hogy mit akartál.
szerintem meg igy is sikerult
Tyrael
Hát bocs, ha
Nem értem, hogy mi a cél, de majd úgyis kiderül. :-)
Ugye:
a===b -> a==b && a és b típusa egyenlő
a====b -> a===b && f(a)==f(b)
Az uccsónak max úgy lenne értelme, ha azt vizsgálnánk, hogy a két pointer ugyanarra a memória címre mutat e, vagy sem. Az objecteknél így hasonlít össze a szigorúan egyenlő (1-2 bugtól eltekintve), a sima változóknál viszont érték és típus szerint, és tudtommal nem lehet lekérni, hogy hova mutat a pointer, szóval azt sem, hogy nagyon szigorúan egyenlő e két változó.
A sima változókhoz tartozó objektumokkal sem lehet mit kezdeni, mert minden lekérésnél új példány jön létre:
Egyébként ha szimplán a logikát nézzük, akkor meg hiányzik az, hogy "f(a)==f(a)" minden "a" esetén a feltételek listájából, különben az én megoldásom jó lenne. (Mondjuk http://weblabor.hu/blog/20100805/nagyon-szigoruan-egyenlo#comment-70042 -ben már javította ezt a hiányosságot.)
en ugy ertelmeztem a
a randomos megoldas megserti azt a feltetelt, hogy csak a bemenettol fugg a kimenet.
a new type-os mar szintaktikailag megoldas, de szerintem a kerdezo valami sokkal trukkosebb megoldast talalt, mint az, hogy 2 object csak akkor szigoruan egyenlo ha ugyanarra a peldanyra mutatnak.
Tyrael
ez a feltetel szerintem az
a new type-os peldaval kapcsolatban meg nem tudok olyan peldat mondani, ahol a ==== b, es f(a) == f(b), es nem csak azert nem, mert nem tudom pontosan mit nezne az ==== :)
egyebkent az eredeti felvetessel kapcsolatban, a ====-nak nem latom ertelmet
NaN
NaN
-nal visszatérő függvény megteszi.Re: NaN
Nem jó a függvény
A feladat az volt, hogy a
a ==== b
eseténf(a) == f(b)
a === b
, dea !=== b
, ígyf(a) != f(b)
igen, enis igy gondoltam, de
Igaz.
sorry
http://weblabor.hu/blog/20100805/nagyon-szigoruan-egyenlo#comment-70042
Kihagytam valamit…
A
====
operátor egy még szigorúbb értelemben vett egyenlőséget akar jelenteni, így a feltételekhez illett volna hozzávenni, hogy azonosság esetén, vagyis például aza = b
művelet utána ==== b
lesz természetesen.Re: implicit :)
A NaN példa nekem tetszett, ezért azt folytatva:
igazad van
Másképpen megfogalmazva a feladatot
Megpróbálom megfogalmazni másképpen.
Nyilvánvaló, hogy ha „a” és „b” változók (gyengén) egyenlőek, abból nem következik, hogy szigorúan egyenlőek. (Azaz
a == b =X=> a === b
)Azt állítom, hogy ha „a” és „b” változók szigorúan egyenlőek, abból nem következik, hogy azonosak (nagyon szigorúan egyenlőek, pontosan megegyeznek, stb.). (Azaz
a === b =X=> a ==== b
)Mivel a Javascriptben nincsen azonosságot vizsgáló operátor (
====
), ezért az állítás bizonyítása egy módon lehetséges: ha találunk olyan „a” és „b” változót, hogya === b
ellenére meg tudjuk különböztetni őket. Hogyan lehet megkülönböztetni? Kell egy olyan egy változós, csak a bemenetétől függő függvényt* mutatnunk, amely „a”-ra és „b”-re különböző eredményt ad.* „csak a bemenetétől függ”: ez alatt azt értem, hogy ha
var x = f(a);
, akkorx == f(a);
minden esetben. (Kérlek, akard megérteni! Hadd ne kelljen belemenni, hogy csak az „x” definíciója után, a scope-on belül, abban az esetben, ha sem „x”, sem „f”, sem „a” értéke nem változik, stb.)Tehát: keresünk olyan „a”, és vele nem azonos, de szigorúan egyenlő „b” változót és olyan a fenti kritériumokat teljesítő „megkülönböztető” „f” függvényt, melyre
A lényeg: az egyik kezemben van „a”, a másikban „b”, és
a === b
. Te mégis pontosan meg tudod mondani, melyik kezemben melyik van. Hogyan lehetséges ez? Mi ez az „a” és „b”, és milyen módszerrel tudod őket megkülönböztetni?Azonosságot létrehozó operátor?
Valami ilyesmire gondolsz?
Ebben az esetben az azonosságot vizsgáló operátor valamilyen "közvetlen származtatást" vizsgáló operátor lehetne. (Valahogy sérülne valamilyen következetességi szabály, hiszen erre az operátorra nem lenne érvényes a következtetés, hogy ha a====b és b====c akkor a====c)
Így, ahogy írod
Jelen példában
a ==== b ==== c ==== d
, mert az „5” mindenhol ugyanaz az „5”, és a „4+1” eredményeként létrejövő „c” értékét sem tudod semmilyen módon megkülönböztetni például „b” értékétől.Ha két érték minden körülmények között pontosan ugyanúgy viselkedik (azaz nem tudod megkülönböztetni őket), akkor azonosak. Olyan „a” és „b” kell, hogy meg lehet különböztetni őket (tehát nem azonosak) annak ellenére, hogy
a === b
Én kezdem elveszteni a fonalat. :)
var a = 4, b = 2 + 2;
eseténa ==== b
egyenlőség fennáll, akkor azt kijelenthetjük, hogy az összes skalár értéknél aza === b
esetén következik aza ==== b
. Nem?Másik oldalról ha két "ugyanolyannak tűnő" objektum - amely másik memória címen van - esetén az
a === b
sosem áll fent, így aza ==== b
sem. (hasonlóan két ugyanolyan függvény esetén sem lesz egyenlőség)Ebben az esetben, akkor még mi marad, ha még a
NaN
-t is kizártuk?Kezded megtalálni a fonalat! :)
Az bizonyos, hogy az objektumokat kizárhatjuk a játékból, hiszen objektumok esetén
a === b
akkor lehet, ha „a” és „b” ugyanarra az objektumra hivatkozik.Maradnak a primitív típusok.
Azonosságot vizsgáló operátor
Valami ilyesmi jutott az eszembe:
De nem, valószínűleg nem erre gondolsz, már sejtem hogy mi lehet:
(Mivel nem ugyanabban az objektumban vannak, meg lehet különböztetni őket.)
Nem talált
f(x) == f(x)
, viszont az adott „a”-ra és „b”-ref(a) != f(b)
annak ellenére, hogya === b
A te esetedben a[0] és b[0] ugyanarra az „x” objektumra mutat, ezért valószínűleg nem fogsz tudni olyan (a feltételeknek megfelelő) függvényt találni, ami megkülönbözteti őket.
Pedig
megoldás
Pontosan
A +0 és a -0 között egyetlen különbség van, ha ezzel osztunk egy nem nulla véges számot:
1/+0 == +Infinity
, ellenben1/-0 == -Infinity
.Minden más esetben pontosan ugyanúgy viselkednek, és
-0 === +0
.Ha minden feltételnek meg akarunk felelni, akkor a függvényt úgy írhatnánk, hogy
f(x) == f(x)
kitétel.De ez csak apróság, jó a megoldásod, gratulálok még egyszer!
nos igen
Hátha nyerek egy IEEE 754 feliratú pólót vagy bögrét :).
Grat. :-)
var x=-0; switch(x) { case
Pedig
fenebe, pedig en is neztem a
Tyrael