Diberikan masukan dari daftar kata-kata dan singkatan-singkatannya, menampilkan pola pembentukan singkatan-singkatan itu.
Mari kita ambil contoh input
potato ptao
puzzle pzze
sebagai contoh (yaitu, singkatan untuk potato
adalah ptao
, dan singkatan untuk puzzle
adalah pzze
).
Pertimbangkan semua cara yang mungkin untuk mendapatkan ptao
dari potato
. Satu cara yang mungkin adalah dengan mengambil huruf pertama, ketiga, keempat, dan keenam, yang akan kita sebut sebagai
1346
. Tapi karena t
dan o
muncul beberapa kali dalam kata, ada beberapa cara lain yang mungkin untuk menghasilkan ptao
dari potato
: 1546
, 1342
, dan 1542
.
Demikian pula, catatan yang pzze
dapat dihasilkan dari puzzle
dengan salah 1336
,
1346
, 1436
, 1446
. Satu-satunya pola yang dimiliki oleh kedua singkatan ini adalah 1346
; oleh karena itu, itu harus menjadi output untuk input ini. Jika beberapa pola yang memungkinkan dimungkinkan, Anda dapat menampilkan salah satu, beberapa, atau semuanya (setidaknya satu).
Anda dapat berasumsi bahwa:
Input kata dan singkatan hanya berisi huruf kecil.
Setidaknya ada satu pasangan kata / singkatan dalam input.
Dimungkinkan untuk setiap singkatan dibentuk dari kata yang sesuai.
Akan selalu ada setidaknya satu pola yang membentuk setiap singkatan.
Panjang maksimum setiap kata adalah 9 karakter.
Masukan dapat diambil sebagai berikut:
Array 2-dimensi / daftar / array tupel / dll.
[[word, abbr], [word, abbr], ...]
Daftar / array 1 dimensi yang datar
[word, abbr, word, abbr, ...]
string tunggal, dibatasi oleh karakter tunggal yang bukan huruf kecil
"word abbr word abbr"
hash / array asosiatif / dll.
{word => abbr, word => abbr, ...}
Di salah satu opsi input ini, Anda juga diizinkan untuk menukar urutan kata / abbr (harap jelaskan format input di pos Anda).
Output dapat diberikan sebagai angka tunggal, string dibatasi oleh non-digit, atau array / daftar / tuple / dll. angka.
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
Uji kasus (ingat bahwa Anda hanya perlu menampilkan ≥1 hasil jika beberapa pola berfungsi):
In Out
--------------------------------------------------------
potato ptao puzzle pzze | 1346
aabbcc abc fddeef def | 246
prgrmming prgmg puzzles pzzlz | 14353
aaaaa a bbbb b ccc c dd d e e | 1
aaaaa a bbbb b ccc c | 1, 2, 3
abcxyz zbcyax | 623514
abcxyz acbbacbcbacbbac | 132213232132213
potato ptao | 1346, 1546, 1342, 1542
a aaaaa | 11111
Jawaban:
Pyth, 19 byte
Coba di sini!
Mengambil daftar dalam format berikut:
Alternatif 17 byte solusi yang menampilkan hasilnya sebagai daftar indeks berbasis nol yang dibungkus dalam daftar 1-elemen:
Penjelasan
Contoh:
[["potato", "ptao"],["puzzle", "pzze"]]
Pertama kita memetakan setiap karakter dalam singkatan ke daftar indeks dari semua kejadian dalam kata yang menghasilkan
[[[0], [2, 4], [3], [1, 5]], [[0], [2, 3], [2, 3], [5]]]
Lalu kami mengubah daftar ini yang memberi kami
[[[0], [0]], [[2, 4], [2, 3]], [[3], [2, 3]], [[1, 5], [5]]]
Jadi indeks masing-masing karakter dari masing-masing singkatan disatukan dalam satu daftar.
Maka kita hanya perlu menemukan satu indeks umum di semua daftar yang menghasilkan:
[[0], [2], [3], [5]]
Ini adalah output dari solusi 17 byte alternatif saya di atas. Ini kemudian ditransformasikan menjadi
[1,3,4,6]
.Rincian kode
sumber
dm
hak sebelum@
?MATL , 29 byte
Input adalah array 2D dalam format berikut:
Cobalah online! ( kode tertaut menyertakan beberapa modifikasi karena perubahan bahasa sejak jawaban ini diposting )
Kode diperlukan beberapa trik yang terlibat (dan panjang!) Untuk
find
(f
) agar tidak berubah tergantung pada bentuk input. Ini adalah pernyataanX:wX:
: paksakan kedua output menjadi vektor kolom.min
(X>
). Ini adalah pernyataantv
: ambil salinan dirinya sendiri untuk memastikan setidaknya dua baris);sumber
Perl,
464542 byteTermasuk +1 untuk
-p
Berikan input sebagai kata berurutan pada STDIN, mis
Hentikan STDIN dengan
^D
atau^Z
atau apa pun yang diperlukan di sistem Andaabbrev.pl
:Penjelasan
Pertimbangkan input ini (tata letak konseptual, bukan cara input nyata untuk program ini):
String pembangun program mewakili kolom vertikal dari string penuh yang diindeks pada id kolom
dll. Ia juga melakukan hal yang sama untuk singkatan, tetapi menggunakan id yang berbeda
Kata-kata diproses secara implisit satu per satu dengan menggunakan
-p
opsi. String kolom dikonstruksikan menggunakan rangkaian berulang sementara setiap kata berjalan menggunakans#.# ...code.. #eg
, sehingga setiap kolom membutuhkan id berulang. Saya menggunakan minus nomor kolom diikuti oleh modulo nomor 2. Nomor kolom dapat dibangun menggunakan--$_
yang dimulai sebagai kata saat ini yang karena penggunaan hanyaa-z
dijamin untuk mengevaluasi sebagai 0 dalam konteks numerik. Jadi saya mengerti-1, -2, -3, ...
. Aku benar-benar ingin menggunakan1, 2, 3, ...
, tetapi menggunakan$_++
akan memicu pertambahan string magic perl bukan penghitung angka normal. Saya tidak ingin menggunakan$_
dan bukan beberapa variabel lain karena variabel lain saya harus menginisialisasi ke nol di setiap loop yang membutuhkan terlalu banyak byte.Nomor baris modulo 2 adalah untuk memastikan id untuk kata penuh dan id untuk singkatan tidak berbenturan. Perhatikan bahwa saya tidak dapat menggunakan kata lengkap dan singkatan pada satu string untuk memiliki nomor kolom melewati string gabungan karena kata-kata penuh tidak semua memiliki panjang yang sama, sehingga kolom kata yang diuraikan tidak akan berbaris. Saya juga tidak dapat menempatkan kata singkatan terlebih dahulu (mereka semua memiliki panjang yang sama) karena saya perlu jumlah kolom pertama dari kata-kata penuh menjadi 1.
Saya menyalahgunakan ruang nama perl global melalui referensi yang tidak ketat untuk membuat string kolom sebagai:
Selanjutnya saya memetakan setiap string kolom ke nomor kolom pertama yang pernah muncul string (pemetaan sudah ditunjukkan di atas) dengan lagi menyalahgunakan perl namespace global (tetapi perhatikan bahwa nama tidak dapat berbenturan sehingga global tidak saling mengganggu):
Saya harus meniadakan
$_
karena seperti yang saya jelaskan di atas saya menghitung kolom sebagai-1, -2, -3, ...
. The||=
make yakin hanya penampilan pertama kolom tertentu mendapat sejumlah kolom baru, jika tidak jumlah kolom sebelumnya dipertahankan dan dikembalikan sebagai nilai. Ini akan terjadi khususnya untuk setiap kata yang disingkat karena spesifikasi menjamin bahwa ada kolom dalam kata-kata lengkap yang akan muncul sebelumnya. Jadi dalam kata yang disingkat terakhir setiap huruf akan diganti dengan nomor kolom dalam kata lengkap yang sesuai dengan kolom untuk semua kata yang disingkat. Jadi hasil dari pergantian terakhir adalah hasil akhir yang diinginkan. Jadi cetak jika dan hanya jika kita berada di akhir input:Penugasan indeks kolom juga akan membuat entri untuk kolom tidak lengkap karena kolom belum sepenuhnya dibangun atau beberapa kata lebih pendek dan tidak mencapai panjang kolom penuh. Ini bukan masalah karena kolom yang dibutuhkan dalam setiap kata yang disingkat dijamin memiliki kolom koreksi dari kata-kata lengkap yang memiliki panjang maksimum yang mungkin (jumlah pasangan yang terlihat saat ini) sehingga entri tambahan ini tidak pernah menyebabkan kecocokan yang salah.
sumber
Haskell, 74 byte
Format input adalah daftar pasangan string, misalnya:
Cara kerjanya:
mapM
(sama sepertisequence . map
) pertama-tama mengubah setiap pasangan(w,a)
menjadi daftar daftar indeks huruf dalam singkatan (' ':
memperbaiki indeks berbasis 0 asli Haskell menjadi berbasis 1), misalnya("potato", "ptao") -> [[1],[3,5],[4],[2,6]]
dan kemudian ke daftar semua kombinasi daripadanya di mana elemen pada posisii
diambil darii
sublist th, mis[[1,3,4,2],[1,3,4,6],[1,5,4,2],[1,5,4,6]]
.foldl1 intersect
menemukan persimpangan semua daftar daftar tersebut.sumber
ES6, 92 byte
Menerima input sebagai larik kata dan larik singkatan. Mengembalikan array indeks berbasis 1 (yang biayanya 2 byte dammit). Dalam kasus beberapa solusi, indeks tertinggi dikembalikan.
sumber
Python 3, 210 byte
Bukan jawaban yang mengesankan melihat skor teratas di sini, tapi ini benar-benar beberapa pemahaman daftar paling gila yang pernah saya lakukan dengan Python. Pendekatannya cukup maju ke depan.
Fungsi mengharapkan input selalu sebagai string 2-D array seperti:
[[word, abbr],...]
dan mengembalikan daftar bilangan bulat.Ps: Penjelasan terperinci segera hadir
Ps2: Saran golf lebih lanjut disambut!
sumber