Нарисуйте куб ASCII

14

Учитывая три целых числа> = 2, создайте куб ASCII в ортогональной (кабинетной) проекции. Три целых числа представляют высоту, ширину и глубину (измеряются видимыми символами), включая углы. Углы должны быть «о» или «+», свободный выбор.

ш: 10, ч: 5, д: 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

Код гольф, самый короткий код выигрывает! Конечные пробелы и переводы строк в порядке, вы можете выбрать метод ввода и порядок ввода.

NiklasJ
источник
5
Насколько строг ваш формат ввода? можно сделать функцию с 9 параметрами?
LiefdeWen
1
@LiefdeWen you're free to choose input method and input order. И поскольку ничто не говорит иначе, любой из методов ввода / вывода по умолчанию может использоваться.
Дзайма
Могу ли я взять целое число в качестве растрового изображения для прозрачных / сплошных флагов?
Тит
@ Титус Хорошо .. хорошо. Я предполагаю, что это немного более интересно, если вы действительно можете проверить значения самостоятельно.
NiklasJ

Ответы:

5

Древесный уголь , 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 байтов путем оптимизации моих условий. У древесного угля нет elseтокена, поэтому у ifкоманд всегда есть две альтернативы, если они не находятся в конце блока или программы. Чтобы избежать этого, я использую for (<bool>)вместо if (<bool>)которого имеет аналогичный эффект, когда выражение может иметь только значения 0 или 1, но сохраняет байт. (Для того , чтобы достичь этого я должен был изменить выражения , чтобы они всегда были верны , когда тело необходимо для выполнения.) Я также был в состоянии оптимизировать if (<bool>) for (<int>)в for (And(bool, int)).

Нил
источник
Святой Христос О_О. Я даже не мог понять, как нарисовать сам куб, используя уголь. Можете ли вы привести пример для рисования простого куба в папке примеров github? Тот, который был оптимизирован? Я хочу сравнить свой 50-байтовый ответ с тем, каким он должен был быть.
Волшебная урна осьминога
@carusocomputing Извините, мне неясно, что вы подразумеваете под "простым кубом", и я не являюсь автором самого угля, поэтому не могу добавить пример.
Нил
Вы не ?! Святое дерьмо, кто это? Я честно думал, что ты был. Кроме того, я бы попросил стать вкладчиком угля. Вы можете легко стать одним на GitHub :). Вы талантливы в языке, очевидно. И под «простым кубом» я подразумеваю первую половину испытания, просто делая X * Y * Z куб ASCII.
Волшебная Урна Осьминога
Насколько я могу судить, @carusocomputing ASCII-only является основным автором, хотя вики-сайт esolang считает, что второй участник внес свой вклад.
Нил
по крайней мере, я бы связался с ними с несколькими вашими примерами, вы взяли это дальше, чем кто-либо еще, кого я видел. Я хотел бы получить больше объяснений вашего кода, я немного следил за вашими ответами на Charcoal, потому что язык мне интересен.
Волшебная Осьминог Урна
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)

Переменная a содержит плоский массив, представляющий сетку размером (w + d) x (h + d-1) . Первоначально он заполнен рядами пробелов, оканчивающихся символами новой строки.

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

Функция D () используется для «рисования» грани кубоида.

Два младших бита параметра t содержат тип лица:

  • 0 = задний / передний
  • 1 = влево / вправо
  • 2 = низ / верх

Биты с № 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)

демонстрация

Arnauld
источник
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)

dzaima
источник