StreetView 3D de arte ASCII


29

Entrada:

  1. Você obtém uma série de números inteiros (alimentados via stdin ou prompt).
  2. Cada par de números inteiros nesta série representa a LARGURA de um edifício [intervalo válido: 1..10] e HEIGHT [intervalo válido: 0..10]
  3. Suponha que a entrada seja bem formada.

Entrada de amostra (a segunda linha é apenas para fins de demonstração):

1 2 1 1 1 0 2 4 1 3 1 2 2 1
WHWHWHWHWHWHWH

Resultado da amostra correspondente:

                 ______
               / ______ / |
              | | | __
              | | / __ / |
     __ | | | __
   / __ / | | | | / __ / |  
  | | | __ | | | | | ______
  | | / __ / | | | | | / ______ / |
  | | | | _ | | | | | |
  | _o_ | _o_ | / __ | _o _____ | _o_ | _o_ | _o _____ | /
  -------------------------------------  
 - - - - - - - - - - - - - 
-------------------------------------

Regras:

Os prédios

  1. Um bloco de construção básico tem esta aparência (1 W, 1H)
   __
 / __ / | (o cubo base é emprestado do que está nesta pergunta:
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. Nossa visão é (ahum) ~ 3D para que edifícios vizinhos possam esconder partes de outros. Os edifícios são 'logicamente' renderizados da esquerda para a direita.

  2. O primeiro edifício é precedido por dois espaços à esquerda.

  3. Você renderiza todas as construções aplicando WIDTH e HEIGHT nas dimensões do cubo base (veja a saída de amostra fornecida!). Para referência: número de caracteres da esquerda para a direita 'parede' (para um edifício com W> 1): (W * 5) - (W-1).

  4. Edifícios com Altura> 0 têm UMA porta (que é representada pelo personagem oe está localizada a dois caracteres da parede 'esquerda' na linha 'inferior').

A estrada:

  1. A estrada é composta por três partes que chamaremos de 'superior', 'central' e 'inferior'.
  2. A parte 'superior' e a parte 'inferior' são idênticas, exceto pelo fato de que a parte 'superior' é precedida por dois espaços.
  3. A parte do meio é precedida por um espaço e consiste em uma repetição do seguinte padrão:
    '-'
  4. O comprimento deve ser determinado pela largura total dos edifícios combinados: a parte mais à direita da estrada corresponde à posição da parede "direita" do "último" edifício.

Vencedores:

Isso é código-golfe! O vencedor é o competidor qualificado com a solução mais curta (por contagem de código-fonte). A origem deve consistir apenas em caracteres ASCII imprimíveis. Diverta-se!

Pontos de bônus imaginários para janelas (aleatórias), carros ou pedestres.

Sinta-se livre para comentar se as especificações não estiverem claras!


@ usuário desconhecido: houve de fato um pequeno erro de digitação nas regras. Deve ser corrigido agora, obrigado!
ChristopheD

Espaço em branco à direita permitido? Você parece ter alguns no exemplo, então suponho que sim.
22413 Peter Peter

@ Peter Taylor: espaço em branco à direita é permitido.
ChristopheD

Estrada parte 3, deve ser '-  '(com dois espaços)? Edit : Ah, os dois espaços não aparecem: P. Você pode exibir vários espaços usando o ASCII 255 (espaço sem quebra, ALT + 255 no numpad) ou copiando e colando do meu comentário aqui. Orr ... você em vez poderia apenas dizer que é uma repetição de ' - ':)
mellamokb

Parece que o intervalo válido de altura é realmente [ 0 ..10]. Também o que você quer dizer com but you must not enforce this3)? Na IMO, qualquer suposição está disponível para ser explorada se aumentar sua pontuação. Portanto, posso escrever um código que funcione se a largura total for menor que 80 se puder extrair uma contagem menor de caracteres. Por exemplo, gravando a saída em uma matriz de buffer de exibição com uma largura de 80, para travar em qualquer largura total mais alta. Se você deseja que qualquer largura seja suportada, não dê a hipótese - você não pode ter os dois: P
mellamokb

Respostas:


10

Haskell, 396 caracteres

w&h=take h((3," /|"++(w-3)#'_'++"o_|"):c[(3,"| |"++(w-1)#s++"|")])++[(2,"|/ "++(w-2)#'_'++"/"),(0,"  "++(w-2)#'_')]++c[(0,w#s)]
p(w,h)=r.z take[sum w+k|k<-[1..]]$([c"-",s:c"-  ","  "++c"-"]++).map r.foldl(z(%))((2+maximum h)#(5#s))$z(&)w h
main=interact$unlines.p.q.map read.words;y%(d,x)=x++drop d y;q(x:y:z)=(4*x:a,2*y:b)where(a,b)=q z
q x=(x,x);(#)=replicate;c=cycle;r=reverse;z=zipWith;s=' '

Exemplo de saída:

$ runghc Streetview.hs <<< "1 1 1 3 1 2 1 0 2 4 2 2 1 3 3 1"
                     ______                          
                   /______ /|                        
         __       |       | |        __              
       /__ /|     |       | |      /__ /|            
      |   | |__   |       | |_____|   | |            
      |   |/__ /| |       |/______|   | |            
     _|   |   | | |       |       |   | |__________  
   /__|   |   | | |       |       |   |/__________ /|
  |   |   |   | |_|       |       |   |           | |
  |_o_|_o_|_o_|/__|_o_____|_o_____|_o_|_o_________|/
  -------------------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------------------

5
+1 Seus envios recentes de haskell no codegolf.se despertaram um interesse em mim por aprender um pouco mais sobre o haskell. Por mais curtas que sejam as soluções, elas ainda permanecem imho 'legíveis'.
ChristopheD

8

Python, 415 caracteres

I=eval(raw_input().replace(' ',','))
X=I[::2]
Y=I[1::2]
W=4*sum(X)+6
H=2*max(Y)+2
A=W*H*[' ']
p=W*H-W+2
for w,h in zip(X,Y):i=2*h;j=4*w;q=p-i*W;r=p+j;s=q+j;A[p+1:q+1:-W]=A[p+2:q+2:-W]=i*' ';A[p:q:-W]=A[r:s:-W]=A[r+2-W:s+2-W:-W]=i*'|';A[p+1:r]='_'*(j-1);A[q+2:s]=A[q+3-W:s+1-W]='_'*(j-2);A[q+1]=A[s+1]=A[r+1]='/';A[p+2]='_o'[h>0]; p+=j
A[W-1::W]='\n'*H
D=(W-5)*'-'
print''.join(A)+'  '+D+'\n'+(' - '*W)[:W-4]+'\n'+D

Usa fatias para desenhar todas as partes do edifício.

$ echo "1 2 1 1 1 0 2 4 1 3 1 5 2 1" | ./streetview.py 
                             __          
                           /__ /|        
                 ______   |   | |        
               /______ /| |   | |        
              |       | |_|   | |        
              |       |/__|   | |        
     __       |       |   |   | |        
   /__ /|     |       |   |   | |        
  |   | |__   |       |   |   | |______  
  |   |/__ /| |       |   |   |/______ /|
  |   |   | |_|       |   |   |       | |
  |_o_|_o_|/__|_o_____|_o_|_o_|_o_____|/ 
  -------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------

+1 Muito bom. A solução parece muito já golfed ;-)
ChristopheD

2
Há um espaço perdido em `p + = j` (@ no final da linha longa). Não tenho certeza se você contou que um ;-)
ChristopheD
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.