ASCII küboid çizin


14

Üç => 2 tamsayısı verildiğinde, dikey (kabin) projeksiyonda bir ASCII küpü oluşturun. Üç tamsayı, köşeler dahil yükseklik, genişlik ve derinliği (görünür karakterlerle ölçülen) temsil eder. Köşeler 'o' veya '+', serbest seçim olmalıdır.

w: 10, h: 5, d: 4 Böylece:

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

Şimdi, bunu biraz daha zorlaştırmak için, tüm yüzler sağlam, şeffaf veya eksik olabilir. Yüzleri şu şekilde sipariş ediyoruz:

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

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

Ve jeton, S, T veya M'nin bir listesini sağlayın.

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

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

Bir yüz şeffafsa, arkasında olan her şeyi görebiliriz:

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

Eksik yüz çiftleri için, bitişik kenarlar veya köşeler artık görünmez:

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

Kod golf, en kısa kod kazanır! Sondaki boşluklar ve yeni satırlar iyi, giriş yöntemini ve giriş sırasını seçmekte özgürsünüz.


5
Girdi biçiminiz ne kadar katı? 9 parametreli bir işlev yapabilir miyim?
LiefdeWen

1
@LiefdeWen you're free to choose input method and input order. Ve hiçbir şey aksini söylemediği gibi , varsayılan giriş / çıkış yöntemlerinden herhangi biri kullanılabilir.
dzaima

Saydam / katı bayraklar için bitmap olarak bir tam sayı alabilir miyim?
Titus

@Titus Şey .. tamam. Sanırım değerleri kendiniz test edebiliyorsanız biraz daha eğlenceli.
NiklasJ

Yanıtlar:


5

Kömür , 190 181 bayt

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κ↷

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Düzenleme: Koşullarımı optimize ederek 9 bayt kaydedildi. Kömürün elsejetonu yoktur , bu nedenle ifbir blok veya programın sonunda olmadıkları sürece komutların her zaman iki alternatifi vardır. Bundan kaçınmak için , ifadenin yalnızca 0 veya 1 değerlerine sahip olabileceği, ancak bir bayt kaydettiği zaman for (<bool>)bunun yerine if (<bool>)benzer bir etkiye sahip olduğunu kullanıyorum . (Bu I ulaşmak için gerekli vücut yürütülecek zaman onlar her zaman doğru olduğunu, böylece ifadeleri değiştirmek zorunda kaldı.) Ben optimize etmek de başardı if (<bool>) for (<int>)içine for (And(bool, int)).


Kutsal Mesih O_O. Kömür kullanarak küpün nasıl çizileceğini bile anlayamadım. Github örnekler klasörüne basit bir küp çizmek için bir örnek verebilir misiniz? Optimize edilmiş olanı? Benim gibi ... 50 baytlık cevabı olması gerekenle karşılaştırmak istiyorum.
Sihirli Ahtapot Urn

@carusocomputing Üzgünüm, "basit küp" ile ne demek istediğiniz konusunda net değilim ve Charcoal'ın kendisinin bir yazarı değilim, bu yüzden bir örnek ekleyemiyorum.
Neil

Değil mi ?! Kutsal saçmalık, kim? Dürüst olduğunu düşündüm. Ayrıca, odun kömürü katkısı olmasını rica ediyorum. Github'da kolayca bir tane olabilirsiniz :). Açıkçası, bu dilde yeteneklisin. Ve "basit küp" ile mücadelenin ilk yarısını kastediyorum, sadece bir X * Y * Z ASCII küpü yapıyorum .
Sihirli Ahtapot Urn

@carusocomputing ASCII sadece anlatabildiğim kadarıyla ana katkıda bulunuyor, ancak esolang wiki ikinci bir katılımcıya kredi veriyor.
Neil

en azından onlardan birkaç örnekle iletişime geçirdim, gördüğüm herkesten daha ileri götürdün. Kodunuz hakkında daha fazla açıklama almak isterim, Kömür cevaplarınızı biraz takip ettim çünkü dil benim için ilginç.
Sihirli Ahtapot Urn

2

JavaScript (ES6), 318 314 308 bayt

Genişlik, yükseklik ve derinliği tamsayı olarak alır ve yüzleri bir karakter dizisi olarak alır.

(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``

Nasıl?

M () işlevi belirli bir geri arama F'yi belirli bir aralıkta [0 ... n] işler .

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

Değişken bir boyutta bir ızgara temsil eden bir düz dizi tutar (+ d genişlik) x (h + d-1) . Başlangıçta satırsonu ile sonlandırılmış boşluk satırları ile doldurulur.

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

D () fonksiyonu küboidin bir yüzünü 'çizmek' için kullanılır.

T parametresinin en az anlamlı iki biti yüz tipini taşır:

  • 0 = arka / ön
  • 1 = sol / sağ
  • 2 = alt / üst

# 2 ila # 4 bitleri 0 tabanlı yüz dizinini tutar.

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

Yüzler aşağıdaki sırayla çizilir:

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)

gösteri


1

SOGL V0.11 , 200 194 193 192 190 bayt

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+⁴⁶⁵

Sırayla girdi alır

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

Bağlı!
Buradan Deneyin! (sıkıştırılmış değer V0.12 uyumlu olarak değiştirildi)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.