Diberi matriks ketinggian persegi panjang, gambarkan konturnya.
Tugas
Dua elemen x
dan y
berada pada level kontur yang sama jika floor(x/10) == floor(y/10)
. Misalnya, 52
dan 58
berada pada level kontur yang sama, tetapi 58
dan 64
tidak.
Tindakan menggambar kontur didefinisikan sebagai berikut: Untuk setiap elemen e
, gantikan dengan string dua karakter yang dipilih sebagai berikut:
- karakter pertama adalah
" "
jika elemen di bawahe
ini pada tingkat kontur yang sama dengane
atau jika tidak ada elemen di bawah inie
dan"_"
sebaliknya - karakter kedua adalah
" "
jika elemen di sebelah kanane
berada pada level kontur yang sama dengane
atau tidak ada elemen di sebelah kanane
dan"|"
sebaliknya
Elemen-elemen dalam baris digabungkan bersama, kemudian baris digabungkan bersama dengan baris baru.
Contoh
Katakanlah inputnya [[5,20],[3,6]]
, divisualisasikan sebagai
5 20
3 6
Kami pertama kali melihat 5
. Karena 3
berada pada level kontur yang sama dengan 5
, karakter pertama adalah " "
. Karena 20
tidak pada level kontur yang sama dengan 5
, karakter kedua adalah "|"
.
Sekarang kita lihat 20
. Karena 6
tidak pada level kontur yang sama dengan 20
, karakter pertama adalah "_"
. Karena tidak ada elemen di sebelah kanan 20
, karakter kedua adalah " "
.
Sekarang kita lihat 3
. Karena tidak ada elemen di bawah ini 3
, karakter pertama adalah " "
. Karena 6
berada pada level kontur yang sama dengan 3
, karakter kedua adalah " "
.
Sekarang kita lihat 6
. Karena tidak ada elemen di bawah ini 6
, karakter pertama adalah " "
. Karena tidak ada elemen di sebelah kanan 6
, karakter kedua adalah " "
.
Berdasarkan dua karakter ini, kami melakukan penggantian untuk mendapatkan [[" |","_ "],[" "," "]]
. Bergabung bersama ini, kami mendapatkan output dari
|_
Aturan
- Matriks input akan selalu berbentuk persegi panjang dan terdiri dari bilangan bulat positif.
- Ruang tambahan atau baris baru mungkin dalam jumlah berapa pun (termasuk 0) dan tidak harus konsisten dengan cara apa pun.
- Anda tidak harus mengikuti algoritma yang sama selama Anda menghasilkan hasil yang sama.
- Program atau fungsi Anda dapat menampilkan string yang dipisahkan baris baru, daftar string, atau yang setara.
- Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Uji Kasus
input
output
[[1,5,8,9],[3,11,13,8],[7,14,10,9],[4,8,7,6]]
_ _
| |
|_ _|
[[0,10,20,30,40,50,60,70,80,90],[0,0,10,10,20,20,30,30,40,40],[0,0,0,10,10,10,20,20,20,30],[0,0,0,0,10,10,10,10,20,20],[0,0,0,0,0,10,10,10,10,10],[0,0,0,0,0,0,10,10,10,10],[0,0,0,0,0,0,0,10,10,10],[0,0,0,0,0,0,0,0,10,10],[0,0,0,0,0,0,0,0,0,10],[0,0,0,0,0,0,0,0,0,0]]
|_|_|_|_|_|_|_|_|_
|_ |_ _|_ _|_ _
|_ |_ _ |_
|_ |_ _
|_
|_
|_
|_
|_
[[5,5,5,5,5,5,5,5,5,5,5],[5,10,10,10,10,10,10,10,10,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,25,30,25,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,10,10,10,10,10,10,10,10,5],[5,5,5,5,5,5,5,5,5,5,5]]
_ _ _ _ _ _ _ _ _
| |
| _ _ _ _ _ |
| | | |
| | _ | |
| | |_| | |
| | | |
| |_ _ _ _ _| |
| |
|_ _ _ _ _ _ _ _ _|
[[35,32,29,26,25,25,25,26,29,32,35],[32,28,25,22,20,20,20,22,25,28,32],[29,25,21,18,15,15,15,18,21,25,29],[26,22,18,14,11,10,11,14,18,22,26],[25,20,15,11,7,5,7,11,15,20,25],[25,20,15,10,5,0,5,10,15,20,25],[25,20,15,11,7,5,7,11,15,20,25],[26,22,18,14,11,10,11,14,18,22,26],[29,25,21,18,15,15,15,18,21,25,29],[32,28,25,22,20,20,20,22,25,28,32],[35,32,29,26,25,25,25,26,29,32,35]]
_| |_
_| _ _ _ _ _ |_
_| |_
| _ _ _ |
| | | |
| | | |
| |_ _ _| |
|_ _|
_ |_ _ _ _ _| _
|_ _|
| |
Jawaban:
Perl 6 , 135 byte (131 karakter)
Cobalah online!
Sedikit tidak berbulu:
Penjelasan : Pertama, kami mendefinisikan variabel
$n
(baris 2) dan fungsiw
(baris 3). Fungsi ini mengembalikan spasi jika dua argumennya berada pada "ketinggian" yang sama, dan isi variabel$n
sebaliknya. Alih-alih membaginya dengan 10 dan lantai, kami menyalahgunakan fakta bahwa int adalahCool
(dapat diperlakukan seperti string) dan digunakanchop
untuk menghapus karakter terakhir (= digit). Lalu kami dengan tenang mengurangi mereka, memaksa mereka menjadi angka lagi :—).Setelah itu (baris 4) kita membuat fungsi
q
yang mengambil daftar dan mengembalikan daftar itu dengan elemen pertama dihapus dan elemen terakhir digandakan.Pada 3 baris berikutnya, kita akan membuat 2 matriks lagi dari matriks input: yang pertama memiliki baris pertama yang hilang dan baris terakhir digandakan (itu hanya
.&q
- menggunakan.&
, Anda dapat memanggil fungsi pada apa pun seolah-olah itu adalah sebuah metode - benda di depan titik kemudian argumen pertama), yang lain memiliki kolom pertama hilang dan kolom terakhir digandakan (itu.map(*.&q)
).Pertama (baris 4) kita mengambil matriks asli
$_
, "overlay" dengan matriks "shifted rows" dan menggunakan fungsinyaw
sebagai operator biner (begitulah[&w]
) pada elemen yang cocok. Yang satu menempatkan di_
mana pun elemen yang cocok berada pada ketinggian yang berbeda, dansebaliknya. Jadi kita mendapatkan ½ dari hasil (hanya "karakter pertama").
Pada baris 6, kita melakukan hal yang sama, tetapi pertama kita beralih
$n
ke|
, dan sekarang kita "overlay" matriks asli dengan matriks dengan kolom bergeser. Hasil memiliki|
perbedaan danketinggian yang sama. Ini adalah "karakter kedua".
Sekarang kita hanya menggabungkan keduanya. Kami zip array dengan zip dengan concat (yeah ...), yang menghasilkan matriks dari bentuk asli yang masing-masing elemen adalah 2 elemen yang cocok dari "solusi setengah" yang digabungkan. Akhirnya, kami hanya memetakan di atas matriks ini (yang benar-benar daftar daftar). Masing-masing daftar ini diratakan dan kemudian
say
dicetak ulang (dicetak dengan baris baru). Karenasay
dapat mengambil sejumlah argumen dan mencetak semuanya tanpa pemisah, membuat baris baru di bagian akhir, kita mendapatkan gambar yang diinginkan di stdout. (Dan blok mengembalikan daftarTrue
s (masing-masingsay
mengembalikan satuTrue
), tetapi siapa yang peduli.)sumber
but who cares
Jelly ,
25 2322 byte-1 byte berkat mil (
I
vektorisasi)Program lengkap mencetak hasilnya. Sebagai tautan monadik diperlukan daftar daftar angka, ketinggian, dan mengembalikan daftar daftar, namun "baris" ini terdiri dari daftar dua karakter "pasangan" - jika ini baik maka 1 byte dapat disimpan dengan menghapus
Y
.Cobalah online!
Bagaimana?
sumber
⁵
menghemat satu langsung ...:⁵I;€0ao⁶
alih-alih di tautan utamaZç”_Zż"ç”|$Y
I
tidak akan vectorise seperti itu.I
vektorisasi pada kedalaman 1, dan keduanyaa
dano
vektorkan pada kedalaman 0Python 2 ,
199186157155 byteCobalah online!
sumber
Jelly , 24 byte
Cobalah online!
Penjelasan
-2 byte terima kasih kepada Jonathan Allan
sumber
Y
- itu akan mengembalikan daftar daftar karakter, yang saya percaya tidak apa-apa (sementara milik saya memiliki pasangan di dalam "baris").Python 2 , 226 byte
Cobalah online!
Wah, itu adalah doozy untuk mengerjakan logikanya. Saya sekarang melihat Hyper Neutrino memberi saya ninja dengan jawaban yang lebih pendek tetapi saya menghabiskan terlalu banyak pekerjaan untuk tidak mempostingnya. : P
Juga, bisa saya katakan, ini adalah cara yang luar biasa untuk membuat ASCII-art. Maafkan saya sementara saya membuat lebih banyak kapal dari ini.
sumber
enumerate
alih - alih menggunakan nama lengkap dua kali.enumerate
(obs, saya harus menghapus beberapa input untuk dapat menghubungkannya di sini)J, 58 byte
Cobalah online!
Fungsi anonim yang mengambil matriks dan menampilkan kontur.
Banyak ruang untuk perbaikan di sini. Saya tidak punya waktu untuk mencoba semua kasus uji jadi beri tahu saya jika ada masalah. Akan mencoba golf lebih banyak dan menjelaskannya nanti.
(Cepat) Penjelasan
Fungsi pembantu: mengindeks ke dalam string panjang 2 berdasarkan pada apakah elemen pertama dari array 2 panjang sama dengan yang kedua. Jika sama, itu akan diindeks ke elemen nol, jika tidak sama, itu diindeks menjadi yang pertama. Array 1 panjang selalu diindeks ke elemen nol dari string.
Fungsi utama
1:+<.@%&10
lantai setiap elemen dibagi 10 dan menambahkan 1 (jadi kita tidak akan pernah mendapatkan 0 - ini penting untuk fungsi pembantu).2 2((' _'f{."1),' |'f{.);.3
memotong matriks menjadi segmen 2 x 2 jika dapat (jika tidak akan memberikan segmen 2 x 1, 1 x 2, atau 1 x 1 di dekat tepi) dan menerapkan fungsi yang digunakanf
untuk membandingkan elemen kiri atas ke atas. elemen kanan dan kiri atas ke kiri bawah.(,/"2)
ratakan hasilnya menjadi bentuk yang diinginkan. Saya benar-benar merasa harus menghindari penggunaan ini (dan banyak hal lainnya, tetapi saya ngelantur).sumber
J ,
4645 byteCobalah online!
sumber
JavaScript (ES6),
120118 byteDimana
\n
mewakili karakter baris baru literal. Sunting: Disimpan 2 byte berkat @ Bálint.sumber
(a[i] || [])[j]
konstruksi menjadi(a[i] || 0)[j]
join`\n`
Anda dapat menghapus\n
bagian dan menggantinya dengan baris baru yang sebenarnyaa=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>" _"[(a[i+1]||0)[j]-c&1]+" |"[b[j+1]-c&1]).join``).join`<new line here>`
\n
bagian itu; Saya menguji dalam REPL sehingga baris baru literal akan menghalangi.Proton , 202 byte
Cobalah online!
-2 byte berkat Jonathan Frech
-15 byte dengan beralih ke Proton alih-alih Python 2
sumber
len
denganL
dan mendefinisikanL=len;
.Java 8,
200170169 bytePenjelasan:
Coba di sini.
Perhatikan bahwa pembagian integer di Jawa secara otomatis lantai.
sumber
R, 159 byte
Dengan baris baru dan lekukan:
Apakah pembagian integer dari matriks, mengukur perbedaan baris-bijaksana dan kolom-bijaksana, dan ketika tidak nol ganti dengan
|
dan_
masing - masing, kemudian tempelkan keduanya (tanpa rasa sakit, berkat vektorisasi R) dan output.Kasus uji:
sumber
Perl 5 ,
130126 byte124 byte kode + 2 untuk
-ap
benderaCobalah online!
Format input adalah grid 2-D angka yang dipisahkan oleh ruang.
Penjelasan
Ini dari iterasi kode sebelumnya.
sumber