Ich will Bienenwabe

39

Schreiben Sie das kürzeste Programm, das diesen ASCII-Kunstabschnitt einer hexagonalen Kachelung oder Wabe druckt :

       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
  • Es sollten keine Eingaben gemacht werden.
  • Ausgabe auf stdout oder die nächstgelegene Alternative Ihrer Sprache.
  • Anstelle eines Programms können Sie eine benannte Funktion schreiben , die keine Parameter annimmt und das Ergebnis normal ausgibt oder als Zeichenfolge zurückgibt.
  • Die Ausgabe kann eine beliebige Anzahl von führenden und / oder nachfolgenden Zeilen aufweisen, und jede Zeile in der Ausgabe kann eine beliebige Anzahl von führenden und / oder nachfolgenden Leerzeichen aufweisen (sofern das Muster ordnungsgemäß ausgerichtet ist).
  • Der kürzeste Code in Bytes gewinnt.
Calvins Hobbys
quelle
13
Spielst du viel Catan?
user3490
@ user3490 In der Tat mache ich ^^
Calvins Hobbys
2
Nächste Woche auf PCG: Catan Board Generator schreiben?
user3490
7
Es sollte eine Eingabe IMO haben, in Ihrem Fall sollte es 3 sein.
user3819867
3
@ user3819867 Ich habe das in Betracht gezogen, aber es vorgezogen. Es ist zu spät, sich zu ändern, aber nicht zu spät, um eine entsprechende Herausforderung zu stellen.
Calvins Hobbys

Antworten:

33

CJam, 45 43 42 41 40 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

"\__/  "38*21/

Wiederholt das Muster \__/ 38 Mal und teilt es in Stücke mit der Länge 21 auf . Wenn die Blöcke durch Zeilenvorschübe getrennt wären, wäre dies das Ergebnis:

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

Dieser enthält eindeutig die gewünschte Wabe. Sie müssen lediglich einige Zeichen durch Leerzeichen ersetzen, andere abschneiden und die Zeilenvorschübe einführen.

741e8 36+Ab

generiert die Ganzzahl 74 100 000 036 und konvertiert sie in das Array [7 4 1 0 0 0 0 0 0 3 6] . Jedes Array-Element codiert die Anzahl der führenden Zeichen der entsprechenden Zeile, die durch Leerzeichen ersetzt werden müssen. Indem wir diese Zahl von 16 subtrahieren , erhalten wir auch die richtige Länge für diese Zeile.

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

Da ein Leerzeichen einen niedrigeren Codepunkt als die anderen Zeichen von L hat und vektorisierte Operatoren die Zeichen der längeren Zeichenfolge, die keinem der kürzeren Zeichen entsprechen, unberührt lassen, werden .e<die ersten D- Zeichen durch Leerzeichen ersetzt.

Dennis
quelle
2
Das ist brilliant. Gute Arbeit.
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

Sehen Sie es laufen.

Berechnet für jede der 11 Ausgabezeilen die Anzahl der führenden Leerzeichen kals maximal drei lineare Funktionen, die die Hüllkurve der linken Seite des Sechsecks bilden. Da die diagonalen Linien Steigung 3und haben -3, ist es besser, die Zeilennummer als zu indizieren i=0,3,...30.

Um das Sechsecknetz zu erstellen, müssen Sie zuerst genügend Teile der Einheit kacheln '\__/ '. Durch Verschieben [i:]wird es dann für ungerade Zeilen um 3 neu ausgerichtet. Schließlich nehmen wir den benötigten Teil [k:16-k]und lassen klinks und rechts einen Rand frei .

xnor
quelle
22

CJam, 65 56 55 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Idee

Die rechte Hälfte jeder Zeile ist eine umgekehrte Kopie der linken Hälfte mit getauschten Schrägstrichen und umgekehrten Schrägstrichen. Daher genügt es, die linke Hälfte der Wabe zu codieren:

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

Anstatt dieses Muster Zeile für Zeile zu analysieren, können wir es Spalte für Spalte analysieren:

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

Offensichtliche Muster entstehen:

  • Die Zeichenfolge _ _ _ _kommt fünfmal vor.
  • Jedem /folgt ein \.

Jeden durch Ersetzen /\, _, _ _ _ _und Raum mit einer Zahl von 0 bis 3, kann man das resultierende Array von einer Zahl zur Basis 4 zu einer höheren Basis und speichere das vollständige Muster in einer kompakten Art und umzuwandeln.

Code

"Ý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
quelle
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);}}

Mit Leerzeichen, ohne Compiler-Warnungen und vor einigen Code-Optimierungen, um ein paar Bytes zu sparen:

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

Dieser Ansatz verwendet keine Zeichen- / Zeichenfolgentabellen. Es durchläuft alle 187 (11 Zeilen, 17 Spalten, einschließlich Zeilenvorschub) und entscheidet anhand einer Kombination von Bedingungen, welches Zeichen für jede Position gedruckt werden soll.

Die Bedingungen umfassen einen Test, um innerhalb / außerhalb der 4 Ecken zu sein, unter Verwendung von 4 Liniengleichungen, wobei das Ergebnis in Variable gespeichert wird p. Der Rest wiederholt sich dann meist alle 6 Zeichen, wobei die ungeraden Zeilen gegenüber den geraden Zeilen um 3 Zeichen verschoben sind.

Reto Koradi
quelle
2
Für den Golfspieler können Sie implicit-int verwenden und das löschen int .
Luser Droog
Ein paar kleine Verbesserungen: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]}

Eine Transkription von xnors Lösung (69 Bytes):

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

JavaScript (ES6), 129 130

Dies ist eine reine Zeichenfolge zum Ersetzen / Ersetzen / Ersetzen, die keine geometrischen Eigenschaften ausnutzt.

Bei Verwendung von Vorlagenzeichenfolgen sind alle Zeilenumbrüche signifikant und zählen.

Führen Sie zum Testen das Snippet in Firefox aus

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

PHP - 139 137 107 101 91 87 Bytes

Ich weiß nicht, ob dies der beste Weg ist, um Golf zu spielen, aber hier ist mein Versuch:

30 36 46 -50 Bytes dank Ismael Miguel

Testen Sie es hier online

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

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

alter Code:

<?php $a="/  \\__";$c=$a.$a."/  \\\n\__".$a.$a."/\n";echo "       __\n    __".$a."\n __".$a,$a."\n".$c,$c,$c."   \\__".$a."/\n      \\__/";
Timo
quelle
Willkommen bei Programming Puzzles und Code Golf. Ihr PHP-Code kann viel mehr reduziert werden. Sie können <?anstelle von <?php3 Bytes speichern. Stattdessen $c=$a.$a."/ \\\n\__".$a.$a."/\n";können Sie schreiben $c="$a$a/ \\\n\__.$a$a/\n";(da PHP Variablen in Strings erweitert). Sie können dieselbe Logik auf die anwenden echo, um ihre Länge weiter zu verringern. Außerdem benötigen Sie diesen Abstand zwischen der echound der Zeichenfolge nicht.
Ismael Miguel
1
Danke, ich lerne jedes Mal etwas Neues, wenn ich versuche, Golf zu spielen, hehe.
Timo
Bitte schön. Hier ist eine 99 Byte lange Lösung: ideone.com/WHWEZS . Es sieht chaotisch aus, ist aber viel kürzer. Anstatt zu verwenden \n, können Sie eine echte neue Zeile einfügen und 1 Byte pro Zeile speichern.
Ismael Miguel
Inzwischen habe ich es 2 Bytes reduziert. Jetzt hat es 97 Bytes.
Ismael Miguel
1
Hier ist ein Einzeiler: <?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";. Denken Sie daran, das \tZeichen durch ein Tabulatorzeichen und \neine echte Newline zu ersetzen .
Ismael Miguel
4

Lua 146

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

(Zeilenumbrüche zur Verdeutlichung hinzugefügt)

Kyle Kanos
quelle
1
Ist dieser Code nicht länger als die gewünschte Ausgabe, weil er nur die Ausgabe plus Escape- und String-Handling-Elemente enthält?
Caleb,
6
@Caleb: Ich vermute, Sie haben nicht gezählt und nur geraten, diesen Kommentar zu machen. Laut meinem Texteditor enthält das Gitter 165 Zeichen (einschließlich Zeilenumbrüche). Ich habe 19 Zeichen weniger, weil ich Sdreimal wiederholt habe .
Kyle Kanos
2
Aber Sie haben Recht, dass die Fluchten und Zeilenumbrüche die Wettbewerbsfähigkeit meines Codes in diesem bestimmten Spiel einschränken. Aber zu gewinnen ist auch nicht der Grund, warum ich das tue, es ist für den Spaß und das Lernen.
Kyle Kanos
3

Dart - 113

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

Reine String-Interpolationslösung, nichts Besonderes. Zeichenfolgenoperationen wie "Teilzeichenfolge" sind zu ausführlich, um in der Praxis konkurrieren zu können.

Führen Sie es auf DartPad aus .

lrn
quelle
3

Javascript ( ES7-Entwurf ), 96 94 93 Bytes

Inspiration aus ein paar Lösungen hier ...

Edit: -1 von 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>');

Kommentiert:

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
quelle
Schön. .substr(+x+z,16-x-x)-> .slice(+x+z,16-x+z)-1
edc65
@ edc65 schöner Fang!
nderscore
Kurze Frage: Warum ist es +xstatt nur x?
Nic Hartley
1
@ QPaysTaxes Es ist xzu einer Zahl zu werfen . Ohne sie würde es verkettenz
Endpunkt
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

Und eine lesbare Version des Codes unten. Die Idee ist, die Intervalle (Anfang, Länge) fest zu codieren und dann mit der richtigen Anzahl von Leerzeichen zu füllen, um das Intervall zu zentrieren.

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
quelle
2

Netzhaut , 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

Jede Zeile sollte in eine eigene Datei gehen und <LF>bedeutet, dass die Datei tatsächlich eine neue Zeile enthält. 1 Byte pro zusätzlicher Datei zur Byteanzahl hinzugefügt.

Sie können den Code als eine Datei mit dem -sFlag <LF>ausführen , wobei die Markierungen beibehalten und gegebenenfalls in der Ausgabe in Zeilenumbrüche geändert werden, um die Lesbarkeit zu gewährleisten.

Der Algorithmus besteht aus 5 einfachen Ersatzschritten (Ändern des Inhalts einer ungeraden Zeile in einen Inhalt einer geraden Zeile), beginnend mit einer leeren Eingabezeichenfolge. Die Ergebnisse nach jedem Schritt sind (durch ='s begrenzt):

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
quelle
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
quelle