Wyzwanie
Zaimplementuj tetrację (inaczej Power Tower lub Hyperexponentiation) z najmniejszą liczbą postaci.
Warunki
- Nie używać określenia „moc” operatora lub jego odpowiedniki (takie jak
pow(x,y)
,x^y
,x**y
etc.) - Dane wejściowe podane jako:
x y
(oddzielone spacją) x
jest potęgowany przez siebiey
razy.- Twoja metoda musi być w stanie obliczyć co najmniej
4 3
(4 wykładniki samodzielnie 3 razy)
Punktacja
- Najniższy wynik wygrywa: (liczba znaków)
- Odliczenie premii, jeśli nie korzystasz z operatora mnożenia (-5 punktów).
- Brak wymagań prędkości / pamięci. Zajmij tyle, ile chcesz.
Przykłady
x, 0 -> 1
2, 2 -> 2^2 = 4
2, 4 -> 2^(2^(2^2)) = 65536
4, 3 -> 4^(4^4) = 4^256 = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
Otwarty na sugestie / zmiany / pytania
*
jest mnożenie w niektórych sytuacjach, ale również prosty pętli operatora:{block}N*
jest równoważny C-stylufor(i=0;i<N;i++){block}
. Trudnym przypadkiem na krawędzi jest mnożenie łańcucha / tablicy ('a'3*
daje'aaa'
), ale nie jest to problem, biorąc pod uwagę, że tablica4***3
elementów przepełni pamięć RAM.x 0
=> 1. Moje oryginalne rozwiązanie nie obsługiwało tej skrzynki.Odpowiedzi:
J, wynik to 7 (12 znaków - 5 punktów za uniknięcie pomnożenia)
+/@$/@$~/@$~
stosowanie:
Tylko kilka zagnieżdżonych fałd:
*/@$~/@$~
^/@$~
gdzie$~
tworzy tablicę,/
jest funkcją składania.źródło
pad
znaczyło tutaj? Przepraszam, angielski nie jest moim językiem ojczystym.@$~
w połączeniu?/
, ale tak. po prostu składasz tyle razy, ile potrzeba w funkcji zagnieżdżenia.Haskell,
8785 - 5 == 8082Nie używa potęgowania, mnożenia ani dodawania (!), Wystarczy wyświetlić listę operacji. Demonstracja:
...
ahm ... nie mówiłeś nic o wydajności ani pamięci, prawda? Ale biorąc pod uwagę wystarczającą ilość miliardów lat i kilka petabajtów pamięci RAM, nadal dawałoby to poprawny wynik (genericLength może użyć bigInt do zliczenia długości listy).
źródło
GolfScript,
1518 znakówTak, jeden ze
*
znaków to operator mnożenia (ćwiczenie: który?), Więc nie kwalifikuję się do otrzymania premii 5 znaków. Mimo to jest tylko trochę krótszy niż rozwiązanie Petera .Wcześniejsza 15-znakowa wersja jest inaczej taka sama, ale nie generuje danych wyjściowych, gdy drugi argument ma wartość 0. Dzięki res za wykrycie błędu.
źródło
"2 3" ~])*{[]+*{*}*}*
. Z.;
aby usunąć rzeczywisty ciąg wejściowy, który interpreter umieszcza na stosie podczas uruchamiania. Lub po prostu dodaj[
kod do: oba;"2 3" ~])*{[]+*{*}*}*
i"2 3" [~])*{[]+*{*}*}*
działają dobrze dla mnie.ruby golfscript.rb my_script.gs
wiersza poleceń, nie wiedząc, że powoduje to, że coś („” najwyraźniej) znajduje się na stosie przed uruchomieniem skryptu - co czasami działa, a czasem nie. (Również, zecho 2 3 | ruby golfscript.rb my_script.gs
, program wykonuje pracę jako nadane.)J,
161912 znakówlub jako czasownik (17 znaków):
stosowanie:
lub pobieranie danych z klawiatury (
242720 znaków):z podziękowaniami dla FUZxxl za zwrócenie uwagi na moją głupotę. :-)
Wyjaśnienie:
J jest odczytywany od prawej do lewej, więc używając
2 4
:/
służy do wstawiania czasownika$~
między każdą parą elementów na liście.$~
bierze lewy element i kształtuje go$
za pomocą odpowiedniego elementu (~
odwraca argumenty) - więc byłoby to równoważne z tym,4 $ 2
co daje listę2
s, która ma cztery elementy2 2 2 2
.Teraz dodajemy 1 do listy,
1,~
a następnie robimy to samo ponownie;/
wstaw czasownik*/@$~
między każdą parą elementów na liście. Ten czasownik zaczyna się w ten sam sposób,$~
ale tym razem/
wstawia*
między każdą pozycję nowo wygenerowanej listy.@
Tylko zapewnia, że*/@$~
prace jako jeden czasownik zamiast dwóch. Daje to2
pomnożone przez siebie wystarczającą ilość razy, aby być równoważnym2^4
.Strona słownictwa J. - Rozwiązywanie problemów z J sprawia mi przyjemność tylko dlatego, że czasami robi różne rzeczy.
Dodanie jednej kolejnej iteracji w celu usunięcia
*
operatora ma 2 problemyWychodzi na 17 znaków (+/@$~/,@$~/1,~$~/
), co, nawet z bonusem -5, jest za długie4 3
źródło
^/]$[
co tworzy listę2 2 2 2
i umieszcza między nimi operatora potęgowania. To, co robi, idzie o krok dalej i dokonuje potęgowania przez wielokrotne mnożenie.GolfScript (24 znaki - 5 = 19 punktów)
jest niesamowicie wolny.
(lub 20 znaków)
jest znacznie szybszy.
źródło
Python, 70
Używa zagnieżdżonych
eval
wywołań, w końcu generując ciąg,"a*a*a*a...*a"
który jest analizowany. Prawie połowa wyniku jest marnowana na uzyskiwanie argumentów ... chociaż zauważyłem, że kilka innych rozwiązań nie przeszkadza w tym.źródło
input()
lub wykorzystanieeval(raw_input())
Cheersexec"eval('a*'*"*b+'1'+"+'1')"*b
Scala: 110
bez golfa:
wyjaśnienie:
plus, mul, high (: = pow), tetration działają wszystkie w ten sam sposób. Wspólny wzorzec można wyodrębnić jako metodę rekurencyjną, która wymaga dwóch BigIntów i podstawowej funkcji:
Podkreślenia są symbolami zastępczymi dla czegoś, co zostanie wywołane w tej sekwencji, na przykład dodanie plus (a, b) = (a + b); dlatego ( + ) jest funkcją, która pobiera dwa argumenty i dodaje je (a + b).
niestety mam problemy z rozmiarem stosu. Działa dla małych wartości dla 4 (na przykład: 2) lub jeśli zmniejszę głębokość o jeden krok:
Oryginalny kod składa się z 112 znaków i, jeśli jest poprawny, wyniósłby 107. Może dowiem się, jak zwiększyć stos.
Rozszerzony algorytm można przekształcić w wywołania tailrecursive:
Wywołanie tailrecursive jest dłuższe niż oryginalna metoda, ale nie spowodowało przepełnienia stosu w długiej wersji - jednak nie daje wyniku w rozsądnym czasie. t (2,4) jest w porządku, ale t (3,3) już mnie zatrzymał po 5 minutach. Jest jednak bardzo elegancki, prawda?
A teraz to samo co powyżej: użyj śmierdzącego mnożenia (nawet zyskujemy, odrzucając premię 5, ponieważ oszczędzamy 7 znaków: wygrana = 4 znaki :)
wezwanie:
czas pracy: 1ms.
źródło
Br ** nfuck, 128-5 = 123 bajtów
Dane wejściowe mają postać znaków z punktami kodowymi liczb pożądanych jako dane wejściowe. Dane wyjściowe są takie same.
Wyjaśnienie
nadchodzi, kiedy mam czasponiżej. Czy dostaję punkty bonusowe za niestosowanie potęgowania, mnożenia, a nawet dodawania?Działa (testowane) do
x 0
,0 x
,x 1
,1 x
,x 2
,2 3
, i2 4
. Próbowałem3 3
, ale działało przez kilka godzin bez ukończenia (w mojej implementacji Java - prawdopodobnie nie optymalne) (EDYCJA: w EsotericIDE @ Timwi [To świetnie! Powinniście też spróbować]. Nie mam szczęścia.) Teoretycznie działa to do wielkości komórki konkretnej implementacji.źródło
Python, 161-5 (bez * operatora) = 156
odwołać się:
źródło
4***3
?!m
funkcjęm=lambda x,y:sum(x for _ in r(y))
Perl, 61 znaków
tutaj jest dziwny
stosowanie:
źródło
Mathematica ,
4033Nie jest to do końca zgodne z regułami, ale i tak nie jest sprzeczne z najkrótszym kodem i mam nadzieję, że będzie to dla kogoś interesujące.
To buduje funkcję „tetracji” po uruchomieniu, ale argumenty muszą być podawane w odwrotnej kolejności. Przykład:
źródło
Fold[g, 1, #2~Table~{#}] &[3, 4]
tog[g[g[1, 4], 4], 4]
na przykład przyniesie .m[Times]
produkujeFold[Times, 1, Table[#2, {#1}]] &
, co jest funkcją mocy:m[Times][5, x]
--->x^5
; tę samą metodę stosuje się w przypadku tej nowej funkcji mocy w celu wytworzenia funkcji tetracji. Logicznie rzecz biorąc, można zacząć,Plus
ale kończy się to niemal natychmiast.t[h_, n_] := Sum[h, {i, n}]
. Potem biegnijm[m@t][3, 4]
.Sum[h, n]
.)Haskell:
5851 znaków, z pomnożeniem lub bez.Nie golfowany:
Krótsza definicja pochodzi od wstawienia „wypukłości” i zdefiniowania niestandardowej wersji „iteracji”. Niestety wynik jest niemożliwie nieefektywny, ale rozpoczęcie od (*) zamiast (+) daje przyzwoitą prędkość. W
ghci
:źródło
Ruby
6659 znakówźródło
1
), gdy drugim numerem wejściowym jest0
;e(x,0)
zwraca raczej wartośćx
.Python, 112 znaków
Liczby powinny być pierwszym i drugim argumentem:
python this.py 4 3
**
operator nie jest używany.*
używany. Jest dość trywialny do wdrożenia, dokładnie tak**
, ale kosztuje więcej niż 5 znaków.źródło
*
implementacji, uważam, że głębokość rekurencji byłaby zbyt duża4 3
.C,
11710599 znakówEDIT: połączył dwie funkcje
p
ir
do jednego, oszczędzając kilka znaków.Z 99 znaków 52 wykonuje rzeczywiste obliczenia (w tym definicje zmiennych). Pozostałe 47 służą do obsługi danych wejściowych i wyjściowych.
BŁĄD: Źle obsługuje moce 0 (npTo nie jest błąd, zapomniałem, że0 2
.). Powinien znaleźć ustalenie minimalnego kosztu.0 2
jest niezdefiniowany.Z powodzeniem radzi sobie
4 3
, a nawet daje dokładny wynik. Może być jednak niedokładny w przypadku niektórych mniejszych liczb.Drukuje liczbę ze znakiem końcowym
.000000
.źródło
Współczynnik, 187 znaków
Przed golfem:
Nie usunąłem operatora mnożenia
*
. Gdybym to zrobił, musiałbym dodać logikę wyrażającą, że suma pustej sekwencji wynosi 0, a nie 1. Ta dodatkowa logika kosztowałaby więcej niż premia -5.Łamacz reguł, 124 + 10 = 134 znaków
Ten program ma niższy wynik, ale operator potęgowania
^
łamie reguły. Reguły mówią „(liczba znaków) + (10 * (liczba operatorów„ mocy ”))”, więc zastosowałem karę +10. Jednak zasady mówią również: „Nie używaj operatora„ mocy ”, więc każdy program, który przyjmuje tę karę, łamie zasady. Dlatego ten program składający się z 134 znaków nie jest poprawną odpowiedzią i muszę przedstawić mój dłuższy program składający się z 187 znaków jako moją odpowiedź.źródło
Haskell 110-5 = 105
Tetration Peano Style. Jest to najbardziej szalenie wolne rozwiązanie, tylko ostrzeżenie, ale także pozwala uniknąć nawet dodawania.
To zależy od tego, czy masz cierpliwość do wpisywania liczb Peano (i nie pokaże odpowiedzi. Jeśli naprawdę chcesz ją uruchomić, dodaj kilka wierszy (90 znaków):
źródło
Ruby,
47 4645t=->x,n{r=x;2.upto(n){r=([x]*r).inject :*};r}
źródło
Lua: 133 znaki, bez mnożenia
Pierwotnie zamierzałem użyć hacków do powtarzania ciągów, aby zrobić fałszywe pomnożenie, ale lubi zawodzić przy dużych wartościach. Mógłbym użyć dynamicznej kompilacji i łańcucha ładującego, aby zmniejszyć, ale robi się już późno ... Potrzebuję snu.
Wprowadzanie „4 3” do wyjść standardowego wejścia:
źródło
VBA, 90 znaków
* Być może premia za brak pomnożenia nie jest wystarczająca. Myślę, że odpowiedź na pomnożenie nie jest o wiele bardziej interesująca, ale to jest golf golfowy, więc nie jest najlepszy. Oto odpowiedź bez
*
i lepsza (krótsza i lepsza ocena) odpowiedź:90 znaków, brak operatorów mocy, używa mnożenia = 90
116 znaków, brak operatorów mocy, brak premii za pomnożenie (-5) = 111
UWAGA: VBA ma problemy z wydrukowaniem liczby, gdy wynik jest bardzo duży (tj.
4, 3
), Ale oblicza się poprawnie, więc jeśli na przykład chcesz użyć tej liczby, dobrze byś poszedł. Również przepełnione (WIĘCEJ) liczby są większe3, 4
.źródło
Perl 6 , 32 bajty
Wypróbuj online!
(1, { [*] a xx $_ } ... *)
jest leniwą sekwencją, która generuje wieżę mocy, przy czym każdy element jest listą, która składa się z pierwszego parametru wejściowegoa
zreplikowanego (xx
) kilka razy równego poprzedniemu elementowi ($_
), a następnie ta lista jest pomniejszana przez mnożenie ([*]
). Z tej sekwencji po prostu wyciągamyb
-ty element.źródło
Rachunek Lambda, 10-5
(przy użyciu kodowania Church i De Bruijn indeces )
λλ(1λ13)λ1
Wyjaśnienie
Bez indeksu De Bruijn
λa,b.(b λc.ca)λc.c
:Jeśli zdefiniujesz
exp_a(x)=a^x
ten program, określaa↑↑b=exp_a^b(1)
gdzie^b
oznacza iterację funkcji.Nie jestem pewien, czy jest to dozwolone, ponieważ
ca
jest technicznie równoważne za^c
tym, jak to nigdy nie jest prawdziwym wbudowanym i tylko efektem ubocznym sposobu, w jaki liczby całkowite są kodowane w rachunku lambda.źródło
JavaScript: 116 znaków
t („4 3”) Wyjścia:
źródło
Python
(111)(113) nie *6 *** 3-36k cyfr))
Aktualizacja: należy dodać wartość początkową, aby dopasować t (X, 0) = 1
źródło
Haskell: 88-5 znaków bez mnożenia, 59 znaków z mnożeniem
Bez mnożenia:
Są prawdopodobnie sposoby, w które mógłbym trochę pograć w golfa.
Z mnożeniem:
I wreszcie program bez golfa:
Jest to prawdopodobnie najprostszy sposób rozwiązania tego problemu, polegającego na zdefiniowaniu mnożenia jako powtarzanego dodawania, potęgowania jako powtarzanego mnożenia i tetracji jako powtarzanego potęgowania.
źródło
Rakieta 58 (nie *)
źródło
Common Lisp, 85 znaków
Próbowałem robić multiplikacje poprzez wielokrotne dodawanie, ale było to o wiele więcej niż 5 znaków. To samo dotyczy makroletów, deklaracje nie były warte zysków.
Kolejne rozwiązanie, zainspirowane rozwiązaniem Python firmy Boothby. To o 1 znak mniej niż powyższe rozwiązanie.
źródło
Python 3-68
(w tym 10-punktowa kara dla operatora)
źródło
Yabasic , 71 bajtów
Funkcja, która pobiera dane wejściowe
a
ib
jest ciągiem rozdzielanym spacjami.Wypróbuj online!
źródło
R , 71 - 5 = 66 bajtów
Wypróbuj online!
-5 za unikanie *, co było trudniejsze niż się spodziewałem. Eksploduje naprawdę szybko i nie będzie działać (chyba że będzie miał więcej pamięci), ale spełnia wszystkie niezbędne kryteria.
źródło