Palindromic Prime

8

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))
Martin Rajnoha
quelle
3
Bevor die Leute schließen, stimmen sie ab, weil es keine Herausforderung ist: Solche Dinge sind jetzt zum Thema . Das einzige, was ich mich frage, ist, ob dies nicht besser geeignet ist, da zwei separate Fragen "Wie kann ich die Suche nach palindromischen Zahlen verkürzen?" und "Wie kann ich die Suche nach Primzahlen verkürzen?" (@Martin, tu das aber nicht, bis du mehr Feedback bekommst, das dies bestätigt.)
Martin Ender
@ m.buettner, ok danke.
Martin Rajnoha

Antworten:

7

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>lBit 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 nextdie 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.

isaacg
quelle
int für x== x[:: - 1], als nächstes für Index [0] ... immer noch darüber nachdenken und x> l
Martin Rajnoha
@MartinRajnoha TIPP: Sehen Sie sich die rangeFunktion genauer an .
BeetDemGuise
Danke, Leute, ich habe das gefunden :) Aktueller Status -10chars. Großartig!
Martin Rajnoha
@MartinRajnoha Als Kurzreferenz konnte ich (in meiner kurzen Zeit beim Golfen Ihres Codes) 12 Zeichen entfernen.
BeetDemGuise
@BeetDemGuise jetzt neckst du mich :) OK, wie hast du das geschafft?
Martin Rajnoha