Teka-teki menarik datang kepada saya sambil melihat tombol lift pagi ini.
Anda harus membuat daftar semua pola Braille yang sesuai dengan kisi 2x3. Gunakan hash #
untuk menunjukkan benjolan dan tanda hubung -
untuk menunjukkan daerah datar.
Sampel keluaran yang diharapkan:
#-
--
--
##
--
--
#-
#-
--
(and so on...)
Aturan:
- Program Anda harus memisahkan setiap pola dengan setidaknya satu karakter atau garis.
- Pola dapat dihasilkan dalam urutan apa pun.
- Semua pola, apa pun alfabet Braille yang sebenarnya digunakan, harus dibuat. Pola yang benar-benar kosong adalah opsional.
- Hanya pola benjolan unik yang harus dihasilkan. Pola berikut ini dianggap sama karena benjolan berada dalam pengaturan yang identik. Dalam kasus ini, gunakan pola yang paling dekat dengan sudut kiri atas (mis. Opsi pertama dalam contoh ini.)
#- -# -- --
#- -# #- -#
-- -- #- -#
Bonus poin jika Anda dapat membuatnya bekerja untuk setiap x oleh y kotak berukuran. ( EDIT: Dalam batas wajar. Hingga 4x4 sudah cukup untuk bukti konsep.)
Membaca artikel wiki, tampaknya ada 45 pola (termasuk yang kosong) yang memenuhi aturan teka-teki ini.
code-golf
combinatorics
Makanan Tangan
sumber
sumber
x
xy
kisi Anda menghasilkan2^(xy)
angka pertama dan memfilter angka yang menutupi 0 terhadap2^x - 1
atau(2^(xy+1) - 1)/(2^y - 1)
.Jawaban:
GolfScript,
3432 karakterTernyata bahwa ada yang solusi yang lebih pendek daripada hanya menghasilkan semua 64 pola dan menyaring yang buruk. Bahkan, dengan memetakan bit ke posisi grid dengan tepat, dimungkinkan untuk memetakan semua pola yang valid (tidak kosong) ke rentang angka yang berurutan, seperti yang dilakukan program ini.
Secara khusus, pemetaan yang saya gunakan adalah:
di mana angka-angka menunjukkan posisi bit (mulai dari bit paling signifikan
0
) dipetakan ke posisi itu di grid. Dengan pemetaan ini, kisi-kisi yang valid sesuai dengan angka 20 hingga 63 inklusif.Ini hampir sama dengan pemetaan yang jelas diperoleh dengan menuliskan angka 6-bit dalam biner dan menambahkan jeda baris antara setiap bit kedua, kecuali bahwa bit
1
dan2
ditukar - dan memang, itulah cara program saya menghitungnya. (Saya juga menambahkan 64 ke angka-angka sebelum mengubahnya menjadi biner, dan kemudian menghapus bit ekstra tinggi; itu hanya untuk memasukkan angka menjadi 6 bit, karena GolfScript'sbase
tidak akan mengembalikan nol yang memimpin.)Ps. Demo online di sini. (Server tampaknya kelebihan beban akhir-akhir ini; jika Anda mendapatkan batas waktu, coba lagi atau unduh juru bahasa dan mengujinya secara lokal.)
Sunting: Berhasil menyimpan dua karakter dengan menghindari pembangunan array yang tidak perlu dan dumping. Fiuh!
sumber
Mathematica 97
Kosong tidak termasuk:
NB! = Adalah karakter tunggal dalam Mathematica.
sumber
C # - 205
Versi yang dapat dibaca:
sumber
Perl,
716765 karakterUbah int menjadi biner, lakukan transliterasi, dan tambahkan baris baru setelah setiap dua karakter. The
/^#/m
uji menghilangkan dua pola (20 dan 21) yang tidak memiliki benjolan dibesarkan di kolom paling kiri.Solusi umum,
150106103100 charBaca
x
dany
dari argumen baris perintah. Baris baru sangat pentingIterasi lebih dari 0,2 xy seperti sebelumnya, konversi setiap int ke biner, gantikan
-
dan#
untuk0
dan1
, dan masukkan baris baru setelah setiap$x
karakter./^#/m
menguji bahwa ada tonjolan yang muncul di kolom paling kiri, dan/^.*#/
mengetes adanya tonjolan di baris paling atas. Hanya pola yang lulus kedua tes yang dicetak.sumber
Python,
12011811395118Sunting: menggunakan saran Winston Ewert dan menambahkan solusi grid x by y
Sunting: Saya entah bagaimana melewatkan kendala terakhir tentang keunikan. Script ini menghasilkan semua urutan yang mungkin, bukan hanya 45.
Sunting: Cadangkan hingga 118 tetapi sekarang benar
sumber
['#','-']
dengan'#-'
J,
3533 karakterMenggunakan pendekatan Ilmari Karonen datang dengan solusi Golfscript mereka. Namun, karena kata kerja J
#:
(antibase) menyimpan bit (atau, yah, digit dalam case umum) dalam daftar, kita perlu mengindeksnya dari kiri bukan kanan (yaitu indeks 0 adalah bit paling kiri, tertinggi).Solusinya agak mudah:
20+i.44
memberikan daftar angka20..63
, inklusif.#:
mengambil antibase-2 dari setiap elemen dalam daftar ini, dan dengan demikian menghasilkan daftar pola bit untuk setiap angka dalam rentang itu.{
memilih (pada dasarnya menata ulang) bit ke dalam pola yang tepat, dan kemudian{
digunakan kembali untuk menggunakan digit sebagai indeks dalam string '- #' untuk menyiapkan output. Akhirnya, kami mengatur setiap entri ke dalam persegi panjang 2-by-3 dengan$
(bentuk).sumber
(0 2 3 ,. 1 4 5) { #: 44
dapat diubah agar berfungsi dengan daftar angka dan bukan satu angka? Mungkin akan mencukur beberapa karakter lagi.Python -
121112kosong tidak termasuk
sumber
'_#',repeat=6
->*['_#']*6
b
sudah menjadi tuple, jadi tidak perlu mengubahnya :)