Napisz program lub funkcję, która podała dwie liczby całkowite a, b, wyprowadza ciąg zawierający liczbę dziesiętną dokładnie reprezentującą ułamek a / b .
Jeśli a / b jest liczbą całkowitą, po prostu wypisz wartość bez kropki dziesiętnej ani zer wiodących:
123562375921304812375087183597 / 2777 -> 44494913907563850333124661
81 / 3 -> 27
-6 / 2 -> -3
Jeśli a / b nie jest liczbą całkowitą, ale ma skończoną reprezentację w podstawie 10, wypisz wartość bez wiodących lub końcowych zer (z wyjątkiem pojedynczego zera przed kropką):
1 / 2 -> 0.5
3289323463 / -250000000 -> -13.157293852
Wreszcie, jeśli i tylko wtedy, gdy (a więc nie 0.999...
) a / b nie jest liczbą całkowitą i nie ma skończonej reprezentacji, wypisz część skończoną, a następnie część powtarzającą się w nawiasie. Powtarzająca się część musi być tak mała, jak to możliwe, i rozpocząć jak najwcześniej.
-1 / 3 -> -0.(3)
235 / 14 -> 16.7(857142)
123 / 321 -> 0.(38317757009345794392523364485981308411214953271028037)
355 / 113 -> 3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168)
Twój program musi działać dla wszystkich powyższych przykładów w mniej niż 10 sekund na nowoczesnym komputerze stacjonarnym. Najmniejszy program w bajtach wygrywa.
Odpowiedzi:
Perl 6 ,
63 5850 bajtówSprawdź to
Jeśli nie przejmujesz się, że będzie działać tylko z mianownikami pasującymi do 64-bitowej liczby całkowitej, można go skrócić do zaledwie 43 bajtów:
Rozszerzony:
źródło
Python 2, 174 bajty
Nie jestem do końca przekonany co do ważności tej odpowiedzi, ale zadziałała ona dla powyższych przypadków testowych i innych przypadków testowych, które na nią rzuciłem. Wygląda to na porządny bałagan, więc jestem pewien, że jest dużo miejsca na grę w golfa.
Początkowa konfiguracja przyjmuje wartości bezwzględne obu argumentów, aby upewnić się, że mamy do czynienia z liczbami nieujemnymi (zapisując obliczenia znaku na później), i deleguje część ilorazową wyniku do arytmetyki arbitralnej precyzji Pythona. Część ułamkowa jest wykonywana za pomocą algorytmu podziału na klasy, dopóki nie otrzymamy powtórzenia w pozostałej części. Następnie patrzymy w górę, kiedy ostatnio widzieliśmy to powtórzenie, aby uzyskać kropkę, i odpowiednio konstruujemy ciąg.
Zauważ, że algorytm jest dość powolny z powodu operacji O (n)
in
, ale jest wystarczająco szybki dla przykładów.źródło
Partia,
349344 bajtówEdycja: Zapisano 5 bajtów, usuwając niepotrzebne znaki. „Niegolfowany”:
źródło
set /a
.Java,
625605Kod do gry w golfa:
Uwaga: Liczę import statyczny jako część funkcji do gry w golfa.
Ta funkcja zaczyna się od uzyskania wyniku podziału. Dodaje integralną część i znak, jeśli to konieczne. Następnie, jeśli pozostała część, dokonuje podstawowego podziału 10 długiego. Na każdym kroku wykonaj podział. Przechowuj obliczoną cyfrę, a resztę na dwóch listach. Jeśli napotkamy tę samą cyfrę i resztę ponownie, nastąpi powtórzenie części i wiemy, od jakiego indeksu zaczyna. Kod albo dodaje cyfry (bez powtórzenia), albo cyfry z powtórzenia, a następnie powtórzone cyfry ujęte w nawiasy.
Jest to nieco duże, głównie z powodu
BigInteger
. Jeśli dane wejściowe nawet się nie przelałylong
, może być nieco krótszy. Mimo to oczekuję, że istnieją sposoby na ulepszenie tego wpisu.Nieskluczony kod z główną metodą testowania:
Wyjście programu:
źródło
a, BigInteger
. Myślę też, że możesz pseudonimBigInteger.TEN
iBigInteger.ZERO
.while (true)
->,for (;;)
które pozwoliły mi również wstawić różne rzeczy dofor
inicjalizatora, oszczędzając kolejny bajt.BigInteger
w moim kodzie jest osiem wystąpień tekstu i nie widzę, jak warto dodać więcej kodu, aby zmniejszyć je do nazwy klasy jednoznakowej. I z pewnością dodanie kodu do obsługiint[]
(co BigInteger już robi wewnętrznie) spowoduje tylko wzdęcie mojej odpowiedzi.BigInteger
metodę nazywam powrócić instancję podklasy, będę musiał dodać kilka odlewane co dodatkowo uwędzić kod. Oprócz zmarnowanych bajtów narzutu podklasy, to z pewnością zwiększyłoby rozmiar kodu.PHP, 277 bajtów
źródło
Mathematica 198 bajtów
UnGolfed
Testy
{„27”, „-27”, „0,25”, „-4. (3)”, „2. (714285)”, „131572.93852”, „16,7 (857142)”, „94,6 (428571)”}
źródło