Pangramas de auto-enumeração

12

Pangrams

A ligeira raposa marrom saltou sobre o cão preguiçoso.

Este é um exemplo de um pangram - uma frase que contém todas as letras do alfabeto pelo menos uma vez.

Um pangram auto-enumerado é uma frase que preenche os critérios para ser um pangram produzindo uma análise de sua própria contagem de letras.

Um exemplo de conseguir isso é a frase

Este pangram contém quatro As, um B, dois Cs, um D, trinta Es, seis Fs, cinco Gs, sete Hs, onze Is, um J, um K, dois Ls, duas Ms, dezoito Ns, quinze Os, dois Ps , um Q, cinco Rs, vinte e sete Ss, dezoito Ts, dois Us, sete Vs, oito Ws, dois Xs, três Ys e um Z.


O desafio

Produza uma função com a entrada sendo a sequência que leva ao inventário de letras. No exemplo, a entrada seria "Este pangram contém". A quantidade de cada letra deve estar na forma escrita e contribuir para a contagem de letras exibida.


Regras

  • A vírgula de Oxford é opcional
  • Use um e comercial antes de Z (ou, no modo difícil, inclua a capacidade de alternar entre "&" e "e" na função)
  • Cada letra conta para a contagem total de letras
  • Não há números não escritos
  • Isso é então o código mais curto em bytes vence
  • Em Hono u r do casal neste fim de semana, os números devem ser escritos em Inglês da Rainha. por exemplo, nine hundred and ninety-nine Gspara 999 ocorrências da letra G e nine hundred and nine Gspara 909.
  • Ordens de magnitude devem ser escritas na convenção padrão de nomes em pequena escala

Casos de borda

  • Existem alguns casos em que o código fica preso em um loop - por exemplo, se houver dois sistemas operacionais, o código aumentará a contagem para três sistemas operacionais, o que faz com que o código conte dois sistemas operacionais novamente. Se calcular todas as outras letras antes de voltar para isso não pode resolver o problema, considerar a entrada de ser um falso arranque e saída false, nullou uma string vazia.
  • Se uma letra tiver mais de 999 ocorrências, a entrada deve ser considerada um acionador de partida falso.

Casos de teste

  • "Este pangram contém" deve exibir a frase de exemplo
Roubar
fonte
8
Não testei, mas tenho certeza de que existem alguns casos em que você não pode construir uma solução válida. Qual deve ser a saída nesse caso? Por exemplo, se você tiver uma sequência que contenha dois o-s sem a palavra para a contagem, quando você a soletrar two, toda a sequência terá três o-s, o que significa que a palavra está incorreta, alternando-a novamente , etc.
Nit
2
Qual é o maior número escrito que a solução suporta? Cem, mil, um milhão?
Nit
7
Boa primeira pergunta! No entanto, eu pessoalmente recomendo limitar o número máximo de letras para 999 ou talvez apenas 99. Isso tornaria o desafio mais acessível para idiomas que não possuem decimais para incorporar texto, preservando toda a diversão. (Além disso, ele pode até não ser possível entradas de teste com milhões de cartas em alguns idiomas.)
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

Respostas:

6

Python 2 , 615 bytes

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

Experimente online!

A função fassume pcomo prefixo da string; e retorna uma tupla de um número inteiro representando o número de etapas executadas e o autograma.

A função gcodifica um número 1<=n<=999para sua string em inglês; ocupa 291 bytes, aproximadamente metade da contagem total de bytes. O código

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

codifica a string sem um pangram (potencialmente autograma) t.

Nós loop sobre o processo, esperando a situação em que encontramos uma tforma que té um autogram (isto é, onde t==s). Se Quando entramos em um loop, aleatoriamente cutucamos as contagens de letras de maneira completamente ad hoc.

Para a maioria dos valores de p, esse processo expirará no TIO. Normalmente, milhões de possibilidades são examinadas antes de encontrar uma combinação 'vencedora'.

Não tenho nenhuma prova, mas meu palpite é: (a) além de uma exaustiva pesquisa de força bruta semelhante à que o criador Lee Sallows descreve aqui e implementa em hardware (!), Esse tipo de heurística aleatória é tão bom como você pode obter; e (b) não haverá soluções para muitas frases iniciais (a maioria?) p.

Chas Brown
fonte
map(chr,range(65,91))salva alguns bytes.
ბიმო