Zwycięzcą (oczywiście) jest Dennis ♦, który użył Galaretki z 10 bajtami!
To wyzwanie będzie nadal aktualne, ale wyniki nie będą już brane.
Układ napędowy liczby jest konceptem Johna Conwaya (który jest również znany z tworzenia Gry życia Conwaya, ale nie o to chodzi). Jest tak zdefiniowany:
Dla dowolnej liczby ... układ napędowy liczby to ... (tj. Każda druga cyfra, od lewej do prawej, jest potęgą cyfry wcześniej). Proces ten powtarza się, aż wynikiem będzie jedna cyfra.
PRZYKŁADY:
2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed
135 => (1^3)5 = 5
1234 => (1^2)(3^4) = 81 => (8^1) = 8
1100 => (1^1)(0^0) = 1 # (0^0) = 1
-42 => -42 # Negative numbers output the input
Twoim wyzwaniem jest, dla dowolnej liczby n
na wejściu, powrót powertrain(n)
(tj. n
Po zakończeniu rozkładu układu napędowego) jako wynik.
To jest kod golfowy, więc wygrywa najmniejsza ilość bajtów.
ZRZECZENIE SIĘ:
- Możesz mieć nieparzystą liczbę cyfr na wejściu, ostatnia cyfra po prostu nie będzie miała mocy.
- 0 ^ 0 to 1, ponieważ gdyby było 0, wiele liczb natychmiast zwinąłoby się do 0 lub 1.
- Jeśli liczba jest niezniszczalna w jakiejkolwiek części procesu obliczeniowego (np. Jeśli się skończy
2592
), możesz po prostu wyprowadzić liczbę. - Jeśli dane wejściowe to
< 10
(tzn. Wszystkie liczby jednocyfrowe i liczby ujemne), wyślij dane wejściowe.
Prawdopodobnie ogłoszę zwycięzcę po kilku godzinach .
Aktualny ranking:
- Galaretka ( Dennis ♦ ): 10
- Pyth ( DenkerAffe ): 16
- MATL ( Don Musli ): 21
- Perl ( Ton Hospel ): 42
- Haskell ( Damien ): 64
- JavaScript ES6 ( edc65 ): 71
- Mathematica ( murphy ): 74
- Mathematica ( LegionMammal978 ) i Haskell ( Renzeee ): 77
- Python 2 ( matematyka ): 111
- Python 3 ( Erwan ): 161
- Java 8 ( niebieski ): 229
- Oracle SQL 11.2 ( Jeto ): 456
- Befunge '93 ( Lex ): 490
1100
a-42
Łatwo zasad tęsknisz przypadków brzegowych jeśli nie pokazują się w przypadkach testowych.Odpowiedzi:
Galaretka,
15141210 bajtówWypróbuj online!
Jak to działa
źródło
n
czasy, ale nie mam dowodu, że działa dla wszystkich możliwych danych wejściowych.D*2/Pµ¡
Haskell,
6764 bajtów(>> = (==)) >> = dopóki $ p.show jest nienazwaną funkcją przyjmującą liczbę całkowitą jako dane wejściowe i zwracającą swój zespół napędowy.
Zaoszczędź 3 bajty dzięki Zgarbowi
źródło
((==)=<<g)
oszczędza dwa bajty(\n->g n==n)
.(>>=(==))>>=
naprawdę wygląda jak pociąg!Perl, 42
48bajtówDodaj +2 do
-lp
(możesz też upuścić,-l
ale lubię nowe wiersze)Uruchom z wejściem na STDIN, np
powertrain.pl
:(na starszych perlach możesz także upuścić przestrzeń między wyrażeniem regularnym i do)
To nie będzie w stanie obsłużyć stałego punktu,
24547284284866560000000000
ale tak duża wartość i tak nie będzie działać, ponieważ do tego czasu perl przeszedł na notację wykładniczą.Powyższa wersja działa w rzeczywistości szybko (co najwyżej
2592
pętle) dla wszystkich liczb, które Perl może reprezentować bez użycia wykładniczej notacji, ponieważ udowodniono, że nie ma stałych punktów między2592
i24547284284866560000000000
( https://oeis.org/A135385 )Zakłada to jednak coś, co nie zostało jeszcze udowodnione. Zasadniczo może istnieć redukcja, która wymaga więcej niż
X=10^7
kroków (przypuszcza się, że żaden nieokreślony punkt zajmuje więcej niż 16 kroków, https://oeis.org/A133503 ), których wartość spada poniżejX
(ale powyżej10^7
), a następnie rośnie jeszcze raz. W takim przypadku muszę wrócić do:Wyjaśnienie
Kod działa poprzez wstawianie
**
i*
(naprzemiennie) między cyframitak się
2592
staje2**5*9**2
i12345
staje1**2*3**4*5
. Są to poprawne wyrażenia perla, które można oceniać za pomocą(
0**0
jest1
w perlu). Następnie po prostu owiń pętlę za pomocą licznika, dzięki któremu wygasa. Ponieważ poza stałymi punktami wartości spadają bardzo szybko, seria układu napędowego zbiera się, zanim licznik naprawdę da szansęźródło
Pyth,
25181116 bajtówWypróbuj tutaj!
714 bajtów zapisanych przy pomocy @JakubeWyjaśnienie
źródło
Python 2, 111 bajtów
Chodzi o to, aby utworzyć ciąg, w którym cyfry
n
są oddzielone operacjami, które występują naprzemiennie między*
i**
, a następnieeval
ten ciąg. (Inne rozwiązania wykorzystują ten sam pomysł; patrz na przykład odpowiedź Perla Tona Hospela ).Tak więc operacja przełącza się pomiędzy
'**'[0:]
, co jest**
i'**'[-1:]
co jest sprawiedliwe*
.Jednak pod koniec
for
pętli łańcuch kończy się operacją (jedną lub drugą), więc albo musimy usunąć ostatnią operację, albo dodać kolejną cyfrę, aby łańcuch miał sens.Na szczęście dołączenie
1
na końcu będzie działać bez względu na to, która operacja jest ostatnia. (Jeśli chcesz,1
to jednostronna tożsamość z prawej strony, zarówno dla pomnożenia, jak i potęgowania. Innym sposobem powiedzenia tego jest topowertrain(n) == powertrain(10*n + 1)
dla wszystkichn>0
.)Wreszcie, jeśli wynik
eval
zdarzenia jest taki sam jak na wejściu (jak w1
cyklu długości ), funkcja kończy się. W przeciwnym razie funkcja wywołuje się w wyniku. (Będzie wisiał wiecznie na dowolnym cyklu długości> 1
, ale zgodnie z komentarzami PO mogę założyć, że takich cykli nie ma).(Uwaga: powyższe wyjaśnienie działa na jednocyfrowe dodatnie liczby całkowite, ponieważ wprowadzane
n
będą jednocyfrowe dane wejściowe,n**1
w wyniku których powstanie1
cykl. Jednak musimy również zaakceptować wartości dodatnie, więc jest warunek zaczynając od zwarć, jeśli wejście jest mniejsze niż1
. Moglibyśmy wyeliminować tę linię i zaoszczędzić 17 bajtów, gdyby zagwarantowano, że wejście będzie nieujemne).źródło
Java 8,
265244229 bajtówTo jest moja pierwsza odpowiedź, ale czytam tę stronę od dłuższego czasu i myślę, że wiem, co robię. Przynajmniej wyprzedza befunge i SQL ...
Niestety, podobnie jak inne odpowiedzi, ta nie działa dla 24547284284866560000000000 ze względu na wbudowane ograniczenia java'a dotyczące możliwości uzyskania dużych liczb całkowitych.
Zaoszczędź 36 bajtów dzięki @JackAmmo
Wyjaśnienie bez golfa
źródło
if(n<10)return n;else{...}
przypadku zbędne jest, ponieważ logicznie wszystko w tym innym bloku działałoby tak czy inaczej, gdy n <10 jest fałszywe. Usunięcie else i 2 pasujących nawiasów pozwoli ci zaoszczędzić 6 bajtów. Podobna sytuacja występuje w przypadku twojego ostatniego, jeśli ... inaczejif(n==t)return n;else return p(t);
usuniesz inny i spację po nim, aby zapisać kolejne 5 bajtów. W rzeczywistości możesz go jeszcze bardziej skrócić, jeśli użyjesz operatora triadowego zamiast jeśli ... w innym przypadkureturn n==t?n:p(t);
int t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
JavaScript (ES6) 71
Funkcja rekurencyjna, zatrzymująca się po znalezieniu powtórzenia. Nie może to działać w przypadku dłuższych pętli (powtarzanie co najmniej 2 wartości), ale wydaje się, że tak się nie stanie, przynajmniej w ograniczonym zakresie dokładności liczb javascript (17 cyfr)
Test
źródło
+'1'
zabiłeś dwa ptaki jednym kamieniem!replace
to 1 bajt dłużej:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
Mathematica, 77 bajtów
Funkcja anonimowa. Niezbyt skomplikowane.
źródło
Befunge
720490 bajtówNie mogłem się oprzeć, by zrobić jeszcze jedno po tym, co nigdy nie mów mi o szansach . Tak więc zoptymalizowałem „ASCII-fier” poprzedniego. W tym przypadku nie widziałem potrzeby, aby wskaźnik instrukcji przebiegał nad cyframi, aby je odczytać, więc nie starałem się, aby były czytelne dla ludzi. Więc teraz jest to raczej digitizer.
Ponownie, jeśli chcecie wyjaśnienia, dajcie znać w komentarzach, postaram się stworzyć kilka pomocnych opisów. Możesz skopiować wklej kod do tłumacza . Przekonałem się, że przykład 24547284284866560000000000 wyprowadza 0, ale wydaje się, że jest to problem z uzyskaniem tak dużej wartości z punktu na siatce, ponieważ wyraźnie widać prawidłową wartość przechowywaną w końcowych krokach.
Ta wersja obsługuje również wejście ujemne. To wielka poprawa w stosunku do poprzedniej wersji, jeśli sam tak mówię. Naprawiono co najmniej 1 błąd, a jego rozmiar znacznie się zmniejszył.
źródło
Haskell,
1007977 bajtówNie grał w golfa:
Ta funkcja dzieli dane wejściowe na cyfry i wykonuje lewę
i
.EDYCJA: Dzięki nim za kilka wskazówek.
źródło
i(a:[])=a
jesti[a]=a
, B), nie ma potrzebymax 1
, ponieważ0^0 = 1
w Haskell, c) wymienić(:[])
zpure
, d), przemieszczająlet
wewnątrzg
w oddzieleniu i zastąpićif ... then ... else
w osłony:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
pure
nie ma w Preludium, ale reszta porad działa, dzięki. Próbowałem to zrobić ze strażnikami, ale skończyło się na użyciu;
przed strażnikiem i to nie działało, ale teraz wiem, jak to powinno działać.pure
znajduje się w Preludium dostarczonym z wersją base-4.8.2.0. Nie wiem, kiedy to zostało wprowadzone. Nie trzeba się( )
ini([a])=a
.Mathematica, 74 bajty
Wyjaśnienie
To rozwiązanie wykorzystuje funkcję pomocniczą
f
, która przyjmuje cyfry liczby jako argumenty i stosuje jedną iterację działania układu napędowego. Ostatni wiersz jest czystą funkcją, która jest spreparowana w celu wykorzystaniaReplaceRepeated
funkcji (lub//.
w skrócie), która stosuje regułę do wyrażenia (w tym przypadku argumentu#
funkcji czystej), dopóki się nie zmieni. Regułai_/;i>0:>f@@IntegerDigits@i
zastępuje wszystko, co nie jest ujemne, funkcjąf
stosowaną do cyfr dziesiętnych.źródło
:=
)SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>
,Set::write: Tag Times in 1 f[n_] is Protected. >>
Drugi błąd znika, gdy używam:=
vs=
.;
s zamiast0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
MATL , 21 bajtów
Wytworzenie wyjścia może zająć kilka sekund.
EDYCJA (30 lipca 2016 r.): Połączony kod zastępuje
9L
się,1L
aby dostosować się do ostatnich zmian w języku.Wypróbuj online!
Wykorzystuje dwie następujące sztuczki, aby zmniejszyć liczbę bajtów kosztem wydajności kodu:
n
czasy zamiast czekać na znalezienie cyklu. Jest to dopuszczalne zgodnie z komentarzami OP.1
konieczne będzie dołączenie finału w celu dokończenia operacji zasilania końcowego. Zamiast tego liczba dodanych1
to liczba cyfr. Zapewnia to liczbę parzystą, dzięki czemu można wykonać wszystkie operacje na energii (nawet jeśli te ostatnie są niepotrzebne1^1
).Kod:
źródło
a, b, a, b
ad infinitum (więcej niż jeden termin). Jeśli jeden termin się powtarza, powinieneś wypisać tę liczbę. Przepraszam, jeśli to nie było do końca jasne.2592
dane wejściowe, wydaje się, że przez dłuższy czas nic nie wydaje.Python 3,
169161 bajtówNiespełniony
Wyniki
źródło
;
rozdzielisz je w ten sposób, dzięki czemu zaoszczędzisz białe znaki zamiaru. Możesz także umieścić treść pętli for na tej samej linii.def f(s,o=[['1',s]["-"in s]],n=int):
while s not in o:
o+=[s];s+=1*(len(s)%2<1);r=1
for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j)
s=str(r)
return o[-1]
o=[['1',s]["-"in s]]
w domyślnym argumencie nie działa dla mnie, wywołuje błąd `nieokreślony`Oracle SQL 11.2, 456 bajtów
Nie grał w golfa
v jest widokiem rekurencyjnym, parametry to
n: liczba do podzielenia na 2 cyfry
c: liczba 2 cyfr części
i: bieżące 2 cyfry część do obliczenia
f: ciąg łączący moc z * jako separatorem
t: ocena f
Dekodery przełączają się na następny numer, aby podzielić i obliczyć, gdy wszystkie części bieżącego numeru zostaną wykonane.
XMLTABLE (f) przyjmuje wyrażenie i ocenia je, umieszczając wynik w pseudokolumnie „wartość_kolumny”. To wersja gry w golfa http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html
CYCLE to wbudowana funkcja wykrywania cyklu w wyroczni i służy jako warunek wyjścia.
Ponieważ wynik dla: 1 <10 wynosi: 1, a v nie zwraca wiersza dla tych przypadków, SUM wymusza wiersz z NULL jako wartością. NVL zwraca: 1 jako wynik, jeśli wiersz jest pusty.
źródło