Ich löse Aufgabe, wo:
Eingang:
Eine Zahl als Ganzzahl.
Ausgabe:
Die nächstgrößere palindromische Primzahl als Ganzzahl.
Ich würde mich über Hinweise freuen, wie ich meine Lösung verkürzen kann. Oder Anweisungen, wenn eine Änderung des Ansatzes von Vorteil wäre.
golf=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)
palindromisch:
x==int(`x`[::-1])
prime:
all(x%d for d in r(2,x))
Antworten:
Nun zu einigen wirklich großen Verbesserungen. Ihr ursprüngliches Programm bestand aus 97 Zeichen:
Mit den folgenden Verbesserungen können Sie 90 Zeichen erreichen:
Mit einem Trick, um die Klammern um die Palindrom-Überprüfungsanweisung zu entfernen, können Sie zu 87 gelangen:
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 drehenund
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.
quelle
x
==x
[:: - 1], als nächstes für Index [0] ... immer noch darüber nachdenken und x> lrange
Funktion genauer an .