Pertanyaan ini didasarkan pada pertanyaan yang saya ajukan dalam bahasa Spanyol . Ya, saya meminta algoritma dalam Bahasa Spanyol. :)
Di Spanyol, plat nomor saat ini memiliki pola ini:
1234 XYZ
di mana XYZ adalah tiga konsonan yang diambil dari set konsonan Spanyol penuh (kecuali 'Ñ', saya pikir).
Terkadang, saat bepergian dengan istri saya, kami biasa bermain game. Ketika kita melihat plat nomor, kita mengambil tiga konsonan dan mencoba untuk membentuk sebuah kata yang mengandung ketiga konsonan itu, muncul dalam urutan yang sama seperti pada plat nomor. Contoh (dalam bahasa Spanyol):
BCD
BoCaDo (valid)
CaBezaDa (not valid)
FTL
FaTaL (valid)
FLeTar (not valid)
FTR
FleTaR (valid, wins)
caFeTeRa (valid, loses)
Pemenangnya adalah orang yang menggunakan jumlah karakter paling sedikit, seperti yang Anda lihat pada contoh terakhir.
Tantangan
Tulis program atau fungsi terpendek yang menerima daftar kata dan satu set tiga konsonan dan temukan kata terpendek dalam daftar yang berisi tiga konsonan dalam urutan yang sama. Untuk tujuan permainan ini, kasus tidak masalah.
- Input untuk daftar kata (parameter pertama) akan menjadi array dari
string
jenis bahasa Anda . Parameter kedua (tiga konsonan) akan menjadi yang lainstring
. Jika lebih baik untuk bahasa Anda, pertimbangkanstring
dengan tiga konsonan item terakhir dari seluruh daftar parameter. Output akan menjadi yang lainstring
. - Kata-kata dalam daftar kata tidak akan ditemukan atau kata-kata yang tak terbatas, kata-kata yang akan muncul dalam kamus standar apa pun. Jika Anda membutuhkan batas, anggap tidak ada kata dalam daftar kata yang akan lebih panjang dari 50 karakter.
- Jika ada beberapa kata dengan panjang yang sama yang bisa menjadi jawaban yang valid, Anda dapat mengembalikan salah satu dari mereka. Pastikan Anda mengembalikan hanya satu kata, atau string kosong jika tidak ada kata yang cocok dengan pola tiga konsonan.
- Anda dapat mengulangi konsonan dalam grup, jadi input yang valid untuk ketiga konsonan adalah keduanya
FLR
danGGG
. - Konsonan Spanyol persis sama dengan bahasa Inggris, dengan penambahan "Ñ". Vokal sama dengan adition dari vokal yang ditekankan: "áéíóúü". Tidak akan ada tanda lain seperti "-" atau "'".
- Anda dapat mengira bahwa kasusnya akan selalu sama dalam daftar kata dan tiga konsonan.
Jika Anda ingin menguji algoritme Anda dengan koleksi nyata kata-kata Spanyol, Anda dapat mengunduh file (15,9 MB) dari Dropbox dengan lebih dari satu juta kata.
Uji kasus
Input: 'psr', {'hola' 'repasar' 'pasarais' 'de' 'caída' 'pequeñísimo' 'agüeros'}
Output: 'repasar'
Input: 'dsd', {'dedos' 'deseado' 'desde' 'sedado'}
Output: 'desde'
Input: 'hst', {'hastío' 'chest'}
Output: 'chest'
Ini adalah kode-golf , jadi semoga program terpendek yang membantu saya untuk selalu mengalahkan kemenangan istri saya! :)
Jawaban:
05AB1E ,
108 byteDisimpan 2 byte berkat Leo
Cobalah online!
Penjelasan
Saya akan digunakan
head
pada akhirnya menghemat satu byte tetapi itu akan menampilkan daftar kosong jika tidak ada kecocokan.sumber
3ù #keep only those of length 3
mengapa kamu membutuhkan ini?MATL ,
3029 byteCobalah online!
Penjelasan
sumber
PHP , 111 byte
Cobalah online!
sumber
You can suppose the case will always be the same in both the word list and the three consonants.
- tidak perlu untuk pengubah regex. Apakah Anda mencobawordwrap
bukanjoin(str_split())
?Jelly ,
12 1110 byteProgram lengkap yang menerima daftar daftar huruf kecil (kata-kata) dan daftar huruf kecil (huruf) dan mencetak kata pertama dari kata terpendek yang berisi sub-urutan sama dengan huruf (atau tidak sama sekali jika tidak ada ).
Cobalah online!
Bagaimana?
sumber
Pyth -
2221191211 byte-1 Terima kasih kepada Maltysen.
Mengambil 2 baris sebagai input. 1 adalah string 3 huruf (huruf kecil), dan 2 adalah daftar kata huruf kecil.
Coba di sini
Penjelasan:
Solusi lama 19 byte:
sumber
Brachylog v2, 11 byte
Cobalah online!
Pengiriman fungsi. (TIO link memiliki argumen baris perintah untuk menjalankan fungsi seolah-olah itu adalah program lengkap.)
Penjelasan
Hanya terjemahan langsung dari spesifikasi lagi ...
Anda benar-benar hampir dapat menjawab dengan
h⊆.&t∋
- menukar urutan evaluasi berarti bahwa Brachylog akan memilih jawaban tersingkat secara default (seperti kendala pertama yang dilihatnya⊆
, yang memiliki "terpendek" yang agak nyaman sebagai tiebreak default) - tetapi dalam kasus itu, Brachylog's algoritma evaluasi sayangnya akan masuk ke loop tak terbatas jika jawabannya tidak benar-benar ditemukan. Jadi hampir setengah dari jawaban itu didedikasikan untuk menangani kasus tidak ada jawaban yang tepat. Bahkan kemudian,lᵒ
tiebreak menimpa (yang secara teknis semacam, memanfaatkan∋
tiebreak default dari elemen yang disukai lebih dekat pada awal daftar) hanya dua byte; tiga lainnya berasal dari kebutuhan untuk mengeluarkan string kosong khusus ketika output tidak ditemukan, yang bertentangan dengan nilai sentinel "no solusi" default Brachylog (karena final.
akan tersirat jika kita tidak harus mengikutinya dengan∨
).Menariknya, ada fitur yang sebelumnya diterapkan di Brachylog yang akan menyelamatkan satu byte di sini. Pada satu titik, Anda bisa mengekstrak elemen dari argumen masukan menggunakan
?₁
,?₂
, dll sintaks; yang akan memungkinkan Anda untuk mengatur ulang programtlᵒ∋.⊇?₁∨Ẹ
, yang hanya 10 byte. Sayangnya, implementasi yang digunakan tidak benar-benar berfungsi (dan menyebabkan banyak program yang rusak), sehingga dikembalikan. Anda dapat menganggap program sebagai "konseptual" sepanjang 10 byte.sumber
Haskell
12912574 byteKREDIT ke @nimi
sumber
map
dan yangfilter
dengan daftar pemahaman. Karena Anda sudah memilikiData.List
ruang lingkup, Anda dapat menggunakansortOn length
dan memilih kepala untuk menemukan elemen dengan panjang minimal. Akhirnya, buatlahy
fungsi infiks. Semua ini membuatf
dank
berlebihan:l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0
.Data.Lists
, Anda dapat menggunakanargmin
bukannyasortOn
dan menyimpan!!0
:l#w=argmin length[...]
.Data.Lists
memiliki banyak fungsi yang bagusPerl, 53 byte
48 byte kode + 5 untuk
-paF
.Ini mengambil keuntungan dari fakta bahwa daftar diinterpolasi ke
m//
operator yang memanfaatkan$"
variabel yang mengubah masukan string awal daripsr
kep.*s.*r
yang kemudian dicocokkan untuk setiap kata tambahan dan diurutkan padalength
.Cobalah online!
sumber
<<<
operator menambahkan itu untuk saya di baris perintah!JavaScript (ES6),
777572 byteMembawa 3 konsonan
c
dan daftar katal
dalam sintaks currying(c)(l)
. Kedua input diharapkan dalam kasus yang sama.Uji kasus
Tampilkan cuplikan kode
sumber
c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))
untuk 72, saya pikirR, 101 byte
Pertama kali bermain golf! Saya yakin ini bisa dipadatkan
Mengambil string x dan vektor karakter y dari input yang mungkin
Cobalah online!
Sunting: Versi saya 135, terima kasih Scrooble untuk -34!
sumber
Retina , 58 byte
Cobalah online! Mengambil tiga konsonan pada satu baris dan kemudian daftar kata pada semua baris berikutnya. Penjelasan:
O
mengurutkan daftar¶.+
tidak termasuk baris pertama secara#
numerik$
dikunci oleh$.&
panjang. Pertandingan kemudian dicari untuk garis yang menyertakan tiga konsonan secara berurutan. Jika garis yang sesuai ada dari yang terakhir, yaitu terpendek, garis tersebut menjadi output, jika tidak maka output kosong. Untuk?-s:
sementara menonaktifkan efeks`
sehingga hanya satu baris yang cocok.sumber
Pip , 17 byte
Mengambil daftar kata sebagai argumen baris perintah, dan konsonan dari stdin. Cobalah online!
Penjelasan
sumber
Java 8,
132126 byte-6 byte terima kasih kepada @Nevay .
Penjelasan:
Cobalah online.
sumber
s->a->{String r="";for(String x:a)r=(x.length()<r.length()|r.isEmpty())&x.matches(r.format(".*%s.*%s.*%s.*",s))?x:r;return r;}
Python, 77 byte
Cobalah online!
sumber
MATL ,
282726 byteCobalah online!
x
- Secara implisit mengambil input pertama (string dengan tiga huruf) dan menghapusnya. Mendapat disalin ke clipboard G, level 1 secara otomatis (bagian ini terinspirasi oleh jawaban @Luis Mendo )."
- Secara implisit mengambil input kedua (array kata-kata sel), beralih melalui itu.l
- Dorong 1 untuk digunakan nanti1G
- Tekan input pertama (katakan 'psr')@g
- Dorong kata saat ini sebagai array3XN
-nchoosek
- Dapatkan semua kombinasi 3 huruf dari kataXm
- Lihat apakah kode plat 'psr' adalah salah satu dari kombinasi ini. Mengembalikan 0 untuk false dan 1 untuk true./
- Membagi 1 (yang kami dorong sebelumnya) dengan hasil ini. Mengubah 0s menjadiInf
s@gn
- Dapatkan panjang kata saat ini*
- Kalikan panjangnya dengan hasil pembagian. Mengembalikan panjang seperti ketika kata berisi 3 karakter, jika tidak kembaliInf
v
- menggabungkan hasil ini secara vertikal menjadi satu larik]
- tutup lingkaran&X<
- dapatkan indeks dari nilai minimum dari array itu yaitu indeks di mana kata yang mengandung huruf dan dengan panjang minimum ditemukan2G
- Tekan kembali input keduaw
- Bawa indeks min kembali ke atas tumpukan)
- Indeks ke dalam array kata dengan indeks min, mengembalikan kata yang valid dengan panjang minimum(Output tersirat.)
Lebih tua:
sumber