Wprowadzenie
Dziesiętny kończy się, jeśli ma skończoną liczbę cyfr dziesiętnych. Na przykład 0,4 (2/5) kończy się, ponieważ ma jedną cyfrę dziesiętną.
Liczba dziesiętna jest czysto okresowa, jeśli ma nieskończoną liczbę cyfr dziesiętnych i nie ma cyfr dziesiętnych przed powtórzeniem (część dziesiętna, która się powtarza). Na przykład 0,142857142857142… (1/7) jest czysto okresowa, ponieważ ma powtarzalność 142857, który zaczyna się powtarzać natychmiast po przecinku.
Dziesiętny jest ostatecznie okresowy, jeśli ma nieskończoną liczbę cyfr dziesiętnych i ma skończoną liczbę cyfr dziesiętnych przed powtórzeniem (część dziesiętna, która się powtarza). Na przykład 0.166666666666666… (1/6) jest ostatecznie okresowy, ponieważ jego powtórzenie 6 zaczyna się powtarzać po 1.
Twoje zadanie
Napisz program lub funkcję, która, gdy otrzyma liczby p i q (liczby całkowite, 0 <= p < q <= 100), określi, czy dziesiętna reprezentacja p / q jest zakończona, czysto okresowa czy ewentualnie okresowa.
Musisz wyjście a
czy to kończące (czyli 0,1), b
jeśli jest to czysto Okresowe (czyli 0,333 ...), lub c
jeśli jest to Ostatecznie Okresowe (czyli 0,166 ...), gdzie a
, b
i c
są jakieś wyraźne, stałe ciągi wyboru.
Przypadki testowe
0/1 => Terminating
0/2 => Terminating
1/2 => Terminating
0/3 => Terminating
1/3 => Purely Periodic
2/3 => Purely Periodic
0/4 => Terminating
1/4 => Terminating
2/4 => Terminating
3/4 => Terminating
0/5 => Terminating
1/5 => Terminating
2/5 => Terminating
3/5 => Terminating
4/5 => Terminating
0/6 => Terminating
1/6 => Eventually Periodic
2/6 => Purely Periodic
3/6 => Terminating
4/6 => Purely Periodic
5/6 => Eventually Periodic
0/7 => Terminating
1/7 => Purely Periodic
2/7 => Purely Periodic
3/7 => Purely Periodic
4/7 => Purely Periodic
5/7 => Purely Periodic
6/7 => Purely Periodic
0/8 => Terminating
1/8 => Terminating
2/8 => Terminating
3/8 => Terminating
4/8 => Terminating
5/8 => Terminating
6/8 => Terminating
7/8 => Terminating
0/9 => Terminating
1/9 => Purely Periodic
2/9 => Purely Periodic
3/9 => Purely Periodic
4/9 => Purely Periodic
5/9 => Purely Periodic
6/9 => Purely Periodic
7/9 => Purely Periodic
8/9 => Purely Periodic
0/10 => Terminating
1/10 => Terminating
2/10 => Terminating
3/10 => Terminating
4/10 => Terminating
5/10 => Terminating
6/10 => Terminating
7/10 => Terminating
8/10 => Terminating
9/10 => Terminating
0/11 => Terminating
1/11 => Purely Periodic
2/11 => Purely Periodic
3/11 => Purely Periodic
4/11 => Purely Periodic
5/11 => Purely Periodic
6/11 => Purely Periodic
7/11 => Purely Periodic
8/11 => Purely Periodic
9/11 => Purely Periodic
10/11 => Purely Periodic
0/12 => Terminating
1/12 => Eventually Periodic
2/12 => Eventually Periodic
3/12 => Terminating
4/12 => Purely Periodic
5/12 => Eventually Periodic
6/12 => Terminating
7/12 => Eventually Periodic
8/12 => Purely Periodic
9/12 => Terminating
10/12 => Eventually Periodic
11/12 => Eventually Periodic
0/13 => Terminating
1/13 => Purely Periodic
2/13 => Purely Periodic
3/13 => Purely Periodic
4/13 => Purely Periodic
5/13 => Purely Periodic
6/13 => Purely Periodic
7/13 => Purely Periodic
8/13 => Purely Periodic
9/13 => Purely Periodic
10/13 => Purely Periodic
11/13 => Purely Periodic
12/13 => Purely Periodic
0/14 => Terminating
1/14 => Eventually Periodic
2/14 => Purely Periodic
3/14 => Eventually Periodic
4/14 => Purely Periodic
5/14 => Eventually Periodic
6/14 => Purely Periodic
7/14 => Terminating
8/14 => Purely Periodic
9/14 => Eventually Periodic
10/14 => Purely Periodic
11/14 => Eventually Periodic
12/14 => Purely Periodic
13/14 => Eventually Periodic
0/15 => Terminating
1/15 => Eventually Periodic
2/15 => Eventually Periodic
3/15 => Terminating
4/15 => Eventually Periodic
5/15 => Purely Periodic
6/15 => Terminating
7/15 => Eventually Periodic
8/15 => Eventually Periodic
9/15 => Terminating
10/15 => Purely Periodic
11/15 => Eventually Periodic
12/15 => Terminating
13/15 => Eventually Periodic
14/15 => Eventually Periodic
Można znaleźć wszystkie przypadki testowe tutaj .
Możesz wybrać własne 3 wartości wyjściowe, ale musi być jasne, która z nich jest.
Pamiętaj, że to jest golf golfowy , więc wygrywa kod z najmniejszą liczbą bajtów.
Poradnik
Zakończenie:
Faktoryzacja pierwotna mianownika kończącego dziesiętnego w najprostszej postaci składa się tylko z 2 i 5 s.
Czysto okresowe:
Faktoryzacja pierwotna mianownika czysto okresowego dziesiętnego w najprostszej postaci nie obejmuje żadnych 2s lub 5s.
Ostatecznie okresowe:
Faktoryzacja pierwotna mianownika ostatecznie okresowego dziesiętnego w najprostszej postaci obejmuje co najmniej jedną 2 lub 5, ale obejmuje także inne liczby.
Liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Odpowiedzi:
Galaretka , 10 bajtów
Akceptuje mianownik i licznik (w tej kolejności) jako argumenty. Zwraca 0 za zakończenie, 1 za czysto okresowe i 2 za ewentualnie okresowe. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
JavaScript (ES6),
70..6853 bajtówZwraca 0 za zakończenie, true dla czysto okresowego i false dla ostatecznie okresowego.
Jak to działa
To, co tutaj robimy, polega na ręcznej symulacji podziału:
a?...:0
- Jeśli licznik wynosi zero, zatrzymujemy się tutaj i wracamy0
. Sekwencja się kończy .(s[a]^=a)?...:x==a
- Jeśli już wcześniej spotkałem się z tym licznikiem, oznacza to, że sekwencja jest okresowa i będzie się powtarzać na zawsze. Zatrzymujemy się tutaj i zwracamy albo,true
jeślia
jest równa pierwszej wartościx
sekwencji ( czysto okresowa ), albofalse
jeśli nie jest ( ewentualnie okresowa ).f(a*10%b,b,s,x||a)
- W przeciwnym razie mnożymy licznika
przez 10. Obliczamy pozostałą część podziału przez mianownikb
. Powtarzamy ten proces, używając tej reszty jako nowego licznika. (Podajemy równieża
jako pierwszą wartość sekwencji, jeśli nie jest jeszcze zapisanax
.)Przykład
źródło
Python,
626159 bajtówDrukuje 1 dla ewentualnie okresowego, 2 dla czysto okresowego i 4 dla zakończenia.
Weryfikacji wszystkich przypadków testowych na repl.it .
źródło
*r
zrobić?f(1, *(2, 3), 4)
jest równoważne zf(1, 2, 3, 4)
.f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
in
służy w JS zupełnie innym celom niż w Pythonie):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)
że też zadziałałoby.Perl,
494645 bajtówObejmuje +3 za
-p
Oparty na eleganckim pomyśle Dennisa , ale zrealizowany perfekcyjnie
Podaj liczby wejściowe na STDIN
termninating.pl
:Drukuje 2, jeśli kończy się. 1, jeśli jest okresowy i nic, jeśli ostatecznie
źródło
Partia, 247 bajtów
Używa mojej szybkiej sztuczki gcd10 od frakcji do dokładnej liczby dziesiętnej . Oczywiście mogłem zapisać sporo bajtów, używając niestandardowego formatu wyjściowego.
źródło
@if %d%==1 (echo T)else if %d%==%e% (echo P)else echo E
chcesz zaoszczędzić 42 bajtów?JavaScript (ES6),
91888579757478 bajtówDane wyjściowe
NaN
do zakończenia,1
wyłącznie okresowe iInfinity
ewentualnie okresowe.Testowy fragment kodu
Pokaż fragment kodu
Wyjaśnienie
Po pierwsze, dzielą zarówno n i d o GCD (d, n) , aby zmniejszyć frakcję najprostszej formie. Pozwala nam to uniknąć sytuacji takich jak 2/6, w których wynik byłby w przeciwnym razie obliczany jako czysto okresowy. Definiujemy również zmienną t jako gcd (d, 10) ; zostanie to wykorzystane później.
Pierwsza kontrola dotyczy tego, czy n wynosi 0, czy d wynosi 1 . Jeśli n * (d-1) wynosi 0, zwracamy
+f
lub NaN : ułamek się kończy .Następnym sprawdzeniem jest, czy t wynosi 1 . Jeśli tak, zwracamy 1 : ułamek jest czysto okresowy .
Jeśli t nie jest równe 1 , dzielimy d przez t , uruchamiamy ponownie całą funkcję i dzielimy przez 0. Jeśli n / (d / t) się kończy, to zwraca NaN / 0 = NaN : ułamek się kończy . W przeciwnym razie zwraca 1/0 = Nieskończoność : ułamek jest ostatecznie okresowy .
źródło
Infinity
wszystkie te wartości.n
... Dzięki za zwrócenie na to uwagi.Mathematica, 41 bajtów
Wyprowadzane,
{3,1,2}
jeśli dane wejściowe mają końcowe rozszerzenie dziesiętne,{2,3,1}
jeśli dane wejściowe mają wyłącznie okresowe rozwinięcie dziesiętne i{3,2,1}
jeśli dane wejściowe mają ewentualnie okresowe rozszerzenie dziesiętne.Oparty na podstępnej sztuczce: jeśli
d
mianownik ułamka jest w najniższych kategoriach, to największy wspólny dzielnikd
i10^d
równa się,d
jeślid
ma tylko 2 i 5 w swojej podstawowej faktoryzacji; jest równy,1
jeślid
nie ma ani 2, ani 5 w swojej podstawowej faktoryzacji; i równa się pewnej liczbie całkowitej, jeślid
ma 2s / 5s i inne liczby pierwsze.Ordering
Funkcja po prostu informuje, gdzie najmniejsze, następna najmniejsza, a największe elementy są potrójne, z więzi broken lewej do prawej.Wada: zwraca wariant wyniku
{1,2,3}
zamiast,{3,1,2}
jeśli wejście ma wartość 0.Mathematica, 46 bajtów, perwersja
Zwraca,
a[[1]]
jeśli dane wejściowe mają końcowe rozszerzenie dziesiętne,b[[1]]
jeśli dane wejściowe mają czysto okresowe rozszerzenie dziesiętne ib[a]
jeśli dane wejściowe mają ewentualnie okresowe rozszerzenie dziesiętne. Zgłasza błąd we wszystkich przypadkach!Jak wyżej, chcemy wiedzieć, czy ten największy wspólny dzielnik wynosi 1, d, czy gdzieś pomiędzy. Logarytm base-d tego gcd wynosi 0, 1 lub coś pomiędzy.
Teraz zaczynamy torturować Mathematicę.
b[a][[n]]
oznaczan
th część wyrażeniab[a]
. Więcb[a][[1]]
wracaa
;b[a][[0]]
zwracab
; ab[a][[x]]
gdziex
jest liczbą od 0 do 1, Mathematica zgłasza błąd „Part :: pkspec1: Wyrażeniex
nie może być użyte jako specyfikacja części”. i zwracab[a][[x]]
nieocenione.To już odpowiednio rozróżnia trzy przypadki, z wyjątkiem tego, że wynik dla przypadku ostatecznie okresowego jest taki
b[a][[x]]
, co nie jest stałe, ponieważx
jest faktycznym logarytmem czegoś. Zatem stosujemy się[[1]]
do już opisanych wyników. Ze względu na to, jak Mathematica wewnętrznie reprezentujeb[a][[x]]
, wynikb[a][[x]][[1]]
jest po prostub[a]
. Z drugiej strony zastosowanie[[1]]
doa
wyników powoduje inny błąd „Part :: partd: Specyfikacja części a [[1]] jest większa niż głębokość obiektu.” i zwracaa[[1]]
nieocenione (i podobnie dlab
).Wada: kłamie na temat wejścia 0, zwracając
b[a]
zamiasta[[1]]
.źródło
C 173 bajtów
Pobiera dwie liczby całkowite ze standardowego, drukuje 1 dla czysto okresowego, -1 dla ewentualnie okresowego i 0 dla zakończenia.
Nie golfowany:
Pół golfa:
źródło
Właściwie 15 bajtów
Jest to oparte na odpowiedzi Jelnisa na żelki . 0 kończy się, 1 jest czysto okresowe, a 2 ostatecznie jest okresowe. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!
Ungolfing
źródło
Mathematica, 44 bajty
Zwroty
Null
za zakończenie,True
za okresowo iFalse
ewentualnie okresowo.Wyjaśnienie
Znajdź rozwinięcie dziesiętne N. (powtarzające się cyfry są otoczone dodatkową głową
List {}
).Sprawdź, czy ostatnim elementem rozwinięcia dziesiętnego jest a
List
.Jeśli powyższy warunek jest spełniony
True
, sprawdź, czy całe rozwinięcie dziesiętne składa się z jednej rzeczy. (ZAList
liczy się jako jeden byt). (zwracaTrue
lubFalse
)(Jeśli warunek jest spełniony
False
,Null
to zwracane jest a, ponieważ nie ma trzeciego argumentu zaIf
)źródło
Pyth ,
3127 bajtówWkład
Możesz spróbować tutaj . Drukuje 1 dla ewentualnie okresowego, 2 dla czysto okresowego i 0 dla zakończenia. To jest moja pierwsza odpowiedź w codegolf. Wszelkie sugestie są mile widziane.
Wyjaśnienie
Należy zauważyć, że [2,3] filtrowane według [2,5] = [2], ale [2,3,5] - [2,5] = [3].
źródło
PARI / GP, 64 bajty
Nie wyprowadza nic do zakończenia, 0 dla czysto i 1 dla ewentualnie okresowego.
Niezbyt fantazyjne, kiedy zaczynałem, liczyłem na coś lepszego.
źródło
05AB1E ,
1611 bajtówZaoszczędź 5 bajtów dzięki @Adnan!
Drukuje 0 dla czysto okresowego, 1 dla kończącego i 10 dla ostatecznie okresowego.
Wyjaśnienie:
Wejście przyjmuje się jako p nowy wiersz q .
Wypróbuj online!
źródło
I
. Ponadto stałą predefiniowaną na10
jestT
. To samo dotyczy2B
, co jestb
:).¿²r/fTrÖbÙJ
jako kod końcowy :).PHP, 126 bajtów
Drukuje 0 dla zakończonego i 1 dla czysto okresowego 2 dla ostatecznie. Pozwól mi wyjaśnić, czy licznik jest dwa razy w tablicy tutaj rozpoczyna sesję okresową, jeśli zostanie zakończona,
echo end($a);
wartość wynosi0
Jeśli nie ufasz mi umieścić$t=count($a)>$d?2:0;
w pętliAby było to bardziej jasne, dodaj
print_r($a);
lubvar_dump($a);
lubjson_encode($a);
po pętlimożesz zobaczyć jeden licznik dwa razy lub zero na końcu tablicy, jeśli licznik jest dwa razy policz elementy między tymi dwoma elementami i możesz uzyskać długość okresu i możesz zobaczyć pozycję według pierwszego licznika, od którego zaczyna się okres
Po tym możemy znaleźć pozycję i długość sekwencji okresowej za pomocą
if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}
Wizualizuj czasopismo
Dane wyjściowe wizualizują okres
Innym sposobem jest 130 bajtów
Wersja rozszerzona
źródło
[3,30,35,32,2,20,41,39,19,31,45,26,48,3]