pengantar
Teka-teki kata yang populer adalah mengubah satu kata menjadi kata lain melalui serangkaian langkah yang hanya mengganti satu huruf dan yang selalu menghasilkan kata yang valid. Misalnya, BAG dapat dikonversi ke DOG melalui jalur lima langkah:
BAG -> BAT -> CAT -> COT -> COG -> DOG
Jalur yang lebih pendek juga ada dalam kasus ini; sebagai contoh:
BAG -> BOG -> DOG
Jika seseorang menggambar grafik yang simpulnya dilabeli dengan kata-kata, dengan tepi antara pasangan kata yang berbeda dengan satu huruf, maka jalur terpendek dari "BAG" ke "DOG" akan terdiri dari dua tepi.
Tantangan
Anda harus menulis sebuah program yang menerima sebagai masukan "kamus" kata-kata yang semuanya memiliki panjang yang sama, mewakili semua kata yang diijinkan yang dapat muncul sebagai langkah-langkah di sepanjang jalur. Ini harus menghasilkan setidaknya satu "jalan terpendek terpanjang", yaitu jalur antara dua kata yaitu:
tidak lebih dari jalan lain di antara kedua kata itu;
setidaknya selama jalur terpendek yang mungkin antara pasangan kata lain dalam daftar.
Dalam konteks grafik yang dijelaskan di atas, panjang jalur tersebut adalah diameter grafik.
Dalam kasus degenerasi di mana tidak ada kata-kata input dapat diubah menjadi yang lain, output setidaknya satu jalur dengan panjang nol, yaitu, satu kata.
Contohnya
Input ["bag", "bat", "cat", "cot", "dot", "dog"] harus menghasilkan jalur yang melintasi semua enam kata dalam urutan itu (atau urutan terbalik), karena jalur terpendek dari " tas "ke" anjing "dalam kamus ini adalah yang paling lama dicapai, lima langkah.
Input ["bag", "bat", "bot", "cat", "cot", "dot", "dog"] harus menghasilkan path "bag, kelelawar, bot, titik, anjing" dan / atau pembalikan.
Input ["kode", "golf", "pria", "buzz", "mol", "peran", "cetakan", "dingin", "emas", "mode"] akan menghasilkan jalur antara "kode dan "golf".
Input ["satu", "dua", "enam", "sepuluh"] sesuai dengan grafik tanpa tepi, sehingga menghasilkan satu atau beberapa jalur kata-tunggal (panjang nol).
Jika input berisi dua kata dengan panjang yang tidak sama, outputnya tidak ditentukan.
Aturan
- Aturan golf kode standar berlaku
- Akan ada beberapa jalur "terpendek". Anda harus mengeluarkan setidaknya satu, tetapi bebas untuk menghasilkan sebanyak yang Anda inginkan.
- Anda bebas memutuskan bagaimana kamus input dimasukkan ke dalam program Anda.
- Kode terpendek dalam byte menang.
[]
atau[[]]
)?Jawaban:
Jelly , 20 byte
Cobalah online!
sumber
APL (Dyalog Classic) ,
84 80 77 76 74 6661 byteCobalah online!
input dan output adalah matriks karakter
⍵+.≠⍉⍵
matriks jarak hamming-like antara kata-kata9*⍨2⌊
biarkan 0s dan 1s utuh, ubah 2+ menjadi sejumlah besar (512 = 2 9 , digunakan sebagai "∞")⌊.+⍨⍣≡
Algoritma jalur terpendek floyd & warshall⌊.+
seperti multiplikasi matriks tetapi menggunakanmin
(⌊
) dan+
bukannya+
dan×
masing - masing⍨
gunakan matriks yang sama di kiri dan kanan⍣≡
ulangi sampai konvergensid←⌈/512|,
panjang jalur terpanjang (bukan "∞"), ditugaskan ked
⊃⍸a=
yang mana dua node terhubung, sebut saja mereka i dan j{⍵,⍨⊃⍋(1≠a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/
merekonstruksi jalan{
}⍣d/
mengevaluasi waktu{
}
fungsid
. arg kiri⍺
selalu i . arg kanan⍵
dimulai sebagai j dan secara bertahap mengakumulasi node internal path(1≠a⌷⍨⊃⍵),⍪⍺⌷a
buat matriks 2-kolom dari dua vektor ini:1≠a⌷⍨⊃⍵
booleans (0 atau 1) menunjukkan node mana pada jarak 1 ke yang pertama⍵
⍺⌷a
jarak semua node grafik ke⍺
⊃⍋
indeks baris terkecil secara leksikografis⍵,⍨
dipertanggungjawabkan ke⍵
⍵⌷⍨
indeks kata aslinya dengan pathsumber
Python 3 , 225 byte
Cobalah online!
Pada dasarnya, ambil semua jalur yang mungkin, simpan jalur yang valid, lalu lewati setiap kombinasi awal-akhir, temukan jarak jalur minimum, dan temukan maksimumnya.
sumber
Bahasa Wolfram (Mathematica) , 105 byte
Cobalah online!
sumber
JavaScript (ES6),
195194 bytePengembalian
[optimal_length, [optimal_path]]
.Cobalah online!
Bagaimana?
(kode ini dieksekusi pada setiap kedalaman rekursi, tetapi hanya level root yang benar-benar penting)
sumber
Bahasa Wolfram (Mathematica) , 92 byte
Cobalah online!
sumber
Python 3, 228 byte.
Menerapkan algoritma Floyd-Warshall untuk semua-pasangan jalur-terpendek, kemudian mengambil maksimum di atas jalur yang ditemukan.
16 karakter dalam implementasi ini adalah tab, yang tidak menguntungkan :(
sumber