Tym razem Twoim celem jest znalezienie maksymalnie 3 liczb całkowitych (od - (2 ^ 31) do 2 ^ 31 - 1 w uzupełnieniu binarnym 2) bez użycia rozgałęzień lub pętli.
Jesteś tylko wolno używać
Nierówność / Równość (
==
,>
,>=
,<
,<=
,!=
) Ci liczone jako 2 żetonów.Arytmetyczna (
+
,-
,*
,/
)Operatory logiczne (
!
nie&&
i,||
lub)Operatory bitowe (
~
nie,&
i,|
lub,^
xor,<<
,>>
,>>>
arytmetyczne i logiczne lewy i prawy przesunięcia)Stałe 0 tokenów
Zmienne przypisanie. 0 tokenów
Wejście 3 zmienne jak a
, b
i c
. Podaj maksymalną liczbę.
Obowiązują standardowe zasady kodowania atomowego. Jeśli masz jakieś pytania, zostaw je w komentarzach. Jeden token to dowolny z powyższych ze specjalnymi zasadami.
Odpowiedzi:
Javascript 10 tokenów
Edycja za pomocą <i * zamiast fiddlingu bitowego - jak wskazano w komentarzach, operacje bitowe mogą zakończyć się niepowodzeniem dla danych wejściowych w pobliżu limitu zakresu (ponad 30 bitów)
C 8 żetonów
Niezależnie od języka, zrobi to każdy język podobny do C. Aby być wybrednym, w standardowym C nie jest przenośny, ponieważ prawe przesunięcie może nie przedłużać znaku (ale w zwykłych implementacjach to robi).
W C (i C ++, C # i Java, myślę) możemy łatwo poradzić sobie z problemami z przepełnieniem przy użyciu większych wartości tymczasowych:
źródło
int
s twój kod nie działa dla x = 2147483647, y = -2, z = 0. Twój wybór, jeśli chcesz go zmienićJavaScript
6 żetonów
źródło
&&
i||
prawdopodobnie był niedopatrzeniem, które należy podkreślić, a nie wykorzystać.&&
,<
a>
.=
Stosowany jest jako przypisanie i liczy się jako 0C: 10 żetonów
Zainspirowany odpowiedzią @ openorclose, ale przekonwertowany na C i pozbawiony rozgałęzień przy użyciu mnożenia, a nie zwarcia operatorów logicznych.
źródło
JavaScript
14 żetonów
źródło
Wiele języków (Python) (10 tokenów)
https://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
Och, ktoś już to opublikował :)
źródło
You are only allowed to have one function, the one that takes the 3 inputs and outputs.
Dokładnie to ma ta odpowiedź. 2 odbitki to tylko przypadki testowemax2(max2(x,y),z)
początkowo :)C ++ 11: 15 tokenów
Używanie tylko operatorów arytmetycznych i bitowych (ponieważ operatory logiki równości i logicznej sprawiają, że jest to zbyt łatwe) ...
źródło
J (nie konkuruje)
Zastanawiałem się tylko, jak wyglądałoby rozwiązanie w J. To używa
,
a#
, ale nie będzie konkurować.To konkurowałoby, ale jest zbyt długie, z 9 żetonami:
źródło
mamy następujące założenia:
max (a; b) = (a + b + | ab |) / 2
max (a; b; c) = max (max (a; b); c)
abs (a) = (a + (a >> 31)) ^ (a >> 31)
możemy użyć pseudo-kodu:
źródło
C # (druga próba)
Mam to ... Brak zintegrowanych funkcji ...
Ale czy można używać innych zintegrowanych typów danych, czy tylko zwykłego int? Jeśli pozwolę, zaproponowałbym:
źródło
javascript 8 tokenów
chociaż podobne do odpowiedzi @ openorclose, faktycznie używam operatorów logicznych do samego przypisania.
skrzypce
źródło
R (10 żetonów)
źródło
Brainfuck (nie konkuruje)
źródło
TIS-100, 8 operacji
Dostawca (UP) wykonuje tylko MOV, więc nie pokazano w kodzie Może nie działać, gdy jest zbyt blisko krawędzi 999
źródło
VBA (6 żetonów)
nie jestem pewien, czy to nie rozgałęzia się.
źródło
IIf
, Inline-If. W większości języków jest to na przykłada>=b ? a : b
. To naprawdę rozgałęzia się.JavaScript: 4 tokeny (** oparte na szerokiej interpretacji „przypisania”!)
Oczywiście mój wynik 4 jest wyjątkowo hojny / łagodny!
Aby dojść do tego wyniku, założyłem, że „przypisanie” (warte 0 żetonów w pytaniu) obejmuje takie rzeczy, jak przypisanie addytywne, przypisanie odejmujące, przypisanie multiplikatywne i XOR-ing (
^=
)Jeśli te zadania faktycznie się liczą, wynik wynosi 14 :)
źródło
d -= b
rzeczywistości jest to to samod = d - b
, powiedziałbym, że używasz arytmetyki i że powinieneś liczyć to jako token.