Me Want Honeycomb

39

Escreva o programa mais curto que imprime esta seção de arte ASCII de um ladrilho hexagonal ou favo de mel :

       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
  • Nenhuma entrada deve ser tomada.
  • Saída para stdout ou a alternativa mais próxima do seu idioma.
  • Em vez de um programa, você pode escrever uma função nomeada que não aceita parâmetros e imprime o resultado normalmente ou o retorna como uma string.
  • A saída pode ter qualquer número de novas linhas à esquerda e / ou à direita e cada linha na saída pode ter qualquer número de espaços à esquerda e / ou à direita (desde que o padrão esteja alinhado corretamente).
  • O código mais curto em bytes vence.
Passatempos de Calvin
fonte
13
Você toca muito Catan?
User3490
@ user3490 De fato eu faço ^^
Calvin's Hobbies
2
Semana que vem no PCG: escreva um gerador de placas Catan?
User3490
7
Ele deve ter uma entrada IMO, no seu caso deve ser 3. #
user3819867 17/15
3
@ user3819867 Eu considerei isso, mas preferi isso. É tarde demais para mudar, mas não é tarde demais para alguém fazer um desafio relacionado.
Hobbies de Calvin

Respostas:

33

CJam, 45 43 42 41 40 bytes

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

Experimente online no intérprete CJam .

Como funciona

"\__/  "38*21/

repete o padrão \__/ 38 vezes e o divide em pedaços de comprimento 21 . Se os pedaços fossem separados por linhas de alimentação, este seria o resultado:

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

Isso contém claramente o favo de mel desejado. Tudo o que resta a fazer é substituir alguns caracteres por espaços, cortar outros e introduzir os feeds de linha.

741e8 36+Ab

gera o número inteiro 74 100 000 036 e o converte na matriz [7 4 1 0 0 0 0 0 0 3 6] . Cada elemento da matriz codifica o número de caracteres iniciais da linha correspondente que precisam ser substituídos por espaços. Subtraindo esse número de 16 , também obtemos o comprimento correto para esta linha.

.{            } 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.

Como um espaço possui um ponto de código mais baixo do que os outros caracteres de L e os operadores vetorizados deixam os caracteres da sequência mais longa que não correspondem a uma das mais curtas intocados, .e<substitui os primeiros caracteres D por espaços.

Dennis
fonte
2
Isto é brilhante. Bom trabalho.
Alex A.
28

Python 2, 73

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

Veja-o correr.

Para cada uma das 11 linhas de saída, calcula o número de espaços iniciais kcomo no máximo três funções lineares que formam o envelope do lado esquerdo do hexágono. Como as linhas diagonais têm inclinação 3e -3, é melhor indexar o número da linha como i=0,3,...30.

Para criar a malha hexagonal, primeiro ladrilhamos o suficiente da unidade '\__/ '. Em seguida, a mudança o [i:]realinha em 3 para linhas ímpares. Finalmente, pegamos a parte necessária [k:16-k], deixando uma margem kà esquerda e à direita.

xnor
fonte
22

CJam, 65 56 55 bytes

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

Experimente online no intérprete CJam .

Idéia

A metade direita de cada linha é uma cópia invertida da metade esquerda com barras e barras invertidas trocadas. Portanto, basta codificar a metade esquerda do favo de mel:

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

Em vez de analisar esse padrão linha por linha, podemos analisá-lo coluna por coluna:

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

Surgem padrões óbvios:

  • A corda _ _ _ _ ocorre cinco vezes.
  • Todos /são seguidos por um\ .

Ao substituir todos /\,_ , _ _ _ _e no espaço com um número de 0 a 3, podemos converter a matriz resultante de um número base 4 para uma base maior e armazenar o padrão completo de uma forma 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
fonte
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);}}

Com espaço em branco, sem avisos do compilador e antes de algum código ser ajustado para salvar alguns 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);
    }
}

Essa abordagem não usa nenhuma tabela de caracteres / string. Ele percorre todas as 187 (11 linhas, 17 colunas, incluindo novas linhas) e decide qual caractere imprimir para cada posição, com base em uma combinação de condições.

As condições incluem um teste para estar dentro / fora dos 4 cantos, usando 4 equações de linha, com o resultado armazenado na variável p. O restante é repetido principalmente a cada 6 caracteres, com as linhas ímpares deslocadas em 3 caracteres em relação às linhas pares.

Reto Koradi
fonte
2
Para o jogador de golfe, você pode usar implicit-int e largar o int .
Luser droog
Algumas micro-melhorias: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

Ruby - 78 bytes

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

Uma transcrição da solução da xnor (69 bytes):

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

JavaScript (ES6), 129 130

É uma string pura substituir / substituir / substituir ... sem tirar proveito de nenhuma propriedade geométrica.

Usando cadeias de modelo, todas as novas linhas são significativas e contam.

Execute o snippet no Firefox para testar

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
fonte
6

PHP - 139 137 107 101 91 87 bytes

Não sei se essa é a melhor maneira de jogar golfe, mas aqui está minha tentativa:

30 36 46 -50 bytes graças a Ismael Miguel

Teste online aqui

<?='       __
    __',$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 antigo:

<?php $a="/  \\__";$c=$a.$a."/  \\\n\__".$a.$a."/\n";echo "       __\n    __".$a."\n __".$a,$a."\n".$c,$c,$c."   \\__".$a."/\n      \\__/";
Timo
fonte
Bem-vindo à programação de quebra-cabeças e código de golfe. Seu código PHP pode ser reduzido muito mais. Você pode usar em <?vez de <?phpsalvar 3 bytes. Em vez de $c=$a.$a."/ \\\n\__".$a.$a."/\n";, você pode escrever $c="$a$a/ \\\n\__.$a$a/\n";(já que o PHP expande variáveis ​​em strings). Você pode aplicar a mesma lógica ao echopara reduzir ainda mais o comprimento. Além disso, você não precisa desse espaço entre a echoe a sequência.
Ismael Miguel
1
Obrigado, eu aprendo algo novo toda vez que tento jogar golfe hehe.
Timo
Você é bem vindo. Aqui está uma solução com 99 bytes de comprimento: ideone.com/WHWEZS . Parece uma bagunça, mas é muito mais curto. Em vez de usar \n, você pode colocar uma nova linha real e salvar 1 byte por linha.
Ismael Miguel
Enquanto isso, reduzi-o em 2 bytes. Agora ele possui 97 bytes.
Ismael Miguel
1
Aqui é um one-liner: <?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";. Lembre-se de substituir \tpor um caractere de tabulação e\n por uma nova linha real.
Ismael Miguel
4

Lua 146

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

(novas linhas adicionadas para maior clareza)

Kyle Kanos
fonte
1
Esse código não é mais longo que a saída desejada, porque contém apenas a saída, além de itens de escape e manipulação de strings?
Caleb
6
@ Caleb: Eu suspeito que você realmente não contou e apenas adivinhou ao fazer esse comentário. De acordo com meu editor de texto, existem 165 caracteres na estrutura (novas linhas incluídas). Tenho 19 caracteres a menos por repetir Strês vezes.
Kyle Kanos #
2
Mas você está certo de que as fugas e as novas linhas limitam a capacidade do meu código de competir nesse jogo em particular. Mas ganhar também não é por isso que faço isso, é pela diversão e aprendizado.
Kyle Kanos #
3

Dardo - 113

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

Solução pura de interpolação de cordas, nada extravagante. Operações de string como "substring" são muito detalhadas para competir na prática.

Execute-o no DartPad .

lrn
fonte
3

Javascript ( ES7 Draft ), 96 94 93 bytes

Inspiração tirada de algumas soluções aqui ...

Edit: -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
fonte
Agradável. .substr(+x+z,16-x-x)-> .slice(+x+z,16-x+z)-1
edc65
@ edc65 boa captura!
Ndscore # 18/15
Pergunta rápida: por que é em +xvez de apenas x?
Nic Hartley
1
@QPaysTaxes É para transmitir xpara um número. Sem ele, seria concatenadoz
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

E uma versão legível do código abaixo. A idéia é codificar os intervalos (começo, comprimento) e depois preencher com a quantidade correta de espaços para centralizar o 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
fonte
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 linha deve ir para seu próprio arquivo e <LF> significa uma nova linha real no arquivo. 1 byte por arquivo extra adicionado à contagem de bytes.

Você pode executar o código como um arquivo com a -sbandeira, mantendo os <LF>marcadores e talvez alterando-os para novas linhas na saída para facilitar a leitura, se desejar.

O algoritmo é composto por 5 etapas simples de substituição (alterar o conteúdo da linha ímpar para o conteúdo da linha par), iniciando a partir de uma sequência de entrada vazia. Os resultados após cada etapa são (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
fonte
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
fonte