Sebuah pangram adalah string yang berisi setiap surat a
- z
dari bahasa Inggris alfabet, kasus-sensitif. (Tidak apa-apa jika pangram berisi lebih dari satu salinan surat, atau jika berisi karakter bukan huruf di samping surat-surat itu.)
Tulis program atau fungsi yang inputnya adalah daftar string, dan yang menghasilkan satu atau lebih string yang memiliki properti berikut:
- Setiap string keluaran harus berupa pangram.
- Setiap string output harus dibentuk dengan menggabungkan satu atau lebih string dari daftar input, dipisahkan oleh spasi.
- Setiap string keluaran harus yang terpendek, atau diikat untuk yang terpendek, di antara semua string dengan properti ini.
Banyak program akan memilih untuk hanya menghasilkan satu string; Anda hanya ingin menghasilkan lebih dari satu string jika Anda harus menulis kode tambahan untuk membatasi output.
Anda dapat berasumsi bahwa input tidak mengandung karakter atau spasi yang tidak dapat dicetak, dan tidak ada kata di dalamnya yang lebih dari (26 kali logaritma natural dari panjang daftar) karakter. (Namun, Anda tidak boleh berasumsi bahwa input hanya berisi huruf, atau hanya huruf kecil; tanda baca dan huruf besar sepenuhnya mungkin.)
Input dan output dapat diberikan dalam format apa pun yang masuk akal. Untuk menguji program Anda, saya sarankan menggunakan dua test case: kamus kata-kata bahasa Inggris (kebanyakan komputer memiliki satu), dan case berikut (yang pangram sempurna (26 huruf) tidak mungkin, jadi Anda harus menemukan satu berisi surat rangkap):
abcdefghi
defghijkl
ijklmnop
lmnopqrs
opqrstuvw
rstuvwxyz
Anda harus menyertakan sampel hasil program Anda bersama dengan kiriman Anda. (Ini mungkin berbeda untuk orang yang berbeda karena menggunakan daftar kata yang berbeda.)
Kondisi kemenangan
Ini adalah tantangan kode-golf dengan kompleksitas terbatas . Pemenangnya adalah program terpendek (dalam byte) yang berjalan dalam waktu polinomial . (Rangkuman untuk orang-orang yang tidak tahu apa artinya: jika Anda menggandakan ukuran daftar kata, program harus menjadi lebih lambat tidak lebih dari faktor konstan. Namun, faktor konstan yang dipermasalahkan bisa sebesar Anda. seperti. Misalnya, itu berlaku untuk menjadi empat kali lebih lambat, atau delapan kali lebih lambat, tetapi tidak untuk itu menjadi lebih kecil oleh faktor panjangnya daftar kata; faktor melalui mana ia menjadi lebih lambat harus dibatasi.)
Jawaban:
Ruby 159 (berulang-ulang)
Rubi
227220229227221 (rekursif)Solusi iteratif baru (berdasarkan algoritma yang dijelaskan oleh @Niel):
Solusi rekursif lama:
Pengukuran byte didasarkan pada meninggalkan baris baru terakhir dalam file, yang tidak masalah
ruby 2.3.1p112
. Hitungan byte naik kembali setelah memperbaiki bug kecil (menambahkan.downcase
.upcase
untuk case-insensitivity seperti yang dipersyaratkan oleh pernyataan masalah).Ini adalah versi sebelumnya dari sebelum memperpendek pengidentifikasi dan semacamnya:
Bagaimana cara kerjanya? Itu pada dasarnya mempertahankan satu set karakter masih untuk menutupi dan hanya berulang pada kata jika itu akan mengurangi set terbuka. Selain itu, hasil rekursi juga dicatat. Setiap subset dari 2 ^ 26 sesuai dengan entri tabel memoisasi. Setiap entri tersebut dihitung dalam waktu sebanding dengan ukuran file input. Jadi semuanya
O(N)
(di manaN
ukuran file input), meskipun dengan konstanta besar.sumber
JavaScript (ES6),
249248 byte, mungkin bersaingPenjelasan: Mengubah array dengan mengubah huruf menjadi bitmask, menyimpan hanya kata terpendek untuk setiap bitmask di peta. Kemudian beralih di atas salinan peta, tambahkan peta dengan menambahkan setiap bitmask gabungan jika string yang dihasilkan akan lebih pendek. Akhirnya kembalikan string yang disimpan untuk bitmap yang sesuai dengan pangram. (Kembali
undefined
jika tidak ada string seperti itu.)sumber
Python 3,
98,94, 92 byteIterasi melalui representasi ASCII dari alfabet dan tambahkan 1 ke daftar jika huruf ditemukan dalam string. Jika jumlah daftar lebih besar dari 25, itu berisi semua huruf alfabet dan akan dicetak.
sumber
(' ')
danif
. Anda juga dapat mengubahord(i) in range(65,91)
ke91>x>=65
. Juga, apa kompleksitasnya?