Advent Challenge 4: Представьте сборочную линию!


12

<< Пред. След. >>

Санта был в состоянии восстановить все подарки, которые эльфы украли за одну ночь! Теперь он должен отправить их на конвейер для упаковки. У него обычно есть камера для наблюдения за сборочной линией, чтобы убедиться, что эльфы делают хорошую работу, а также потому, что картинки с сборочной линии выглядят хорошо на рекламных плакатах [цитата-нужна]

К сожалению, его камера сломалась, поэтому он хотел бы, чтобы вы нарисовали симуляцию того, как будет выглядеть сборочная линия!

Для того, чтобы сборочная линия работала с максимальной эффективностью и чтобы снизить риск ошибки или отказа, все имеющиеся коробки имеют одинаковую ширину, чтобы они идеально подходили к конвейерной ленте.

Вызов

Учитывая список подарков, представленных их размерами, выведите конвейерную ленту со всеми подарками.

Подарок нарисован так:

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

Этот подарок имеет ширину 1, высоту 2 и длину 4. Обратите внимание, что знаки плюс не учитывают длину стороны, поэтому подарок длиной 4 фактически занимает 6 позиций.

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

После того, как все существующие ящики нарисованы, конвейерная лента вытягивается путем замены пространства между ящиками в каждой из последних width + 2строк подчеркиванием.

Окончательный вывод для существующих ящиков с (l, w, h)of [(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 все существующие боксы имеют одинаковую ширину
Эрик 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.