Jak rozwiązać całkowite zadanie „zwrotu true to win” w 21 znakach

13

Istnieje strona o nazwie „Return True to Win” z interesującymi zadaniami dla programistów Javascript. Celem jest znalezienie argumentów dla danej funkcji, które zmuszają ją do zwrócenia wartości true.

Oto jedno z zadań:

function total(x) {
  return (x < x) && (x == x) && (x > x);
}

Użytkownicy muszą znaleźć fragmenty, których wartość xpowoduje, że funkcja zwraca true. Aby przetestować urywki, wywołujesz funkcję z urywkiem jako parametrem (tj total(<snippet>).).

Znalazłem rozwiązanie 22-znakowe:

{valueOf:_=>n++%3},n=0

Niektóre osoby znalazły rozwiązanie w 21 znakach. Nie mogę znaleźć tego rozwiązania. Jakie jest rozwiązanie w 21 znakach?

Oleg
źródło
3
Powinieneś połączyć konkurs / stronę, z której pochodzi zadanie.
Emigna
2
{valueOf:Math.random}działa od czasu do czasu ... ale podejrzewam, że naruszałoby to jakąś zasadę ... (a może nie?)
Arnauld
1
Te są zdecydowanie trudne; z pierwszych 24 mogę odpowiedzieć tylko 14 ...
Neil
4
Słona uwaga dewelopera ... funkcja zwracająca wartość logiczną o nazwie „total” jest jak paznokcie na tablicy!
scunliffe

Odpowiedzi:

7

21 znaków

{valueOf:n=_=>n=2<<n}

Mój oryginalny żart, który został odrzucony i zaproponował usunięcie:

11 znaków :)

total=_=>!0

Test:

function total(x) {
  return (x < x) && (x == x) && (x > x);
}
var arg = total=_=>!0
console.log(total(arg))
ngn
źródło
3
Dobra robota, myślenie nieszablonowe, ale wyzwaniem jest dokończenie function total(x) { ... } total(<insert here>)i uzyskanie wyniku total()rozmowy true, więc nie sądzę, aby to zadziałało ...
ETHproductions
@ETHproductions <insert here>-> 0),(true:)
ngn
Próbowałem tego, a także 0)||(true. Żadna z nich jednak nie działa, a teraz jestem całkowicie zdezorientowany, ponieważ istnieje inny poziom, w którym musisz zrobić 0);(!0lub coś podobnego ...
ETHprodukcje
Twoje nowsze rozwiązanie jest niesamowite, +1 ode mnie!
ETHprodukcje
4

Oszukana odpowiedź

Wspomniałem już o tym w komentarzach, ale nie został przetestowany. To jest teraz. Musisz go przesyłać, dopóki nie zadziała.

{valueOf:Math.random}

Próbny

function total(x) {
  return (x < x) && (x == x) && (x > x);
}

for(i = 1; !total({valueOf:Math.random}); i++);

console.log('Returned true after ' + i + ' iteration(s)')

Arnauld
źródło
Czy możesz wyjaśnić więcej o tym, jak to działa? Po prostu nie rozumiem, jak to się x == xstało, jeśli x jest wybierane losowo za każdym razem.
tsh
1
@tsh Sztuczka polega na tym, że valueOfnie jest wywoływana podczas przetwarzania testu równości. Z drugiej strony operatory porównania oczekują prymitywnych wartości, które zmuszają valueOfdo wywołania. Oto test, który to pokazuje.
Arnauld,
Mam wysoki wynik <s> 15 </s> 16 iteracji !!!
Magic Octopus Urn
@MagicOctopusUrn Chodź, możesz zrobić więcej niż to! Włóż monetę i graj ponownie!
Arnauld