Ich habe mit einem Freund an einer mathematischen Frage gearbeitet, und wir haben beschlossen, ein Skript zu schreiben, das die Antwort findet. Die ursprüngliche Frage lautet wie folgt:
Die Differenz zweier natürlicher Zahlen ist 2010 und ihr größter gemeinsamer Nenner ist 2014 mal kleiner als ihre niedrigste gemeinsame Multiplikation. Finden Sie alle möglichen Lösungen.
Wir haben angefangen, das Programm unabhängig voneinander zu schreiben, und als es funktionierte, haben wir beschlossen, es zu spielen, um die geringste Anzahl von Bytes zu erhalten, die wir verwalten konnten. Wir haben diese wunderschöne Codezeile mit wunderbaren 89 Bytes erhalten.
from fractions import*;print[i for i in range(10**6)if i*(i+2010)/gcd(i,i+2010)**2==2014]
Wir wollten sehen, ob es jemandem gelingt, einen kürzeren Code zu schreiben, der die ersten 1 Million i auflistet. Wenn Sie mutig genug sind, sich zu behaupten, können Sie eine beliebige Sprache verwenden. Wir würden jedoch Python 2 bevorzugen, um Ihren Code mit unserem vergleichen zu können.
Es gelten die üblichen Regeln, kürzeste Bytes gewinnen. Es gelten die Standardcode-Golfschlupflöcher. Standard "Lücken", die nicht mehr lustig sind
Habe Spaß!
Antworten:
Mathematica, 8 Bytes
Beweis, dass 4 und 5092 die einzigen Lösungen sind: Das ursprüngliche Problem kann wie folgt umgeschrieben werden
Schreiben wir x als 2 a 2 3 a 3 5 a 5 … und x + 2010 als 2 b 2 3 b 3 5 b 5 … Dann wird die Gleichung
Seit 2014 = 2 × 19 × 53 haben wir
Somit
Somit
Es gibt nur 8 mögliche Auswahlmöglichkeiten, und wir können leicht überprüfen, ob 4 und 5092 die einzigen positiven ganzzahligen Lösungen sind.
Warten Sie, ich höre Leute Standardlücke schreien ...
Mathematica, 45 Bytes
quelle
Pyth
2725Probieren Sie es online aus.
Dies verwendet Ihren Algorithmus ziemlich naiv ... Ich könnte mir etwas Besseres einfallen lassen ...
Filtert grundsätzlich Werte aus, die das Kriterium nicht erfüllen
range(10**6)
Vielen Dank an @xnor für den Hinweis im Chat
gcd(x,x+2010)==gcd(x,2010)
quelle
Python 3, 84 Bytes
FryAmTheEggman hat bereits vorgeschlagen, wie Sie Ihre Lösung auf 88 Byte bringen können, damit ich das nicht poste. Aber ich dachte, ich würde zeigen, wie Sie in Python 3 noch weniger Bytes erhalten können:
(Danke für FryAmTheEggman für Tipps)
Dies funktioniert in Python 2 nicht, da es
print
keine Funktion ist.Ich bin mir nicht sicher, ob wir erlaubt sind, aber ob wir
9**9
stattdessen verwenden könnten10**6
, wäre ein weiteres Byte.quelle
and
/or
... zu tun, hätte aber nicht an Python 3 gedacht;) Mehr zum Thema: Wenn die Reihenfolge keine Rolle spielt, denke ich, dass das Einstellenx=10**6
und Ausführenwhile x:x-=1;...
ein Byte kürzer ist.R, 75 Zeichen
Mit Zeilenumbrüchen:
quelle
GolfScript (41 Bytes)
Rufen Sie die Nummern
am
undbm
wogcd(a, b) = 1
und wlogb > a
. Dann ist der Unterschiedm(b-a) = 2010
undlcm(am, bm) = abm = 2014m
soab=2014
.Faktoren von 2014 sind
und diejenigen, die Unterschiede haben, die sich in 2010 teilen, sind
Da ich in einer Sprache arbeite, in der weder GCD noch LCM integriert sind, verkürzt diese Analyse wahrscheinlich das Programm:
wo
44
istfloor(sqrt(2014))
.Es ist möglich, mit einer naiven Schleife ganz nah zu kommen:
quelle
Perl6
6158565452Eine ziemlich direkte Übersetzung Ihrer Quelle gibt
gcd
ist ein Infix op in Perl6.^10**6
ist die Abkürzung für0 ..^ 10**6
, wobei die^
Mittel diese Zahl aus dem Bereich ausschließen.Natürlich
i gcd (i+2010)
ist das das gleiche wiei gcd 2010
so kann ich 3 Zeichen speichernWenn ich
$_
anstelle von verwende,i
kann ich noch ein paar Zeichen speichern. (.say
ist die Abkürzung für$_.say
)Ich kann ein paar weitere Zeichen speichern, indem ich
... && .say
anstelle von verwende.say if ...
, da ich auf beiden Seiten kein Leerzeichen benötige,&&
wie ich es tueif
.Da ich beide vorherigen "Optimierungen" durchgeführt habe, kann ich die Anweisungsmodifikatorform von verwenden
for
, was bedeutet, dass ich{
und entfernen kann}
.Ich denke, das ist so kurz wie möglich, ohne einen anderen Algorithmus zu verwenden.
quelle
J, 26 Bytes
Diese verdammten 2-Byte-Verben ... :)
quelle
Dyalog APL, 29 Zeichen
quelle
PARI / GP, 42 Bytes
Ich bin der Meinung, dass es eine äußerst elegante Lösung gibt, die das
fordiv
Konstrukt von GP verwendet, aber mit dieser Lösung konnte sie aus Gründen der Kürze nicht mithalten.quelle
Schläger, 72 Zeichen
quelle
λ
1 Byte.Haskell, 52 Zeichen
Funktioniert in der interaktiven Haskell-Umgebung GHCi.
quelle