Trenggiling yang menghitung sendiri


12

Pangrams

Rubah cokelat cepat melompati anjing malas.

Ini adalah contoh pangram - kalimat yang berisi setiap huruf alfabet setidaknya sekali.

Sebuah pangram pencacahan sendiri adalah kalimat yang memenuhi kriteria untuk menjadi pangram dengan menghasilkan analisis jumlah suratnya sendiri.

Contoh untuk mencapai ini adalah kalimat

Pangram ini berisi empat As, satu B, dua Cs, satu D, tiga puluh Es, enam Fs, lima Gs, tujuh Hs, sebelas Is, satu J, satu K, dua Ls, dua Ms, delapan belas Ns, lima belas Os, dua Ps , satu Q, lima Rs, dua puluh tujuh Ss, delapan belas Ts, dua Us, tujuh Vs, delapan Ws, dua Xs, tiga Ys, & satu Z.


Tantangan

Menghasilkan fungsi dengan input berupa string yang mengarah ke inventaris surat. Dalam contoh tersebut, inputnya adalah "pangram ini berisi". Jumlah setiap huruf harus dalam bentuk tertulis dan berkontribusi pada jumlah surat yang ditampilkan.


Aturan

  • Koma Oxford adalah opsional
  • Gunakan ampersand sebelum Z (atau, untuk mode keras, termasuk kemampuan untuk beralih antara "&" dan "dan" dalam fungsi)
  • Setiap huruf diperhitungkan terhadap jumlah total surat
  • Tidak ada nomor yang tidak tertulis
  • Ini adalah sehingga kode terpendek dalam byte menang
  • Dalam hono u r dari pasangan yang menikah akhir pekan ini, jumlahnya akan ditulis dalam Ratu Inggris. misalnya nine hundred and ninety-nine Gsuntuk 999 kemunculan huruf G dan nine hundred and nine Gsuntuk 909.
  • Urutan besarnya harus ditulis dalam konvensi penamaan skala pendek standar

Kasus tepi

  • Ada beberapa kasus di mana kode akan macet dalam satu lingkaran - misalnya, jika ada dua O kode akan meningkatkan hitungan menjadi tiga O, yang menyebabkan kode untuk menghitung dua O lagi. Jika menghitung setiap huruf lain sebelum kembali ke masalah ini tidak dapat menyelesaikan masalah, pertimbangkan input sebagai starter dan output yang salah false, nullatau string kosong.
  • Jika sebuah surat memiliki lebih dari 999 kemunculan, input harus dianggap sebagai starter yang salah.

Uji Kasus

  • "Pangram ini berisi" harus menampilkan contoh kalimat

8
Saya belum mengujinya, tapi saya cukup yakin ada beberapa kasus di mana Anda tidak dapat membangun solusi yang valid, apa yang harus menjadi output dalam kasus itu? Misalnya, jika Anda memiliki string yang berisi dua o-s tanpa kata untuk hitungan, maka ketika Anda mengeja dengan two, seluruh string sekarang memiliki tiga o-s, yang berarti kata itu sekarang salah, beralih membuatnya menjadi salah lagi , dll.
Nit

2
Berapa angka tertulis terbesar yang harus didukung oleh solusi? Seratus, seribu, sejuta?
Nit

7
Pertanyaan pertama yang bagus! Namun, saya pribadi merekomendasikan untuk membatasi jumlah maksimum huruf menjadi 999 atau bahkan mungkin hanya 99. Ini akan membuat tantangan lebih mudah diakses oleh bahasa yang tidak memiliki desimal untuk teks bawaan, sambil tetap mempertahankan semua kesenangan. (Juga, bahkan mungkin tidak mungkin untuk menguji entri dengan jutaan huruf dalam beberapa bahasa.)
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

Jawaban:


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

Cobalah online!

Fungsi ini fdiambil psebagai awalan string; dan mengembalikan tupel bilangan bulat yang mewakili jumlah langkah yang diambil, dan autogram.

Fungsi gmenyandikan angka 1<=n<=999ke string bahasa Inggrisnya; membutuhkan 291 byte, kira-kira setengah dari total byte. Kode

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

mengkodekan string smenjadi pangram (berpotensi autogram-matic) t.

Kami mengulang proses, berharap untuk situasi di mana kami menemukan tsedemikian rupa sehingga tmerupakan autogram (yaitu, di mana t==s). Jika Ketika kita masuk ke loop, kita secara acak mendorong jumlah huruf dengan cara yang sepenuhnya ad hoc.

Untuk sebagian besar nilai p, proses ini akan habis pada TIO. Biasanya, jutaan kemungkinan diperiksa sebelum menemukan kombinasi 'menang'.

Saya tidak punya bukti sama sekali, tetapi dugaan saya adalah: (a) selain dari pencarian brute force yang lengkap mirip dengan apa yang digambarkan oleh pencetusnya Lee Sallows di sini dan diimplementasikan dalam perangkat keras (!), Heuristik acak ini kira-kira sama sebagus yang Anda bisa; dan (b) tidak akan ada solusi untuk banyak (sebagian?) frasa awal p.


map(chr,range(65,91))menghemat beberapa byte.
ბიმო
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.