Wszyscy wiemy, że ilekroć liczba wymierna jest zapisywana dziesiętnie, wynik kończy się albo (ewentualnie) jest okresowy. Na przykład, gdy liczba 41/42 jest zapisywana dziesiętnie, wynikiem jest
0.9 761904 761904 761904 761904 761904 761904 761904 ...
z początkową sekwencją cyfr, 0.9
a następnie sekwencją 761904
powtarzaną w kółko. (Wygodnym zapisem jest 0.9(761904)
to, gdy nawiasy otaczają blok powtarzających się cyfr).
Twoim celem w tym wyzwaniu jest pobranie dodatniej liczby wymiernej, usunięcie pierwszej cyfry wchodzącej w skład powtarzalnej sekwencji i zwrócenie wynikowej liczby wymiernej. Na przykład, jeśli zrobimy to do 41/42, otrzymamy
0.9 61904 761904 761904 761904 761904 761904 761904 ...
lub 0.9(619047)
w skrócie, czyli 101/105.
Jeśli liczba wymierna ma końcowe rozszerzenie dziesiętne, tak jak 1/4 = 0.25
, nic nie powinno się wydarzyć. Możesz myśleć o 1/4 zarówno jako, jak 0.250000000...
i tak, 0.249999999...
ale w każdym przypadku usunięcie pierwszej cyfry powtarzającej się części pozostawia liczbę bez zmian.
Detale
- Dane wejściowe to dodatnia liczba wymierna, albo jako para dodatnich liczb całkowitych reprezentujących licznik i mianownik, lub (jeśli twój język na to pozwala i chcesz) jako jakiś obiekt liczby wymiernej.
- Wynik jest również liczbą wymierną, również w dowolnej formie. Jeśli wynikiem jest liczba całkowita, możesz zwrócić liczbę całkowitą zamiast liczby wymiernej.
- Jeśli weźmiesz parę liczb jako dane wejściowe, możesz założyć, że są względnie pierwsze; jeśli tworzysz parę liczb jako wynik, musisz uczynić je względnie pierwszymi.
- Uważaj, aby znaleźć pierwszą cyfrę rozpoczynającą powtarzający się blok. Na przykład można napisać 41/42 jako,
0.97(619047)
ale to nie czyni0.97(190476)
poprawnej odpowiedzi 2041/2100 (z rozszerzeniem dziesiętnym ). - Możesz założyć, że na otrzymywanym wejściu pierwsza cyfra okresowa znajduje się po przecinku, co oznacza
120/11
=10.909090909...
nieprawidłowe wejście: (jej pierwszą cyfrą okresową może być0
in10
). Na podstawie takich danych możesz zrobić co chcesz. - To jest golf golfowy : wygrywa najkrótsze rozwiązanie.
Przypadki testowe
41/42 => 101/105
101/105 => 193/210
193/210 => 104/105
104/105 => 19/21
1/3 => 1/3
1/4 => 1/4
2017/1 => 2017/1
1/7 => 3/7
1/26 => 11/130
1234/9999 => 2341/9999
źródło
2017
zamiast2017/1
?(2017,1)
.)2/4
zdarzyć na wejściu?120/11
poprawną odpowiedzią111/11
lub210/11
?111/11
z wyjątkiem tego, że w tej chwili powraca najbardziej pozytywna odpowiedź210/11
, więc pozwolę ci wybrać, aby uniknąć unieważnienia istniejących odpowiedzi.Odpowiedzi:
Wolfram Language (Mathematica) , 59 bajtów
Wypróbuj online!
Wyjaśnienie
Znajdź cyfry dziesiętne wejścia.
Jeśli występują powtarzające się cyfry, to
RotateLeft
one. (List@@#
uniemożliwia kodowi obrócenie ostatniej cyfry dziesiętnej, jeśli liczba wymierna się kończy).Konwertuj na wymierne.
źródło
Galaretka ,
36323130 bajtów-1 bajt dzięki Erik the Outgolfer !
Wypróbuj online!
Powinno być poprawne Niedokładność zmiennoprzecinkowa dodaje 3 bajty dla
+.Ḟ
.Polega na tym, że dane wejściowe są nieredukowalne.
Wyjaśnienie
Zależy to od:
n/d
w najprostszej formie. Następnieọ2,5Ṁ
zastosowane łączed
poda liczbę nieokresowych cyfr po punkcie podstawy.źródło
Python 2 ,
237235214 bajtów-21 bajtów dzięki Mr. Xcoder
Wypróbuj online!
Dane wejściowe są wykonywane jako krotka
(numerator, denominator)
; wynik jestfractions.Fraction
obiektem.Wykorzystuje metodę w stylu dzielenia długiego, aby uzyskać początkowe i powtarzające się cyfry odpowiedzi, a następnie przesuwa pierwszą powtarzającą się cyfrę do końca, używa manipulacji ciągiem i
fraction.Fraction
przekształca ją z powrotem na współczynnik.Wersja bez golfa:
źródło
Python 3 ,
177173169 bajtówWypróbuj online!
źródło
Wolfram Language (Mathematica) ,
7067 bajtówDzięki tej wskazówce (teraz usuniętej) dla -3 bajtów!
Wypróbuj online!
Port mojej odpowiedzi na galaretkę . Dłużej niż istniejąca odpowiedź Mathematica o 8 bajtów ...
Funkcja przyjmuje 2 dane wejściowe
[denominator, numerator]
, takie jakGCD[denominator, numerator] == 1
.źródło
Perl 6 , 102 bajtów
Spróbuj
Pobiera liczbę wymierną i zwraca liczbę wymierną lub Int .
Rozszerzony:
Uwaga będzie obsługiwać mianowniki aż do
uint64.Range.max
obsługi większych mianowników.FatRat(9 x$1.chars)
Wypróbuj .źródło