Намалюйте кубоїд ASCII


14

Давши три цілі числа> = 2, створіть куб ASCII в ортогональній (шафі) проекції. Три цілі числа представляють висоту, ширину та глибину (вимірюється видимими символами), включаючи кути. Кути повинні бути "o" або "+", вільний вибір.

ш: 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

Код гольфу, найкоротший виграш коду! Пробіли та нові рядки в порядку, ви можете вибрати метод введення та порядок введення.


5
Наскільки суворий ваш формат введення? чи можу я зробити функцію з 9 параметрами?
LiefdeWen

1
@LiefdeWen you're free to choose input method and input order. І як ніщо не говорить про інше, можна використовувати будь-який із методів вводу / виводу за замовчуванням .
dzaima

Чи можу я взяти ціле число як растрове для прозорих / суцільних прапорів?
Тит

@Titus Ну .. добре. Напевно, це трохи цікавіше, якщо ти насправді можеш перевірити значення самотужки.
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 є основним учасником, хоча вікі esolang зараховує до другого учасника.
Ніл

принаймні я б з ними зв’язався з кількома вашими прикладами, ви взяли це далі за всіх, кого я бачив. Я хотів би отримати більше пояснень вашого коду, зараз я трохи дотримувався ваших відповідей Вугілля, тому що мова мені цікава.
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)

Змінна 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)

Демо


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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.