Nun zu einigen wirklich großen Verbesserungen. Ihr ursprüngliches Programm bestand aus 97 Zeichen:
n=lambda l,r=range:next(x for x in r(10**6)if(x==int(`x`[::-1]))&all(x%d for d in r(2,x))and x>l)
Mit den folgenden Verbesserungen können Sie 90 Zeichen erreichen:
n=lambda l,r=range:min(x for x in r(l+1,10**6)if(`x`==`x`[::-1])&all(x%d for d in r(2,x)))
Mit einem Trick, um die Klammern um die Palindrom-Überprüfungsanweisung zu entfernen, können Sie zu 87 gelangen:
n=lambda l,r=range:min(x for x in r(l+1,10**4)if`x`==`x`[::-1]*all(x%d for d in r(2,x)))
Ich habe jedoch eine Lösung in 80 Zeichen. Um dies zu erreichen, konzentrieren Sie sich darauf, das Gesamtbild und nicht die einzelnen Komponenten zu ändern. Überdenken Sie Ihre grundlegendsten Entscheidungen, um an diesen Punkt zu gelangen. Warum ein Lambda? Warum eine Minute eines gefilterten Bereichs? Es kann einen besseren Weg geben.
Mit int()
im Palindrom Vergleich ist eine Menge von Zeichen - können Sie einen kürzeren Weg sehen drehen
x
und
`x`[::-1]
in den gleichen Typ?
Außerdem enthält dieses and x>l
Bit am Ende viele Zeichen. Gibt es eine Möglichkeit, es zu verkürzen? Beseitigen Sie die Notwendigkeit dafür, indem Sie etwas anderes ändern?
Ist next
die richtige Funktion für den Job? Denken Sie daran, dies ist Code Golf, Laufzeit ist irrelevant.
Die Hauptprüffunktion sieht jedoch genau richtig aus.
Außerdem, und dies ist nur ästhetisch, mag ich keine Aliasing-Funktionen, wie Sie es mit Range tun, wenn keine Zeichen gespeichert werden, wie in diesem Fall.