Powiązane: Iterowana funkcja phi (n) .
Twoim wyzwaniem jest obliczenie iterowanej funkcji phi:
f(n) = number of iterations of φ for n to reach 1.
Gdzie φ
jest funkcja totalna Eulera .
Powiązane OEIS .
Oto jego wykres:
Zasady:
Twoim celem jest wyjście f(n)
z n=2
celu n=100
.
To jest golf golfowy, więc wygrywa najkrótszy kod.
Oto wartości, z którymi możesz sprawdzić:
1, 2, 2, 3, 2, 3, 3, 3, 3, 4, 3, 4, 3, 4, 4, 5, 3, 4, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 4, 5, 5, 5, 5, 5, 4, 5, 4, 5, 5, 6, 4, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 4, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 5, 6, 7, 5, 7, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 7, 5, 6, 6
code-golf
math
sequence
kolmogorov-complexity
number-theory
Po prostu piękna sztuka
źródło
źródło
x
takich wartości ,phi(x)
czyli konkretna stała liczba.f(n)
, niż uruchamiać go w zakresie ustalonych liczb. To także robi różnicę między językami dzięki możliwości zastosowania funkcji w zakresach o mniejszej liczbie bajtów (częściowo wyzwanie kameleona?)Odpowiedzi:
Haskell ,
5352 bajtyDzięki nim za uratowanie 1 bajtu!
Wypróbuj online!
sum[1|1<-gcd n<$>[1..n]]
dajeφ(n)
(wzięte z wad , dzięki!)f
jest funkcją rekurencyjną, która oblicza,1+φ(n)
jeśli n nie jest1
, i zwraca,0
jeślin
jest1
, ponieważ nie ma już więcej iteracji1
Na koniec
f<$>[2..100]
tworzy listęf
zastosowanych do każdego elementu[2..100]
źródło
Haskell ,
70 6968 bajtówTa funkcja
(\n->sum[1|1<-gcd n<$>[1..n]])
jest funkcją totalną, którą wielokrotnie stosujemy w funkcji anonimowej. Dzięki @laikoni za -1 bajtów!EDYCJA: Właśnie dowiedziałem się, że @xnor użył tej dokładnej funkcji totient w poprzednim wyzwaniu .
Wypróbuj online!
źródło
MATL ,
1615 bajtówWypróbuj online!
Wyjaśnienie
Stara wersja, 16 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
2 3 3 4 3
, gdy wyzwanie mówi, że powinny być1 2 2 3 2
Galaretka ,
1211109 bajtówWypróbuj online!
-1 bajt dzięki HyperNeutrino!
-1 bajt dzięki Mr. Xcoder!
-1 bajt dzięki Dennisowi
Jak to działa
Ponieważ zostało to zrobione przez Dennisa, (co zrozumiałe) nie mam pojęcia, dlaczego to działa, tylko że działa.
źródło
f(n)
od2
do100
, a pytanie nie wspomina o danych wejściowych, więc myślę, że jest to poprawna wersjaf
don=2
celun=100
, a nie tylko jedna wartość.#
w tym przypadku? Coś jak ten (który wyraźnie nie działa, ale napisany przez kogoś, kto jasno rozumie składnię!)€
jest zwykle lepsze niż#
.APL (Dyalog) ,
502925 bajtówSpójrz, nie ma wbudowanego totemu!
4 bajty zapisane dzięki @ H.PWiz
Wypróbuj online!
W jaki sposób?
Najwyraźniej najpierw wybrałem dłuższą (i trudniejszą) formułę totemu. Zobacz historię zmian.
⍳⍵
-1
don
⍵∨
- gcd zn
1=
- równa 1?+/
- podsumuj je wszystkieTo jest totient. Cała reszta to opakowanie do liczenia (
1+∇
) i zastosowania do zakresu2..100
(¨1+⍳99
).źródło
Mathematica, 44 bajty
-10 bajtów od @Misha Lavrov
-2 bajty od @ user202729
Wypróbuj online!
źródło
J REPL, 23 bajty
Nie sprawdziłem, ale prawdopodobnie działa to w zwykłym J, jeśli zdefiniujesz to jako rzeczownik (grałem w golfa na moim telefonie na REPL).
Wbudowane, yo.
Powiedziałbym, że są co najmniej 2-3 bajty do zgolenia (off-by-one ze względu na sposób
a:
działania, konieczność używania|
jako noop itp.).źródło
+/*<:5&p:^:a:2+i.99
za 19 bajtów Wypróbuj online!"+
zamiast"0
, aby mógł stać się<:#@(5&p:^:a:)"+i.99
+/1<a:5&p:2+i.99
a:
w swoim kodzie? Jak to działa zamiast^:
?(5&p:)^:a: m
można zrobić,a: 5&p: m
używając innej definicji&
terminu, w którym diad jest związany z rzeczownikiem, a następnie wywoływany dyadycznie.JavaScript (ES6),
115...10499 bajtówKodowanie może być krótsze, ale spróbujmy podejścia czysto matematycznego.
źródło
Python 2 , 80 bajtów
Wypróbuj online!
źródło
Python 2 , 82 bajty
Wypróbuj online!
Wykorzystuje się obserwacje, które:
f(a*b) = f(a) + f(b) - 1
, z wyjątkiem-1
pominięcia, jeślia
ib
oba są parzystef(p) = f(p-1) + 1
kiedyp
jest pierwsza, zf(2)=1
Sugerują one, że jeśli
n
ma on faktoryzację pierwotnąn = 2**a * 3**b * 5**c * 7**d * 11**e * ...
, to wtedyf(n) = max(a,1) + b + 2*c + 2*d + 3*e + ...
, gdzie bierze udział każdap>2
z faktoryzacjif(p-1)
.Nie jestem pewien, czy nadal się trzymają przeszłości
n=100
, ale jeśli tak, dają sposób na zdefiniowanie i obliczenief
bez użyciaφ
.źródło
Bubblegum , 49 bajtów
Wypróbuj online!
źródło
PowerShell , 110 bajtów
Wypróbuj online!
Podejście matematyczne.
Właściwie, przeglądając go, bardzo podobny do odpowiedzi C , ale rozwijał się niezależnie. Tworzy tablicę
0
s, pętle od2
do100
, a następnie obliczaphi
przy użyciugcd
formuły. Część w parens na końcu zarówno zapisuje wynik do$a
następnej rundy, jak i umieszcza kopię w potoku, co daje wynik niejawny.PowerShell, 112 bajtów
Wypróbuj online!
Mocno zakodowane. Ho-hum.
Krótszy niż mogłem uzyskać podejście matematyczne o około 10-15 bajtów.źródło
Python 2 , 83 bajty
Wypróbuj online!
Kompleksy heurystyczny oszacowanie z sztywno stała, która koryguje każdy oszacowanie jak też
-0
i-1
.źródło
Łuska ,
1017 bajtówWypróbuj online!
Edycja : +7 bajtów do faktycznego odwzorowania funkcji na żądany zakres, zanim była to tylko funkcja obliczająca A003434 .
Wyjaśnienie
Następujące obliczenia A003434 :
m(....)ḣ100
Część tylko map tę funkcję w całym zakresie [2..100], nie wiem, jak brakowało mi tej części przed: Sźródło
PHP, 98 bajtów
Wypróbuj online!
Wszystkie cyfry spakowałem w ciąg binarny. Po rozpakowaniu, przekształceniu go w tablicę, a następnie ponownym scaleniu tablicy, musiałem tylko przygotować 1,2 i dołączyć 6, ponieważ nie pasowałyby lub spowodowały pojawienie się kodu sterującego.
źródło
Perl 6 , 47 bajtów
Wypróbuj online!
źródło
05AB1E , 11 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
C, 112 bajtów
Nie golfowany:
Wypróbuj online!
źródło
Aluminium , 87 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Pyth, 38 bajtów (niekonkurencyjny)
Wypróbuj na Pyth Herokuapp , ponieważ z jakiegokolwiek powodu nie działa on na TIO.
Nie mam wątpliwości, że jawne rozwiązanie Pyth jest mniejsze, ale chciałem zobaczyć, jak mały mógłbym uzyskać kod poprzez skompresowanie sekwencji i chyba nauczyć się Pyth. Wykorzystuje to fakt, że górna granica sekwencji jest
log2(n)+1
.Wyjaśnienie
Skompresowany ciąg otrzymałem przez
Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3
, co jest przeciwieństwem powyższego kodu z kilkoma typami konwersji.źródło
Ohm v2 , 41 bajtów
Wypróbuj online!
Dosłownie całkowicie zakodowany ... Właściwie wziąłem powyższą sekwencję, usunąłem wszystko, co nie było liczbą, zinterpretowałem ją jako podstawę 8, a następnie przekształciłem we wbudowaną reprezentację liczby 255 Ohma. Tak robią cytaty. Następnie program po prostu zamienia to ponownie w bazę 8.
źródło