Lihat! Ini adalah labirin ASCII! Soo coolzors, amazeballs dan lainnya.
+-+-----+---+
| | | |
| | ++ | |
| | ++ +-+ |
| | |
+-------+ | |
| | |
+---------+-+
Tapi, tapi, tapi ... itu menyusahkan untuk mengetahui ke arah mana semua bagian labirin pergi. Saya hanya ingin menggambar tata letak dan labirin membuat dirinya sendiri jadi kul tanpa banyak waktu.
Bagaimana jika saya bisa menggambar ini di ...
#############
# # # #
# # ## # #
# # ## ### #
# # #
######### # #
# # #
#############
Itu akan sangat manis!
Aturan (Karena aturan keren):
- Tulis kode untuk mengonversi string menjadi labirin ascii dan hasilkan hasilnya.
- Setiap karakter non-spasi putih akan dibaca sebagai dinding.
- Setiap karakter dinding akan memutuskan karakter mana yang akan didasarkan pada tetangganya (hanya di arah Utara, Selatan, Timur dan Barat).
- Jika char tidak memiliki tetangga non-spasi putih, itu akan menjadi tanda tambah (+).
- Jika char memiliki tetangga di kedua arah vertikal (Utara-Selatan) dan horisontal (Timur-Barat), itu akan menjadi tanda tambah (+).
- Jika char memiliki tetangga hanya dalam arah vertikal (Utara-Selatan), itu akan menjadi simbol pipa (|).
- Jika char memiliki tetangga hanya dalam arah horisontal (Timur-Barat), itu akan menjadi tanda minus (-).
- Input dapat berupa string tunggal (dengan garis yang dipisahkan oleh karakter baris baru, atau array string).
- Semua karakter input akan dicetak karakter ASCII, Anda tidak perlu berurusan dengan rangkaian karakter yang diperluas.
- Silakan gunakan bahasa lama mana saja.
- Jika ada spasi putih sebelum garis, itu harus jumlah yang sama di setiap baris. Setiap ruang putih setelah setiap jalur output baik-baik saja.
- Coba atasi dengan jumlah byte terkecil.
Kasus uji:
1: Bingkai
Memasukkan:
##########
# #
# #
# #
##########
Keluaran:
+--------+
| |
| |
| |
+--------+
2: Labirin klasik
Memasukkan:
#################
# #
# ##### # ##### #
# # # # # #
# # # # ##### # #
# # # # #
### # ####### # #
# # # # # #
# ### # ## # ##
# # ## #
#################
Keluaran:
--------+-------+
| |
| --+-+ | ----+ |
| | | | | |
| + | | +---- | |
| | | | |
+-- | +----+- | |
| | | | | |
| --+ | ++ | -+
| | ++ |
+-----+-++----+--
3: Telur hijau, man.
Memasukkan:
I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!
Keluaran:
| ++ +++ ++++ +++++ +++- -++ ----
| ++ +++ ++++ +++++ +++ + +++
+-+++ +++ ++++ ++++ ++++ ++ +++---
| +++-+ +++ ++++ ++-+ +++++++++
4: Es
Memasukkan:
Word Icicle!
Word Icicle
Word cicle
ord cicle
ord icle
ord i le
or i le
or i l
or l
or
r
Keluaran:
++++ ++++++-
++++ ++++++
++++ +++++
+++ +++++
+++ ++++
+++ | ++
++ | ++
++ | |
++ |
++
|
---
?-
s sama sekali atau mengapa labirin klasik tidak memiliki empat+
s di baris bawah.smallest number of characters
, bukan byte?+
di tengah baris ke-2 2)!
es harus diganti dengan a-
. Bisakah Anda memeriksa ulang yang ini?whitespace
, apakah Anda hanya berarti hanya ruang? Saya tidak ingin harus mendukung tab dan Anda mungkin tidak ingin saya mengubah baris baruJawaban:
APL (Dyalog Unicode) ,
5735 byte SBCS–22 berkat solusi baru oleh ngn .
Fungsi diam-diam anonim mengambil matriks karakter sebagai argumen.
Cobalah online!
{
…}⌺3 3
Pada setiap lingkungan 3-oleh-3, terapkan fungsi berikut:,⍵
ravel (meratakan)' '≠
Boolean mana non-ruang⍱∘⌽⍨
bahwa NOR itu terbalik (termasuk tidak atas NOR bawah, tidak kiri NOR kanan)5 4 2⊃¨⊂
memilih 5 th , 4 th , dan 2 nd elemen dari yang seluruh daftaryaitu diri kosong, tidak ada vertikal, tidak ada horisontal
2⊥
mengevaluasi dalam basis-2 (biner)yaitu ≥4: kosong diri; 3: tidak ada tetangga; 2: tidak ada tetangga horisontal; 1: tidak ada vertikal; 0: memiliki keduanya
'+-|+'↓⍨
jatuhkan banyak elemen dari string iniyaitu kosong sendiri
:; sendiri
+
:; tetangga vertikal saja|+
:; horisontal:-|+
; kedua:+-|+
⊃
pilih elemen pertama (pad dengan spasi jika tidak tersedia)yaitu kosong sendiri
+
:; tetangga vertikal saja|
:; horisontal:-
; kedua:+
Solusi lama
Fungsi diam-diam anonim mengambil matriks karakter sebagai argumen.
Cobalah online!
{
…}⌺3 3
Pada setiap lingkungan 3-oleh-3, terapkan fungsi berikut:,⍵
ravel (meratakan)(
...)/
filter menggunakan masker berikut:9⍴0 1
membentuk kembali secara siklis[0,1]
hingga panjang 9 (memilih N, W, E, S)' '≠
Boolean mana non-ruang1⌽
putar satu langkah ke kiri;[W,E,S,N]
2 2⍴
membentuk kembali menjadi 2-oleh-2 matriks;[[W,E],[S,N]]
∨/
pengurangan baris ATAU:[horizontal,vertical]
(
...)
terapkan fungsi diam-diam berikut:⊢
identitas;[horizontal,vertical]
∧/,
didahului dengan pengurangan AND;[both,horizontal,vertical]
(
...),
tambahkan yang berikut:,⍵
Ravel (meratakan) lingkungan5⊃
pilih elemen ke- 5 (sendiri)' '=
Boolean jika spasi (mis. Kosong)Sekarang kita punya
[empty,both,horizontal,vertical]
1⍳⍨
indeks paling kiri 1 (memberikan 5 jika tidak ada tetangga sama sekali)' +-|+'⊃⍨
gunakan itu untuk memilih simbolsumber
JavaScript (ES6), 110 byte
Format I / O: array string.
Cobalah online!
Atau 108 byte dengan menggunakan matriks karakter sebagai gantinya.
sumber
Python 2 ,
181168 byteterima kasih kepada Leaky Nun untuk -13 byte
Cobalah online!
sumber
MATLAB,
113110101 byteMengubah input menjadi logis, menerapkan konvolusi secara horizontal dan vertikal dan menggabungkan output untuk membuat karakter yang sesuai.
3 byte disimpan oleh @Adriaan karena memberi tahu saya bahwa Anda dapat menyumbat output di PPCG: P
9 byte disimpan berkat banyak komentar @ flawr!
sumber
J ,
4947 byteTerima kasih kepada FrownyFrog untuk -2 byte!
Cobalah online!
sumber
Retina 0.8.2 , 92 byte
Cobalah online! Membutuhkan input persegi panjang. Tautan termasuk kasus uji. Penjelasan:
Ubah semua non-spasi menjadi
0
s.Cari semua
0
dengan yang lain0
tepat di atas atau di bawah di kolom yang sama dan ubah menjadi 1.1
Sekarang adalah tempat-tempat dengan tetangga vertikal, sedangkan0
s tidak memiliki tetangga vertikal.Cari semua digit tanpa tetangga horisontal. The
0
s tidak memiliki tetangga vertikal baik, sehingga mereka menjadi+
s, sedangkan1
s memiliki tetangga vertikal, sehingga mereka menjadi|
s.Digit yang tersisa memiliki tetangga horisontal. The
1
s juga memiliki tetangga vertikal, sehingga mereka menjadi+
s, sedangkan0
s hanya memiliki tetangga horisontal, sehingga mereka menjadi-
s.sumber
Python 3 , 336 byte
Cobalah online!
Saya harus menggunakan banyak kode untuk menangani kesalahan kasus tepi.
sumber
C (gcc) , 143 byte
Cobalah online!
Fungsi f memodifikasi array string di tempat. Area di sekitar array harus diisi dengan spasi (sedikit dibatasi). Meskipun ini tidak benar-benar memenuhi persyaratan yang digunakan kebanyakan solusi, itu sesuai dengan aturan jika kita mengatakan bahwa kita mewakili baris baru dengan dua spasi (dan mengambil array string yang diakhiri dengan baris baru).
Tidak disatukan
Ini adalah tantangan yang menyenangkan dari pointer aritmatika. Menggunakan iterasi pointer C-style mudah untuk mendapatkan tetangga horisontal, tetapi yang vertikal lebih keras. Untungnya pointer y masih ada (yang menunjuk ke nilai awal z) sehingga saya dapat menyimpulkan indeks saya darinya dan menggunakannya untuk mengakses elemen yang sama pada baris yang berbeda. Rasanya sangat keliru menulis
y[-1][z-*y]
saat terbang di hadapan gaya apa pun yang masuk akal!sumber