Przegląd:
Z Wikipedii : Ułamek egipski to suma różnych ułamków jednostkowych. Oznacza to, że każda frakcja w wyrażeniu ma licznik równy 1 i mianownik, który jest dodatnią liczbą całkowitą, a wszystkie mianowniki różnią się od siebie. Wartością wyrażenia tego typu jest dodatnia liczba wymierna a / b. Każda dodatnia liczba wymierna może być reprezentowana przez ułamek egipski.
Wyzwanie:
Napisz najkrótszą funkcję, która zwróci wartości wszystkich mianowników dla najmniejszego zestawu ułamków jednostkowych, które składają się na dany ułamek.
Zasady / Ograniczenia:
- Dane wejściowe będą dwie dodatnie wartości całkowite.
- Może to być na
STDIN
,argv
oddzielone przecinkami, rozdzielane spacjami lub dowolna inna metoda.
- Może to być na
- Pierwszą wartością wejściową jest licznik, a drugą wartością wejściową mianownik.
- Pierwsza wartość wejściowa musi być mniejsza niż druga.
- Dane wyjściowe mogą zawierać wartości przekraczające ograniczenia pamięci systemu / języka (RAM, MAX_INT lub jakiekolwiek inne ograniczenia kodu / systemu). Jeśli tak się stanie, po prostu skróć wynik do najwyższej możliwej wartości i zauważ, że jakoś (tj
...
.). - Wyjście powinno być w stanie obsłużyć wartość mianownika do co najmniej 2 147 483 647 (2 31 -1, 32-bitowe ze znakiem
int
).- Wyższa wartość (
long
itp.) Jest całkowicie do przyjęcia.
- Wyższa wartość (
- Dane wyjściowe powinny zawierać listę wszystkich wartości mianowników najmniejszego zestawu znalezionych ułamków jednostkowych (lub samych ułamków, tj
1/2
.). - Wyjście należy uporządkować rosnąco według wartości mianownika (malejącej o wartość ułamka).
- Dane wyjściowe można rozdzielić w dowolny sposób, ale między nimi musi być jakiś znak, aby odróżnić jedną wartość od drugiej.
- To jest golf golfowy, więc wygrywa najkrótsze rozwiązanie.
Przykłady:
Wejście 1:
43, 48
Wyjście 1:
2, 3, 16
Wejście 2:
8/11
Wyjście 2:
1/2 1/6 1/22 1/66
Wejście 3:
5 121
Wyjście 3:
33 121 363
code-golf
math
rational-numbers
Gaffi
źródło
źródło
8, 11
i2, 6, 22, 66
prawda?1/2 1/6 1/22 1/66
byłoby preferowane1/2 1/5 1/37 1/4070
dla danych wejściowych8/11
.5/121 = 1/33+1/121+1/363
do przypadków testowych. Wszystkie chciwe programy (w tym moje) dają za to 5 frakcji. Przykład pochodzi z Wikipedii .Odpowiedzi:
Common Lisp, 137 znaków
(z 43/48) -> (2 3 16)
(z 8/11) -> (2 5 37 4070)
(z 5/121) -> (25 757 763309 873960180913 1527612795642093418846225)
Nie musisz się martwić o ogromne liczby lub obsługę notacji ułamkowej!
źródło
Python 2,
169167 znakówPobiera rozdzielone przecinkami argumenty na standardowym wyjściu i drukuje listę python na standardowym wyjściu.
źródło
PHP 82 bajty
Można to skrócić, ale bieżący licznik i mianownik należy zachować jako liczby całkowite, aby uniknąć błędu zaokrąglania zmiennoprzecinkowego (zamiast utrzymywania bieżącego ułamka).
Przykładowe użycie:
źródło
5 121
lub31 311
, da złą odpowiedź (po bardzo długim czasie).C,
163177 znaków6/6 : W końcu program poprawnie obsługuje teraz obcinanie we wszystkich przypadkach. Zajęło mi to o wiele więcej znaków, niż się spodziewałem, ale było warto. Program powinien teraz w 100% spełniać wymagania dotyczące problemu.
Program pobiera licznik i mianownik na standardowe wejście. Mianowniki są drukowane na standardowe wyjście, po jednym w wierszu. Skrócone wyjście jest wskazywane przez wydrukowanie zerowego mianownika na końcu listy:
Mianowniki w drugim przykładzie sumują się do 95485142815/107645519046, który różni się od 6745/7604 o około 1e-14.
źródło
31 311
na przykład).31 311
przepełnia się, ale program nie może go oflagować.Python, 61 znaków
Dane wejściowe ze STDIN, oddzielone przecinkami.
Wyjście do STDOUT, separacja nowego wiersza.
Nie zawsze zwraca najkrótszą reprezentację (np. 5/121).
Znaki zliczane bez zbędnych nowych linii (tj. Łączące wszystkie linie w
while
użyciu;
).Frakcja jest
a/b
.i
jestb/a
zaokrąglony, więc wiem1/i <= a/b
.Po wydrukowaniu
1/i
, zamieniama/b
sięa/b - 1/i
, co jest(a*i-b)/(i*b)
.źródło
C, 94 bajty
Wypróbuj online
edycja: krótsza wersja kodu została opublikowana w komentarzach, więc ją zastąpiłem. Dzięki!
źródło
for(i=2;n>0&&i>0;i++)
mogą byćfor(i=1;n>0&++i>0;)
; wsporniki pętli for można usunąć (ponieważ ma ona tylkoif
wnętrze);d=d*i;
może byćd*=i;
; i nie jestem do końca pewien, ale myślę, że#include <stdio.h>
może być bez spacji:#include<stdio.h>
. Och, i może być interesujące przeczytać Porady dotyczące gry w golfa w C i Porady dotyczące gry w golfa w <wszystkich językach>Stax , 18 bajtów
Uruchom i debuguj
Na każdym kroku próbuje zminimalizować kolejny licznik . Wydaje się, że działa, ale nie mogę tego udowodnić.
źródło
AXIOM, 753 bajty
Pomysł polegałby na zastosowaniu „Chciwego algorytmu” z różnymi punktami początkowymi i zapisaniu listy o minimalnej długości. Ale nie zawsze znajdowałoby to minimalne rozwiązanie o mniej zróżnicowanym: „tablica A będzie mniejsza niż tablica B, i tylko wtedy, gdy A ma kilka elementów B lub jeśli liczba elementów A jest taka sama jak liczba elementów B , niż A jest mniejszy niż B, jeśli bardziej mały element A jest większy niż liczba, niż więcej mały element B ”. Nie golfisty i test
referencje i numery z: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fractions/egyptian.html
dla dodania czegoś, to poniżej byłoby zoptymalizowane pod kątem znajdowania ułamka o minimalnej długości, który ma maksymalny mianownik mniej (i nie jest zoptymalizowany dla długości)
wyniki:
Wydaje się, że wiele dobrych mianowników ma jako dzielniki czynnika mianownika frakcji wejściowej.
źródło
C,
8578 bajtówPoprawiony przez @ceilingcat , 78 bajtów:
Wypróbuj online!
Moja oryginalna odpowiedź, 85 bajtów:
Wypróbuj online!
Częścią uznania powinien być Jonathan Frech , który napisał to 94-bajtowe rozwiązanie, które ulepszyłem.
źródło
APL (NARS), 2502 bajtów
Trasacja z kodu AXIOM dla tego problemu, do APL, używając po raz pierwszy (dla mnie) typu ułamka (czyli bignum ...).
103r233 oznacza ułamek 103/233. Test:
źródło