Selbstaufzählende Pangrams

12

Pangrams

Der schnelle braune Fuchs sprang über den faulen Hund.

Dies ist ein Beispiel für einen Pangram - ein Satz, der jeden Buchstaben des Alphabets mindestens einmal enthält.

Eine Selbstaufzählung Pangram ist ein Satz, der die Kriterien eines Pangrams erfüllt, indem er eine Analyse seiner eigenen Buchstabenanzahl erstellt.

Ein Beispiel dafür ist der Satz

Dieser Pangram enthält vier As, ein B, zwei Cs, ein D, dreißig Es, sechs Fs, fünf Gs, sieben Hs, elf Is, ein J, ein K, zwei Ls, zwei Ms, achtzehn Ns, fünfzehn Os, zwei Ps , ein Q, fünf Rs, siebenundzwanzig Ss, achtzehn Ts, zwei Us, sieben Vs, acht Ws, zwei Xs, drei Ys und ein Z.


Die Herausforderung

Produziere eine Funktion, wobei die Eingabe die Zeichenkette ist, die in das Briefinventar führt. Im Beispiel wäre die Eingabe "Dieser Pangram enthält". Die Menge jedes Buchstabens muss in schriftlicher Form vorliegen und zur angezeigten Buchstabenanzahl beitragen.


Regeln

  • Das Oxford-Komma ist optional
  • Verwenden Sie ein kaufmännisches Und vor Z (oder schließen Sie für den harten Modus die Möglichkeit ein, in der Funktion zwischen "&" und "und" zu wechseln)
  • Jeder Buchstabe wird auf die Gesamtzahl der Buchstaben angerechnet
  • Keine nicht geschriebenen Zahlen
  • Das ist also gewinnt der kürzeste Code in Bytes
  • In hono u r des Ehepaares an diesem Wochenende sind die Zahlen in der Königin Englisch geschrieben werden. zB nine hundred and ninety-nine Gsfür 999 Vorkommen des Buchstabens G und nine hundred and nine Gsfür 909.
  • Größenordnungen sind in der üblichen Kurzskalen-Namenskonvention zu schreiben

Edge-Fälle

  • In einigen Fällen bleibt der Code in einer Schleife hängen. Wenn beispielsweise zwei Os vorhanden sind, erhöht der Code die Anzahl auf drei Os, wodurch der Code erneut zwei Os zählt. Wenn die Berechnung jedes zweiten Buchstabens, bevor Sie darauf zurückkommen, das Problem nicht lösen kann, betrachten Sie die Eingabe als falschen Starter und Ausgang false.null oder eine leere Zeichenfolge.
  • Wenn ein Buchstabe mehr als 999 Mal vorkommt, sollte die Eingabe als falscher Starter betrachtet werden.

Testfälle

  • "Dieser Pangram enthält" sollte den Beispielsatz ausgeben
rauben
quelle
8
Ich habe es nicht getestet, aber ich bin mir ziemlich sicher, dass es einige Fälle gibt, in denen Sie keine gültige Lösung erstellen können. Wie sollte die Ausgabe in diesem Fall aussehen? Wenn Sie beispielsweise eine Zeichenfolge haben, die zwei- os ohne das Wort für die Zählung enthält two, hat die gesamte Zeichenfolge jetzt drei- os, was bedeutet, dass das Wort jetzt falsch ist. Wenn Sie es umschalten, wird es wieder falsch , etc.
Nit
2
Was ist die größte geschriebene Zahl, die die Lösung unterstützen muss? Hunderttausend Millionen?
Nit
7
Schöne erste Frage! Ich persönlich würde jedoch empfehlen, die maximale Anzahl von Buchstaben auf 999 oder vielleicht sogar nur 99 zu beschränken. Dies würde die Herausforderung für Sprachen zugänglicher machen, die keine Dezimalstellen für eingebaute Texte haben, während der ganze Spaß erhalten bleibt. (Außerdem ist es möglicherweise nicht möglich, Einträge mit Millionen von Buchstaben in einigen Sprachen zu testen.)
Arnauld,
1
Siehe auch
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

Antworten:

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

Probieren Sie es online!

Die Funktion fdauertp als Zeichenfolge das Präfix; und gibt ein Tupel einer ganzen Zahl zurück, die die Anzahl der durchgeführten Schritte und das Autogramm darstellt.

Die Funktion gcodiert eine Zahl 1<=n<=999in ihre englische Zeichenfolge. es nimmt 291 Bytes ein, ungefähr die Hälfte der Gesamtbytezahl. Der Code

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

kodiert die Zeichenkette sin ein (möglicherweise autogrammatisches) Pangramt .

Wir durchlaufen den Prozess und hoffen auf die Situation, in der wir eine tsolche findent das ein Autogramm ist (dh wo t==s). Wenn wir in eine Schleife geraten, stoßen wir die Anzahl der Buchstaben ganz ad hoc nach dem Zufallsprinzip an.

Für die meisten Werte von p läuft dieser Prozess bei TIO ab. In der Regel werden Millionen von Möglichkeiten geprüft, bevor eine „gewinnbringende“ Kombination gefunden wird.

Ich habe überhaupt keinen Beweis, aber meine Vermutung ist: (a) Abgesehen von einer erschöpfenden Brute-Force-Suche, die der Beschreibung des Urhebers Lee Sallows ähnelt und in Hardware (!) Implementiert, ist diese Art von zufälliger Heuristik ungefähr so gut wie du bekommen kannst; und (b) es wird keine Lösung für viele (die meisten?) Anfangssätze geben p.

Chas Brown
quelle
map(chr,range(65,91))spart einige Bytes.
27.