Tantangan
Anda akan diberikan tabel sebagai input, digambar dengan ASCII |
dan _
. Tugas Anda adalah mengatur kursi di sekitarnya.
Contoh
Memasukkan:
____
| |
| |
| |
| |
|____|
Keluaran:
_^_^_
< >
| |
< >
| |
<_ _ _>
v v
Kursi-kursi itu terbuat dari <>
dan v^
.
Contoh lain:
Garis harus memiliki kursi sebanyak mungkin di dalamnya.
_____
| |_____
| |
| |
| |
| _____|
|_____|
_^_^_
< |_^_^_
| >
< |
| |
< _ _ _>
|_ _ _| v v
v v
Harus ada ruang di antara setiap kursi. Dan >_^_^_<
itu tidak valid, seharusnya |_^_^_|
.
_____ _____
| |_____| |
| |
| |
| |
| ___________|
|_____|
_^_^_ _^_^_
< |_^_^_| >
| |
< >
| |
< _ _ _ _ _ _>
|_ _ _| v v v v v
v v
Tidak ada kursi di bagian dalam "donat".
_________________
| _____ |
| | | |
| | | |
| |_____| |
|_________________|
_^_^_^_^_^_^_^_^_
< _____ >
| | | |
< | | >
| |_____| |
<_ _ _ _ _ _ _ _ _>
v v v v v v v v
^
dan v
memprioritaskan <
dan >
. Tidak ada kursi sendiri (harus memiliki setidaknya satu |
atau _
di baris).
_________________
| _____ |
| | | |
| | |_____|
| |_____
|___________|
_^_^_^_^_^_^_^_^_
< _ _ _ >
| | v v | |
< > <_ _ _>
| |_^_^_ v v
<_ _ _ _ _ _|
v v v v v
Ini kode golf, jadi kode terpendek menang.
Jawaban:
Python 2,
10331007924879829787713699692691688687672670664659654648643642630625623620570560554545518514513510505492476454451443 bytes6 byte disimpan berkat Riley
6 byte disimpan berkat Adnan
Karena pertanyaan ini sudah berusia lebih dari satu tahun dan masih belum memiliki jawaban, saya pikir saya akan mencobanya.
Cobalah online!
Program membaca tabel nama file
I
dan mencetak tabel dengan kursinyastd::out
. Saya tidak yakin tentang banyak kasus tepi jadi saya mengambil penilaian terbaik saya (apa pun yang paling sedikit usaha) tetapi tampaknya melewati semua kasus uji. Beberapa output tidak sama persis tetapi mereka semua memiliki jumlah kursi yang sama.Penjelasan
Baris pertama cukup membuat beberapa definisi yang akan menyelamatkan kita byte di masa depan:
(Saya akan membongkar makro ini untuk dibaca di baris mendatang)
Kemudian kita akan membuka file bernama
I
karena kita sudah memiliki variabel yang merupakan kependekan dari itu sehingga menghemat beberapa byte.Kami membagi sepanjang baris baru untuk membuat daftar string (Baris gambar)
Saya kemudian menemukan panjang garis terpanjang sehingga saya bisa mengisi semua garis dengan panjang itu. (Saya juga menambahkan 3 karena kami membutuhkan sedikit tambahan tambahan)
Kemudian kami melakukan padding yang sebenarnya dan membuat batas
I
karakter di sekitar tepi. Ini karena kita perlu memberi tahu perbedaan antara bagian dalam dan bagian luar bentuk nanti. Kami juga akan mengubah tipe data dari daftar string ke daftar daftar karakter (panjang 1 string).Baris berikutnya hanyalah definisi penghematan byte lain.
(Saya juga akan membongkar yang ini)
Sekarang kami ingin menyebarkan
I
karakter ke mana saja di luar bentuk. Kita dapat melakukan ini dengan otomat pseudo-seluler. MasingI
- masing akan menyebar kekarakter yang berdekatan . Kita dapat mengulang sampai otomat stabil tetapi ini tidak dapat mengambil lebih banyak iterasi daripada karakter sehingga kita hanya mengulang setiap karakter dalam
b
(input asli)Untuk setiap iterasi kami ingin melewati setiap karakter dalam daftar 2D (tidak termasuk padding terluar)
Untuk setiap posisi kami menjalankan kode berikut:
Mari kita hancurkan ini.
Kami memiliki if dengan dua kondisi yang dipisahkan oleh
&
(bitwiseand
)Yang pertama hanya memeriksa apakah ada
I
di salah satu sel yang berdekatan dan yang kedua hanya memeriksa apakah sel saat ini adalah a" "
. Jika kami melewati kondisi tersebut, kami menetapkan sel saat ini menjadiI
.Sekarang kita telah menentukan bagian luar dan dalam bentuknya, kita dapat mulai menempatkan kursi di sekeliling meja.
Sekali lagi kita mengulang semua sel (dan mengatur beberapa singkatan lagi)
Sekarang inilah bagian favorit saya. Jika Anda berjalan dengan susah payah melalui golf yang membosankan, sebagian besar berbasis definisi, sejauh ini saya akan menghadiahi Anda dengan berita gembira yang bagus tentang bermain golf pintar (jika saya mengatakannya sendiri).
Sedikit latar belakang python:
Dalam Python jika Anda mencoba untuk menetapkan kunci kamus dua kali itu menandakan yang terakhir. Sebagai contoh
Kami akan menyalahgunakan properti ini untuk menetapkan sel saat ini ke karakter tertentu.
Kondisi pertama adalah
Jika sel berada di tengah-tengah tepi 3
_
karakter, kami akan menugaskan kembali sel saat ini dan sel di bawahnya. Kami akan menetapkannya ke hasil pengindeksan kamus yang kelebihan beban olehI
. Kami pertama-tama menetapkan default kami dengan pasangan"I":"_"+a[x+1][y]
ini artinya jika tidak ada perubahan kami akan menetapkan dua sel kembali ke nilai aslinya. Selanjutnya kita tambahkan pasangana[x-1][y]:"^ "
. Ini tidak akan melakukan apa pun (penting) kecuali sel di atas yang sekarang (a[x-1][y]
) diisi denganI
. Jika adaI
di dalamnya, maka akan menimpa default yang memberitahu kita untuk menempatkan kursi di sel saat ini. Selanjutnya kita beralih ke sel di bawah sel saat ini jika sel ituI
kita timpa lagi untuk menempatkan kursi menghadap ke atas di bawah tempat saat ini.Kondisi selanjutnya sedikit lebih sederhana
Kami memeriksa apakah sel saat ini dan sel di atas keduanya
|
. Jika demikian, kami membuat kamus.Pasangan pertama dalam kamus
"I":"|"
menetapkan standar. Karena kita akan mengakses kunciI
jikaI
tidak dipindahkan maka akan kembali ke default|
(karakter sudah ada) dan tidak melakukan apa-apa.Kita menambahkan dua kunci.
A[y+1]:">",A[y-1]:"<"
Jika salah satu dari dua sel di kiri dan kanan,I
maka itu akan menugaskan kembali sel saat ini ke kursi yang menunjuk ke arah luar.Sekarang kita hanya perlu output. Namun kita tidak bisa hanya mencetak, ada beberapa hal yang harus kita lakukan terlebih dahulu. Kami harus mengonversi kembali ke string dan menghapus semua yang
I
kami buat. Ini dilakukan dalam satu baris.sumber
i,o="I "
alih-alihi="I";o=" "
bekerja?n
biaya 4 byte dan menyelamatkan saya 6. Meskipun saya tidak menggunakannya sering menghemat 2 byte.