Me quiero panal

39

Escriba el programa más corto que imprima esta sección de arte ASCII de un mosaico hexagonal o panal :

       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
  • No se debe tomar ninguna entrada.
  • Salida a stdout o la alternativa más cercana a su idioma.
  • En lugar de un programa, puede escribir una función con nombre que no tome parámetros e imprima el resultado normalmente o lo devuelva como una cadena.
  • La salida puede tener cualquier número de nuevas líneas iniciales y / o finales y cada línea en la salida puede tener cualquier número de espacios iniciales y / o finales (siempre que el patrón se alinee correctamente).
  • El código más corto en bytes gana.
Pasatiempos de Calvin
fuente
13
¿Juegas mucho a Catan?
user3490
@ user3490 De hecho, lo hago ^^
Calvin's Hobbies
2
La próxima semana en PCG: ¿escribir un generador de placa Catan?
user3490
77
Debería tener una entrada IMO, en su caso debería ser 3.
user3819867
3
@ user3819867 Lo consideré pero preferí esto. Es demasiado tarde para cambiar, pero no demasiado tarde para que alguien haga un desafío relacionado.
Hobbies de Calvin

Respuestas:

33

CJam, 45 43 42 41 40 bytes

741e8 36+Ab"\__/  "38*21/.{G2$-<\S*.e<N}

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

"\__/  "38*21/

repite el patrón \__/ 38 veces y lo divide en trozos de longitud 21 . Si los fragmentos se separaran por saltos de línea, este sería el resultado:

\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  

Esto contiene claramente el panal deseado. Todo lo que queda por hacer es reemplazar algunos caracteres con espacios, cortar algunos otros e introducir los avances de línea.

741e8 36+Ab

genera el entero 74 100 000 036 y lo convierte en la matriz [7 4 1 0 0 0 0 0 0 3 6] . Cada elemento de la matriz codifica el número de caracteres iniciales de la línea correspondiente que deben reemplazarse con espacios. Al restar este número de 16 , también obtenemos la longitud correcta para esta línea.

.{            } e# Execute for each pair of a digit D and a line L:
  G2$-<         e#   Chop off L after 16 - D characters.
       \S*      e#   Push a string of D spaces.
          .e<   e#   Compute the vectorized minimum.
             N  e#   Push a linefeed.

Dado que un espacio tiene un punto de código más bajo que los otros caracteres de L y los operadores vectorizados dejan intactos los caracteres de la cadena más larga que no corresponden a uno de los más cortos, .e<reemplaza los primeros caracteres D con espacios.

Dennis
fuente
2
Esto es brillante. Buen trabajo.
Alex A.
28

Pitón 2, 73

i=0
exec"k=max(7-i,i-24,0);print' '*k+('\__/  '*9)[i:][k:16-k];i+=3;"*11

Véalo correr.

Para cada una de las 11 filas de salida, calcula el número de espacios iniciales kcomo un máximo de tres funciones lineales que forman la envoltura del lado izquierdo del hexágono. Debido a que las líneas diagonales tienen pendiente 3y -3, es mejor indexar el número de fila como i=0,3,...30.

Para crear la malla hexagonal, primero colocamos suficientes mosaicos de la unidad '\__/ '. Luego, al [i:]cambiarlo, se realinea por 3 para filas impares. Finalmente, tomamos la porción necesaria [k:16-k], dejando un margen de kizquierda y derecha.

xnor
fuente
22

CJam, 65 56 55 bytes

"Ý6TNð*¯5"303b4b["/\_")"_ "4*S]f=sB/z{_W%"\/"_W%erN}/

Pruébelo en línea en el intérprete de CJam .

Idea

La mitad derecha de cada línea es una copia invertida de la mitad izquierda con barras y barras invertidas intercambiadas. Por lo tanto, es suficiente codificar la mitad izquierda del panal:

       _
    __/ 
 __/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
   \__/ 
      \_

En lugar de analizar este patrón línea por línea, podemos analizarlo columna por columna:

   /\/\/\  
  _ _ _ _  
  _ _ _ _  
  /\/\/\/\ 
 _ _ _ _ _ 
 _ _ _ _ _ 
 /\/\/\/\/\
_ _ _ _ _ _

Surgen patrones obvios:

  • La cadena se _ _ _ _produce cinco veces.
  • Cada /es seguido por un \.

Mediante la sustitución de cada /\, _, _ _ _ _y el espacio con un número de 0 a 3, podemos convertir la matriz resultante de un número de base 4 a una base superior y almacenar el patrón completo de una manera compacta.

Código

"Ý6TNð*¯5"303b4b  e# Convert the string from base 303 to base 4.
["/\_")"_ "4*S]f= e# Replace each resulting digit by the corresponding item of the array
                  e# ["/\" "_" "_ _ _ _ " " "].
sB/               e# Split into strings of length 11.
z                 e# Zip: transpose rows with columns.
{             }/  e# For each string:
 _W%              e#     Push a reversed copy.
    "\/"_W%er     e#     Swap slashes and backslashes.
             N    e#     Push a linefeed.
Dennis
fuente
10

C, 148 144 140 bytes

k,r,c,d,p;f(){for(;k<187;k++){r=k/17;c=k%17;d=c+r%2*3;p=3*r+c-7<33u&3*r-c+8<33u;putchar(c==16?10:p&(d+5)%6<2?95:p&d%6==3?47:!p|d%6?32:92);}}

Con espacios en blanco, sin advertencias del compilador, y antes de algunos ajustes de código para guardar algunos bytes:

#include <stdio.h>

int k, r, c, d, p;

void f() {
    for ( ; k < 187; k++) {
        r = k / 17;
        c = k % 17;
        d = c + 3 * (r % 2);
        p = 3 * r + c - 7 < 33u && 3 * r - c + 8 < 33u;
        putchar(
            c == 16 ? 10 :
            p && (d + 5) % 6 < 2 ? 95 :
            p && d % 6 == 3 ? 47 :
            p && d % 6 == 0 ? 92 :
            32);
    }
}

Este enfoque no utiliza ninguna tabla de caracteres / cadenas. Se repite en todos los 187 (11 filas, 17 columnas, incluidas las nuevas líneas), y decide qué carácter imprimir para cada posición, en función de una combinación de condiciones.

Las condiciones incluyen una prueba de estar dentro / fuera de las 4 esquinas, utilizando 4 ecuaciones de línea, con el resultado almacenado en variable p. El resto se repite principalmente cada 6 caracteres, con las filas impares desplazadas por 3 caracteres en relación con las filas pares.

Reto Koradi
fuente
2
Para el golfista, puede usar implícita-int y soltar el int .
luser droog
Algunas micro mejoras:k;f(r,c,d,p){for(;k<187;putchar(c>15?10:p&d<2&p?95:p&d<3?47:!p|d-5?32:92))r=k/17,c=k++%17,d=(5+c+r%2*3)%6,p=3*r+c-7<33u&3*r-c+8<33u;}
Dennis
7

Rubí: 78 bytes

(-5..5).map{|i|puts' '*(j=[i.abs*3-i/6-9,0].max)+('/  \__'*4)[j+i%2*3,16-j*2]}

Una transcripción de la solución de xnor (69 Bytes):

11.times{|i|puts' '*(j=[7-i*=3,i-24,0].max)+('\__/  '*9)[i+j,16-j*2]}
primo
fuente
1
11.timesahorra 2 bytes
Mitch Schwartz
6

JavaScript (ES6), 129 130

Esa es una cadena pura reemplazar / reemplazar / reemplazar ... sin aprovechar ninguna propiedad geométrica.

Usando cadenas de plantillas, todas las nuevas líneas son significativas y cuentan.

Ejecute el fragmento en Firefox para probar

f=_=>`70
405
 055
9992 3051
6301`[R='replace'](/9/g,`55123
30551
`)[R](/5/g,1230)[R](/\d/g,n=>['__','/',,'\\'][n]||' '.repeat(n))

// TEST

O.innerHTML = f()
<pre id=O></pre>

edc65
fuente
6

PHP - 139 137 107 101 91 87 bytes

No sé si esta es la mejor manera de jugar golf, pero aquí está mi intento:

30 36 46 -50 bytes gracias a Ismael Miguel

Pruébelo en línea aquí

<?='       __
    __',$a='/  \__',"
 __$a$a
",$c="$a$a/  \
\__$a$a/
","$c$c   \__$a/
      \__/";

<script src="http://ideone.com/e.js/WHWEZS" type="text/javascript" ></script>

código antiguo:

<?php $a="/  \\__";$c=$a.$a."/  \\\n\__".$a.$a."/\n";echo "       __\n    __".$a."\n __".$a,$a."\n".$c,$c,$c."   \\__".$a."/\n      \\__/";
Timo
fuente
Bienvenido a Programming Puzzles y Code Golf. Su código PHP se puede reducir mucho más. Puede usar en <?lugar de <?phpguardar 3 bytes. En lugar de $c=$a.$a."/ \\\n\__".$a.$a."/\n";, puede escribir $c="$a$a/ \\\n\__.$a$a/\n";(ya que PHP expande las variables en cadenas). Puede aplicar la misma lógica al echopara reducir aún más su longitud. Además, no necesita ese espacio entre el echoy la cadena.
Ismael Miguel
1
Gracias, aprendo algo nuevo cada vez que intento jugar al golf, jeje.
Timo
De nada. Aquí hay una solución de 99 bytes: ideone.com/WHWEZS . Parece un desastre, pero es mucho más corto. En lugar de usar \n, puede poner una nueva línea real y guardar 1 byte por línea.
Ismael Miguel
Mientras tanto, lo he reducido 2 bytes. Ahora tiene 97 bytes.
Ismael Miguel
1
Aquí está una sola línea: <?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";. Recuerde reemplazar el \tcon un carácter de tabulación y \ncon una nueva línea real.
Ismael Miguel
4

Lua 146

T="       __\n    __/  \\__\n __/  \\__/  \\__\n"
S="/  \\__/  \\__/  \\\n\\__/  \\__/  \\__/\n"
B="   \\__/  \\__/\n      \\__/"
io.write(T,S,S,S,B)

(nuevas líneas agregadas para mayor claridad)

Kyle Kanos
fuente
1
¿No es este código más largo que la salida deseada porque solo contiene la salida más cosas de escape y manejo de cadenas?
Caleb
66
@Caleb: Sospecho que en realidad no has contado y solo has adivinado al hacer ese comentario. Según mi editor de texto, hay 165 caracteres en la red (se incluyen nuevas líneas). Tengo 19 caracteres menos debido a repetir Stres veces.
Kyle Kanos
2
Pero tienes razón en que los escapes y las nuevas líneas limitan la capacidad de mi código para competir en este juego en particular. Pero ganar no es por eso que hago esto, es por diversión y aprendizaje.
Kyle Kanos
3

Dart - 113

main({r:"/  \\__"}){print("       __\n    __$r\n __$r$r\n${"$r$r/  \\\n\\__$r$r/\n"*3}   \\__$r/\n      \\__/");}

Solución pura de interpolación de cuerdas, nada lujoso. Las operaciones de cadena como "subcadena" son demasiado detalladas para competir en la práctica.

Ejecútalo en DartPad .

lrn
fuente
3

Javascript ( borrador ES7 ), 96 94 93 bytes

Inspiración tomada de algunas soluciones aquí ...

Editar: -1 de edc65

f=z=>[for(x of[741e6]+36)' '.repeat(x)+'/  \\__'.repeat(4,z^=3).slice(+x+z,16-x+z)].join(`
`)

// For snippet demo:
document.write('<pre>'+f()+'</pre>');

Comentado:

f=z=>[                                 
        for(x of [741e6] + 36)        // for each character "x" in "74100000036"
            ' '.repeat(x) +           // x spaces
            '/  \\__'.repeat(4,       // build pattern string
            z ^= 3).                  // toggle z offset (3) for even lines
            slice(+x + z, 16 - x + z) // get appropriate substring
    ].join(`                          // join with newlines
    `)
nderscore
fuente
Buena esa. .substr(+x+z,16-x-x)-> .slice(+x+z,16-x+z)-1
edc65
@ edc65 buena captura!
nderscore
Pregunta rápida: ¿Por qué es en +xlugar de solo x?
Financia la demanda de Mónica
1
@QPaysTaxes Es para emitir xa un número. Sin él, se concatenaríaz
nderscore
2

Python 3, 100 87 bytes

n=0x85208e08e08dd445
while n:l=n>>2&15;print(' '*(8-l)+('\__/  '*4)[n&3:n&3|l*2]);n>>=6

Y una versión legible del código a continuación. La idea es codificar los intervalos (inicio, longitud) y luego rellenar con la cantidad correcta de espacios para centrar el intervalo.

hexagon_string = '\__/  ' * 4
for i in range(11):
    # Pick the begin and length of the i-th interval using hardcoded numbers
    b = (0x00030303111 >> 4*i) & 3   # n is a combination of these two numbers
    l = (0x25888888741 >> 4*i) & 15  #
    # Print the interval with appropriate whitespace in front of it
    spaces = ' ' * (8-l)
    print(spaces + hexagon_string[b : b+l*2])
Matty
fuente
2

Retina , 66 bytes

<empty line>
sss __<LF>ssa__<LF> aa__<LF>lll dau<LF>ssdu
l
/daa<LF>\aau<LF>
a
ud
u
__/
d
s\
s

Cada línea debe ir a su propio archivo y <LF>significa nueva línea real en el archivo. 1 byte por archivo adicional agregado al conteo de bytes.

Puede ejecutar el código como un archivo con la -sbandera, manteniendo los <LF>marcadores y quizás cambiándolos a nuevas líneas en la salida para facilitar su lectura si lo desea.

El algoritmo consta de 5 pasos sustitutos simples (cambiar el contenido de línea impar a contenido de línea par) a partir de una cadena de entrada vacía. Los resultados después de cada paso son (delimitados por ='s):

sss __
ssa__
 aa__
lll dau
ssdu
============
sss __
ssa__
 aa__
/daa
\aau
/daa
\aau
/daa
\aau
 dau
ssdu
============
sss __
ssud__
 udud__
/dudud
\ududu
/dudud
\ududu
/dudud
\ududu
 dudu
ssdu
============
sss __
ss__/d__
 __/d__/d__
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
 d__/d__/
ssd__/
============
sss __
ss__/s\__
 __/s\__/s\__
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
 s\__/s\__/
sss\__/
============
       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
randomra
fuente
1

Javascript, 154 151 bytes

b="\n",c="\t",d="/  \\",f="__",g="\\",h="/",a=f+d,j=a+a,i=d+j+b+g+j+f+h+b,k="   ";console.log(c+k+f+b+c+a+f+b+" "+j+f+b+i+i+i+k+g+a+f+h+b+c+"  "+g+f+h)
SuperJedi224
fuente