Niewłaściwe zmniejszenie frakcji
W tym wyzwaniu golfa musisz znaleźć frakcje, które można zmniejszyć w niewłaściwy sposób, ale wciąż kończą się tą samą liczbą.
Uwaga: zmniejszenie ułamków w niewłaściwy sposób ma tutaj dokładną definicję, zobacz szczegóły.
Przykład:
64/16 = 6 4/1 6 = 4/1 = 4
Oczywiście nie możesz po prostu trafić obu 6, ale tutaj nadal masz prawidłową wartość. W tym wyzwaniu musisz znaleźć takie przykłady.
Detale
Musisz napisać funkcję / program, który przyjmuje jedną dodatnią liczbę całkowitą n
jako dane wejściowe i wyjściowe / zwraca listę / tablicę ułamków w formacie
numerator1,denominator1,numerator2,denominator2,...
Program ma znaleźć się na każdej frakcji a/b
z a+b=n
i a,b>0
czy może ona zostać zmniejszona w niewłaściwy sposób . (Nie ma znaczenia, czy można to zmniejszyć w sposób konwencjonalny, czy też istnieje wiele możliwości redukcji, musi być możliwe zmniejszenie go w niewłaściwy sposób przynajmniej na jeden sposób).
Definicja niewłaściwego sposobu: Ułamek można zmniejszyć w niewłaściwy sposób tylko wtedy, gdy ta sama sekwencja kolejnych cyfr pojawia się w aib oraz jeśli wartość ułamka pozostaje taka sama, jeśli usuniesz podłańcuch.
Przykład: 1536/353 można „zredukować” do 16/3, ale te dwie wartości nie są równe, więc nie można zmniejszyć tej frakcji w niewłaściwy sposób .
Zauważ, że ta definicja zmniejszania niewłaściwego sposobu może również obejmować ułamki, które są zmniejszane we właściwy sposób: 110/10 = 11/1
mieści się w definicji zmniejszania niewłaściwego sposobu, mimo że jest to właściwy krok.
Punktacja
Wygrywa najmniejsza liczba bajtów. Możesz napisać funkcję lub program, który akceptuje liczbę całkowitą i zwraca tablicę lub program, który używa stdin / stdout, lub możesz rozważyć n zapisane w zmiennej, a na końcu programu lista musi zostać zapisana w innej zmiennej.
Przypadki testowe
Podaj następujące przypadki testowe (Powiedz mi, które powinienem dodać, nie mam pojęcia, ile jest tych ułamków / ile przykładów można się spodziewać)
n=80 (64/16 should be in this list)
n=147 (98/49 should be in this list)
n=500 (294/196 should be in this list) WRONG since 294+196 != 500 Thanks Falko
1010/10 = 101/1 && 1010/10 /= 110/1
n=147
) jest nieprawidłowy:49/89 != 4/8
.Odpowiedzi:
Python 2 -
183180wejście musi być zapisane
n
, wyjście zostanie zapisanel
.Przypadki testowe:
n = 80:
n = 147:
n = 490:
Jeśli duplikaty danych wyjściowych są zabronione, stają się dłuższe o 10 znaków:
źródło
Haskell,
207206 (209?) ZnakówJeśli nie można zwrócić tego samego współczynnika więcej niż jeden raz (400/400 = 40/40 = 4/4), użyj,
f n=nub[...
aby je odfiltrować.Zwraca listę par. Lista par dwuelementowych kosztuje tyle samo. Lista rzeczywistych ułamków wymagałaby importu
Data.Ratio
lub pełnej kwalifikacjiData.Ratio.%
(co również koliduje ze%
zdefiniowaną tutaj funkcją)przypadki testowe (z
nub
):niepolubił i skomentował :
źródło
Python 2 - 236
źródło
Python 3 - 302
Uwaga: Z powodu trudności z parsowaniem nie ma ułamków z liczbą 0 w (więc ułamki nie są obliczane przy użyciu poprawnej metody).
Przy n = 80:
Przy n = 147
Przy n = 500
źródło
n=80
tego odbitki[[64, 16], [65, 26]]
, ale oczywiście65 + 26 = 91 > 80
.if
s w jedno dużeif
dziękiand
s łączącym wszystkie warunki? Myślę, że oszczędza sporo znaków.10/70
,20/60
i30/50
?