Gambarlah ASCII berbentuk kubus

14

Diberikan tiga bilangan bulat> = 2, buat kubus ASCII dalam proyeksi (kabinet) ortogonal. Tiga bilangan bulat mewakili tinggi, lebar dan kedalaman (diukur dalam karakter yang terlihat) termasuk sudut. Sudut harus 'o's atau' + ', pilihan bebas.

w: 10, h: 5, d: 4 Dengan demikian memberi:

   o--------o
  /        /|
 /        / |
o--------o  |
|        |  o
|        | /
|        |/
o--------o

Sekarang, untuk membuatnya sedikit lebih sulit, semua wajah bisa menjadi solid, transparan, atau hilang. Kami memesan wajah-wajah seperti ini:

   o--------o
  /        /|
 /    2   / |
o--------o 3|
|        |  o
|   1    | /
|        |/
o--------o

  ---
  |2|
-------
|5|1|3|
-------
  |4|
  ---
  |6|
  ---

Dan berikan daftar token, S, T atau M. Contoh aslinya adalah sebagai berikut:

w 10
h 5
d 4
S S S S S S

   o--------o
  /        /|
 /        / |
o--------o  |
|        |  o
|        | /
|        |/ 
o--------o

Jika satu wajah transparan, kita dapat melihat apa pun yang ada di belakangnya:

T S S S S S

   o--------o
  /        /|
 /        / |
o--------o  |
|  o-----|  o
| /      | /
|/       |/
o--------o


T T T T T T

   o--------o
  /|       /|
 / |      / |
o--------o  |
|  o-----|--o
| /      | /
|/       |/
o--------o

Untuk pasangan wajah yang hilang, tepi atau sudut yang berdekatan tidak lagi terlihat:

M M S S S S

   o--------o
  /|       /|
 / |      / |
o  |     o  |
|  o-----|  o
| /      | /
|/       |/
o--------o

M M S S M S

   o--------o
   |       /|
   |      / |
   |     o  |
   o-----|  o
  /      | /
 /       |/
o--------o

Golf kode, kode terpendek menang! Ruang tambahan dan baris baru baik-baik saja, Anda bebas memilih metode input dan urutan input.

NiklasJ
sumber
5
Seberapa ketat format input Anda? dapatkah saya membuat fungsi dengan 9 parameter?
LiefdeWen
1
@LiefdeWen you're free to choose input method and input order. Dan seperti tidak ada yang mengatakan sebaliknya, salah satu dari metode input / output default dapat digunakan.
dzaima
Bisakah saya mengambil integer sebagai bitmap untuk flag transparan / padat?
Titus
@Itus Yah .. baiklah. Saya kira itu sedikit lebih menghibur jika Anda benar-benar dapat menguji nilai sendiri.
NiklasJ

Jawaban:

5

Arang , 190 181 byte

NωA⁻ω²ςNηA⁻η²γNδA⁻δ²χA⪪S αF›⊟αMF⟦ςγςγ⟧«oκ↶»F∧›⊟αM²«oς↷³oχ↷¹»F∧›⊟αM²«↷³oχ↷³oγ↶»M⁻ωδ⁻δηF⁼§α²SG↗δ↓η↙δ↑η F∧›⊟αM²«↶¹oχ↷³oγ↷»F⁼§α¹SG↗δ←ω↙δ→ω F∧›⊟αM²«↶¹oχ↶³oς»F⁼§α⁰SUO±ωη ↷F›⊟αMF⟦γςγς⟧«oκ↷

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 9 byte dengan mengoptimalkan kondisi saya. Charcoal tidak memiliki elsetoken, jadi ifperintah selalu memiliki dua alternatif, kecuali mereka ada di akhir blok atau program. Untuk menghindari hal ini, saya menggunakan for (<bool>)bukannya if (<bool>)yang memiliki efek yang sama ketika ekspresi hanya dapat memiliki nilai 0 atau 1 tapi menghemat byte. (Untuk mencapai ini saya harus mengubah ekspresi sehingga mereka selalu benar ketika tubuh diperlukan untuk dieksekusi.) Saya juga mampu mengoptimalkan if (<bool>) for (<int>)dalam for (And(bool, int)).

Neil
sumber
Kristus Suci O_O. Aku bahkan tidak tahu cara menggambar kubus itu sendiri menggunakan arang. Bisakah Anda memberikan contoh untuk menggambar kubus sederhana pada folder contoh github? Yang sudah dioptimalkan? Saya ingin membandingkan jawaban saya yang seperti ... 50 byte dengan yang seharusnya.
Magic Gurita Guci
@carusocomputing Maaf, saya tidak jelas tentang apa yang Anda maksud dengan "kubus sederhana", dan saya bukan penulis Charcoal sendiri, jadi saya tidak bisa menambahkan contoh.
Neil
Kamu bukan ?! Omong kosong, siapa itu? Jujur saya pikir kamu. Juga, saya akan meminta untuk menjadi kontributor arang. Anda dapat dengan mudah menjadi satu di github :). Kamu berbakat dalam bahasa, jelas. Dan dengan "kubus sederhana" yang saya maksud adalah bagian pertama dari tantangan, hanya membuat X * Y * Z kubus ASCII.
Magic Gurita Guci
@carusocomputing ASCII-only adalah kontributor utama sejauh yang saya tahu, meskipun wiki esolang memang mengkredit kontributor kedua.
Neil
setidaknya saya akan menghubungi mereka dengan beberapa contoh Anda, Anda telah mengambilnya lebih jauh daripada orang lain yang pernah saya lihat. Saya ingin mendapatkan lebih banyak penjelasan tentang kode Anda, saya sudah mengikuti sedikit jawaban Charcoal Anda sekarang karena bahasanya menarik bagi saya.
Magic Gurita Guci
2

JavaScript (ES6), 318 314 308 byte

Mengambil lebar, tinggi dan kedalaman sebagai bilangan bulat dan wajah sebagai array karakter.

(w,h,d,l,M=(n,F)=>[...Array(n+1).keys()].map(F),a=M((L=w--+d)*(h--+--d),i=>++i%L?' ':`
`),D=(t,Y=0,X=d,W=t&1?d:w,H=t&2?d:h,F=l[t>>2])=>F>'R'&&M(W,i=>M(H,j=>a[p=L*(Y+j-i*(t&1))+X+i-(t&2?j:0)]=(x=!(i&&i-W)|2*!(j&&j-H))?' |-o|/o/-o'[t%4*3+x]:a[F>'S'?p:0])))=>D(20)&D(D(14,h)&D(17,d,0),d,D(9,d,w)&D(6))||a.join``

Bagaimana?

Fungsinya M () memproses panggilan balik F yang diberikan pada rentang yang diberikan [0 ... n] .

M = (n, F) => [...Array(n + 1).keys()].map(F)

Variabel a memegang array datar yang mewakili kisi ukuran (w + d) x (h + d-1) . Awalnya diisi dengan barisan ruang yang diakhiri dengan baris baru.

a = M((L = w-- + d) * (h-- + --d), i => ++i % L ? ' ' : '\n')

Fungsi D () digunakan untuk 'menggambar' wajah berbentuk kubus.

Dua bit paling signifikan dari parameter t memegang tipe wajah:

  • 0 = belakang / depan
  • 1 = kiri / kanan
  • 2 = bawah / atas

Bit # 2 hingga # 4 memiliki indeks wajah berbasis 0.

D = (                                           // given:
  t, Y = 0, X = d,                              // - the type and the initial coordinates
  W = t & 1 ? d : w,                            // - the drawing width
  H = t & 2 ? d : h,                            // - the drawing height
  F = l[t >> 2]                                 // - the character representing the status
) =>                                            //
  F > 'R' &&                                    // provided that the face is not missing:
  M(W, i =>                                     // for each i in [0...W]:
    M(H, j =>                                   //  for each j in [0...H]:
      a[                                        //    update the output
        p = L * (Y + j - i * (t & 1)) +         //    at position p
            X + i - (t & 2 ? j : 0)             //
      ] =                                       //    with either:
      (x = !(i && i - W) | 2 * !(j && j - H)) ? //    - '|', '-' or '/' on edges
        ' |-o|/o/-o'[t % 4 * 3 + x]             //    - or 'o' on vertices
      :                                         //
        a[F > 'S' ? p : 0]                      //    - or a space on solid faces
    )                                           //    - or the current character on
  )                                             //      transparent faces

Wajah digambar dengan urutan sebagai berikut:

D(5 * 4 + 0, 0, d)  // face #5 (rear)
D(3 * 4 + 2, h, d)  // face #3 (bottom)
D(4 * 4 + 1, d, 0)  // face #4 (left)
D(2 * 4 + 1, d, w)  // face #2 (right)
D(1 * 4 + 2, 0, d)  // face #1 (top)
D(0 * 4 + 0, d, 0)  // face #0 (front)

Demo

Arnauld
sumber
1

SOGL V0.11 , 200 194 193 192 190 byte

b³@*⁶
ž}1}X⁵
;aκ⁴
2-³
* o1Ο²
d=?a³:?∫:¹
be.Aā6∫D,ζLI%:C?abe"DCa∫:c+H⁴d+ /ž}{"a+Hy"e³┐²čž|"b³┌²žz"EBAøp”,ōkB°s9θW=*↑(⅜⅞~υ=\⁰ōwūΧ►ΣΤP░¶Ο⁽◄Φ7⅟▲s#‘┌Θdwι+#¶ŗ!!6c=?6d=?2aI⁶e³∙ž}5¹b+⁴Ie³@∙⁵}4¹2+⁴⁶⁵

Mengambil input dalam urutan

width
height
depth
down-face
left-face
back-face
top-face
right-face
front-face

Terikat!
Coba Di Sini! (nilai terkompresi diubah menjadi V0.12 yang kompatibel)

dzaima
sumber