Construa uma sala simples em arte ASCII

15

Uma sala pode ser composta de retângulos conectados, por exemplo, uma sala em forma de L. Essa sala pode ser descrita por uma lista de dimensões que descrevem o tamanho de cada retângulo.

Suponha que você tenha duas listas de entrada. O primeiro contém a largura dos retângulos empilhados verticalmente um sobre o outro. O segundo contém a altura dos retângulos.

Como exemplo, a entrada [4 6][3 2]será um retângulo de 4 por 3 no topo de um retângulo de 6 por 2. A figura abaixo mostra esta forma. Observe que as paredes são consideradas "finas", portanto, são os espaços entre a parede que são determinados pela entrada.

[4 6][3 2]
 ____
|    |
|    |
|    |_
|      |
|______|

O desafio é: Pegue uma lista de dimensões como entrada e produza a forma da sala como arte ASCII. O formato deve ser como nas figuras de exemplo:

  • Todas as paredes horizontais são mostradas usando sublinhados
  • Todas as paredes verticais são mostradas usando barras
  • Não deve haver paredes onde os retângulos estão conectados
  • A parede esquerda é reta
  • Para mais detalhes, dê uma olhada nos casos de teste

Suposições que você pode fazer:

  • Todas as dimensões estão no intervalo [1 ... 20]
    • Todas as dimensões horizontais são números pares
  • O número de retângulos estará na faixa [1 ... 10]
  • Somente entrada válida é fornecida
  • Formato de entrada opcional (você pode decidir a ordem das dimensões de entrada, especifique na resposta).

Casos de teste:

[2][1]
 __
|__|

---

[4][2]
 ____
|    |
|____|

---

[2 6 2 4][2 2 1 3]
 __
|  |
|  |___
|      |
|   ___|
|  |_
|    |
|    |
|____|

---

[2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]
 __
|  |___________
|              |
|       _______|
|      |
|      |
|      |_
|     ___|
|    |
|    |_____________
|   _______________|
|  |______
|     ____|
|    |
|   _|
|__|
Stewie Griffin
fonte
Você pode decidir a ordem das dimensões de entrada , isso significa que podemos trocar linhas e colunas e revertê-las? Assim: seu exemplo de formato de entrada: [2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]-> (swap e reverse) -> meu formato de entrada:[1 2 1 1 1 2 1 3 2 1][2 4 10 2 18 4 8 6 14 2]
daavko 19/16
Sim, isso é ok :-).
Stewie Griffin
Obrigado. Acabou que provavelmente não preciso revertê-los, apenas trocar.
Daavko 19/03/16

Respostas:

1

Retina, 169 150 113 bytes

A contagem de bytes assume a codificação ISO 8859-1.

\ d +
$ *
{+ r`1 (1 * ¶ [^ |] * (1+))
US $ 1,00 | US $ 2 |
} `(*. *) 1+
$ 1
1
_
(\ | _ +) \ | (? = ¶ \ 1 _ (_ +))
$ 1 | $ 2
T`w` `(\ | _ +) _? (? = _ * \ |. * ¶ \ 1)
^ ¶
 

O código contém um espaço à direita em uma nova linha à direita.

Formato de entrada:

Altura (separada por espaços)
Largura (também separada por espaços)

Por exemplo:

1 2 3 1 2 1 1 1 2 1
2 14 6 8 4 18 2 10 4 2

Experimente online!

daavko
fonte
4

JavaScript (ES6) 174

A única parte crítica é a fileira horizontal que une 2 partes de larguras diferentes, com a barra vertical no lado direito que pode estar no meio ou na extremidade direita.

(p,h,q=-1,R=(n,s=' ')=>s.repeat(n))=>[...p,0].map((x,i)=>(x>q?p=x:(p=q,q=x),(~q?`
|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')+R(p+~q+!x,'_')+R(x<p,'|')+R(h[i]-1,`
|${R(q=x)}|`))).join``

TESTE

f=(p,h,q=-1,R=(n,s=' ')=>s.repeat(n))=>[...p,0].map((x,i)=>(x>q?p=x:(p=q,q=x),(~q?`
|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')+R(p+~q+!x,'_')+R(x<p,'|')+R(h[i]-1,`
|${R(q=x)}|`))).join``

// Less golfed

F=(p,h, q=-1, 
   R=(n,s=' ')=>s.repeat(n)
  )=>
  [...p, 0].map((x,i)=> (
    x>q? p=x : (p=q,q=x),
    (q>=0?`\n|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')
    + R(p+~q+!x,'_') + R(x<p,'|')
    + R(h[i]-1,`\n|${R(q=x)}|`)
  )).join``

console.log=x=>O.textContent+=x+'\n'

;[  
  [[2],[1]],
  [[4],[2]],
  [[2, 6, 2, 4],[2, 2, 1, 3]],
  [[2, 14, 6, 8, 4, 18, 2, 10, 4, 2],[1, 2, 3, 1, 2, 1, 1, 1, 2, 1]]
].forEach(t=>{
  var w=t[0],h=t[1]
  console.log('['+w+'] ['+h+']\n'+f(w,h)+'\n')
})
<pre id=O></pre>

edc65
fonte
4

Python 3, 230 223 222 217 bytes

def f(a):b=a[0]+[0];m=' _';print('\n'.join([' '+'_'*b[0]+' ']+['|'+' '*min(b[l],b[l+1])+m[b[l+1]<1]*(b[l]>b[l+1])+m[k]*(b[l]-b[l+1]-1)+'|'+m[k]*(b[l+1]-b[l]-1)for l,i in enumerate(zip(*a))for k in[0]*(i[1]-1)+[1]]))

Obrigado a @StewieGriffin @KevinLau por sua ajuda

Resultados

>>> f([[2, 14, 6, 8, 4, 18, 2, 10, 4, 2],[1, 2, 3, 1, 2, 1, 1, 1, 2, 1]])
 __ 
|  |___________
|              |
|       _______|
|      | 
|      | 
|      |_
|     ___|
|    |             
|    |_____________
|   _______________|
|  |_______
|     _____|
|    |
|   _|
|__|
Erwan
fonte
Ponto e vírgula! Eles separam suas tarefas e o salvam de recuos indesejados! ( a=1;b=2)
CalculatorFeline
"solutoin"> solução
Matt
Indexação de string! m=' _'em vez de m=[' ','_']salvar como 5 bytes.
Value Ink
3

Ruby 191

Golfe pela primeira vez, também é meu primeiro dia com Ruby, então provavelmente não é a coisa mais elegante do mundo, mas serve?

def f(x)
a=x[0]+[0]
puts" #{'_'*a[0]} "
for i in 0..x[1].length-1
n,m=a[i,2].sort
puts"|#{' '*a[i]}|\n"*(x[1][i]-1)+'|'+' '*n+(a[i+1]<1?'_':m>a[i]?'|':' ')+'_'*(m-n-1)+(n<a[i]?'|':'')
end
end
Value Ink
fonte