To jest CMC (mini-wyzwanie na czacie), które opublikowałem nieco wcześniej w naszym czacie, The Ninteenth Byte .
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą x
, w zależności od 2 ostatnich bitów x
, wykonaj następujące czynności:
x & 3 == 0: 0
x & 3 == 1: x + x
x & 3 == 2: x * x
x & 3 == 3: x ^ x (exponentiation)
Wejście wyjście
Single Integer -> Single Integer
Końcowy znak nowej linii jest dozwolony w danych wyjściowych. Żadne inne białe znaki nie są dozwolone.
Przypadki testowe
input output
1 2
2 4
3 27
4 0
5 10
6 36
7 823543
8 0
9 18
10 100
11 285311670611
12 0
To wyzwanie dla golfa , więc wygrywa najkrótszy kod!
0
przypadek byćx + 2
, skoro, jak inni sąx * 2
,x ^ 2
ix ^^ 2
(tetracja)? : Px ^ x
)? Wersja 32-bitowa nie jest już wystarczająca dla przypadku testowego11
, a wersja 64-bitowa nie wystarcza dla przypadku testowego19
.Odpowiedzi:
Galaretka , 8 bajtów
Wypróbuj online!
Jak to działa
Po pierwsze, zauważ, że
x&3
jest to równoważne zx%4
, gdzie%
jest modulo. Następnie, ponieważ Jelly używa modułowego indeksowania (a[n] == a[n+len(a)]
), więc nawet nie musimy sobie z tym poradzić.Następnie:
x%4==0
, zwróćx_x
(odejmij) (dla spójności);x%4==1
wróćx+x
;x%4==2
, zwróćx×x
(mnożenie);x%4==3
, zwróćx*x
(potęgowanie)Zauważ, że Jelly używa indeksowania 1, więc odejmowanie
"_"
jest przenoszone na koniec.źródło
wc --bytes
).Python , 30 bajtów
Wypróbuj online!
źródło
CJam , 12 bajtów
Wypróbuj online!
Wyjaśnienie
Wykonuje jedną z następujących operacji w zależności od
x
wartości mod 4 (mod 4 jest równoważny AND 3).źródło
Mathematica 25 bajtów
Zapisano 4 bajty dzięki @MartinEnder
źródło
Pyth, 8 bajtów
Interpretator
źródło
v
zamiast.v
..v
nie mogę uzyskać dostępuQ
... Najwyraźniej zostałem rozgolfowany w Pyth. +1 dla ciebie.v
ma zasięg lokalny,.v
po prostu analizuje wyrażenie."0y*^
może być"-+*^
.Rubinowy , 26 bajtów
Wypróbuj online!
źródło
PHP, 37 bajtów
Wersja online
PHP, 47 bajtów
Wersja online
Funkcje BC Math
źródło
Haskell,
2827 bajtówWypróbuj online!
Edycja: Dzięki @ Ørjan Johansen za 1 bajt.
źródło
cycle
.JavaScript, 24 bajty
Wypróbuj online!
źródło
C, 63 lub 62 bajty
-1 bajt, jeśli makra są dozwolone, zakładając, że
x
nie jest wyrażeniem podobnym3+5
(ponieważ to zepsułoby pierwszeństwo):źródło
cast to incomplete array type "int[]" is not allowed
Compiler powiedziałerror C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
; RÓWNIEŻ! gdzie jest int f (int x)? kod jest w rzeczywistości co najmniej 8 bajtów dłuższy; również jest bardzo wolny i nieefektywny, ponieważ ocenia wszystko - nie powtarzaj tego IRL)(int[])
składnię w tej sytuacji. 2)f(x)
jest całkowicie legalny C89. Nie podałem standardu. 3) Chodzi o rozmiar kodu, a nie wydajność. I 4) Jeśli zamierzasz patronować, użyj przynajmniej prawdziwego kompilatora i / lub sprawdź swoje fakty.Java 7, 75 bajtów
Mimo że jest prawidłowy zgodnie z regułami,
long
ma 64 bity, więc nie powiedzie się w przypadku testów potęgowania19^19
wyższych i wyższych. Aby to naprawić, możemy zastosowaćBigDecimal
podejście:148146 bajtówObjaśnienie (podejścia BigDecimal):
Kod testowy:
Wypróbuj tutaj.
Wydajność:
źródło
Asembler x86, składnia Intel, 192 bajty
Przykład udaje najszybszą prędkość roboczą. Jest to program lub część programu, która wykorzystuje konwencję szybkiego połączenia. Zakłada zmienną wejściową
x
w rejestrzeeax
i zwraca wynik również weax
. Podstawową ideą jest unikanie skoku warunkowego, jak w niektórych przykładach tutaj. Nie chodzi również o ocenę wszystkiego (jak w przykładzie C z tablicami), ale o użycie tablicy wskaźników do funkcji i szybszych bezwarunkowych skoków (jmp / call) jako zoptymalizowany analog „C language switch () - case ..”). Ta technika może być również przydatna w rodzajach automatów finita - takich jak emulatory procesorów, executory i tak dalej.Aktualizacja: dla x64 użyj „r” w nazwach rejestrów zamiast „e” (np.
rax
Zamiasteax
,rcx
zamiastecx
). Rozmiar nie zostanie zmieniony i użyje 64-bitowych słów bez znaku.źródło
C #, 39 bajtów
Wyjaśnienie
Obseruj to:
(xx, x + x, x * x, x ^ x) == (0, 2, x, x ^ (x-1)) * x
Rozwiązanie tworzy tablicę, indeksuje do niej, a następnie mnoży wynik przez
x
:Alternatywne wersje:
(39B, wszystkie mnożenie wykonane w tablicy,
x%4
zastępujex&3
)(39B, to samo co odpowiedź @ MetaColon, ale
x%2*2*x
zastępujex*x%4<1?0:2
)źródło
Właściwie 12 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
05AB1E , 10 bajtów
Wykorzystuje kodowanie 05AB1E . Wypróbuj online!
źródło
J , 14 bajtów
Wypróbuj online!
źródło
(4&|{-,+,*,^)~
działa również, ale ma tę samą liczbę bajtów ze względu na parens, chociaż nieco bardziej oczywiste jest to, co robi.Oaza , 25 bajtów
Wypróbuj online!
Jak to działa
Zauważ, że
x&3
jest to równoważne zx%4
, gdzie%
jest modulo.Oaza to język oparty na stosie, w którym każda postać jest poleceniem.
źródło
Cubix , 29 bajtów
Wypróbuj online!
Wyjaśnienie zostanie dodane wkrótce ...
źródło
C #, 42 bajtów
W rzeczywistości jest to normalny C #, ale ponieważ nie możesz uruchomić go jako całego programu i musisz wpisać go w interaktywny, myślę, że możesz nazwać go C # interaktywnym .
Objaśnienie :
Nie mogę powiedzieć, czy to najkrótszy wariant, wszelkie sugestie są mile widziane.
źródło
x
pojawia się błąd, ponieważ nie jest zdefiniowany. To sprawia, że jest to fragment kodu, a nie pełny program.x
” oznacza, że są podanex
przez standardowe metody wprowadzania (czyli funkcji lub programu).PHP, 36 bajtów
źródło
dc, 27
Nigdy wcześniej nie miałem okazji używać tablic w DC:
Wypróbuj online .
źródło
Groovy, 26 bajtów
Wypróbuj online!
źródło
C, 115 bajtów
Przykład jest funkcją
int f(int x)
Udaje najszybszą prędkość roboczą, ponieważ powstrzymuje procesor przed używaniem skoków warunkowych. Jest to tylko poprawny sposób optymalizacji prędkości dla tego zadania. Ponadto stara się nie oceniać wszystkiego, jak w przykładzie z tablicy C,
return(int[]){0,x+x,x*x,pow(x,x)}[x%4];
ale mądrze wykorzystuje tablicę wskaźników do funkcji, aby wykonać znacznie szybsze bezwarunkowe skoki (jmp / call) z dużo szybszą arytmetyką adresu, jako zoptymalizowaną wersję „ Sprawa przełącznik..". Ta technika może być również przydatna w kilku rodzajach automatów finita - takich jak emulatory procesorów, moduły wykonawcze, parsery strumienia poleceń i tak dalej - w których prędkość ma znaczenie, a kod podobnyswitch(x%4) case(0):... case(1):...
jest nieodpowiedni, ponieważ wytwarza wiele instrukcji cmp / jnz; i są to kosztowne operacje na procesorzeNajprostszym i najkrótszym programem testowym (w warunkach domyślnych) dla przypadku będzie:
Doda to tylko 12 bajtów ładunku i sumuje nasz rozmiar do 127 bajtów;
Ale powinieneś lepiej powiedzieć linkerowi, aby
f
zamiast funkcji używał funkcji jako punktu wejściamain
. W ten sposób staramy się uzyskać najszybszy możliwy działający plik binarny dla tego zadania z najkrótszego kodu ;-) Dzieje się tak, ponieważ biblioteka C dodaje dodatkowy kod inicjujący / zamykający przed wywołaniem funkcji main ().Kod kompiluje się w MSVS Community 2015 bez żadnych sztuczek i problemów i daje prawidłowe wyniki. Nie testowałem tego z gcc, ale jestem pewien, że również będzie działał dobrze.
źródło
R,
4742 bajtówStosuje funkcję
-
,+
,*
, lub^
w oparciu o modułx
dox
ax
.-
jest jedyną (nieco) mądrą rzeczą, ponieważx-x
zawsze wynosi 0.R, 33 bajty
Ta sama metoda, której używają inni ludzie. Chociaż jest krótszy, nie lubię go tak bardzo.
źródło
Pyth , 12 bajtów
Wypróbuj online!
Jak to działa
Po pierwsze, zauważ, że
x&3
jest to równoważne zx%4
, gdzie%
jest modulo. Następnie, ponieważ Pyth używa modułowego indeksowania (a[n] == a[n+len(a)]
), więc nawet nie musimy sobie z tym poradzić.Następnie:
x%4==0
, zwróćx-x
(w celu zachowania spójności);x%4==1
wróćx+x
;x%4==2
wróćx*x
;x%4==3
wróciszx^x
.Więcej o polskiej notacji: Wikipedia (szkoda, jeśli jesteś w Turcji).
źródło
Japt , 13 bajtów
Wypróbuj online!
Używa tej samej metody, co inne odpowiedzi eval, z wyjątkiem tego, że program
-U
tylko negujeU
, więc^
zamiast tego używamy (bitowego XOR).źródło
Vim, 50 bajtów
Tutaj
^V
reprezentuje aCtrl+V
,^R
reprezentujeCtrl-R
i^[
reprezentujeesc
kluczDziała, najpierw budując wyrażenie, a następnie pozwalając
bc
je ocenić. Oczekuje danych wejściowych w pierwszym wierszu w innym pustym buforze.Wyjaśnienie:
źródło
^V
, po prostu wkleja to, co mam w schowku, zamiast numeru ...D
zamiastd$
Pyth, 9 bajtów
Zestaw testowy
Nie ma w tym nic dziwnego, wystarczy obliczyć cztery wartości i wybrać jedną z modułowym indeksowaniem.
źródło
Partia, 135 bajtów
Miałem nadzieję utworzyć potęgowanie, budując i oceniając ciąg formularza w
[0+...+0, 2+...+2, x+...+x, x*...*x]
zależności od dwóch ostatnich bitów,x
ale niestety kod do wybrania operacji zabrał zbyt dużo czasu na wyrażenie, ponieważ nie mogłem użyć*
jakofor
parametru, ale byłem przynajmniej w stanie wykorzystać sztuczkę polegającą na upadku, aby odegrać trochę bajtów.źródło
Siatkówka , 87 bajtów
Wypróbuj online! (Link zawiera pakiet testowy.)
Objaśnienie: Pierwsze dwa wiersze konwertują dane wejściowe na jednoargumentowe i powielają je (teraz mamy
x;x
). Następne dwie linie szukająx&3
albo0
albo1
i zmieniają sięx;x
nax;0
lubx;2
odpowiednio. Następne dwie linie szukająx&3==3
i zmieniają sięx;x
wx;x;x;...;x;1;x
(x
x
s). Oznacza to, że musimy albox;0
,x;2
,x;x
, lubx;...;x
i pozostaje pomnożyć wszystko razem i przeprowadzić z powrotem w systemie dziesiętnym. (Kod mnożenia jest oparty na kodzie na wiki Retina, ale został zmieniony tak, aby obsługiwał mnożenie przez zero).źródło