Pi est un nombre irrationnel , ce qui signifie que sa représentation décimale ne se termine ou ne se répète jamais.
Pi tronqué à 41 chiffres décimaux (40 places) est 3.1415926535897932384626433832795028841971
.
Si nous ignorons le point décimal et listons les chiffres comme une séquence d'entiers positifs, en évitant les doublons , nous obtenons 3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 950 28 841 971
( OEIS A064809 ).
(Remarquez que cela 15
apparaît dans la séquence plutôt que 1 5
parce que cela 1
s'est déjà produit.
Notez également que 0
cela ne se produit pas car il n'est pas positif; 950
contient le premier zéro.)
Pour construire le premier nombre de rotation, nous utilisons cette séquence pour indexer les chiffres de Pi (le premier chiffre étant 3, le second 1, etc.).
Ainsi, le premier chiffre du premier numéro de rotation est le 3e chiffre de Pi,
le deuxième chiffre est le 1er chiffre de Pi,
le troisième chiffre est le 4e chiffre de Pi,
le quatrième est le 15e chiffre de Pi,
et ainsi de suite.
Un point décimal est ajouté après le premier chiffre pour imiter Pi.
Ainsi, le premier numéro de pirration à 41 chiffres est 4.3195195867462520687356193644029372991880
.
(Notez que pour le 30e chiffre, j'ai dû aller jusqu'au 974e chiffre de Pi.)
Pour construire le deuxième nombre de pirations, le processus est répété en utilisant le premier nombre de pirations au lieu de Pi. (Pi lui-même peut être appelé le nombre pirational zéro.) Ainsi, la nouvelle séquence est 4 3 1 9 5 19 58 ...
et le premier nombre piirational est indexé pour produire la seconde, qui commence 9.14858...
.
D'autres nombres de pirration sont créés de la même manière, chacun étant généré à partir du précédent.
Défi
Votre tâche consiste à écrire le programme le plus court possible qui accepte deux nombres entiers, N
et D
, et N
génère le numéro de génération tronqué en D
chiffres décimaux.
D
est toujours positif mais N
n'est pas négatif, et les D
chiffres de Pi doivent être sortis quand N
est 0.
Quand D
est 1, peu importe si le séparateur décimal est présent ou non.
L'entrée doit provenir de stdin ou de la ligne de commande et la sortie doit aller à stdout (ou aux alternatives les plus proches de votre langue).
Votre programme devrait fonctionner pour toutes les valeurs d'entrée inférieures N
ou D
égales à 2 16 , mais il ne doit pas être opportun ni efficace.
Le code le plus court en octets gagne.
(Notez que les nombres pirrationnels sortent dans d'autres bases mais tout dans ce défi se fait en base 10.)
N=1
,D=13393
par exemple, vous auriez besoin du 31 millionième chiffre de PIRéponses:
Python 292 octets
Assez inefficace, je n'ai pu obtenir que quelques chiffres de N = 3 et aucun de N = 4.
Exemple d'entrée:
la source
=="0"
pour<"1"
. Faites la boucle intérieure d'une ligne. Retirez les espaces autourx += 1
.if l not in h
->if(l in h)<1:
N==0
->N<1
if(l in h)<1
c'est aussi assez intelligent.s
comme paramètre deP
(def P(N,D,s=''):
).str(...)
peut probablement être écrit avec des crochets.while'1'>...
économise l'espace. Faitesh
un ensemble et initialisez avech=l,={''}
, puis écrivezl in h
comme{l}<h
.h
être commandée. Pourtant, c'est une astuce intéressante que je vais essayer de retenir.while j+1:
peut être raccourci enwhile-~j
btw.Haskell,
431400369Je dois aimer des listes infinies! Avec suffisamment de temps et de mémoire, ce programme finira par calculer la bonne réponse pour tout N et D (je suppose).
Je génère les chiffres de pi en
g
utilisant un algorithme de spigot (volé sans vergogne à un gars appelé Stanley Rabinowitz), en regroupant les chiffres / en créant la séquence en utilisantv
et en générant un nombre de pirration à partir de ceux-ci en utilisantm
.Le voici en action:
la source