Tantangan
Tulis sebuah program yang mengambil array bilangan bulat 11x11, dan buat sebuah bangunan blok ASCII 3D, di mana setiap nilai dalam array mewakili ketinggian kolom blok pada koordinat yang sesuai dengan posisi array. Tinggi negatif adalah kolom "mengambang" - hanya blok atas yang terlihat.
Contoh
__________________
___ /\__\__\__\__\__\__\
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /\__\ /\/\__\__\__\__\__\__\
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /\/__/ /\/\/__/__/__/__/__/__/
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /\/\__\ /\/\/\__\ /\/\/__/
1, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0, \/\/\__\ /\/\/\/__/ /\/\/__/
0, 0, 0, 7,-7,-7,-7,-7, 7, 0, 0, \/\/__/ /\/\/\/\__\ /\/\/__/
0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, \/\__\ /\/\/\/\/__/ /\/\/__/
0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, \/__/ \/\/\/\/\__\_ \/\/__/
1, 0, 0, 4, 3, 2, 1, 0, 0, 0, 1, \/\/\/\/__/_\_ \/__/
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ___ \/\/\/__/__/_\_ ___
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, /\__\ \/\/__/__/__/_\ /\__\
1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, \/\__\ \/__/__/__/__/ \/\__\
\/\__\_________ ______\/\__\
\/\__\__\__\__\ /\__\__\__\__\
\/__/__/__/__/ \/__/__/__/__/
Memasukkan
Input akan menjadi daftar 121 bilangan bulat, baik dibaca dari stdin (pilihan pemisah terserah Anda), atau diteruskan sebagai array (bisa 1D atau 2D).
Ketinggian akan berada di kisaran -11 hingga 11.
Keluaran
Bangunan yang dihasilkan dapat ditulis ke stdout, ditampilkan langsung di layar, atau dikembalikan sebagai string yang dipisahkan baris baru.
Ruang putih terkemuka dan tertinggal diizinkan.
Peraturan Bangunan
Bentuk blok 3D individual terlihat seperti ini:
___
/\__\
\/__/
Dan kubus blok 2x2x2 terlihat seperti ini:
______
/\__\__\
/\/\__\__\
\/\/__/__/
\/__/__/
Ketika blok tumpang tindih, blok yang lebih tinggi diutamakan daripada yang lebih rendah, blok di depan diutamakan di belakang, dan blok di sebelah kiri diutamakan daripada yang di sebelah kanan. Satu-satunya kasus khusus adalah bahwa baris paling atas dari sebuah blok tidak boleh menimpa karakter non-spasi di belakangnya.
Interpretasi ketinggian kolom dapat dijelaskan dengan melihat representasi 2D dari samping.
HEIGHT: 1 2 3 -3 -2 -1
__ __
__ |__| |__| __
__ |__| |__| |__| __
|__| |__| |__| |__|
Uji Kasus
Jika Anda ingin mencoba solusi Anda pada beberapa input lagi, saya telah mengumpulkan beberapa test case di sini .
Kemenangan
Ini adalah kode-golf , sehingga pengiriman terpendek (dalam byte) menang.
Jawaban:
Arang ,
706968 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Baca array, pisahkan setiap baris pada koma dan dilemparkan ke integer, tetapi juga balikkan setiap baris, karena kami ingin menggambar kanan-ke-kiri sehingga kolom kiri menimpa kolom kanan. (Dimensi lain sudah memiliki perilaku menimpa yang diinginkan.)
Loop melalui i) garis dan badan atas k) tinggi l) baris m) kolom. (Looping melalui baris teratas pertama dan kemudian badan menghindari menimpa tubuh dengan baris atas.)
Lompat ke posisi kubus.
Ambil ketinggian di baris dan kolom saat ini.
Uji apakah sebuah kubus harus digambar pada ketinggian ini untuk baris dan kolom ini.
Gambarlah tubuh atau bagian atas kubus.
sumber
3
ke33
, saya hanya mendapatkan 11 blok di menara. Secara umum menara tampaknya ditutup pada jam 11. Bagaimana hal itu terjadi?F¹¹F¹¹F¹¹
itu bukan petunjuk ...C,
376350313309285 byteTerima kasih kepada @Jonathan Frech karena telah menghemat empat byte!
Cobalah online!
Belum dibuka:
sumber
26*66
bisa1716
?*s==32
->*s<33
.for(e=k=1;e;++k)for(e=
->for(k=1;e;++k)for(e=
.#define B b(...)&++e
->#define B++e&b(...)
(dengan asumsib
tidak bergantung padae
, yang saya pikir tidak).JavaScript (ES6),
277251 byteTampilkan cuplikan kode
Disimpan 26 byte dari saran @ Neil .
Tidak disatukan
sumber
,$(w=>$(z=>$(y=>$(x=>(Z=a[y][x=10-x,X=x*3+y+z,Y=y-z+n,x])<=z&&Z+z+1?0:w?['/\\__\\','\\/__/'].map(s=>S[++Y].splice(X,5,...s)):S[Y].splice(X+1,3,...'___'))))),
tampaknya menghemat 26 byte.Python 2 , 243 byte
Cobalah online!
Terjemahan Python dari pendekatan Neil's Charcoal.
sumber
+1+k
->-~k
.APL (Dyalog Unicode) ,
117116112 byte SBCSCobalah online!
sumber
Tcl, 380
409byteSergiol pengguna telah sibuk menyelesaikan ini dengan sangat baik:
Cobalah online!
Konten Asli
Cobalah online!
Sayangnya, ini adalah apa adanya. Itu hanya sedikit lebih mudah di mata ketika "tidak diserang"
Membangun string, sesuai persyaratan. Mengambil array dari stdin. Pergi dari bawah ke atas, depan ke belakang, kanan ke kiri pada data string. Lakukan dalam dua lintasan, satu kali untuk tepi atas dan lagi untuk sisa tubuh masing-masing kubus.
Saya mencoba membuatnya lebih kecil menggunakan beberapa lambda mojo fungsional yang manis, tetapi sayangnya, itu membuatnya lebih besar.
sumber