Pangrammes auto-énumérants

12

Pangrams

Le rapide renard brun sauta par dessus le chien paresseux.

Ceci est un exemple de pangram - une phrase qui contient au moins une fois chaque lettre de l'alphabet.

Un pangram auto-énumérant est une phrase qui remplit les critères pour être un pangram en produisant une analyse de son propre décompte des lettres.

Un exemple pour y parvenir est la phrase

Ce pangram contient quatre As, un B, deux Cs, un D, ​​trente Es, six Fs, cinq Gs, sept Hs, onze Is, un J, un K, deux Ls, deux Ms, dix-huit Ns, quinze Os, deux Ps , un Q, cinq R, vingt-sept S, dix-huit Ts, deux Us, sept V, huit W, deux X, trois Y et un Z.


Le défi

Produisez une fonction dont l'entrée est la chaîne menant à l'inventaire des lettres. Dans l'exemple, l'entrée serait "Ce pangram contient". La quantité de chaque lettre doit être sous forme écrite et contribuer au nombre de lettres affiché.


Règles

  • La virgule d'Oxford est facultative
  • Utilisez une esperluette avant Z (ou, pour le mode difficile, incluez la possibilité de basculer entre "&" et "et" dans la fonction)
  • Chaque lettre compte pour le nombre total de lettres
  • Pas de numéros non écrits
  • C'est le donc le code le plus court en octets gagne
  • Dans hono u r du couple marié ce week - end, les chiffres doivent être rédigés en anglais de la Reine. par exemple nine hundred and ninety-nine Gspour 999 occurrences de la lettre G et nine hundred and nine Gspour 909.
  • Les ordres de grandeur doivent être écrits dans la convention de dénomination standard à petite échelle

Cas de bord

  • Il y a des cas où le code restera bloqué dans une boucle - par exemple, s'il y a deux Os, le code augmentera le nombre à trois Os, ce qui fera que le code comptera à nouveau deux Os. Si le calcul toutes les autres lettres avant de revenir à cela ne peut pas résoudre le problème, pensez à l'entrée à un faux départ et de sortie false, nullou une chaîne vide.
  • Si une lettre a plus de 999 occurrences, l'entrée doit être considérée comme un faux démarreur.

Cas de test

  • "Ce pangram contient" devrait afficher l'exemple de phrase
Rob
la source
8
Je ne l'ai pas testé, mais je suis sûr qu'il y a des cas où vous ne pouvez pas construire une solution valide, quelle devrait être la sortie dans ce cas? Par exemple, si vous avez une chaîne qui contient deux o-s sans le mot pour le décompte, alors lorsque vous l'épelez avec two, la chaîne entière a maintenant trois o-s, ce qui signifie que le mot est maintenant incorrect, le changer le rend à nouveau incorrect , etc.
Nit
2
Quel est le plus grand nombre écrit que la solution doit prendre en charge? Cent, mille, un million?
Nit
7
Belle première question! Cependant, je recommanderais personnellement de limiter le nombre maximum de lettres à 999 ou peut-être même seulement 99. Cela rendrait le défi plus accessible aux langues qui n'ont pas de décimales aux textes intégrés, tout en préservant tout le plaisir. (De plus, il peut même ne pas être possible de tester des entrées avec des millions de lettres dans certaines langues.)
Arnauld
1
Rob enjoys any sentence with two As, two Bs, two Cs, one D, thirty five Es, four Fs, three Gs, nine Hs, eight Is, two Js, one K, two Ls, one M, twenty two Ns, eighteen Os, one P, one Q, nine Rs, twenty three Ss, twenty three Ts, three Us, four Vs, eleven Ws, one X, seven Ys, & one Z.
Chas Brown

Réponses:

6

Python 2 , 615 octets

def g(n):S=str.split;D=S('z one two three four five six seven eight nine');K=' fif six seven eigh nine';n,m=n/100,n%100;e,d=m/10,m%10;return' '.join([D[n],'hundred']*(n>0)+([S('ten eleven twelve thir four'+K)[d]+'teen'*(d>2)]if 9<m<20else[S('twen thir for'+K)[e-2]+'ty']*(e>0)+[D[d]]*(d>0)))
from random import*
X='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def f(p):
 T=set();s='';i=0
 while 1:
	Q=s.upper().count;t=p+' '+', '.join(['& '*(c=='Z')+g(Q(c))+' '+c+'s'*(Q(c)!=1)for c in X])+'.'
        if s==t:return i,t
	if t in T:t=''.join(c*max(1,t.upper().count(c)+(randint(0,6)-3)*(random()<0.25))for c in X)
	T.add(t);s=t;i+=1

Essayez-le en ligne!

La fonction fprend pcomme préfixe de chaîne; et renvoie un tuple d'un entier représentant le nombre de pas effectués et l'autogramme.

La fonction gcode un nombre 1<=n<=999dans sa chaîne anglaise; il prend 291 octets, soit environ la moitié du nombre total d'octets. Le code

Q=s.upper().count
t=p+' '+', '.join(['& '*(c=='Z')+g(Q(c))+' '+c+'s'*(Q(c)!=1)for c in X])+'.'

code la chaîne sen un pangramme (potentiellement autogramme) t.

Nous passons en revue le processus, en espérant la situation où nous trouvons un ttel qui test un autogramme (c'est-à-dire, où t==s). Si lorsque nous entrons dans une boucle, nous poussons au hasard le nombre de lettres de manière complètement ad hoc.

Pour la plupart des valeurs de p, ce processus expirera sur TIO. En règle générale, des millions de possibilités sont examinées avant de trouver une combinaison «gagnante».

Je n'ai aucune preuve du tout, mais ma supposition est: (a) à part une recherche exhaustive de force brute similaire à ce que l' auteur Lee Sallows décrit ici et implémente dans le matériel (!), Ce type d'heuristique aléatoire est à peu près aussi bon que vous pouvez obtenir; et (b) il n'y aura pas de solutions pour de nombreuses phrases (la plupart?) initiales p.

Chas Brown
la source
map(chr,range(65,91))enregistre quelques octets.
ბიმო