Kotak ASCII terlihat seperti ini:
++ +---+ +------+ +---+ +---+
++ | | | | | | | |
| | | | | | | |
+-+ | | | | | | | |
+-+ | | | | | | +---+
+---+ | | | |
+--+ | | | | ++
| | | | | | ||
| | +------+ | | ||
+--+ | | ||
+---+ ||
||
+-----+ ||
+------------+ | | ++
| | | |
| | | |
+------------+ +-----+
Berikut adalah beberapa contoh kotak ASCII yang sama, meledak:
++ +- -+ +- -+ +- -+ +- -+
++ | - | | - - | | - | | - |
| | | -- | | | | |
+-+ | | | | " | - |
+-+ | - | || | | +- -+
+- -+ | | | |
+--+ | -- | | | ++
| | | - - | " ||
| | +- -+ | | ||
+--+ | - | | |
+- -+ | |
-- ||
- - +- -+ ||
+- - - -+ | - - | ++
| -- -- | | = |
| -- -- | | - - |
+- - - -+ +- -+
- -
--
Sini ini tautan ke semua kotak uji ini dalam format yang lebih mudah disalin. Urutannya adalah semua input diikuti oleh semua output dalam urutan yang sama.
Tujuan Anda adalah untuk mengambil kotak ASCII sebagai input, dan mengembalikan kotak yang meledak. Aturan ledakan adalah:
- "+" tidak pernah berubah; tidak melakukan "-" atau "|" berbatasan langsung dengan "+"
- Mulai dari sudut, "-" dan "|" bergerak ke dalam oleh satu spasi lebih dari karakter yang sama lebih dekat ke sudut itu. Jika "-" dan "|" akan pernah pindah ke tempat yang sama, tidak bergerak.
- Jika "-" dan "-" pindah ke tempat yang sama, letakkan "=" di tempat itu. Jika "|" dan "|" pindah ke tempat yang sama, letakkan "di tempat itu. Ini dihitung sebagai dua karakter masing-masing di tempat yang sama bergerak dalam arah yang berlawanan.
- Dua "-" atau dua "|" dapat bergerak melewati satu sama lain, seperti yang terlihat di contoh kiri bawah.
- Jika kotaknya cukup kurus, itu akan mulai mengembang ke arah luar dengan cara yang sama, selalu menjauh dari sisi yang dimulai dari bagian itu.
- Hasilnya harus simetris di garis tengah di kedua arah x dan y (mengabaikan baris baru); ini termasuk spasi, jadi hasilnya mungkin perlu diisi dengan spasi untuk memenuhi itu.
Detail Aturan:
- Ini adalah kode-golf, jadi program terpendek dalam byte menang.
- Celah standar berlaku.
- Anda dapat mengasumsikan setiap baris berakhir dengan karakter baris baru.
- Satu-satunya karakter dalam string input adalah "+", "-", "|", "", dan "\ n" (baris baru), dan string output Anda harus mengikuti aturan yang sama, dengan penambahan "=" dan "sebanyak mungkin karakter.
- Secara opsional, Anda dapat memiliki satu baris baru di akhir baris terakhir.
- Kotak ASCII terkecil yang perlu Anda tangani adalah contoh kiri atas. Setiap kotak ASCII akan memiliki tepat 4 "+", tepat di sudutnya.
- Anda perlu menangani kotak ukuran
m x n
untuk bilangan bulat apa punm,n
sehingga2<=m,n<256
(ukuran string sebesar mungkin255*(255+1)
) - Anda dapat menganggap Anda akan selalu mendapatkan satu kotak ASCII yang valid sebagai input.
||
dalam contoh itu harus menjadi"
atau sesuatu ..."
? Saya kira"
hanya muncul pada 3-lebar atau lebih besar?"
? Di sebelah kiri, atau di sebelah kanan? Tidak bisa keduanya, tetapi tidak bisa karena hasilnya simetris.Jawaban:
Python 2 ,
591555545527525496436351334333303 byteCobalah online!
EDIT : Metode lama saya pertama kali meledak bagian atas dan bawah, dan kemudian kiri dan kanan. Sebagai gantinya, kita bisa meledak atas, memutar 90 derajat, dan melakukannya 4 kali. Juga, saya menggunakan kode yang user-friendly, yang ini membutuhkan input dalam bentuk
[['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]
yang jelek tapi lebih pendek untuk program: P (Terima kasih kepada Phoenix untuk menangkap itu)Penghargaan untuk Leaky Nun untuk kode tajuk di tautan TIO yang digunakan untuk mengubah input yang dapat dibaca manusia menjadi input yang dapat dibaca komputer.
-85 byte berkat Leaky Nun!
-17 byte dengan beralih dari atas-ledakan ke kiri-ledakan yang memungkinkan seluruh baris disimpan ke dalam variabel dan dimodifikasi. Terima kasih kepada Leaky Nun untuk sarannya!
-1 byte dengan mengalihkan berbagai hal untuk menghapus spasi.
-30 byte terima kasih untuk Leaky Nun!
sumber
s[0]
danS[0]
ke variabel untuk menyimpan beberapa bytep=s[0]
danP=S[0]
denganp=z(s[0])
danP=z(S[0])
, masing-masing, lalu mengganti semua kemunculanz(p)
denganp
dan semuaz(P)
denganP
untuk menghemat 18 byte.(z(s)-1)/2-p
denganz(s)/2-.5-p
dan(p-1)/2-z(s)
denganp/2-.5-z(s)
untuk menyimpan 2 byte lebih banyak.C (dentang) , 693 byte
Baris baru ditambahkan untuk dibaca. Dua yang pertama diperlukan tetapi sisanya tidak.
Terima kasih atas tantangannya! Itu cukup rumit tetapi saya masih bersenang-senang.
Ini mengambil input sebagai argumen baris perintah dan output ke STDOUT string multi-line dari kotak meledak. Seperti biasa, tips golf sangat dihargai.
Cobalah online!
sumber