La casa de santa claus

16

La casa de santa claus

Nota: Este es el primer desafío que he intentado establecer. Ha pasado por el Sandbox, sin embargo, si encuentras algo mal en él, no solo desestimes, sino que dejas un comentario para que pueda mejorarlo.

Antecedentes

Hay un viejo rompecabezas para niños donde el desafío es dibujar una caja con un techo y una cruz en el medio sin levantar el bolígrafo del papel o pasar dos veces por cualquier línea.

En Alemania se le conoce como "das Haus des Nikolaus" o "La casa de Santa Claus". Sinceramente, no puedo recordar cómo solíamos llamarlo. Para cualquiera que no esté familiarizado con el rompecabezas, hay disponibles todos los detalles aquí .

Aquí hay una representación de arte ASCII de la casa.

 /\
/__\
|\/|
|/\|
----

Desafío

Escriba un programa o función para dibujar la Casa de Santa Claus en el idioma que elija.

¿Suena demasiado fácil? Bueno, aquí está el truco. También debe generar cada etapa del dibujo y cumplir con las reglas del rompecabezas. No se requiere que su programa tome ninguna entrada. La casa terminada debe verse exactamente como se muestra arriba.

Según el sitio anterior, hay 44 posibles soluciones. Puedes usar cualquiera de ellos. Este es un desafío de arte ASCII, por lo que no es necesario que calcules la solución, sino solo que la dibujes.

Salida

A continuación se muestra un ejemplo de la salida requerida de una de las 44 soluciones:

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

 /\
/__\
|\
| \
----

 /\
/__\
|\/
|/\
----

 /\
/__\
|\/|
|/\|
----

Reglas

  • He agregado 1 nueva línea adicional entre cada salida esperada para tratar de aclarar los requisitos. Esto es opcional Se permite cualquier número de líneas en blanco entre cada salida.
  • Su salida debe consistir solo en los caracteres /, \, -, _ y espacio como se muestra arriba. Se permiten espacios finales.
  • Cada línea en su dibujo debe continuar desde el final de la línea anterior y no puede repetir ninguna línea.
  • Lagunas estándar prohibidas.
  • No es necesario que muestres la rima mencionada en el enlace anterior.
  • Este es el código de golf, por lo que la respuesta más corta en bytes será la ganadora.

Resultado

Algunas buenas respuestas y gracias y respeto a todos los que publicaron. Dije el recuento de bytes más bajo, pero he marcado como respuesta principal no solo por eso, sino también por la gran explicación del código. Buena @ Dennis.

ElPedro
fuente
Esto podría haber pasado algún tiempo en la caja de arena . Intente agregar un parámetro para el tamaño de la casa, o el número de casas concatenadas (o ambas). Me resulta demasiado fácil como es. También es posible que desee agregar la rima a su salida de ejemplo, o no mencionarla en absoluto. Me parece lindo este gif , o este .
Tito
44
@Titus Gracias por los comentarios. Mi intención no era crear un desafío particularmente difícil, sino crear uno que sea bastante fácil de hacer y así alentar a tantas personas como sea posible a proponer soluciones. Tomaré sus sugerencias a bordo para mi próximo intento.
ElPedro
1
Mi culpa; Esperaba cosas demasiado complejas para el arte ascii. :) Pero todavía me gustan los gifs.
Titus
Los gifs son geniales y también me gusta la idea de incluir la rima también en una elección de idioma :)
ElPedro

Respuestas:

10

Jalea , 40 39 36 bytes

“ḥ%DtƊVḍI’ḃ9W;“|_/-\/\|‘Ė¤y@\FỌ»⁶s4Y

Pruébalo en línea!

Cómo funciona

“ḥ%DtƊVḍI’

es un literal biyectivo base-250; cada carácter corresponde a su punto de código en la página de códigos de Jelly . El resultado es el número entero 13192938935880491074 .

          ḃ9

convierte el entero generado en la base biyectiva 9, produciendo la matriz de enteros
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Los enteros corresponden al orden del trazo, con la excepción de 9 , que indica un espacio.

            W

envuelve la matriz generada en una matriz singleton, que se requerirá para anteponerla a la matriz que generaremos ahora.

              “|_/-\/\|‘Ė¤

Funciona de la siguiente manera. ¤combina los dos enlaces a la izquierda en una cadena niládica. El primero, “|_/-\/\|‘produce los puntos de código de los caracteres especificados, produciendo [124, 95, 47, 45, 92, 47, 92, 124] . Luego, Ėenumera los puntos de código, obteniendo
[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . El par [n, c] medios que el n º carrera será el carácter ASCII con punto de código c .

             ;

concatena las matrices generadas. El resultado es la matriz
[[9,6,7,9,6,2,2,7,1,5,3,8,1,3,5,8,4,4,4,4], [1,124 ], [2,95], [3,47], [4,45], [5,92], [6,47], [7,92], [8,124]] .

                          y@\

realiza una reducción acumulativa (es decir, que muestra todos los pasos intermedios), utilizando la transliteración ( y) con argumentos intercambiados ( @). En el primer paso, por ejemplo, reemplazamos cada 1 en la matriz original con 124 , que es el punto de código del carácter | .

                             FỌ

aplana el resultado y reemplaza todos los puntos de código con los caracteres ASCII correspondientes. En todos los pasos, esto generará algunos caracteres no imprimibles con los puntos de código 1 a 9 .

                               »⁶

toma el máximo en cuanto a caracteres con el carácter de espacio, reemplazando todos los caracteres no imprimibles con espacios.

                                 s4Y

divide la cadena generada en trozos de longitud cuatro y los une con un salto de línea como separador.

Dennis
fuente
2
Guau. Simplemente simplemente guau. +1
ElPedro
Pero espera, ¿esos son bytes?
Leif Willerts
1
@LeifWillerts Sí. Para evitar caracteres no imprimibles, Jelly utiliza una página de códigos personalizada que codifica los 256 caracteres que entiende como un solo byte cada uno. El enlace de bytes en el encabezado apunta a él.
Dennis
Perdón por no darse cuenta de hacer clic en ese enlace: D
Leif Willerts
Gana tanto por la explicación como cualquier otra cosa. El respeto.
ElPedro
13

Javascript (ES6), 119 116 96 92 91 bytes

for(i=8;i--;)console.log(`834
3554
2610
2160
7777`.replace(/./g,c=>'|/|/\\_\\- '[c<i?8:c]))

Arnauld
fuente
Buena respuesta. Tenía la sensación de que Javascript estaría allí o por ahí :-)
ElPedro
Perdón por las ediciones múltiples. No debería publicar antes del segundo café.
Arnauld
Las ediciones múltiples son buenas. Es bueno ver que el conteo de bytes baja.
ElPedro
¿Hay algún punto en tener dos copias idénticas del código en su respuesta?
Neil
@Neil: conservaré solo uno hasta que encuentre una buena razón para tener dos. ^^
Arnauld
9

Lotes, 356 344 341 337 bytes

@set s=@set "
%s%g=@goto 1
%s%r=
%s%c=
%s%u=|
%s%l=|
%s%f=
@for /l %%i in (1,1,7)do @call:%%i
%s%u=|\/|
%s%l=|/\|
%g%
:7
%s%u=|\/
%s%l=|/\
%g%
:6
%s%f=----
%g%
:5
%s%u=|\
%s%l=| \
%g%
:4
%s%c=/__\
%g%
:3
%s%r= /\
%s%c=/  \
%g%
:2
%s%r= /
%s%c=/
:1
@for %%l in ("%r%" "%c%" "%u%" "%l%" "%f%")do @echo(%%~l

|Reglas |de citas estúpidas por lotes ... si desea un en una variable, debe citarlo con tres ^s, por lo que es más barato usarlo @y sustituirlo en la salida, aunque para lograr esto tengo que comenzar con la pared izquierda. La línea uno tiene un espacio final. echo(se utiliza debido a que el r, cy fvariables podrían estar vacío y no queremosECHO is off. imprimir.

Editar: guardado 12 bytes mediante el uso de fallthrough para la última parte. Guarde 3 bytes usando un forbucle para imprimir cada parte, esto significa que ahora uso |s en mis variables, lo que hace que el código sea un poco más fácil de leer. Guardado 4 bytes mediante el uso de @caracteres explícitos en lugar de @echo off. Creo que comenzar con la pared izquierda todavía requiere la menor cantidad de bytes.

Neil
fuente
2
Puede que no sea el más corto, pero recibe un voto positivo de mi parte por lograr hacerlo en Batch +1
ElPedro
echo:es más estándar pero echo(parece que estás abusando de una función de idioma, por lo que +1.
wizzwizz4
@ wizzwizz4 echo:falla en algunos casos extremos oscuros, pero no conozco ningún caso de falla para echo(.
Neil
@ wizzwizz4 Si tiene un archivo foo.baten el directorio actual, echo(\..\foo.batechos \..\foo.batpero se echo:\..\foo.batejecuta foo.bat.
Neil
@Neil ¿Sabes por qué es eso? Parece echo:.\foo.batque tendría ese efecto en su lugar. ¿Se debe a una falla en la pila del directorio, donde el "ARRIBA" del directorio raíz es el directorio actual?
wizzwizz4
7

C, 118 bytes

main(){char *p,n;for(n='B';n++<'J';)for(p="ZFEAFDDEAGCHIAGHCIABBBBAA";*p;p++)putchar(" \n-\\_\\/|/|"[(*p<n)**p&15]);}
Martin Rosenau
fuente
¡Impresionante! Buena primera respuesta, y bienvenido al sitio!
DJMcMayhem
1
Para guardar 3 bytes: char*p(sin espacio) y cambiar 'B'y 'J'sus códigos ASCII.
Level River St
Gracias por la respuesta. No esperaba que C siquiera compita. Esto es realmente impresionante y vale la pena un +1
ElPedro
6

/// , 112 bytes

/!/\/\///*/----
 !@/\\\\!$/ @@!^/
*@\/@@
@\/__@@
/*@
 $
*__
$
 $
*$
 __@
$
 $^$
 $^|@
|$^|@\/
|\/@^|@\/|
|\/@|
*

Pruébalo en línea!

Erik el Outgolfer
fuente
No entiendo un solo byte del 112, pero lo probé en línea y hace exactamente lo que dice en la lata, así que +1
ElPedro
1
@ElPedro Intente hacer clic en el enlace en el encabezado, es posible que entienda el concepto, pero, si no, contácteme. Quiero que cada vez más personas puedan entender un idioma y, si no lo haces, es un hecho triste. Sé que no puedo hacer que todos entiendan /// (algunas personas solo quieren comida y agua, /// y PPCG están muy lejos de eso, aunque no es imposible).
Erik the Outgolfer
Gracias. ¡Hay tantos idiomas para aprender! Definitivamente voy a echar un vistazo. Todavía estoy jugando golf en Python y Lotus Formula, pero me estoy metiendo más. Más idiomas es más divertido. Gracias de nuevo por su contribución :)
ElPedro
2

PHP, 98 95 bytes

inspirado por solución de Arnauld

for($i=8;$i--;)for($p=24;$p--;)echo"|/|/\\_\\- 
"[($c="977779061290162945539438"[$p])<$i?8:$c];

Nota: La primera línea de código tiene un espacio final.

Titus
fuente
Una buena @Titus. Se permiten espacios finales.
ElPedro
@ElPedro: solo conozco a algunas personas que han configurado sus editores para recortarlas automáticamente; Por eso lo mencioné.
Tito
1

PHP con GD, 348 338 bytes (no compite)

no exactamente lo que se pedía, pero ...

function f($v,$w){global$x,$y,$i;imageline($i,$x,$y,$x=$v,$y=$w,1);ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';}$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

guardar en archivo, llamar en un navegador

Descompostura

function f($v,$w)
{
    global$x,$y,$i;
    imageline($i,$x,$y,$x=$v,$y=$w,1);      // draw line, set end coords as new start coords
    ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();           // get image output
    echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';    // print <img> tag
}
// calculate dimensions, create image, allocate background color (foreground implicitly black)
$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);
// paint lines: implicit `$x=0`
f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

Para dibujar una casa más grande, cambie $w=9al ancho deseado.

Titus
fuente
Y le doy a este un +1 también. Aunque no aborda el desafío directo, cubre las mejoras sugeridas y se ve muy bien :)
ElPedro