Io voglio Honeycomb


39

Scrivi il programma più breve che stampa questa sezione di arte ASCII di una piastrellatura esagonale o nido d'ape :

       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
  • Nessun input dovrebbe essere preso.
  • Invia a stdout o l'alternativa più vicina alla tua lingua.
  • Invece di un programma, è possibile scrivere una funzione denominata che non accetta parametri e stampa il risultato normalmente o lo restituisce come una stringa.
  • L'output può avere un numero qualsiasi di newline iniziali e / o finali e ogni riga nell'output può avere un numero qualsiasi di spazi iniziali e / o finali (purché il motivo sia allineato correttamente).
  • Vince il codice più breve in byte.

13
Suoni molto Catan?
user3490

@ user3490 In effetti lo faccio ^^
Calvin's Hobbies

2
La prossima settimana su PCG: scrivere un generatore di schede Catan?
user3490

7
Dovrebbe avere un input IMO, nel tuo caso dovrebbe essere 3.
user3819867

3
@ user3819867 L'ho considerato, ma ho preferito questo. È troppo tardi per cambiare, ma non troppo tardi perché qualcuno possa fare una sfida correlata.
Calvin's Hobbies,

Risposte:


33

CJam, 45 43 42 41 40 byte

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

Provalo online nell'interprete CJam .

Come funziona

"\__/  "38*21/

ripete lo schema \__/ 38 volte e lo divide in blocchi di lunghezza 21 . Se i blocchi fossero separati da avanzamenti di riga, questo sarebbe il risultato:

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

Questo contiene chiaramente il nido d'ape desiderato. Tutto ciò che resta da fare è sostituire alcuni personaggi con spazi, tagliarne alcuni e introdurre effettivamente i linefeed.

741e8 36+Ab

genera il numero intero 74 100 000 036 e lo converte nella matrice [7 4 1 0 0 0 0 0 0 3 6] . Ogni elemento dell'array codifica il numero di caratteri iniziali della riga corrispondente che devono essere sostituiti con spazi. Sottraendo questo numero da 16 , otteniamo anche la lunghezza corretta per questa linea.

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

Poiché uno spazio ha un punto di codice inferiore rispetto agli altri caratteri di L e gli operatori vettorializzati lasciano intatti i caratteri della stringa più lunga che non corrispondono a uno di quello più corto, .e<sostituiscono i primi caratteri D con spazi.


2
È brillante. Bel lavoro.
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

Guardalo correre.

Per ciascuna delle 11 righe di output, calcola il numero di spazi iniziali kcome un massimo di tre funzioni lineari che formano l'inviluppo del lato sinistro dell'esagono. Poiché le linee diagonali hanno una pendenza 3e -3, è meglio indicizzare il numero di riga come i=0,3,...30.

Per creare la maglia esagonale, prima piastrelliamo abbastanza l'unità '\__/ '. Quindi, spostando lo [i:]riallinea per 3 per le righe dispari. Infine, ne prendiamo la parte necessaria [k:16-k], lasciando un margine ka sinistra e a destra.


22

CJam, 65 56 55 byte

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

Provalo online nell'interprete CJam .

Idea

La metà destra di ogni riga è una copia invertita della metà sinistra con barre rovesciate e barre rovesciate. Pertanto, è sufficiente codificare la metà sinistra del nido d'ape:

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

Invece di analizzare questo modello riga per riga, possiamo analizzarlo colonna per colonna:

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

Emergono modelli evidenti:

  • La stringa si _ _ _ _verifica cinque volte.
  • Ogni /è seguito da un \.

Sostituendo ogni /\, _, _ _ _ _e lo spazio con un numero da 0 a 3, si può convertire la matrice risultante da un numero di base 4 ad una base superiore e memorizzare il modello completo in modo compatto.

Codice

"Ý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.

10

C, 148 144 140 byte

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 spazi bianchi, senza avvisi del compilatore e prima di alcune modifiche al codice per salvare alcuni byte:

#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);
    }
}

Questo approccio non utilizza alcuna tabella di caratteri / stringhe. Esegue il loop su tutte le 187 (11 righe, 17 colonne incluse le nuove righe) e decide quale personaggio stampare per ogni posizione, in base a una combinazione di condizioni.

Le condizioni includono un test per essere dentro / fuori dai 4 angoli, usando equazioni a 4 linee, con il risultato memorizzato in variabile p. Il resto si ripete quindi per lo più ogni 6 caratteri, con le righe dispari spostate di 3 caratteri rispetto alle righe pari.


2
Per il golf, puoi usare implicit-int e rilasciare il int .
Luser droog,

Alcuni micro-miglioramenti: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

Rubino - 78 byte

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

Una trascrizione della soluzione di xnor (69 byte):

11.times{|i|puts' '*(j=[7-i*=3,i-24,0].max)+('\__/  '*9)[i+j,16-j*2]}

1
11.timessalva 2 byte
Mitch Schwartz il

6

JavaScript (ES6), 129 130

Questa è una stringa pura di sostituzione / sostituzione / sostituzione ... che non sfrutta alcuna proprietà geometrica.

Utilizzando le stringhe modello, tutte le nuove righe sono significative e contano.

Esegui lo snippet in Firefox per testarlo

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>


6

PHP - 139 137 107 101 91 87 byte

Non so se questo è il modo migliore per giocare a golf, ma ecco il mio tentativo:

30 36 46 -50 byte grazie a Ismael Miguel

Provalo online qui

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

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

vecchio codice:

<?php $a="/  \\__";$c=$a.$a."/  \\\n\__".$a.$a."/\n";echo "       __\n    __".$a."\n __".$a,$a."\n".$c,$c,$c."   \\__".$a."/\n      \\__/";

Benvenuti in Programming Puzzle and Code Golf. Il tuo codice PHP può essere ridotto molto di più. È possibile utilizzare <?invece di <?phpsalvare 3 byte. Invece di $c=$a.$a."/ \\\n\__".$a.$a."/\n";, puoi scrivere $c="$a$a/ \\\n\__.$a$a/\n";(poiché PHP espande le variabili nelle stringhe). È possibile applicare la stessa logica a echoper ridurne ulteriormente la lunghezza. Inoltre, non è necessario quello spazio tra la echoe la stringa.
Ismael Miguel,

1
Grazie, imparo qualcosa di nuovo ogni volta che provo a giocare a golf hehe.
Timo,

Prego. Ecco una soluzione lunga 99 byte: ideone.com/WHWEZS . Sembra un disastro, ma è molto più breve. Invece di utilizzare \n, è possibile inserire una nuova riga reale e salvare 1 byte per riga.
Ismael Miguel,

Nel frattempo, l'ho ridotto di 2 byte. Ora ha 97 byte.
Ismael Miguel,

1
Ecco una battuta: <?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";. Ricorda di sostituire il carattere \tcon una scheda e \ncon una nuova riga reale.
Ismael Miguel,

4

Lua 146

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

(nuove righe aggiunte per maggiore chiarezza)


1
Questo codice non è più lungo dell'output desiderato perché contiene solo l'output più elementi di escape e gestione delle stringhe?
Caleb,

6
@Caleb: sospetto che tu non abbia effettivamente contato e indovinato solo nel fare quel commento. Secondo il mio editor di testo, ci sono 165 caratteri nel reticolo (nuove righe incluse). Ho 19 personaggi in meno a causa della ripetizione Stre volte.
Kyle Kanos,

2
Ma hai ragione sul fatto che le fughe e le nuove righe limitano la capacità del mio codice di competere in questo gioco particolare. Ma anche vincere non è il motivo per cui lo faccio, è per divertimento e apprendimento.
Kyle Kanos,

3

Dardo - 113

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

Pura soluzione di interpolazione delle stringhe, niente di speciale. Le operazioni su stringa come "sottostringa" sono troppo dettagliate per competere nella pratica.

Eseguilo su DartPad .


3

Javascript ( ES7 Draft ), 96 94 93 byte

Ispirazione presa da alcune soluzioni qui ...

Modifica: -1 da 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>');

ha commentato:

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
    `)

Ben fatto. .substr(+x+z,16-x-x)-> .slice(+x+z,16-x+z)-1
edc65,

@ edc65 bella cattura!
nderscore,

Domanda veloce: perché +xinvece di solo x?
Fondi Monica's Lawsuit

1
@QPaysTaxes È il cast xper un numero. Senza di essa, si concatenerebbez
nderscore

2

Python 3, 100 87 byte

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

E una versione leggibile del codice qui sotto. L'idea è di codificare gli intervalli (inizio, lunghezza) e quindi riempire con la quantità corretta di spazi per centrare l'intervallo.

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])

2

Retina , 66 byte

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

Ogni riga dovrebbe andare nel proprio file e <LF>indicare la nuova riga effettiva nel file. 1 byte per ogni file aggiuntivo aggiunto al conteggio byte.

È possibile eseguire il codice come un file con il -sflag, mantenendo il<LF> marker e magari cambiandoli in newline nell'output per leggibilità, se lo desideri.

L'algoritmo prevede 5 semplici passaggi sostitutivi (modifica del contenuto di riga dispari in contenuto di riga pari) a partire da una stringa di input vuota. I risultati dopo ogni passaggio sono (delimitati da ='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\__/
============
       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/

1

Javascript, 154 151 byte

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.