Utwórz funkcję, która przyjmuje liczbę naturalną (zaczynając od 0 włącznie) i zwraca parę dodatnich liczb całkowitych, które są odpowiednio licznikiem i mianownikiem. Użyj ukośnego przejścia. Liczby wcześniej policzone muszą zostać pominięte. (możesz zapamiętać zestaw pominiętych wartości)
Diagram:
Czerwone są pomijanymi wartościami
Wartości:
- f (0) = 1, 1
- f (1) = 2, 1
- f (2) = 1, 2
- f (3) = 1, 3
- f (4) = 3, 1 (zauważ pominięcie)
- f (5) = 4, 1
- f (6) = 3, 2
- f (7) = 2, 3
- f (8) = 1, 4
- f (9) = 1, 5
- f (10) = 5, 1 (zauważ pominięcie)
Możesz użyć struktury danych Rational i ich operacji, jeśli istnieją. Najkrótszy kod wygrywa.
code-golf
rational-numbers
Ming-Tang
źródło
źródło
Odpowiedzi:
J,
4136 znakówPobiera liczby całkowite i zwraca wektor zawierający dwie liczby całkowite. Moje pierwsze rozwiązanie, które nie jest całkowicie milczące ani całkowicie jednoznaczne.
Oto rozwiązanie z wstawionymi spacjami w stosownych przypadkach:
Wyjaśnienie:
x (, % +.) y
– Wektor długości 2 reprezentujący ułamek z licznikiemx
i mianownikiemy
zredukowany do najmniejszego mianownika1 + i. 1 + y
– Wektor liczb całkowitych od1
doy + 1
(, % +.)"0/~ 1 + i. 1 + y
–Macierz wszystkich zredukowanych frakcji o nieredukowanym mianowniku i liczniku w zakresie od1
doy + 1
.<`(<@|.)/. y
–Macierz ukośnych przekątnych matrycyy
, wzajemnie odwróconych względem siebie~. ; y
–Macierz przekątnych zwinął się w wektor elementów z usuniętymi duplikatamix { y
–Pozycja na pozycjix
wy
(u v) y
–Takie jaky u v y
. W tym konkretnym przypadku użyciau
jest{
iv
jest3 : '~. ; <`(<@|.)/. (, % +.)"0/~ 1 + i. 1 + y'
źródło
Haskell, 78 znaków
Przykładowy przebieg:
cycle
i funkcje do naprzemiennej kolejności wierszycycle
ręcznie stworzoną nieskończoną listąd
gcd
tożsamość zgodnie z sugestią Matíasaźródło
gcd (r-b) b == gcd r b
możesz ogolić cztery kolejne postacie.Python, 144 znaki
źródło
Ruby 1.9,
109106źródło
OCaml + Baterie,
182168 znakówOto, co byłoby naturalne w Haskell, ale jest prawie niemożliwe w OCaml:
Edycja: przekątna jest niepotrzebna
źródło
Perl 6 , 75 bajtów
Sprawdź to
Generalnie generuje to całą sekwencję wartości wymiernych, zatrzymując się dopiero po wygenerowaniu wartości indeksowanej.
(Na podstawie mojego golfa do innego wyzwania.)
Rozszerzony:
({1…($+=2)…1}…*)
generuje nieskończoną sekwencję liczników (|(…)
służy do spłaszczania powyżej)(1,{1…(($||=1)+=2)…1}…*)
generuje nieskończoną sekwencję mianownikówźródło