Desafio do Advento 4: Atual Linha de Montagem!

12

<< Anterior Próximo >>

Papai Noel foi capaz de remanufaturar todos os presentes que os elfos roubaram da noite para o dia! Agora ele tem que enviá-los para a linha de montagem para embalagem. Ele geralmente tem uma câmera para supervisionar a linha de montagem, para garantir que os elfos estejam fazendo um bom trabalho e porque as imagens da linha de montagem ficam bem em cartazes publicitários [citação necessária]

Infelizmente, a câmera dele quebrou, então ele gostaria que você desenhasse uma simulação de como seria a linha de montagem!

Para manter a linha de montagem funcionando com a máxima eficiência e reduzir o risco de erro ou falha, todas as caixas presentes têm a mesma largura para que se encaixem perfeitamente na correia transportadora.

Desafio

Dada uma lista de presentes representados por suas dimensões, produza uma correia transportadora com todos os presentes.

Um presente é desenhado assim:

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

Esse presente possui largura 1, altura 2 e comprimento 4. Observe que os sinais de mais não contam para o comprimento lateral; portanto, um presente com comprimento 4 ocupa 6 posições.

Todos os presentes são desenhados um ao lado do outro com um espaço entre os dois caracteres mais próximos; ou seja, os cantos inferior esquerdo dos presentes são espaçados de modo que, se uma caixa atual tiver comprimento le largura w, o canto inferior esquerdo da próxima caixa atual estará exatamente na l + w + 4posição direita do canto inferior esquerdo da caixa anterior.

Depois que todas as caixas atuais são desenhadas, a correia transportadora é desenhada substituindo o espaço entre as caixas em cada uma das últimas width + 2linhas por sublinhados.

A saída final para caixas atuais com (l, w, h)de [(4, 1, 2), (8, 1, 3), (1, 1, 1)]seria:

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

Especificações de formatação

Você pode escolher entre obter uma lista de três tuplas em que um dos elementos é consistente em toda a lista (que seria a largura) ou escolher a largura atual e, em seguida, uma lista de duas tuplas representando o comprimento e altura de cada presente. Você pode receber as entradas em qualquer ordem e em qualquer formato razoável, mas os presentes devem ser exibidos na mesma ordem em que são fornecidos como entrada.

Você pode escolher qualquer formato de saída razoável para a arte ASCII (incluindo retornar de uma função).

Casos de teste

Esses casos de teste são fornecidos como [(l, w, h), ...]formato.

[(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)

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

Regras

  • As brechas padrão se aplicam
  • Isso é , então a resposta mais curta em bytes vence
  • Nenhuma resposta será aceita

Nota: Eu me inspirei para esta série de desafios da Advent Of Code . Não tenho afiliação com este site

Você pode ver uma lista de todos os desafios da série consultando a seção 'Vinculado' do primeiro desafio aqui .

HyperNeutrino
fonte
@AdmBorkBork todas as caixas presentes têm a mesma largura
Erik a Outgolfer
1
Se o carvão não destrói isso, não sei o que será.
totallyhuman
@totallyhuman, na verdade, brainf ** k vencerá este desafio: P
HyperNeutrino 4/17/17
Você pode fazer uma postagem na meta para indexar todas essas perguntas?
RamenChef 4/17/17
@RamenChef Hm good idea. Eu poderia fazer isso: P
HyperNeutrino

Respostas:

4

Carvão , 96 81 bytes

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

Experimente online! Link é a versão detalhada do código. Entrada é a largura na primeira linha, depois as outras dimensões nas linhas seguintes, terminando com uma linha em branco. Explicação:

Nθ

Insira a largura.

WS«

Passe pelas linhas restantes até que a linha em branco seja alcançada.

→FυG↗→↙⁺²θ_

Desenhe o cinto entre os presentes. A uvariável é predefinida para uma lista vazia, que, portanto, não faz nada na primeira passagem, enquanto mais tarde termina com um único elemento, fazendo com que esse código seja executado uma vez. (Usar um ifseria menos golfe.)

≔I⪪ι υ

Divida as dimensões no espaço, converta-as em número inteiro e salve-as u.

≔⊟υπ

Remova a última dimensão e salve-a p.

≔§υ⁰ρ

Copie a primeira dimensão para r, mas deixe-a upara que o cinto seja desenhado no próximo loop.

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

Apague o interior do presente, caso o cinto se sobreponha.

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

Desenhe as linhas interiores do presente.

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

Desenhe na metade do caminho para o exterior do presente e repita para a outra metade.

Neil
fonte
1

Pip , 160 154 bytes

153 bytes de código, +1 para -lsinalizador.

{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#_<|:'_}

Esta é uma função que leva uma lista de listas contendo [width height length]. Experimente online!

Quão?

Explicação de nível superior:

  • Defina uma função que retorna uma lista de linhas representando uma caixa
  • Mapeie a função para cada lista de dimensões fornecida
  • Concatene as listas resultantes de linhas por item
  • Faça um pequeno pós-processamento com substituições de regex para fazer com que os sublinhados se comportem corretamente

Deixe um comentário e eu adicionarei uma explicação mais detalhada.

DLosc
fonte
0

Python 2 , 508 bytes

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('_')

Experimente online!

Faz uma lista de listas de [height, width, length]

TFeld
fonte