Die beste Lösung, die ich bisher für ein Golf-Code-Puzzle gefunden habe, an dem ich arbeite, sind zwei ziemlich fett aussehende Aufrufe von range
. Ich bin sehr neu im Code Golf, besonders in Python, also könnte ich ein paar Tipps gebrauchen.
Das relevante Fragment ist dies
[x for x in range(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in range(2,x))]
Die Obergrenze der ersten range
ist nicht scharf. Es sollte mindestens 98690 sein, und alles andere ist gleich ( dh golfmäßig). Je kleiner der Unterschied zwischen dieser Obergrenze und 98690 ist, desto besser ist die Leistung 1 . Ich verwende 7 6 (= 117649), weil dies 7**6
der kürzeste Python-Ausdruck ist, den ich mir vorstellen kann.
Im Gegensatz dazu sind die Untergrenze in der ersten range
sowie beide Grenzen in der zweiten fest. IOW, das Programm (in seiner aktuellen Form) führt zu falschen Ergebnissen, wenn diese Grenzwerte geändert werden.
Gibt es eine Möglichkeit, einen oder beide Ausdrücke zu verkürzen?
range(n+1,7**6)
range(2,x)
?
Übrigens, in diesem Fall gewinnt das Aliasing range
von beispielsweise r
nichts:
r=range;rr
rangerange
EDIT: FWIW, das vollständige Programm ist das folgende:
p=lambda n:[x for x in range(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in range(2,x))][0]
p(n)
sollte die kleinste palindromische Primzahl größer sein als n
. Auch p
sollte nicht rekursiv sein. Achtung: Es ist schon obszön langsam!
1 Ja, ich weiß: Leistung ist beim Code-Golf irrelevant, aber deshalb habe ich geschrieben, dass "alles andere gleich ist (was das Golf betrifft)". Zum Beispiel meine Wahl 7**6
und nicht die unmittelbar offensichtliche, aber leistungsschwächere "Golf-Äquivalent" -Alternative 9**9
. Ich mag es , meine Code-Golf-Versuche tatsächlich auszuführen , was bedeutet, dass die Leistung nicht so stark beeinträchtigt wird, dass es Jahre dauern würde, bis der Code ausgeführt wird. Wenn ich helfen kann, natürlich.
p=lambda n:(x for x in xrange(n+1,7**6)if`x`==`x`[::-1]*all(x%i for i in xrange(2,x))).next()
. Während Sie dabei sind, können Sie natürlich genauso gutxrange(2,x)
zuxrange(2,int(x**.5+1))
Ihren Tests wechseln und diese sehr schnell durchführen. Dieser Code entspricht eindeutig Ihrem Code, nur länger und schneller.