Un nombre premier tronçable à droite est un nombre premier où chaque préfixe est un nombre premier (en base 10). Un nombre premier tronçable à gauche est exactement le contraire, où chaque suffixe est un nombre premier (les nombres premiers commençant par 0 ne sont pas autorisés). Ces deux séquences sont finies (il n'y a que 83 tronçonnables à droite, alors qu'il y a 4260 tronçonnables à gauche).
Vous devez écrire un programme qui accepte un seul nombre en entrée et produit le n ème nombre premier tronçable à droite. Cependant, lorsque le programme est lu en arrière , il devrait produire le n ème nombre premier tronçable à gauche.
Pour organiser un programme en arrière, nous divisons le programme en mots, puis inversons l'ordre des mots. Un mot peut être composé de n'importe quel nombre de caractères.
Par exemple, si ce qui suit était votre programme:
hello world
1234567890
Les dispositions suivantes seraient toutes autorisées en tant qu'arrangements possibles:
Fractionnement sur chaque personnage:
0987654321
dlrow olleh
Fractionnement sur un espace blanc:
1234567890
world hello
Fractionnement arbitraire (tuyaux ajoutés pour plus de clarté):
hel|lo w|orld
1|23456|7|8|90
908723456orld
1lo whel
Lorsque vous organisez votre programme à l'envers, tous les espaces doivent être pris en compte et inversés, comme tout autre personnage.
Entrées de test direct:
1: 2
2: 3
21: 379
60: 239933
83: 73939133
Entrées de test en arrière:
1: 2
2: 3
39: 647
187: 29173
4260: 357686312646216567629137
Les programmes doivent pouvoir s'exécuter dans un délai raisonnable (moins d'une minute)
C'est un code-golf , donc le programme avec le moins d'octets gagne!
la source
lo w
estorld\n1
. La nouvelle ligne ne met pas fin à l'atomeRéponses:
Gelée ,
2623 octetsVers l'avant
Essayez-le en ligne!
Mots
Ñ
¶
p
9
¶
7ÆR2ĿV€$ÆPÐf$ÐĿFị@
En arrière
Essayez-le en ligne!
Mots
7ÆR2ĿV€$ÆPÐf$ÐĿFị@
¶
9
p
¶
Ñ
Comment ça fonctionne
Tous les programmes Jelly sont constitués de liens (les fonctions de prise en charge de Jelly), qui sont séparés par des sauts de ligne ou des pilcrows (
¶
). Le dernier d'entre eux est le lien principal ; il est appelé automatiquement lors de l'exécution du programme.Le programme avancé fonctionne comme suit.
Le programme en arrière fait presque exactement la même chose; il n'y a que deux différences.
Le lien principal est maintenant
Ñ
, qui appelle simplement le lien en dessous (enroulement), c'est-à-dire le lien principal du programme suivant.9p
au lieu dep9
renvoyer le produit cartésien inversé.la source
Python 2,
143139 octetsSe compose de cinq parties:
I=1
a={2}…[~-n]
I=0
L'inversion revient donc simplement à inverser la valeur de
I
.Explication
La fonction
f
effectue une recherche récursive des nombres premiers tronçables à gauche (LTP) ou des nombres premiers tronçables à droite (RTP), en fonction de la valeur du globalI
. Ces valeurs sont ajoutées à l'ensemblea
. Ensuite,lambda n:sorted(a)[~-n]
renvoie len
-ième.Définissons une feuille comme un LTP, un RTP, un chiffre non nul + un LTP, ou un RTP + un chiffre non nul. Ce sont toutes les valeurs qui
f
pourraient vouloir vérifier la primauté.J'ai conçu un test pseudoprime Fermat qui fonctionne pour toutes les feuilles:
(63973 est un nombre Carmichael .)
Si ce test retourne vrai, alors
z
devrait être ajouté à l'ensemblea
et nous devrions reprendrestr(z)
. Le bit de code responsable est:Tout d'abord, nous souhaitons traiter le cas
z == 2
. Nous le faisons simplement en l'esquivant ici et en codant en dur2
lors de la définition initialea
! (EDIT: Et rien de nuisible ne se produit si nous attrapons égalementz == 1
.) Nous pouvons donc supposer celaz ≥ 3
maintenant.J'ai traduit certains «et» en une comparaison enchaînée de court-circuit: les trois premières comparaisons doivent réussir avant
a.add(z)
etf(u)
sont toujours évaluées. Voici tous leurs rôles:Remerciements
u=[d+s,s+d][I]
→u=d[I:]+s+d*I
;z==2
→z<3
et l' astuce du mod 91 ). Merci!la source