วาดทรงลูกบาศก์ ASCII


14

รับจำนวนเต็มสามตัว> = 2 สร้างลูกบาศก์ ASCII ในโปรเจคชันมุมฉาก (ตู้) จำนวนเต็มสามจำนวนแสดงถึงความสูงความกว้างและความลึก (วัดเป็นอักขระที่มองเห็นได้) รวมถึงมุม มุมควรเป็น 'o's หรือ' + 'ตัวเลือกฟรี

w: 10, h: 5, d: 4 ดังนั้นให้:

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

ตอนนี้เพื่อทำให้สิ่งนี้ยากขึ้นเล็กน้อยใบหน้าทั้งหมดอาจเป็นของแข็งโปร่งใสหรือขาดหายไป เราสั่งใบหน้าดังนี้:

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

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

และจัดหารายการโทเค็น, S, T หรือ M ตัวอย่างต้นฉบับจึง:

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

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

หากใบหน้าหนึ่งโปร่งใสเราสามารถเห็นสิ่งที่อยู่ข้างหลังมัน:

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

สำหรับใบหน้าที่ขาดหายไปคู่หน้าจะมองไม่เห็นขอบหรือมุมที่อยู่ติดกัน:

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

รหัสกอล์ฟรหัสที่สั้นที่สุดชนะ! ช่องว่างต่อท้ายและการขึ้นบรรทัดใหม่นั้นใช้ได้คุณสามารถเลือกวิธีการป้อนข้อมูลและลำดับการป้อนได้


5
รูปแบบการป้อนข้อมูลของคุณมีความเข้มงวดเพียงใด ฉันสามารถสร้างฟังก์ชันด้วยพารามิเตอร์ 9 ตัวได้หรือไม่
LiefdeWen

1
you're free to choose input method and input order@LiefdeWen และอย่างที่ไม่มีสิ่งใดบอกไว้เป็นอย่างอื่นใด ๆ ของวิธีการอินพุต / เอาต์พุตเริ่มต้นสามารถใช้ได้
dzaima

ฉันสามารถใช้จำนวนเต็มเป็นบิตแมปสำหรับแฟล็ก transparent / solid ได้หรือไม่?
ติตัส

@Titus Well .. เอาล่ะ ฉันคิดว่ามันค่อนข้างสนุกสนานถ้าคุณสามารถทดสอบค่าด้วยตัวเอง
NiklasJ

คำตอบ:


5

Charcoal , 190 181 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แก้ไข: บันทึก 9 ไบต์โดยปรับเงื่อนไขของฉันให้เหมาะสม Charcoal ไม่มีelseโทเค็นดังนั้นifคำสั่งจะมีสองทางเลือกยกเว้นว่าจะอยู่ที่ท้ายสุดของบล็อกหรือโปรแกรม เพื่อหลีกเลี่ยงปัญหานี้ฉันใช้for (<bool>)แทนif (<bool>)ซึ่งมีผลคล้ายกันเมื่อนิพจน์สามารถมีค่าเป็น 0 หรือ 1 แต่บันทึกไบต์เท่านั้น (เพื่อให้บรรลุนี้ผมมีการเปลี่ยนแปลงการแสดงออกเพื่อให้พวกเขาเป็นจริงเสมอเมื่อร่างกายจำเป็นต้องได้รับการดำเนินการ.) ฉันก็สามารถที่จะเพิ่มประสิทธิภาพการเข้าif (<bool>) for (<int>)for (And(bool, int))


พระคริสต์ O_O ฉันไม่สามารถเข้าใจวิธีการวาดลูกบาศก์ด้วยถ่าน คุณสามารถวางตัวอย่างเพื่อวาดลูกบาศก์อย่างง่าย ๆ บนโฟลเดอร์ตัวอย่าง github ได้หรือไม่? สิ่งที่ได้รับการปรับปรุงหรือไม่ ฉันต้องการเปรียบเทียบสิ่งที่ชอบ ... 50 ไบต์ตอบกับสิ่งที่ควรจะเป็น
Magic Octopus Urn

@carusocomputing ขออภัยฉันไม่ชัดเจนว่าคุณหมายถึง "Simple cube" และฉันไม่ใช่ผู้แต่ง Charcoal เองดังนั้นฉันจึงไม่สามารถเพิ่มตัวอย่างได้
Neil

คุณยังไม่ได้! อึศักดิ์สิทธิ์ใครล่ะ? ฉันคิดว่าคุณเป็นคนซื่อสัตย์ นอกจากนี้ฉันขอเป็นผู้สนับสนุนถ่าน คุณสามารถเป็นหนึ่งใน GitHub ได้อย่างง่ายดาย :) คุณมีความสามารถในภาษาอย่างชัดเจน และโดย "ลูกบาศก์ง่าย" ฉันหมายถึงครึ่งแรกของความท้าทายเพียงแค่สร้างX * Y * Z ลูกบาศก์ ASCII
Magic Octopus Urn

@carusocomputing ASCII-only เป็นผู้สนับสนุนหลักเท่าที่ฉันสามารถบอกได้ถึงแม้ว่า esolang wiki จะให้เครดิตผู้สนับสนุนคนที่สอง
Neil

อย่างน้อยที่สุดฉันจะติดต่อพวกเขาพร้อมกับตัวอย่างบางส่วนของคุณคุณได้นำมันไปไกลกว่าใครอื่นที่ฉันเคยเห็น ฉันชอบที่จะได้รับคำอธิบายเพิ่มเติมเกี่ยวกับรหัสของคุณฉันได้ทำตามคำตอบ Charcoal ของคุณสักพักแล้วเพราะภาษาน่าสนใจสำหรับฉัน
Magic Octopus Urn

2

JavaScript (ES6), 318 314 308 ไบต์

ใช้ความกว้างความสูงและความลึกเป็นจำนวนเต็มและใบหน้าเป็นอาร์เรย์ของอักขระ

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

อย่างไร?

ฟังก์ชั่นM ()ประมวลผลการเรียกกลับได้รับFในช่วงที่กำหนด[0 ... n]

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

ตัวแปรถืออาร์เรย์แบนเป็นตัวแทนของตารางที่มีขนาด(w + D) x (h + D-1) มันเต็มไปด้วยแถวของช่องว่างที่สิ้นสุดด้วยการขึ้นบรรทัดใหม่

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

ฟังก์ชั่นD ()ใช้เพื่อ 'วาด' ใบหน้าของทรงลูกบาศก์

บิตที่มีนัยสำคัญน้อยที่สุดสองชิ้นของพารามิเตอร์tเก็บประเภทของใบหน้า:

  • 0 = ด้านหลัง / ด้านหน้า
  • 1 = ซ้าย / ขวา
  • 2 = ล่าง / บนสุด

Bits # 2 ถึง # 4 ถือดัชนีใบหน้าตาม 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

ใบหน้าถูกวาดตามลำดับต่อไปนี้:

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)

การสาธิต


1

SOGL V0.11 , 200 194 193 192 190 ไบต์

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

ใช้อินพุตตามลำดับ

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

ผูก!
ลองที่นี่! (ค่าที่บีบอัดเปลี่ยนเป็น V0.12 ที่เข้ากันได้)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.