Advent Challenge 4: Present складальна лінія!


12

<< Попередня Наступна >>

Санта зміг відновити всі подарунки, які ельфи вкрали за ніч! Тепер він повинен відправити їх на складальну лінію для упаковки. Зазвичай у нього є камера для нагляду за конвеєром і для того, щоб переконатися, що ельфи роблять хорошу роботу, і тому, що малюнки з конвеєра добре виглядають на рекламних плакатах [потрібна цитата]

На жаль, його камера зламалася, тому він хотів би, щоб ви намалювали, як виглядатиме складальна лінія!

Для того, щоб конвеєрна лінія працювала з максимальною ефективністю і щоб знизити ризик помилок або відмов, всі наявні коробки мають однакову ширину, щоб вони ідеально помістилися на конвеєрі.

Виклик

Враховуючи список подарунків, представлених їх розмірами, виведіть конвеєр зі всіма подарунками.

Подарунок оформлений так:

  +----+
 /    /|
+----+ |
|    | +
|    |/
+----+

Цей подарунок має ширину 1, висоту 2 та довжину 4. Зверніть увагу, що знаки плюс не враховуються в бічній довжині, тому презент довжиною 4 насправді охоплює 6 позицій.

Усі подарунки намальовані поруч з одним пробілом між найближчими двома символами; тобто нижній лівий кут подарунків розміщений таким чином, що якщо нинішня коробка має довжину lта ширину w, нижній лівий кут наступного вікна буде точно l + w + 4розташований праворуч від нижнього лівого кута попереднього поля.

Після того, як усі наявні коробки намальовані, конвеєрна стрічка намалюється, замінивши пробіл між коробками на кожному з останніх width + 2рядків підкресленнями.

Остаточний вихід для справжніх коробок з (l, w, h)з [(4, 1, 2), (8, 1, 3), (1, 1, 1)]буде:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

Технічні характеристики форматування

Ви можете вибрати або взяти список з 3-х кортежів, де один з елементів відповідає всьому списку (це була б ширина), або ви можете взяти поточну ширину, а потім список 2-кортезів, що представляють довжину та висота кожного присутніх. Ви можете приймати вхідні дані в будь-якому порядку та в будь-якому розумному форматі, але подарунки повинні відображатися в тому ж порядку, що і в якості введення.

Ви можете вибрати будь-який розумний вихідний формат для ASCII-мистецтва (включаючи повернення з функції).

Випробування

Ці тестові приклади подаються у [(l, w, h), ...]форматі.

[(4, 1, 2), (8, 1, 3), (1, 1, 1)]:

           +--------+
  +----+  /        /|
 /    /| +--------+ |   +-+
+----+ | |        | |  / /|
|    | +_|        | +_+-+ +
|    |/__|        |/__| |/
+----+___+--------+___+-+

[(5, 3, 4), (8, 3, 1), (1, 3, 7)]:

                               +-+
                              / /|
                             / / |
    +-----+                 / /  |
   /     /|                +-+   |
  /     / |                | |   |
 /     /  |     +--------+ | |   |
+-----+   |    /        /| | |   |
|     |   +___/        / +_| |   +
|     |  /___/        / /__| |  /
|     | /___+--------+ /___| | /
|     |/____|        |/____| |/
+-----+_____+--------+_____+-+

[(0, 0, 0)] (this is the most interesting test case ever :P)

 ++
+++
++

[(8, 3, 0), (0, 3, 8)] (more zero cases)

                   ++
                  //|
                 // |
                //  |
               ++   |
               ||   |
               ||   |
               ||   |
    +--------+ ||   |
   /        /+_||   +
  /        //__||  /
 /        //___|| /
+--------+/____||/
+--------+_____++

Правила

  • Застосовуються стандартні лазівки
  • Це , тому найкоротша відповідь у байтах виграє
  • Відповідь не буде прийнято

Примітка: Натхнення для цієї серії викликів я черпав з Advent Of Code . Я не маю приналежності до цього сайту

Ви можете переглянути список усіх викликів у серії, переглянувши розділ "Пов'язані" першого виклику тут .


@AdmBorkBork усі присутні коробки мають однакову ширину
Erik the Outgolfer

1
Якщо деревне вугілля цього не зруйнує , я не знаю, що буде.
повністюлюдський

@totallyhuman насправді, brainf ** k переможе в цьому виклику: P
HyperNeutrino

Чи можете ви зробити повідомлення на мета, щоб проіндексувати всі ці питання?
RamenChef

@RamenChef Хм хороша ідея. Я можу це зробити: P
HyperNeutrino

Відповіді:


4

Вугілля деревне , 96 81 байт

NθWS«→FυG↗→↙⁺²θ_≔I⪪ι υ≔⊟υπ≔§υ⁰ρ→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ ↑πP↗⊕θP←⊕ρ↓+↓πF²«↷⁴+ρ↷²+π↷¹+θ↶³

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Вхід - ширина першого рядка, потім інші розміри на наступних рядках, що закінчується порожнім рядком. Пояснення:

Nθ

Введіть ширину.

WS«

Переведіть петлю на решту рядків, поки не буде досягнуто порожнього рядка.

→FυG↗→↙⁺²θ_

Намалюйте пояс між подарунками. uМінлива зумовлена порожній список, який , отже , нічого не робить на першому проході, а потім він закінчує з одним елементом, в результаті чого цей код , щоб запустити один раз. (Використання ifзнаряддя буде менш гофрованим.)

≔I⪪ι υ

Розділіть розміри на простір, перенесіть їх на цілі числа та збережіть їх u.

≔⊟υπ

Видаліть останній вимір і збережіть його p.

≔§υ⁰ρ

Скопіюйте перший вимір у r, але залиште його uтаким чином, щоб пояс натягнувся на наступну петлю.

→↗G↑⊕π↗⊕θ→⊕ρ↓⊕π↙⊕θ 

Стерти інтер’єр справжнього, якщо пояс перекриває його.

↑πP↗⊕θP←⊕ρ↓+↓π

Намалюйте інтер’єрні лінії сучасності.

F²«↷⁴+ρ↷²+π↷¹+θ↶³

Намалюйте наполовину навколо зовнішності подарунка, потім повторіть для іншої половини.


1

Піп , 160 154 байт

153 байти коду, +1 для -lпрапора.

{YMX:_+B+3MUaRV$.({UwhlWg+^11{a<=h+w?J[sXa-haN[0hh+w]?'-XlWR'+sXlWR("/|"a<h)RV(("+|/"aCMw).sXw)@<MN[ah+w-awh]'_Xw-a+1|s]sXl+w+3}M,y}MUa)R`_ +`'_X#_<|:'_}

Це функція, яка приймає список списків, що містять [width height length]. Спробуйте в Інтернеті!

Як?

Пояснення верхнього рівня:

  • Визначте функцію, яка повертає список рядків, що представляють одне поле
  • Відзначте функцію до кожного списку заданих розмірів
  • Об’єднайте отримані списки рядків
  • Зробіть невелику постільну обробку замінами регулярних виразів, щоб підкреслити, як правильно поводитися

Залиште коментар, і я додам більш детальне пояснення.


0

Python 2 , 508 байт

def f(B):
 d=B[0][1]+2;H=max(B)[0]+d+1;W=sum(sum(b[1:])+3for b in B)+len(B);r=[[' ']*i+W*['_']for i in range(d)]+[W*[' ']for _ in' '*H];o=0
 for h,w,l in B:
	for i in range(w+2,1,-1):r[i-1][o+i-2:o+l+i]=[' ']*(l+2)+['/'];r[h+i][o+i-1]=r[h+i][o+l+i]='/'
	r[0][o:o+l+2]=r[h+1][o:o+l+2]=r[w+h+2][o+w+1:o+w+l+3]=['+']+['-']*l+['+']
	for i in range(1,h+1):m=min(i,w)-1;r[i][o:o+l+2+m]=['|']+[' ']*l+['|']+[' ']*m;r[i+w+1][o+l+w+2]='|'
	r[w+1][o+l+w+2]='+';o+=l+w+4
 for l in r[H-1::-1]:print''.join(l).rstrip('_')

Спробуйте в Інтернеті!

Приймає список списків [height, width, length]

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