Oblicz n
modulo 12
dla 32-bitowej liczby całkowitej bez znaku.
Zasady:
- Musi działać dla wszystkich
n
od 0 do 23. Inne liczby są opcjonalne. - Należy używać tylko każdy z operatorów
+-*
,~&^|
lub<<
,>>
jak powszechnie określa się na 32 bitowych uints. - Może używać dowolnej liczby stałych odcieni.
- Nie może używać żadnej formy wskaźników, w tym tablic, ani żadnych
if
instrukcji, w tym elementów, które kompilują się, jeśli instrukcje takie jak operatory trójskładnikowe lub operatory „większe niż”.
Punktacja:
- Operatory
+ -
i operatory bitowe~ & ^ | << >>
(NOT, AND, XOR, OR, przesunięcia bitów) dają wynik1
,*
daje wynik2
. - Najniższy łączny wynik wygrywa.
math
number-theory
atomic-code-golf
nbubis
źródło
źródło
+-*
dodawanie, odejmowanie, mnożenie;~&^|
są bitowe NOT, AND, XOR, OR; i<< >>
są przesunięciami bitowymi.for i in x:y:z, .dostuff
?n % 12
do mnożenia i zmiany jak w zachwycie hakera, więc jest to trywialne, po prostuOdpowiedzi:
4
(Język nie ma znaczenia)
Zabiegać! Mam 4.
11-n
upewni się, że wszystkie bity wysokiego rzędu są ustawione wtedy i tylko wtedy, gdy n> = 12.48&(11-n)
== jeśli n> 11 to 48 jeszcze 0(48&(11-n))>>2
== jeśli n> 11 to 12 w przeciwnym razie 0n-((48&(11-n))>>2)
jest odpowiedziąźródło
n - (((11 - n) & 0xC0000000) >> 28)
. Dobra robota, nie sądzę, że da się to zrobić w mniej niż cztery.4
Rozwiązanie z tabelą odnośników (wyszukuje
i ^ (i % 12)
):4
Oto inne rozwiązanie z 4 operacjami:
Zakłada się, że operand zliczania przesunięć bitowych jest domyślnie brany mod 32, tj.
x >> -1
Jest taki sam jakx >> 31
.5
Inne podejście przy użyciu tabeli odnośników:
źródło
bash - 1
na przykład
źródło
stdin
istdout
strumieni? Oczywiście wewnętrznie są to wskaźniki, ale równie dobrze możemy zdyskwalifikować Javę, ponieważ używa onaInteger
klasy wewnętrznie do wielu rzeczy.C, little-endian - 2
To chyba oszustwo, ale myślę, że spełnia zasady ...
źródło
= 0
zamiast& 0x0
, co powinno się liczyć jako dodatkowe 2 operacje. Ale +1 za kreatywność :)PHP - wynik 0
Zastanawiam się, jak to możliwe, że nikt nie przyszedł z tym przede mną !!!
źródło
C, wynik 5
Działa do 23, nie jest gwarantowana powyżej tego.
((n+4)>>2)&4
zwraca 4 dla n> = 12. Dodaj go do n, a otrzymasz poprawną odpowiedź w najmniej znaczących 4 bitach, a następnie skróć pozostałe bity.źródło
niezależnie od języka: 5
nie wygrywa, ale bierze udział, bo jest fajnie, a może dlatego, że łatwiej zrozumieć niż inni:
jest to równoważne z
jest to równoważne, ponieważ po dodaniu 20 do 12 otrzymujesz 32, a zatem 5-ty bit staje się 1. To tylko wtedy, gdy n> 1, ponieważ 32 jest najmniejszą liczbą, w której 5-ty bit staje się 1.
zwróć też uwagę, że można go łatwo rozszerzyć dla większego zasięgu, jak możesz
osiągnąć zasięg do 35
źródło
Python 2.x - 4
Czy
=
operator?W takim przypadku wynik wynosi 6.
Rozwiązanie BTW @steveverrill może być również użyte bezpośrednio w Pythonie.
Działa w zakresie 0 .. 23
Więc co się dzieje ? Pomnóż przez 357913942 i podziel przez 2 ^ 32 (lub prawy Shift 32)
źródło
C - 6
źródło
Kobra - 2 (lub 3)
To może być gięcia zasadami trochę, ale poprosiłem i pozwolono używać.
Działa również dla dowolnej liczby.
źródło
Kona - 5
Może być nieprawidłowy, ponieważ nie jestem pewien, czy operator podłogi jest dozwolony, ale mam dwa
*
i minus:Który powinien działać dla dowolnej liczby całkowitej.
źródło