Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą N
, wypisuje sumę pierwszych N
odwrotności jako dokładną część, która jest reprezentowana jako para liczb całkowitych w spójnej kolejności reprezentującej licznik i mianownik.
Zasady
Dane wyjściowe muszą być dokładne.
Dane wyjściowe powinny być jako para liczb całkowitych w spójnej kolejności reprezentującej licznik i mianownik.
Używanie typów liczbowych niecałkowitych (wbudowanych lub biblioteki) jest zabronione.
- Wyjaśnienie / wyjątek: typy liczbowe niecałkowite są w porządku, jeśli i tylko wtedy, gdy wszystkie użyte, obliczone i zwrócone wartości są liczbami całkowitymi (tzn. Twój język domyślnie używa liczb wymiernych, ale w odpowiedzi używasz tylko arytmetyki liczb całkowitych)
Wydajność powinna być jak najmniejsza. (
3/2
jest w porządku,6/4
nie jest)Standardowe luki są zabronione.
Zgłoszenia powinny działać dla danych wejściowych co najmniej do 20 lub tej meta , w zależności od tego, która wartość jest wyższa.
Przypadki testowe
1: 1/1
2: 3/2 (1/1 + 1/2)
3: 11/6 (1/1 + 1/2 + 1/3)
4: 25/12 etc.
5: 137/60
6: 49/20
20: 55835135/15519504
56: 252476961434436524654789/54749786241679275146400
226: 31741146384418617995319820836410246588253008380307063166243468230254437801429301078323028997161/5290225078451893176693594241665890914638817631063334447389979640757204083936351078274058192000
Generowanie przypadków testowych (Python 3)
import fractions
def f(x):
return sum(fractions.Fraction(1,i) for i in range(1,x+1))
Podobne do tego wyzwania i tego wyzwania .
Liczniki to OEIS A001008 , a mianownikami są OEIS A002805 .
źródło
gcd
„funkcja wbudowana” jest dostępna w Twoim języku?gcd
i inne wbudowane funkcje są w porządku. Typy wymierne / ułamkowe są niedozwolone.Odpowiedzi:
Python 2 ,
8079 bajtówWypróbuj online!
Drukuje licznik i mianownik.
Tak! Wsparcie MathJax !!!! Obserwuje się:
Następnie, myśląc o rekurencji, dlan dodatniej, w
N
umeratorze:i nie można nie myśleć on!
D
mianowniku również rekurencyjnie; tak więc .exec
Musimy zapłacić Piper o zmniejszonej frakcji z obliczeniem GCD w
while
pętli; i skończymy.źródło
Galaretka , 10 bajtów
Wypróbuj online!
Jak to działa
źródło
J , 16 bajtów
Wypróbuj online!
Uruchom przykłady
Jak to działa
J , 9 bajtów, przy użyciu typu ułamkowego
Wypróbuj online!
J daje ułamki do podziału int-int, jeśli nie jest podzielny.
źródło
2 x:1#.1%1+i.
liczy się jako poprawna odpowiedź, czy jest to nieprawidłowe użycie racjonalnego typu?05AB1E , 10 bajtów
Wypróbuj online!
Używa tej samej metody, co wszystkie inne wpisy. Dane wyjściowe są w formie
[denominator, numerator]
.źródło
Wolfram Language (Mathematica) , 30 bajtów
Wypróbuj online!
14 bajtów, jeśli dozwolone są wbudowane typy ułamkowe
Wypróbuj online!
źródło
InputForm@HarmonicNumber
(24 bajty) daje dane wyjściowe w formacie podanym przez OP.JavaScript (ES6), 60 bajtów
Powraca
[numerator, denominator]
.Wypróbuj online!
W jaki sposób?
Metoda jest podobna do odpowiedzi Pythona na @ ChasBrown .
aż dob = 0
źródło
Perl 6 ,
5753 bajtówWypróbuj online!
Anonimowy blok kodu, który przyjmuje liczbę całkowitą i zwraca krotkę
denominator, numerator
.Gdybyśmy mogli używać typów ułamkowych, byłoby to znacznie prostsze 32 bajtowe:
Wypróbuj online!
źródło
Oktawa , 29 bajtów
Wypróbuj online!
źródło
C ++ 17 (gcc) , 108 bajtów
Używaj tylko arytmetyki liczb całkowitych:
Wypróbuj online!
C ++ 17 (gcc) , 108 bajtów
Wypróbuj online!
Tak jak poniżej, ale używaj C ++ 17
std::gcd
.C ++ (gcc) , 109 bajtów
Wypróbuj online!
Ponieważ C ++ nie ma natywnej obsługi biginta, na pewno się przepełni
n>20
.Wymagać:
import
oświadczenie gcc .std::__gcd
.-O0
(Tak myślę) w przeciwnym razie kompilator zoptymalizuje sięd/=a
.long
.Wyjaśnienie:
a*d
do najbliższej liczby całkowitej, przesyłająca*d+.5
dolong
i przypisz don
. Terazn/d
jest wyjście.std::__gcd
.źródło
auto a=0.
zamiastdouble a=0
(1 char mniej)?Pari / GP , 34 bajty
Wypróbuj online!
17 bajtów, jeśli dozwolone są wbudowane typy ułamkowe
Wypróbuj online!
źródło
MATL, 13 bajtów
Wypróbuj na MATL Online
Ta sama metoda, jak w odpowiedzi Jelly @Dennis .
(Wyjściowe wyjście, najpierw drukuje mianownik, a następnie licznik.)
Niedokładności zmiennoprzecinkowe oznaczają, że to nie działa dla n = 20, ponieważ wartości pośrednie są zbyt duże.Wygląda na to, że dane wyjściowe przypadku testowego były literówką, to zwraca tę samą odpowiedź co inne odpowiedzi dla n = 20.Oto wersja zachowująca typy liczb całkowitych (25 bajtów), w międzyczasie próbowałem, zanim się tego dowiedziałem:
25 bajtów, wejście do 43
Wypróbuj online!
Rzuca liczby
uint64
przed operacją na nich, wykonuje arytmetykę jawnie w pętli (bez użyciaprod
lubsum
). Co ważniejsze, dzieli częściowe liczniki i mianowniki przez ich GCD na każdym kroku, na końcu każdej iteracji. Zwiększa to zakres wejściowy, pozwalając na zwiększenien
do 43. Część kodu oparta jest na odpowiedzi Pythona na @Chas Brown.Alternatywna (oryginalna) metoda wykorzystująca LCM zamiast silni:
1615 bajtówWypróbuj na MATL Online
źródło
Excel VBA, 141 bajtów
Pobiera dane wejściowe
[A1]
i wyjściowe do konsoli.Niegolfowany i komentowany
źródło
dc , 87 bajtów
Wypróbuj online!
Pozostawia to licznik i mianownik na szczycie stosu w tej kolejności, co jest dozwolone przez ten domyślnie wyjściowego. Ponieważ
dc
nie magcd
wbudowanego, wykorzystuje to algorytm euklidesowy do obliczeniagcd
.źródło
Stax , 11 bajtów
Uruchom i debuguj
Wyjaśnienie:
Chcemy obliczyć:
Potrzebujemy teraz mianownikab oraz lista liczników zaja :
Możemy zrobićb = n ! , potem będzie:
Więc mamy:
źródło
APL (NARS), 56 znaków, 112 bajtów
test:
W kilku słowach zmniejsz „funkcję sumowania na 2 liczbach ułamkowych” (jedna liczba ułamkowa to lista 2 liczb całkowitych) na zbiorze:
to poniżej wydaje się błędne:
ale jeśli zmienię typ danych wejściowych niż:
źródło
APL (Dyalog Unicode) ,
1512 bajtówWypróbuj online!
Funkcja milcząca, biorąc jeden argument
⍵
. Zapisuje bajt, usuwając,⌽
jeśli wolno nam najpierw wydrukować mianownik.Dzięki @dzaima za 3 bajty.
W jaki sposób:
źródło