Samowyliczające się pangramy

12

Pangramy

Szybki brązowy lis przeskoczył nad leniwym psem.

To jest przykład pangramu - zdania, które co najmniej raz zawiera każdą literę alfabetu.

Samo wyliczanie pangram jest zdanie, że spełnia kryteria być pangram przedstawiając analizę własnej liczby liter.

Przykładem tego jest zdanie

Ten pangram zawiera cztery As, jeden B, dwa Cs, jeden D, trzydzieści Es, sześć Fs, pięć Gs, siedem Hs, jedenaście Is, jeden J, jeden K, dwa Ls, dwa Ms, osiemnaście Ns, piętnaście Os, dwa Ps , jedno Q, pięć R, dwadzieścia siedem S, osiemnaście Ts, dwa Us, siedem V, osiem W, dwa X, trzy Y i jedno Z.


Wyzwanie

Utwórz funkcję, w której dane wejściowe są ciągiem prowadzącym do spisu liter. W tym przykładzie dane wejściowe to „Ten pangram zawiera”. Ilość każdej litery musi być w formie pisemnej i musi uwzględniać wyświetlaną liczbę liter.


Zasady

  • Przecinek Oxford jest opcjonalny
  • Użyj znaku ampersand przed Z (lub, w trybie twardym, włącz możliwość przełączania się między „&” i „i” w funkcji)
  • Każda litera liczy się do całkowitej liczby liter
  • Brak niepisanych liczb
  • To jest więc wygrywa najkrótszy kod w bajtach
  • W Hono u R małżonków w ten weekend, numery muszą być napisane w języku angielskim królowej. np. nine hundred and ninety-nine Gsdla 999 wystąpień litery G i nine hundred and nine Gsdla 909.
  • Rzędy wielkości należy zapisywać w standardowej konwencji nazewnictwa na małą skalę

Skrzynie na brzeg

  • W niektórych przypadkach kod utknie w pętli - na przykład, jeśli są dwa systemy operacyjne, kod zwiększy liczenie do trzech systemów operacyjnych, co powoduje, że kod ponownie liczy dwa systemy operacyjne. Jeśli obliczenia każdy inny list, zanim wróci do tego nie można rozwiązać problemu, należy rozważyć wejście do być fałszywe rozrusznik i wyjście false, nulllub pusty ciąg.
  • Jeśli litera ma ponad 999 wystąpień, dane wejściowe należy uznać za fałszywy starter.

Przypadki testowe

  • „Ten pangram zawiera” powinien wypisać przykładowe zdanie
Obrabować
źródło
8
Nie przetestowałem tego, ale jestem pewien, że są przypadki, w których nie można skonstruować prawidłowego rozwiązania, jakie powinny być dane wyjściowe w takim przypadku? Na przykład, jeśli masz ciąg znaków, który zawiera dwa o-s bez słowa dla liczby, to kiedy go przeliterujesz two, cały łańcuch ma teraz trzy o-s, co oznacza, że ​​słowo jest teraz niepoprawne, przełączenie powoduje, że znowu jest niepoprawne itp.
Nit
2
Jaka jest największa pisemna liczba obsługiwana przez rozwiązanie? Sto, tysiąc, milion?
Nit
7
Ładne pierwsze pytanie! Jednak osobiście zaleciłbym ograniczenie maksymalnej liczby liter do 999, a może nawet tylko 99. To uczyniłoby wyzwanie bardziej dostępnym dla języków, które nie mają wbudowanej funkcji dziesiętnej do tekstu, przy jednoczesnym zachowaniu całej zabawy. (Ponadto w niektórych językach testowanie wpisów zawierających miliony liter może być niemożliwe).
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,

Odpowiedzi:

6

Python 2 , 615 bajtów

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

Wypróbuj online!

Funkcja fprzyjmuje pjako przedrostek łańcucha; i zwraca krotkę liczby całkowitej reprezentującej liczbę wykonanych kroków oraz autogram.

Funkcja gkoduje liczbę 1<=n<=999w swoim angielskim ciągu; zajmuje 291 bajtów, mniej więcej połowę całkowitej liczby bajtów. Kod

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

koduje ciąg znaków sw (potencjalnie autogramem) pangram t.

Zapętlamy proces, mając nadzieję na sytuację, w której znajdziemy ttaki, jakim tjest autogram (tj. Gdzie t==s). Jeśli wchodząc w pętlę, losowo podważamy liczbę liter w sposób całkowicie ad hoc.

W przypadku większości wartości pproces ten przekroczy limit czasu w TIO. Zazwyczaj miliony możliwości są sprawdzane przed znalezieniem „zwycięskiej” kombinacji.

W ogóle nie mam żadnego dowodu, ale zgaduję, że: (a) oprócz wyczerpującego wyszukiwania brutalnej siły podobnego do tego, co autor tutaj opisał Lee Sallows i implementuje w sprzęcie (!), Ten rodzaj losowej heurystyki jest mniej więcej taki jak dobre, jak możesz; oraz (b) nie będzie rozwiązań wielu (większości?) początkowych fraz p.

Chas Brown
źródło
map(chr,range(65,91))oszczędza niektóre bajty.
ბიმო