Les 9 milliards de noms de Dieu est une nouvelle d'Arthur C. Clarke. Il s'agit d'un groupe de moines tibétains dont l'ordre est consacré à l'écriture de tous les noms possibles de Dieu, écrits dans leur propre alphabet. Ils se consacrent essentiellement à l'écriture de toutes les permutations possibles de leur alphabet, limitées par quelques règles. Dans l’histoire, le monastère a engagé des ingénieurs pour écrire un programme lui permettant de faire tout le travail à sa place. Votre but est d'écrire ce programme.
Règles:
L'alphabet du moine utilise 13 caractères (selon mes estimations). Vous pouvez utiliser
ABCDEFGHIJKLM
ou un autre ensemble de 13 caractères.La longueur minimale d'un nom possible est de 1 caractère. La longueur maximale est de 9 caractères.
Aucun personnage ne peut se reproduire plus de 3 fois de suite.
AAABA
est un nom valide, maisAAAAB
n'est pas.Votre programme doit imprimer (dans un fichier) tous les noms possibles dans l'ordre, de,
A
àMMMLMMMLM
, séparés par tout caractère ne figurant pas dans l'alphabet (sauts de ligne, points-virgules, peu importe).C'est du code-golf, et vous pouvez utiliser n'importe quelle langue. La solution la plus courte au 1er juin 2014 l'emporte.
Edit: Les noms doivent commencer par A
et se terminer par MMMLMMMLM
, en passant en revue tous les milliards de noms de façon séquentielle. Mais la séquence particulière est à vous. Vous pouvez d'abord imprimer tous les noms à une lettre, puis tous les noms à 2 lettres, etc. Vous pouvez également imprimer tous les noms commençant par A
, puis tous ceux commençant par B
, ou un autre motif. Mais un humain devrait pouvoir lire le fichier et confirmer qu'il est présent et dans l'ordre logique de votre choix, en supposant qu'il en ait le temps.
la source
f(k) = k^9 + k^8 + k^7 - 5*k^6 + k^5 + k^4 + 4*k^3 - 2*k^2 + k
. Sage implémentation: goo.gl/0srwhq105.8GB
tout est dit et fait! Je suis content que les stars ne soient pas sorties ... ou peut-être devez-vous imprimer la liste pour que cela se produise ...?Réponses:
Ruby, 46 ans
Ma solution initiale, similaire, était plus longue et erronée (elle produisait des nombres en base13, qui ne sont pas tous dus à des zéros non significatifs), mais je vais les laisser ici car ils ont obtenu des votes de toute façon.
la source
k=*?A..?M*9;puts k-k.grep(/(.)\1{3}|[N-Z]/)
C 140
177 235Bon vieux style procédural, pas de fantaisie.
Il compte (aucune écriture) 11 459 252 883 noms en 8 minutes.
Prochaine édition avec le fichier runtime et la taille des noms. Regarde le ciel ...
Durée 57 minutes, taille du fichier 126 051 781 713 (9 caractères + crlf par ligne). Merci de me communiquer l'adresse email des moines pour que je puisse leur envoyer le fichier compressé, pour vérification manuelle ...
Edit Golfed un peu plus, retravaillé le chèque pour les lettres répétées.
Pas encore le plus court, mais au moins celui-ci se termine et génère la sortie requise.
Durée 51 min, taille du fichier 113 637 155 697 (aucun blanc significatif pour le moment)
Une note de côté: évidemment le fichier de sortie est très compressible, je devais quand même tuer 7zip, après avoir travaillé 36 heures, il était à 70%. Bizarre.
Ungolfed
la source
#include
s?Golfscript,
5847 caractèresGrâce à Peter Taylor, le seppuku ne me laisse pas battre la solution Ruby! Exécutez le code jusqu'à 10 vous - même , et voici la preuve qu'il omet les quatre numéros dans une ligne .
la source
n+
au lieu de''+n
. Je pense qu'il est dans les règles à utiliser un alphabet avec des caractères de contrôle, de sorte que vous pouvez également remplacer65+
avec13+
et enregistrer un autre personnage en nommant13:^
. Et je pense que cela13,{ stuff [...]
pourrait être13,1/{ stuff 4*
.13,
de peut être remplacé par{65+}%n+}%{ backtick {\4*/,}+78,1/%1-!},
pour une économie totale de 8, sauvant la vie.AAAM
ça devrait êtreAAABA
, et pasBAAAB
, non?Utilitaires de ligne de commande Bash + Linux, 43 octets
Ceci utilise une technique similaire à celle décrite ci-dessous, mais compte uniquement en base 16 et supprime tous les "noms" contenant
0
,e
ouf
également ceux comportant plus de 3 mêmes chiffres consécutifs.Convertissez l'alphabet du moine comme suit:
Bash + coreutils (dc et egrep), 46 octets
Edit - version corrigée
Ça va prendre du temps à courir mais je pense que c'est correct.
dc
compte décroissant de 14 ^ 9 à 1 et sorties en base 14. egrep filtre les nombres avec plus de 3 mêmes chiffres consécutifs. Nous filtrons également tous les noms avec des chiffres "0", nous obtenons donc le jeu de lettres correct dans les noms.La question spécifie que n'importe quel alphabet peut être utilisé, donc j'utilise [1-9] [AD]. Mais pour tester, cela peut être transformé en [AM] en utilisant tr:
Cela donne la séquence:
Notez que cette
dc
commande nécessite la récursion de la queue pour fonctionner. Cela fonctionne sur la version DC 1.3.95 (Ubuntu 12.04) mais pas 1.3 (OSX Mavericks).la source
APL (59)
Écrit dans son propre alphabet :) C'est un peu long. Cela prend également beaucoup de temps à courir avec
9
, essayez-le avec un chiffre inférieur à tester si vous le souhaitez.Explication:
{
...}¨⍳9
: pour chaque numéro⍵
de 1 à 9:⍳13*⍵
: obtenir tous les nombres de 1 à13^⍵
¯1⌽
: Tourner la liste à gauche par 1 (donc nous avons13^⍵
,1
,2
, ...,13^⍵-1
qui se transforme en0, 1, 2 ...
modulo13^⍵
).(⍵/13)⊤
: encoder chaque nombre en base 13 en utilisant des⍵
chiffres⎕A[1+
...]
: en ajouter un (les tableaux sont indexés 1) et regarder dans⎕A
(l'alphabet)↓⍉
: transforme la matrice en un vecteur de vecteurs le long des colonnes.Z←⊃,/
: joignez chaque vecteur intérieur de vecteurs, en nous donnant une liste de noms possibles (mais il ne respecte pas encore les règles).{
...}¨
: pour chaque nom, teste s'il respecte la règle des 4 caractères répétés:4/¨⎕A[⍳13]
: pour chaque caractère, générer une chaîne de 4 de ce caractère⍷∘⍵¨
: pour chaque chaîne, teste si elle est présente dans⍵
∨/,↑
: prenez la logique ou de tous ces tests,~
: et inversez-le, ce qui1
signifie qu'il respecte les règles et0
ne le fait pas.Z/⍨
: sélectionnez parmiZ
tous les éléments qui répondent aux carburants↑
: afficher chacun sur une ligne séparéela source
Perl,
70686650 caractèresUsage:
La bonne chose est que les impressions sont mises en mémoire tampon, de sorte que toutes les solutions à 1 caractère sont imprimées en premier, suivies des mots à 2 caractères, etc.
la source
Perl - 35 octets
Compter le shebang comme un octet.
Ceci est une traduction lâche de la réponse de l' histocrate .
A..1x9
est un peu une bizarrerie; c'est un raccourci pour'A'..'111111111'
. L'accumulateur n'atteindra jamais la valeur finale (il ne contient que des lettres majuscules), mais il se terminera quand il dépassera 9 caractères. Cela peut être testé, par exemple, en utilisant à la1x4
place.la source
Array#-
).grep
je vais le faire. Je ne parle pas tout à fait Ruby.Pyg (Waaay trop long, pour une langue faite pour jouer au golf)
chuchotements : 101 ...
Même si c'est proche de la façon dont je le ferais en Python:
Moins la complication de la longue ligne bien sûr;)
la source
Pyth , 34 caractères
Explication:
la source
Python 2 - 212 octets
la source
Japt , 21 octets
Essayez-le en ligne! (le lien ne calcule que jusqu'à
14**4
.)Comment ça fonctionne
Suppose une implémentation ECMAScript 2017 standard en tant que couche JS (et suffisamment de mémoire pour stocker le tableau), où un
Array
objet peut avoir une2**53-1
longueur maximale .la source