Pangrammi auto-enumeranti


12

Pangrams

La volpe marrone veloce saltò sul cane pigro.

Questo è un esempio di un diagramma - una frase che contiene ogni lettera dell'alfabeto almeno una volta.

Un pangramma auto-enumerante è una frase che soddisfa i criteri per essere un pangramma producendo un'analisi del proprio conteggio delle lettere.

Un esempio di raggiungimento di questo è la frase

Questo diagramma contiene quattro As, una B, due C, una D, trenta Es, sei Fs, cinque Gs, sette Hs, undici Is, una J, una K, due Ls, due Ms, diciotto Ns, quindici Os, due Ps , una Q, cinque R, ventisette S, diciotto Ts, due Us, sette Vs, otto Ws, due Xs, tre Ys e una Z.


La sfida

Produce una funzione con l'input come stringa che porta all'inventario delle lettere. Nell'esempio, l'ingresso sarebbe "Questo pangram contiene". La quantità di ogni lettera deve essere nella forma scritta e contribuire al conteggio delle lettere visualizzato.


Regole

  • La virgola di Oxford è facoltativa
  • Usa una e commerciale prima di Z (o, per la modalità difficile, includi la possibilità di alternare tra "&" e "e" nella funzione)
  • Ogni lettera conta per il conteggio totale delle lettere
  • Nessun numero non scritto
  • Questo è quindi vince il codice più breve in byte
  • In Hono u r degli sposi questo fine settimana, i numeri devono essere scritti in inglese della regina. ad es. nine hundred and ninety-nine Gsper 999 occorrenze della lettera G e nine hundred and nine Gsper 909.
  • Gli ordini di grandezza devono essere scritti nella convenzione standard di denominazione su scala ridotta

Custodie per bordi

  • Ci sono alcuni casi in cui il codice si bloccherà in un ciclo - ad esempio, se ci sono due Os il codice aumenterà il conteggio a tre Os, il che fa sì che il codice conti nuovamente due Os. Se il calcolo ogni lettera prima di tornare a questo non può risolvere il problema, si consideri l'ingresso da un falso avviamento e l'uscita false, nullo una stringa vuota.
  • Se una lettera presenta oltre 999 occorrenze, l'input deve essere considerato un falso avviatore.

Casi test

  • "Questo pangram contiene" dovrebbe generare la frase di esempio

8
Non l'ho testato, ma sono abbastanza sicuro che ci sono alcuni casi in cui non è possibile costruire una soluzione valida, quale dovrebbe essere l'output in quel caso? Ad esempio, se si dispone di una stringa che contiene due o-s senza la parola per il conteggio, quindi quando la si scrive two, l'intera stringa ora ha tre o-s, il che significa che la parola ora è errata, cambiandola la rende nuovamente errata , ecc.
Nit

2
Qual è il maggior numero scritto che la soluzione deve supportare? Cento, mille, un milione?
Nit

7
Bella prima domanda! Tuttavia, consiglierei personalmente di limitare il numero massimo di lettere a 999 o forse anche solo a 99. Ciò renderebbe la sfida più accessibile alle lingue che non dispongono di decimali per i messaggi di testo incorporati, pur mantenendo tutto il divertimento. (Inoltre, potrebbe non essere nemmeno possibile testare voci con milioni di lettere in alcune lingue.)
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,

Risposte:


6

Python 2 , 615 byte

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

Provalo online!

La funzione fassume pcome prefisso stringa; e restituisce una tupla di un numero intero che rappresenta il numero di passi effettuati e l'autogramma.

La funzione gcodifica un numero 1<=n<=999nella sua stringa inglese; occupa 291 byte, circa la metà del conteggio totale dei byte. Il codice

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

codifica la stringa sin un pangram (potenzialmente autogram-matic) t.

Passiamo in rassegna il processo, sperando nella situazione in cui troviamo un ttale che tsia un autogramma (cioè, dove t==s). Se quando entriamo in un ciclo, spostiamo casualmente i conteggi delle lettere in un modo completamente ad hoc.

Per la maggior parte dei valori di p, questo processo scadrà su TIO. In genere, milioni di possibilità vengono esaminate prima di trovare una combinazione "vincente".

Non ho alcuna prova, ma la mia ipotesi è: (a) a parte una ricerca esaustiva della forza bruta simile a quella che l' originatore Lee Sallows descrive qui e implementa nell'hardware (!), Questo tipo di euristico casuale riguarda circa buono come puoi ottenere; e (b) non ci saranno soluzioni per molte (la maggior parte?) frasi iniziali p.


map(chr,range(65,91))salva alcuni byte.
ბიმო
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.