Super Square Rain

11

La oferta de invierno de Scream ™ está activada y acabas de atrapar un intenso juego de acción minimalista, Super Square . Al jugarlo, te das cuenta de que el juego es ridículamente difícil o que eres realmente malo en eso. En particular, existe este patrón de "lluvia" que parece atraparte cada vez ...

ingrese la descripción de la imagen aquí

Frustrado, decides darte un desafío diferente: ¡Dibuja el patrón de lluvia en el arte ASCII!

Entrada

La entrada es un único entero positivo que indica el tamaño del patrón n, dado a través de STDIN o argumento de función.

Salida

La salida es el patrón de lluvia en el tamaño especificado, devuelto como una cadena o impreso a través de STDOUT. Los espacios en blanco iniciales o finales antes o después de toda la imagen están bien. Además, la imagen no necesita estar al ras de la izquierda de la pantalla, sino que debe ser claramente discernible.

Aquí está n = 10:

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

Aquí está n = 5:

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

Y finalmente, aquí está n = 1(solo las dos paredes más internas):

 - 

 - 

Construcción (para mayor claridad)

El área de juego se divide en dos pares de cuadrantes de la siguiente manera:

 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

Los cuadrantes superior / inferior deben alternar entre paredes horizontales representadas por guiones -y espacios sombreados con puntos .. Los cuadrantes izquierdo / derecho deben alternar entre espacios y paredes verticales representados por tuberías |. Las diagonales principales están vacías y siempre deben llenarse con espacios.

El patrón de lluvia del tamaño ntiene 2nparedes, con paredes de los cuadrantes superior / inferior más cercanas al centro y paredes alternando entre cuadrantes a medida que nos alejamos del centro.

Puntuación

Este es el código golf, por lo que gana el código en la menor cantidad de bytes.

Sp3000
fuente
44
Este juego ... Sé de lo que estás hablando. Me robó como 40 horas de mi vida hasta que lo vencí. ^^
ThreeFx

Respuestas:

3

CJam, 93 87 78 61 59 bytes

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

Toma valor a ntravés de STDIN

Pocos ejemplos:

1
 - 

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

Esto se puede jugar mucho, lo que haré mañana a primera hora.

Pruébalo en línea aquí

Optimizador
fuente
5

Haskell 150 bytes

Me doy cuenta de que no va a ganar, solo quería publicar mi primer 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)

Úselo cargando en GHCi y llamando a q ndónde nestá el tamaño.

Algunos ejemplos:

*Main> q 1
 - 

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

Alguien probablemente pueda hacerlo mejor, soy bastante nuevo en Haskell.

Joseph Young
fuente
66
No te preocupes por ganar. ;) Ganar es para CJam y Pyth. Jugar al golf en otros idiomas consiste en superar las presentaciones en la misma "clase de peso" y aprender algunas nuevas características oscuras de su idioma. Bienvenido a 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" es una función de utilidad que escribe "b" rodeada de "a" reflejada, con un delimitador opcional (sí, los parámetros lambda pueden tener valores predeterminados). "f" es recursivo, generando lados y partes intermedias para cada nivel "g" es la función lluvia, que se puede llamar con un entero para devolver el texto solicitado.

swstephe
fuente
Me acabo de dar cuenta de que olvidé permitir funciones que devuelven cadenas, lo que generalmente permito (lo he editado). Todavía puede ahorrar en algunos caracteres eliminando espacios en blanco y colocando las líneas 4, 5 en una línea :)
Sp3000
Con un poco de evaluación de cortocircuito, puede bajar esto a 190 :) enlace
Sp3000
Lo siento, te voté por accidente. Puedo cancelarlo si editas.
nutki
1

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

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

Toma el parámetro en la entrada (se requiere el carácter de fin de línea para la función adecuada):

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

Sin golf:

                         # 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
fuente