W dziesiętnej reprezentacji każdej liczby wymiernej p/q
masz okresowy ogon, nieokresową głowę i sekcję przed przecinkiem w następującym formacie:
(before decimal point).(non-periodic)(periodic)
Niektóre przykłady obejmują:
1/70 = 0.0142857... = (0).(0)(142857)
10/7 = 1.428571... = (1).()(428571) ## no non-periodic part
1/13 = 0.076923... = (0).()(076923)
3/40 = 0.075 = (0).(075)() ## no periodic part
-2/15 = -0.13... = -(0).(1)(3) ## negative
75/38 = 1.9736842105263157894... = (1).(9)(736842105263157894)
## periodic part longer than float can handle
25/168 = 0.148809523... = (0).(148)(809523)
120/99 = 40/33 = 1.212121... = (1).()(21)
2/1 = 2 = (2).()() ## no periodic, no non-periodic
0/1 = 0 = (0).()()
0/2 = 0 = (0).()()
299/792 = 0.37752... = (0).(377)(52)
95/-14 = -6.7857142... = -(6).(7)(857142)
-95/-14 = 6.7857142... = (6).(7)(857142)
Wyzwanie polega na zamianie części okresowych i nieokresowych, pozostawiając w before decimal point
spokoju, aby utworzyć nową liczbę. Na przykład:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
Jeśli liczba nie ma części okresowej, takiej jak 0.25
zamień ją na nową liczbę okresową i odwrotnie.
1/4 = 0.25 = (0).(25)() => (0).()(25) = 0.252525... = 25/99
4/9 = 0.444444... = (0).()(4) => (0).(4)() = 0.4 = 2/5
5/1 = 5 = (5).()() => (5).()() = 5 = 5/1
Wyzwanie
- Weź ułamek
x
jako dane wejściowe, ciąg znaków, dwa dane wejściowe, liczbę wymierną lub dowolną metodę odpowiednią dla twojego języka. - Zamień okresowe i nieokresowe części reprezentacji dziesiętnej na,
x
aby utworzyć nową liczbę, pozostawiając tę część przed samą dziesiętną. Część okresowa rozpoczyna się zawsze tak szybko, jak to możliwe, aby część nieokresowa była jak najkrótsza. Przykłady są poniżej. - Zwraca zamienioną liczbę jako nową część. Wejście niekoniecznie jest zmniejszone, chociaż wyjście powinno być. Format wejściowy może różnić się od formatu wyjściowego.
- Licznik
p
stanowix
będzie liczbą całkowitą o wartości bezwzględnej milion lub mniej i mianownikaq
dox
będzie niezerowy całkowitą o wartości bezwzględnej milion lub mniej. - Licznik
r
i mianowniks
wyniku nie jest gwarantowany na mniej niż milion. Biorąc pod uwagę długość okresowych części tych liczb, zaleca się unikanie bezpośredniej konwersji na liczby zmiennoprzecinkowe. - To jest kod golfowy. Najkrótsza odpowiedź w bajtach wygrywa.
Przykłady
1/70 = (0).(0)(142857) => (0).(142857)(0) = (0).(142857)() = 0.142857 = 142857/1000000
10/7 = (1).()(428571) => (1).(428571)() = 1.428571 = 1428571/1000000
1/13 = (0).()(076923) => (0).(076923)() = 0.076293 = 76923/1000000
3/40 = (0).(075)() => (0).()(075) = 0.075075... = 75/999 = 25/333
-2/15 = -(0).(1)(3) => -(0).(3)(1) = -0.311111... = -28/90 = -14/45
75/38 = (1).(9)(736842105263157894)
=> (1).(736842105263157894)(9) = (1).(736842105263157895)() ## since 0.999... = 1
= 1.736842105263157895 = 1736842105263157895/1000000000000000000
= 347368421052631579/200000000000000000
25/168 = (0).(148)(809523) => (0).(809523)(148) = 0.809523148148... = 870397/1080000
120/99 = (1).()(21) => (1).(21)() = 1.21 = 121/100
2/1 = (2).()() => (2).()() = 2 = 2/1
0/1 = (0).()() => (0).()() = 0 = 0/1
0/2 = (0).()() => (0).()() = 0 = 0/1
299/792 = (0).(377)(52) => (0).(52)(377) = 0.52377377... = 2093/3996
95/-14 = -(6).(7)(857142) => -(6).(857142)(7) = -6.857142777... = -12342857/1800000
-95/-14 = (6).(7)(857142) => (6).(857142)(7) = 6.857142777... = 12342857/1800000
code-golf
math
number
rational-numbers
Sherlock9
źródło
źródło
0
końcu przypadku testowego 2 (10/7
) brakuje :1428571/100000
powinno być1428571/1000000
.1/7
może być reprezentowane(0).()(142857)
lub(0).(1)(428571)
,1
mogą być reprezentowane(1).()()
,(0).()(9)
,(0).()(99)
,(0).(9)(9)
, itd.Odpowiedzi:
Python 2, 292 bajty
Wersja bez golfa, działa zarówno w Pythonie 2, jak i 3. Drukuje również reprezentację dziesiętną.
źródło
d=10**len(p+a)
if n==0: p=''
, wykorzystania``
w każdym miejscu, którego używaszstr
, jak`n/d`
zamiaststr(n/d)
i zmiany nazwylen
naL
zL=len;
na początku funkcji.n=int(b+p+a);d=10**L(p+a)
iimport fractions as f;g=f.gcd(n,d);return(n/g*s,d/g)
. Dostaję również 295 bajtów na bieżącą edycję. Czy jest jakaś nowa linia, o której zapominasz pominąć?Galaretka ,
1021018987838179787774 bajtówTrwało to zbyt długo, aby pisać, zdecydowanie zbyt długo, aby debugować, i zdecydowanie wymaga dużo gry w golfa (
osiem siedem sześćpięćczterech linków, święta krowa), ale zgodnie z moją najlepszą wiedzą jest poprawne. Bardzo, bardzo dziękuję Dennisowi za jego pomoc tutaj, szczególnie z pierwszymi dwoma linkami. Ogromne podziękowania dla Rainera P., ponieważ ostatecznie pożyczyłem dużo algorytmu w odpowiedzi na Python.Edycja gry w golfa: -1 bajt dzięki Xanderhall. Naprawiono błąd związany z niepoprawnym użyciem wbudowanego logicznego NIE. -13 bajtów od gry w golfa w łączach licznika. +1 bajt od naprawienia błędu za negatywny
d
dzięki Dennisowi. Zrestrukturyzowano łącza, tak aby generowanie licznika odbywało się w jednym łączu. -2 bajty z połączenia drugiego i trzeciego łącza. -4 bajty od przeniesienia niektórych wspólnych elementów trzeciego i czwartego łącza do drugiego i głównego łącza. -2 bajty z usunięcia niektórych niepotrzebnych operatorów łańcuchowych. -2 bajty od zmiany układu łącza licznika. -1 bajt od przejściaḢ€
do końca drugiego łącza. Naprawiono błąd w głównym linku. -1 bajt ze zmianyṪ ... ,Ḣ
naḢ ... ṭ
. -3 bajty od przeniesienia łącza licznika do łącza głównego.Zapraszamy do gry w golfa! Wypróbuj online!
Wyjaśnienie
Najpierw wyjaśnię główny link , który wywołuje inne linki.
Następnie pierwszy link, który pobiera cyfry.
Teraz drugi link, który pobiera okresowe i nieokresowe części
n/d
oraz wiele innych ciężkich ładunków.Trzecie ogniwo , które daje nasz nowy mianownik.
źródło