Twoim zadaniem jest dane x
wyjście 2*x
. Łatwe, prawda !? Ale jest pewien haczyk: x
zostanie podany jako (być może nieskończony) ciągły ułamek , a wyjście musi być ułamkiem ciągłym. Dane wejściowe są gwarantowaną rzeczywistą liczbą algebraiczną, której stopień wynosi co najwyżej 2.
Wkład : ciągły ułamek x
. Jest on podzielony na 3 części: część całkowitą, przedrostek i część powtarzającą się. Część całkowita składa się z jednej liczby całkowitej. Przedrostek i powtarzająca się część są (być może pustymi) tablicami liczb całkowitych dodatnich, które opisują przedrostek i powtarzającą się część ciągłej części. Na przykład dane wejściowe (3, [1], [2, 4])
reprezentują ciągły ułamek [3; 1, 2, 4, 2, 4, ...]
.
Jeśli powtarzająca się część jest pusta, oznacza to liczbę wymierną. Na przykład (3, [1, 2], [])
reprezentuje [3; 1, 2] = 11/3
. Musisz zaakceptować obie formy liczby wymiernej (tzn. (3, [1, 1, 1], [])
Która [3; 1, 1, 1] = 11/3
powinna być również poprawnym wejściem).
Wyjście : wyjście ciągłego ułamka dwukrotności wejścia, w tym samym formacie co wejście. Jeśli dane wyjściowe są racjonalne, możesz wypisać dowolną formę ciągłego ułamka. Tak długo, jak odpowiedź jest odpowiednikiem poprawnej, jest w porządku; „kompresja” nie jest konieczna, więc nieskończona część może być „rozwinięta” nieco (np. [1; 4, 2, 3, 2, 3...]
może zostać napisana (1, [4], [2, 3])
lub (1, [4, 2, 3], [2, 3])
). Wszystkie odpowiedzi muszą być dokładne.
Przypadki testowe : Dokładna kolumna formularza jest podana dla wygody.
Input Exact Form Output
(0, [] []) 0 (0, [] []) or (-1, [1], [])
(-5, [1, 1], []) -4.5 (-9, [], []) or (-10, [1], [])
(3, [1, 2], []) 11/3 (7, [3], []) or (7, [2, 1], [])
(1, [], [2]) sqrt(2) (2, [], [1, 4])
(-1, [2], [2, 1]) -1/sqrt(3) (-2, [1, 5], [2, 6])
I wreszcie nieco większy przypadek testowy, aby zapewnić precyzję: (0, [1], [6, 1, 3, 1, 42, 1, 3, 1, 6, 2]) --> (1, [], [1, 2, 1, 8, 1, 20, 1, 8, 1, 2, 1, 2])
.
Najkrótszy kod wygrywa!
Wskazówka : Możesz wykonywać arytmetykę w dość prosty sposób na ciągłych ułamkach, jak opisano tutaj . Podwojenie ciągłego ułamka jest tylko specjalnym przypadkiem tego algorytmu (choć trudną częścią może być znalezienie, kiedy ciągły ułamek powtarza się).
źródło
Sqrt[2]
.[3; 1, 1, 1]
byłby(3, [1, 1, 1], [])
w formacie wejściowym, którego używamy - więc pytanie powinno prawdopodobnie zawierać wzmiankę o tym formacie (w trzecim akapicie), aby zapewnić przejrzystość.(-2, [1, 5, 2], [6, 2])
dane wyjściowe byłyby do przyjęcia(-1, [2], [2, 1])
? Jak o(-2, [1, 5, 2, 6, 2, 6], [2, 6])
?Odpowiedzi:
Wolfram Language (Mathematica) , 44 bajty
Wypróbuj online!
Mathematica ma wbudowane! Tak! Wbudowane oprogramowanie Mathematica jest bardzo długie. Aww.
Ciągłe ułamki Mathematiki wyglądają
{integer, ...prefix, {...repeating}}
-1 dzięki JungHwan Min
źródło
*
ponieważ domyślnym ogranicznikiem Mathematiki, jeśli nie jest, jestTimes
.JavaScript (ES6), 267 bajtów
Akceptuje 3 argumenty (n = część całkowita, f = przedrostek, r = część powtarzająca się). Wysyła trzy części z tablicy. Wypróbuj online!
Wyjaśnienie
Jest to dość bezpośrednia implementacja algorytmu obliczania ciągłej arytmetyki ułamkowej powiązanej z wyzwaniem tutaj . Powtarzające się terminy są obsługiwane przez przechowywanie pośrednich macierzy w tabeli odnośników, czekanie na duplikat i generowanie terminów do następnego pojawienia się tego duplikatu. Jest nieelegancki i prawie podwaja bajty potrzebne do obsługi ciągłych frakcji, ale nie mogłem wymyślić lepszej alternatywy.
Termin wiodący jest obliczany osobno, aby zapewnić, że ujemne ciągłe frakcje zachowują wartości dodatnie dla wszystkich terminów z wyjątkiem pierwszego.
Aby uniknąć fałszywych alarmów, gdy w oczekiwaniu na powtarzającym się cyklu, przechowuje tablicę przeglądową danych, jak następuje:
<index of input repeating part><delimiter><matrix values>
.Zauważ, że wersja golfowa używa
eval
do zapisania 1 bajtu.źródło