Chuva super quadrada

11

A venda de inverno do Scream ™ está ativada e você acabou de se divertir com um intenso jogo de ação minimalista, o Super Square . Ao jogá-lo, você percebe que o jogo é ridiculamente difícil ou você é muito ruim nisso. Em particular, há esse padrão de "chuva" que parece te pegar toda vez ...

insira a descrição da imagem aqui

Frustrado, você decide se desafiar: desenhe o padrão de chuva na arte ASCII!

Entrada

A entrada é um número inteiro positivo único, indicando o tamanho do padrão n, fornecido via STDIN ou argumento de função.

Resultado

Saída é o padrão de chuva no tamanho especificado, retornado como uma sequência ou impresso via STDOUT. Os espaços em branco à esquerda ou à direita antes ou depois de toda a imagem estão corretos. Além disso, a imagem não precisa estar nivelada à esquerda da tela, mas deve ser claramente discernível.

Aqui está n = 10:

 ...................
| ----------------- |
|  ...............  |
| | ------------- | |
| |  ...........  | |
| | | --------- | | |
| | |  .......  | | |
| | | | ----- | | | |
| | | |  ...  | | | |
| | | | | - | | | | |
| | | | |   | | | | |
| | | | | - | | | | |
| | | |  ...  | | | |
| | | | ----- | | | |
| | |  .......  | | |
| | | --------- | | |
| |  ...........  | |
| | ------------- | |
|  ...............  |
| ----------------- |
 ...................

Aqui está n = 5:

 --------- 
  .......  
 | ----- | 
 |  ...  | 
 | | - | | 
 | |   | | 
 | | - | | 
 |  ...  | 
 | ----- | 
  .......  
 --------- 

E finalmente, aqui está n = 1(apenas as duas paredes mais internas):

 - 

 - 

Construção (para maior clareza)

A área de jogo é dividida em dois pares de quadrantes da seguinte forma:

 AAAAAAAAA
B AAAAAAA B
BB AAAAA BB
BBB AAA BBB
BBBB A BBBB
BBBBB BBBBB
BBBB A BBBB
BBB AAA BBB
BB AAAAA BB
B AAAAAAA B
 AAAAAAAAA

Os quadrantes superior / inferior devem alternar entre paredes horizontais representadas por hífens -e espaços sombreados com pontos .. Os quadrantes esquerdo / direito devem alternar entre espaços e paredes verticais representadas por tubos |. As diagonais principais estão vazias e sempre devem ser preenchidas com espaços.

O padrão de tamanho das chuvas ntem 2nparedes, com paredes dos quadrantes superior / inferior mais próximos do centro e paredes alternando entre os quadrantes à medida que nos afastamos do centro.

Pontuação

Isso é código-golfe, então o código com o menor número de bytes vence.

Sp3000
fonte
4
Este jogo ... Eu sei do que você está falando. Roubou cerca de 40 horas da minha vida até eu vencê-lo. ^^
ThreeFx

Respostas:

3

CJam, 93 87 78 61 59 bytes

ri:K_+){K" |"*KKI-z:I-I2%:L+<SL>\+_W%L'-'.?I2*Ig-*@I0=>N}fI

Adquire valor nvia STDIN

Poucos exemplos:

1
 - 

 - 
2
 ... 
| - |
|   |
| - |
 ... 
5
 --------- 
  .......  
 | ----- | 
 |  ...  | 
 | | - | | 
 | |   | | 
 | | - | | 
 |  ...  | 
 | ----- | 
  .......  
 --------- 
10
 ................... 
| ----------------- |
|  ...............  |
| | ------------- | |
| |  ...........  | |
| | | --------- | | |
| | |  .......  | | |
| | | | ----- | | | |
| | | |  ...  | | | |
| | | | | - | | | | |
| | | | |   | | | | |
| | | | | - | | | | |
| | | |  ...  | | | |
| | | | ----- | | | |
| | |  .......  | | |
| | | --------- | | |
| |  ...........  | |
| | ------------- | |
|  ...............  |
| ----------------- |
 ................... 

Isso pode ser muito praticado, o que farei amanhã.

Experimente online aqui

Optimizer
fonte
5

Haskell 150 bytes

Sei que não vai ganhar, só queria postar meu primeiro codegolf: D

q n=putStr$unlines$iterate(\l->let[a,b]=if l!!0!!1=='-'then"|."else" -";c=[a:s++[a]|s<-l];t=' ':[b|x<-l!!0]++" "in t:c++[t])[" - ","   "," - "]!!(n-1)

Use carregando no GHCi e ligando para q nonde nestá o tamanho.

Alguns exemplos:

*Main> q 1
 - 

 - 
*Main> q 2
 ... 
| - |
|   |
| - |
 ... 
*Main> q 5
 --------- 
  .......  
 | ----- | 
 |  ...  | 
 | | - | | 
 | |   | | 
 | | - | | 
 |  ...  | 
 | ----- | 
  .......  
 --------- 
*Main> q 10
 ................... 
| ----------------- |
|  ...............  |
| | ------------- | |
| |  ...........  | |
| | | --------- | | |
| | |  .......  | | |
| | | | ----- | | | |
| | | |  ...  | | | |
| | | | | - | | | | |
| | | | |   | | | | |
| | | | | - | | | | |
| | | |  ...  | | | |
| | | | ----- | | | |
| | |  .......  | | |
| | | --------- | | |
| |  ...........  | |
| | ------------- | |
|  ...............  |
| ----------------- |
 ................... 

Alguém provavelmente pode fazer melhor, eu sou bastante novo em Haskell.

Joseph Young
fonte
6
Não se preocupe em ganhar. ;) Ganhar é para CJam e Pyth. Jogar golfe em outros idiomas é derrotar os envios na mesma "classe de peso" e aprender alguns novos recursos obscuros do seu idioma. Bem-vindo ao PPCG!
Martin Ender
3

Python, 204 , 198 , 191 bytes

r=lambda a,b,d=' ':d.join((a,b,a[::-1]))
def f(s,i,n):d=[r(s[:i],'.-'[(n-i)%2]*((n-i)*2-1))];return i==n and[r(s,' '*(2*(i%2)+1),'')]or d+f(s,i+1,n)+d
g=lambda n:'\n'.join(f('| '*(n/2),0,n))

"r" é uma função utilitária que escreve "b" cercada por "a" refletido, com um delimitador opcional (sim, os parâmetros lambda podem ter padrões). "f" é recursivo, gerando lados e partes do meio para cada nível "g" é a função chuva, que pode ser chamada com um número inteiro para retornar o texto solicitado.

swstephe
fonte
Acabei de perceber que me esqueci de permitir funções que retornam strings, o que eu normalmente permito (editei isso em). Você ainda pode economizar em alguns caracteres, removendo espaços em branco e colocando linhas 4, 5 em uma linha :)
SP3000
Com um pouco de avaliação de curto-circuito, você pode reduzir para 190 :) link
Sp3000
Desculpe, eu te derrotei por acidente. Eu posso cancelar se você editar.
nutki
1

Perl 5: 74 bytes (código 73 + -p)

#!perl -p
s/.*/ /;$a=qw(- .)[$|--]x
s/.+/$"$&$"/g,s/^|\z/ $a 
/g,$"^="\\"for($_)x$&

Toma parâmetro na entrada (caractere de fim de linha necessário para o funcionamento adequado):

$ perl rain.pl <<<"3"
 ----- 
  ...  
 | - | 
 |   | 
 | - | 
  ...  
 ----- 

Ungolfed:

                         # Read the input line into $_ (-p)
s/.*/ /;                 # Replace the input with a space (plus the original eol), saves the parameter in $&
for(($_)x$&) {           # Iterate $& times without affecting $_
  $c=s/.+/$"$&$"/g;      # Add $" (initially space) at the start and the end of each line, stores number of lines in $c
  $a=("-",".")[$|--]x$c; # Set $a to $c times minus or dot using magic $| (which iterates over 1 and 0 on decrement)
  s/^|\z/ $a \n/g;       # Equivalent to $_=" $a \n$_ $a \n"
  $"^="\\";              # Alternate $" between space and bar using the string xor 
}
                         # Print $_ (-p)
nutki
fonte