Oblicz n% 12

27

Oblicz nmodulo 12dla 32-bitowej liczby całkowitej bez znaku.

Zasady:

  • Musi działać dla wszystkich nod 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 ifinstrukcji, 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ą wynik 1, *daje wynik 2.
  • Najniższy łączny wynik wygrywa.
nbubis
źródło
6
Możesz zdefiniować operatory dla użytkowników języków innych niż C / Java. Rozumiem, że +-*dodawanie, odejmowanie, mnożenie; ~&^|są bitowe NOT, AND, XOR, OR; i << >>są przesunięciami bitowymi.
Level River St
@steveverrill - dzięki. Taka jest rzeczywiście intencja.
nbubis
Czy mogę użyć for i in x:y:z, .dostuff?
Οurous
Czy mogę ustawić zmienną równą wartości używanej w wyrażeniu?
xnor
4
większość kompilatorów zoptymalizuje się n % 12do mnożenia i zmiany jak w zachwycie hakera, więc jest to trywialne, po prostu
wyjmij

Odpowiedzi:

29

4

(Język nie ma znaczenia)

n-((48&(11-n))>>2)

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 0

n-((48&(11-n))>>2) jest odpowiedzią

isaacg
źródło
1
Aww pieprzy, pokonałeś mnie do tego podejścia! Byłem tylko chwilę od opublikowania n - (((11 - n) & 0xC0000000) >> 28). Dobra robota, nie sądzę, że da się to zrobić w mniej niż cztery.
Runer112
1
@ Runner112 Tak, miałem nadzieję, że nikt mnie nie pobije, kiedy to opublikowałem. Dobra robota, jeśli
chodzi
1
Wspaniale :) 4 to rzeczywiście osiągnięcie.
nbubis
11

4

Rozwiązanie z tabelą odnośników (wyszukuje i ^ (i % 12)):

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

Oto inne rozwiązanie z 4 operacjami:

i - ((0xffff >> (i - 12)) & 12)

Zakłada się, że operand zliczania przesunięć bitowych jest domyślnie brany mod 32, tj. x >> -1Jest taki sam jak x >> 31.

5

Inne podejście przy użyciu tabeli odnośników:

i - (16773120 >> i & 1) * 12
Kopiuj
źródło
7

bash - 1

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

na przykład

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

źródło
1
To nie jest poprawne, ponieważ używa wskaźników.
curiousdannii
@curiousdannii Do jakich wskazówek się odnosisz? I stdini stdoutstrumieni? Oczywiście wewnętrznie są to wskaźniki, ale równie dobrze możemy zdyskwalifikować Javę, ponieważ używa ona Integerklasy wewnętrznie do wielu rzeczy.
Cole Johnson
Czy $ () nie jest efektywnie równoważne ze wskaźnikiem?
curiousdannii
@curiousdannii - dokumentacja awk mówi, że są to zmienne wbudowane.
5

C, little-endian - 2

To chyba oszustwo, ale myślę, że spełnia zasady ...

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;
R ..
źródło
Jak to działa?
nbubis
1
Trochę oszukiwania, ponieważ używasz = 0 zamiast & 0x0, co powinno się liczyć jako dodatkowe 2 operacje. Ale +1 za kreatywność :)
nbubis
4

PHP - wynik 0

Zastanawiam się, jak to możliwe, że nikt nie przyszedł z tym przede mną !!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);
Tomas
źródło
2
Miły. Myślę, że może być problem, ponieważ tablice są niedozwolone. Naprawdę miło.
AJMansfield
@AJMansfield Można argumentować, że nie ma tablic, ale łańcuchy (tak, na niskim poziomie łańcuchy są tablicami bajtowymi). :)
patrz
1
@seequ Można również argumentować, że jest to nieprawidłowe z powodu użycia pamięci RAM (tak, na niskim poziomie, ram jest technicznie tablicą indeksowaną) ¯_ (ツ) _ / ¯
Stan Strum
2

C, wynik 5

Działa do 23, nie jest gwarantowana powyżej tego.

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4zwraca 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.

Level River St
źródło
Dobra robota!! Zobaczmy teraz, czy ktoś może dostać się do 4 ..
nbubis
2

niezależnie od języka: 5

nie wygrywa, ale bierze udział, bo jest fajnie, a może dlatego, że łatwiej zrozumieć niż inni:

n - ((n+20)>>5)*12

jest to równoważne z

n - (n>11)*12

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

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

osiągnąć zasięg do 35

Pinna_be
źródło
1

Python 2.x - 4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

Czy =operator?

W takim przypadku wynik wynosi 6.

j-12*(j*357913942>>32)

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)

Willem
źródło
Podoba mi się, jak użyłeś funkcji do pomnożenia tylko raz. ale imho właśnie zmieniłeś nazwę mnożenia na funkcję m (,), co dla mnie oznacza, że ​​użyłeś jej dwa razy.
Pinna_be
zależy od interpretacji reguł, ale masz rację
Willem,
1

C - 6

(n - (((n * 0xAAAB) >> 19)) * 12 )
nbubis
źródło
To powinno być częścią pytania lub po prostu inną odpowiedzią. Sugeruję to drugie.
Jwosty
@Jwosty - zmieniono.
nbubis
0

Kobra - 2 (lub 3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

To może być gięcia zasadami trochę, ale poprosiłem i pozwolono używać.

Działa również dla dowolnej liczby.

Obrzydliwe
źródło
0

Kona - 5

Może być nieprawidłowy, ponieważ nie jestem pewien, czy operator podłogi jest dozwolony, ale mam dwa *i minus:

mod:{x-(_0.08333*x)*12}

Który powinien działać dla dowolnej liczby całkowitej.

Kyle Kanos
źródło
Nie jestem pewien operacji na podłodze, ale zdecydowanie jestem pewien, że pierwsze mnożenie działa na czymś innym niż 32-bitowe liczby całkowite.
Runer112,
@ Runer112: OP mówi, że dane wejściowe muszą być 32-bitowe, a operatorzy mają zdefiniowane parametry, zwykle mają 32-bitowe odcienie; nie mówi nic o wartościach niecałkowitych w kodzie.
Kyle Kanos,
O ile czegoś nie zrozumiem, 0.08333 * x nie wygląda na mnożenie, jak zdefiniowano w 32-bitowych odcieniach, ponieważ 0,08333 nie jest 32-bitowym odcieniem.
Runer112,
1
„Może używać dowolnej liczby stałych odcieni”. - tzn. nie można używać dowolnych pływaków.
nbubis
1
@nbubis: ta linia w rzeczywistości nie nakłada ograniczeń na zmiennoprzecinkowe.
Kyle Kanos