Tulis fungsi yang mengambil dua parameter: bilangan bulat positif n dan daftar kata-kata.
Mengingat kubus n -by- n -by- n unit, menetapkan huruf acak (AZ) untuk setiap unit permukaan. (Untuk kubus 3x3x3, akan ada 9 unit permukaan pada setiap wajah.)
Kemudian tentukan apakah semut dapat berjalan di sepanjang permukaan (dengan kemampuan untuk menyeberangi wajah) untuk mengeja setiap kata yang disediakan. Asumsikan bahwa untuk mengeja kata, huruf-huruf harus berada di atas / bawah atau berdekatan / kiri, tetapi tidak harus pada wajah yang sama. [ Sunting, untuk kejelasan: Semut dapat membalik jalurnya dan menggunakan huruf lebih dari satu kali. Setiap unit permukaan dihitung sebagai satu karakter, jadi untuk mengeja kata dengan huruf berulang (misalnya "lihat") semut harus mengunjungi tiga unit yang berdekatan.]
Fungsi harus menampilkan dua hal:
1) Masing-masing huruf di setiap wajah, sedemikian rupa sehingga topologi dapat disimpulkan. Misalnya, untuk kubus 2x2x2, output yang dapat diterima akan terlihat seperti:
QW
ER
TY OP UI
DF JK XC
AS
GH
LZ
VB
2) Masing-masing kata, bersama dengan boolean yang mewakili apakah mungkin bagi semut untuk mengeja kata dengan berjalan di sepanjang permukaan kubus. Contohnya:
1 ask
0 practical
1 pure
0 full
Tantangan bonus (tidak akan menjadi faktor dalam skor, hanya untuk bersenang-senang): Alih-alih n hanya mewakili ukuran kubus, biarkan n juga mewakili dimensi bentuk. Jadi, n dari 2 akan menghasilkan 2x2 persegi; sebuah n dari 3 akan menghasilkan kubus 3x3x3; dan n dari 4 akan menghasilkan tesseract 4x4x4x4.
qwq
atauqq
dalam contoh kubus?Jawaban:
Ruby, 272 byte
Dua baris baru yang tidak perlu ditambahkan ke kode di kedua sisi fungsi bersarang
g
untuk meningkatkan keterbacaan. Ini dikecualikan dari skor. Karakterf=
yang menetapkan fungsi anonim ke variabel juga dikecualikan.Format output adalah
0
atau1
per pertanyaan, bukan aslitrue
dan Rubyfalse
. Baris baru (bukan spasi) digunakan untuk memisahkan boolean dan kata. Pemahaman saya adalah bahwa ini adalah interpretasi yang dapat diterima dari persyaratan output, tetapi jika tidak, dampak pada jumlah byte akan kecil.Keluaran
Setelah sekitar 50 panggilan seperti ini:
Saya akhirnya mendapatkan output berikut dengan 2 hit.
ANT
berada di kanan bawah naik ke atas, danAN
dibagikan olehCAN
, denganC
putaran pembungkus ke kiri atas.Penjelasan
Terungkapnya kubus yang dipilih, dipilih sebagian karena kemudahan menggambar, tetapi terutama karena kemudahan pencarian.
Karakter non-alfabet (titik-titik ditambah baris baru di akhir setiap baris) adalah bagian penting dari bidang di mana semut dapat ditemukan berjalan.
Pencarian dilakukan oleh fungsi rekursif
g
, yang bersarang dalam fungsif
. Jika kata yang dilewatkan adalah string kosong pencarian selesai dan$r
diatur ke 1. Jika semut pada kotak huruf yang sesuai dengan huruf pertama dari kata, pencarian dilanjutkan di keempat arah: fungsi dipanggil lagi dengan kata yang disingkat dengan menghapus huruf pertama. Dalam hal ini parameter arah diabaikan. Pemindahan dilakukan dengan pemanggilan berulang dengan indeks sel diubah oleh nilai-nilai dalamx.
. Hasil penambahan diambil modulo ukuran grid ditambah setengah garis tambahan. Ini berarti bahwa garis bawah membungkus putaran ke atas dan sebaliknya, dengan offset horizontal yang benar.Jika semut berada di bujur sangkar non-huruf, ia harus zig-zag dalam gerakan tangga sampai ia menemukan bujur sangkar huruf. Dia akan zizag di arah tenggara atau barat laut. Ini disimulasikan oleh panggilan rekursif dengan
d
parameter sedang XOR dengan 1 setiap kali untuk melacak pergerakannya. Sampai dia mencapai kotak huruf berikutnya, tidak ada pemendekan kata input. Mudahnya, ini dapat dilakukan dengan rekursi yang sama seperti yang digunakan ketika kita mencari di daerah dengan surat. Perbedaannya adalah, rekursi hanya memiliki satu cabang ketika semut berada di area spasi, berbeda dengan 4 di area huruf.Kode yang dikomentari
sumber