Zainspirowany tym pytaniem z Matematyki .
Problem
Niech
n
będzie liczbą naturalną≥ 2
. Weź największy dzielnikn
- który różni się odn
siebie - i odejmij gon
. Powtarzaj, aż dostaniesz1
.
Pytanie
Ile kroków trzeba osiągnąć, 1
aby uzyskać określoną liczbę n ≥ 2
.
Szczegółowy przykład
Let
n = 30
.
Największy dzielnik:
1. 30 is 15 --> 30 - 15 = 15
2. 15 is 5 --> 15 - 5 = 10
3. 10 is 5 --> 10 - 5 = 5
4. 5 is 1 --> 5 - 1 = 4
5. 4 is 2 --> 4 - 2 = 2
6. 2 is 1 --> 2 - 1 = 1
To trwa 6 kroków do osiągnięcia 1
.
Wejście
- Dane wejściowe to liczba całkowita
n
, gdzien ≥ 2
. - Twój program powinien obsługiwać wprowadzanie danych do maksymalnej wartości całkowitej języka.
Wynik
- Po prostu wypisz liczbę kroków, takich jak
6
. - Wiodące / końcowe białe znaki lub znaki nowej linii są w porządku.
Przykłady
f(5) --> 3
f(30) --> 6
f(31) --> 7
f(32) --> 5
f(100) --> 8
f(200) --> 9
f(2016^155) --> 2015
Wymagania
- Możesz uzyskać dane wejściowe z
STDIN
argumentów wiersza poleceń jako parametry funkcji lub z najbliższego odpowiednika. - Możesz napisać program lub funkcję. Jeśli jest to funkcja anonimowa, podaj przykład jej wywołania.
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
- Standardowe luki są niedozwolone.
Tę serię można również znaleźć w OEIS: A064097
Quasi-logarytm zdefiniowany indukcyjnie przez
a(1) = 0
ia(p) = 1 + a(p-1)
jeślip
jest liczbą pierwszą ia(n*m) = a(n) + a(m)
jeślim,n > 1
.
code-golf
math
arithmetic
wstawić nazwę tutaj
źródło
źródło
2^32 - 1
. Reszta zależy od Ciebie i Twojego systemu. Mam nadzieję, że o to ci chodziło z pytaniem.Odpowiedzi:
Galaretka , 9 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
tło
Definicja sekwencji A064097 implikuje, że
Według formuły produktu Eulera
gdzie φ oznacza funkcję całkowitą Eulera, a p zmienia się tylko w liczbach pierwszych.
Łącząc oba, dedukujemy właściwość
gdzie ω oznacza liczbę różnych czynników pierwszych n .
Stosując wynikową formułę k + 1 razy, gdzie k jest wystarczająco duże, aby φ k + 1 (n) = 1 , otrzymujemy
Z tej właściwości otrzymujemy wzór
gdzie zachowana jest ostatnia równość, ponieważ ω (1) = 0 .
Jak to działa
źródło
05AB1E ,
1311 bajtówKod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
[¼Ñü-¤ÄD#]¾
- Byłem blisko ogolenia bajtu parami, no cóż ...[Ð#Ò¦P-¼]¾
.Ð
jest lepszy niżDD
.Pyth, 11 bajtów
Zestaw testowy
Prosta pętla powtarzania aż do prawdziwej.
Wyjaśnienie:
źródło
f
ilter.f
?f
bez drugiego argumentu dokonuje iteracji po wszystkich dodatnich liczbach całkowitych, zaczynając od1
i zwraca pierwszą wartość, która daje wartość true w wewnętrznej instrukcji. Ta wartość jest nieużywana w tym programie, więc zwraca liczbę uruchomień. Nieudokumentowane, po prostu niekonwencjonalne :) Jeśli to pomoże, możesz myśleć o tym jak ofor
pętli:for(int i=1; some_condition_unrelated_to_i; i++) { change_stuff_that_affects_condition_but_not_i;}
f <l:T> <none>
),f
to pierwsze wejście gdzieA(_)
jest truthy over[1, 2, 3, 4...]
.Python 2,
5049 bajtówTo nie zakończy tego ostatniego przypadku testowego w najbliższym czasie ...
Alternatywnie, oto 48-bajtowy, który zwraca
True
zamiast1
dlan=2
:źródło
Galaretka , 10 bajtów
Wypróbuj online! lub zweryfikuj większość przypadków testowych . Ostatnie przypadki testowe kończą się szybko lokalnie.
Jak to działa
źródło
Siatkówka , 12
Zakłada się, że dane wejściowe są podawane w postaci jednoargumentowej, a dane wyjściowe w postaci dziesiętnej. Jeśli nie jest to do przyjęcia, możemy to zrobić dla 6 bajtów więcej:
Retina , 18 lat
Wypróbuj online - dodano 1 linię, aby uruchomić wszystkie przypadki testowe za jednym razem.
Niestety do obliczeń wykorzystuje się jedno, więc wprowadzenie danych z 2016 r. 155 nie jest praktyczne.
1
sźródło
\b
.Pyth -
151413 bajtówSpecjalna obudowa
1
naprawdę mnie zabija.Wypróbuj online tutaj .
źródło
1
?1
jest[]
, co powoduje błąd, gdy biorę pierwszy element. Muszę to zrobić w specjalnym przypadku, aby powrócił1
ponownie, aby punkt.u
stały się skończył. Znalazłem lepszy sposób niż.x
try-wyjątkiem, co uratowało mi te 2 bajty..u
ustalony punkt w końcu sięgnie1
po wszystkie dane wejściowe, w którym to momencie będzie musiał być umieszczony w specjalnej obudowie.JavaScript (ES6),
* 4438Edytuj 6 bajtów zapisanych dzięki @ l4m2
(* 4 strikowane to nadal 4)
Funkcja rekurencyjna
Mniej golfa
Test
źródło
f=(n,d=n)=>n>1?n%--d?f(n,d):f(n-d)+1:0
?Mathematica, 36 bajtów
Funkcja bez nazwy przyjmuje te same bajty:
Jest to bardzo prosta implementacja definicji jako funkcji rekurencyjnej.
źródło
Oktawa,
595855 bajtówPrzykładowe przebiegi:
źródło
end
niezbędna w oktawie?Haskell, 59 bajtów
Stosowanie:
Może być trochę nieefektywny w przypadku dużych liczb ze względu na generowanie listy.
źródło
<1
==0
f 1=0;f n=1+f(n-last[a|a<-[1..n
2],mod n a<1])
Julia,
56504539 bajtówJest to funkcja rekurencyjna, która przyjmuje liczbę całkowitą i zwraca liczbę całkowitą.
Nie golfowany:
Wypróbuj online! (obejmuje wszystkie przypadki testowe)
Zaoszczędzono 6 bajtów dzięki Martinowi Büttnerowi i 11 dzięki Dennisowi!
źródło
PowerShell v2 +, 81 bajtów
Najsilniejsza z brutalnej siły.
Pobiera dane wejściowe
$a
, wchodzi wfor
pętlę, aż$a
będzie mniejsza lub równa1
. W każdej pętli przechodzimy przez kolejnąfor
pętlę, która odlicza czas$a
do znalezienia dzielnika (!($a%$i
). W najgorszym przypadku znajdziemy się$i=1
jako dzielnik. Kiedy to zrobimy, zwiększ nasz licznik$j
, odejmij dzielnik$a-=$i
i ustaw się,$i=0
by wyrwać się z wewnętrznej pętli. W końcu osiągniemy stan, w którym zewnętrzna pętla jest fałszywa (tzn.$a
Osiągnęła1
), więc wyjście$j
i wyjście.Uwaga : Zajmie to dużo czasu w przypadku większych liczb, zwłaszcza liczb pierwszych. Wejście 100 000 000 zajmuje ~ 35 sekund na moim laptopie Core i5. Edycja - właśnie przetestowałem
[int]::MaxValue
(2 ^ 32-1) i zajęło ~ 27 minut. Nie jest tak źle, jak sądzę.źródło
Matlab, 58 bajtów
źródło
Japt , 12 bajtów (niekonkurujące)
Przetestuj online! Nie konkuruje, ponieważ korzysta z wielu funkcji, które zostały dodane po opublikowaniu wyzwania.
Jak to działa
Ta technika została zainspirowana odpowiedzią 05AB1E . Użyto poprzedniej wersji
²¤
(odepchnij 2, odetnij pierwsze dwa elementy) zamiast,Å
ponieważ jest on o jeden bajt krótszy niżs1
(zwróć uwagę na spację); Zrozumiałem dopiero po tym, że ponieważ dołącza on 2 do końca tablicy i wycina od początku , w rzeczywistości nie działa na żadnej nieparzystej liczbie złożonej, chociaż działa na wszystkich podanych przypadkach testowych.źródło
Python 3,
75, 70, 67 bajtów.Jest to dość proste rozwiązanie rekurencyjne. Zajmowanie bardzo dużej liczby przypadków testowych zajmuje BARDZO dużo czasu.
źródło
> <>, 32 bajty
Oczekuje liczby wejściowej
n
na stosie.Ten program buduje pełną sekwencję na stosie. Ponieważ jedyną liczbą, która może do tego doprowadzić,
1
jest2
budowanie sekwencji po jej2
osiągnięciu. Powoduje to również, że rozmiar stosu jest równy liczbie kroków, a nie liczbie kroków +1.źródło
Rubinowy, 43 bajty
Znajdź najmniejszą liczbę
i
, którax
dzielix-i
i powtarzaj, aż dotrzemy1
.źródło
Haskell, 67 bajtów
Oto kod:
Oto jeden z powodów, dla których Haskell jest niesamowity:
Tak, w Haskell możesz zdefiniować
-->
równoważność==
.źródło
Matlab, 107 bajtów
źródło
MATL,
1716 bajtówWypróbuj online
Wyjaśnienie
źródło
C99,
6261 bajtów1 bajt golfowany przez @Alchymist.
Wywołaj jako f (x, i y), gdzie x to wejście, a y to wyjście.
źródło
Julia,
3936 bajtówWypróbuj online!
źródło
Clojure,
116104 bajtów-12 bajtów poprzez filtrowanie zakresu w celu znalezienia wielokrotności, a następnie użycie
last
jednego, aby uzyskać największyNaiwne rozwiązanie, które w zasadzie rozwiązuje problem w sposób opisany przez PO. Niestety znalezienie samego największego dzielnika zajmuje około połowy użytych bajtów. Przynajmniej powinienem mieć stąd dużo miejsca do gry w golfa.
Grał w golfa i testował:
źródło
Perl 6 , 35 bajtów
Wypróbuj online!
Jak to działa
źródło
Pyth,
1716 bajtówWypróbuj online! (Na
y.v
końcu jest wywołanie funkcji)Oryginalne 17 bajtów:
Wypróbuj online! (Na
y.v
końcu jest wywołanie funkcji)(Właściwie odpowiedziałem na to pytanie w tym programie Pyth.)
źródło
u
prawdopodobnie jest ona krótsza niż rzeczywista rekurencja.Pyke, 11 bajtów (niekonkurencyjny)
Wykorzystuje to nowe zachowanie, w którym jeśli po goto pojawi się wyjątek, przywraca on stan sprzed goto (z wyjątkiem definicji zmiennych) i kontynuuje. W tym przypadku jest to równoważne z następującym kodem python:
Wszystko to jest możliwe przy użyciu Pyke bez konstrukcji pętli while - tak, goto!
Wypróbuj tutaj!
źródło
JavaScript (ES6),
7054 bajtówImplementacja podanej formuły rekurencyjnej, ale teraz zaktualizowana, aby użyć rekurencji również w celu znalezienia dzielnika.
źródło
Perl, 57 + 1 (
-p
flaga) = 58 bajtówStosowanie:
Nie golfowany:
źródło
Clojure,
9896 bajtówsłuży
for
:when
do znajdowania największego dzielnika, pętle, dopóki nie zostanie znaleziona taka wartość większa niż jeden.źródło