Pracowałem z matematyką nad moim przyjacielem i postanowiliśmy napisać skrypt, który znajdzie odpowiedź. Pierwotne pytanie brzmi:
Różnica dwóch liczb naturalnych to 2010, a ich największy wspólny mianownik jest 2014 razy mniejszy niż ich najniższy wspólny mnożnik. Znajdź wszystkie możliwe rozwiązania.
Zaczęliśmy pisać program niezależnie od siebie, a kiedy zadziałał, postanowiliśmy go zagrać w golfa, aby uzyskać jak najmniej bajtów, którymi mogliśmy zarządzać. Skończyło się na tym pięknym wierszu kodu o cudownym 89 bajtach.
from fractions import*;print[i for i in range(10**6)if i*(i+2010)/gcd(i,i+2010)**2==2014]
Chcieliśmy sprawdzić, czy komukolwiek uda się napisać krótszy fragment kodu, który wyliczy pierwszy milion I. Jeśli jesteś wystarczająco odważny, aby konkurować, możesz użyć dowolnego języka, który ci się podoba, ale wolelibyśmy, aby Python 2 mógł porównać twój kod z naszym.
Obowiązują reguły, wygrywają najkrótsze bajty. Obowiązują standardowe luki w kodzie golfowym. Standardowe „luki”, które nie są już śmieszne
Baw się dobrze!
Odpowiedzi:
Mathematica, 8 bajtów
Dowód, że 4 i 5092 to jedyne rozwiązania: oryginalny problem można przepisać jako
Napiszmy x jako 2 a 2 3 a 3 5 a 5 … i x + 2010 jako 2 b 2 3 b 3 5 b 5 … Następnie równanie staje się
Ponieważ 2014 = 2 × 19 × 53, mamy
A zatem
A zatem
Istnieje tylko 8 możliwych wyborów i moglibyśmy łatwo sprawdzić, czy 4 i 5092 są jedynymi dodatnimi rozwiązaniami liczb całkowitych.
Czekaj, słyszę ludzi krzyczących standardową lukę…
Mathematica, 45 bajtów
źródło
Pyth
2725Wypróbuj online.
To używa twojego algorytmu dość naiwnie ... Być może uda mi się wymyślić coś lepszego ...
Zasadniczo odfiltrowuje wartości, które nie spełniają kryterium
range(10**6)
Dzięki @xnor za wskazanie tego na czacie
gcd(x,x+2010)==gcd(x,2010)
źródło
Python 3, 84 bajtów
FryAmTheEggman już zasugerował, jak zrobić rozwiązanie 88 bajtów, więc tego nie opublikuję. Ale pomyślałem, że pokażę, jak można uzyskać jeszcze mniej bajtów w Pythonie 3:
(Dzięki za FryAmTheEggman za wskazówki)
To nie działa w Pythonie 2, ponieważ
print
nie jest funkcją.Nie jestem pewien, czy wolno nam, ale gdybyśmy mogli użyć
9**9
zamiast10**6
tego, byłby to kolejny bajt.źródło
and
/or
... nie pomyślałbym o pythonie 3;) Więcej na temat: Jeśli kolejność nie ma znaczenia, myślę, że ustawieniex=10**6
i wykonaniewhile x:x-=1;...
jest o jeden bajt krótsze.R, 75 znaków
Z podziałami linii:
źródło
GolfScript (41 bajtów)
Łączyć się z numerami
am
orazbm
gdziegcd(a, b) = 1
i wlogb > a
. Różnica jest takam(b-a) = 2010
ilcm(am, bm) = abm = 2014m
takab=2014
.Czynniki 2014 roku są
i te, które mają różnice, które dzielą się na 2010 są
Ponieważ działam w języku, który nie ma wbudowanego GCD ani LCM, myślę, że ta analiza prawdopodobnie skraca program:
gdzie
44
jestfloor(sqrt(2014))
.Można zbliżyć się dość blisko za pomocą naiwnej pętli:
źródło
Perl6
6158565452Daje dość bezpośrednie tłumaczenie twojego źródła
gcd
jest opcją infix w Perl6.^10**6
jest skrótem od0 ..^ 10**6
, gdzie^
środki wykluczają tę liczbę z zakresu.Oczywiście
i gcd (i+2010)
jest tak samoi gcd 2010
, że mogę zapisać 3 znakiJeśli użyję
$_
zamiasti
, mogę zapisać kolejną parę znaków. (.say
jest skrótem od$_.say
)Mogę uratować kolejną parę postaci, używając
... && .say
zamiast.say if ...
, ponieważ nie potrzebuję spacji po obu stronach,&&
tak jak robięif
.Ponieważ zrobiłem obie poprzednie „optymalizacje”, mogę użyć formy modyfikatora instrukcji
for
, co oznacza, że mogę usunąć{
i}
.Myślę, że to jest tak krótkie, jak tylko mogę, bez użycia innego algorytmu.
źródło
J, 26 bajtów
Te przeklęte 2-bajtowe czasowniki ... :)
źródło
Dyalog APL, 29 znaków
źródło
PARI / GP, 42 bajty
Wydaje mi się, że istnieje niezwykle eleganckie rozwiązanie wykorzystujące
fordiv
konstrukcję GP, ale nie mogło konkurować z tym rozwiązaniem pod względem zwięzłości.źródło
Rakieta, 72 znaki
źródło
λ
liczy się jako 1 bajt.Haskell, 52 znaki
Działa w interaktywnym środowisku Haskell GHCi.
źródło