31 Stimmen

Code Golf: Bienenstock

Die Herausforderung

Der kürzeste Code nach Zeichenzahl, der aus Benutzereingaben einen Bienenstock erzeugt.

Ein Bienenstock ist definiert als ein Gitter aus Sechsecken in einer Größe, die vom Benutzer als zwei positive Zahlen größer als Null eingegeben wird (eine Überprüfung der Eingabe ist nicht erforderlich). Die erste Zahl ( W ) stellt die Breite des Bienenstocks dar - oder - wie viele Sechsecke sich in jeder Reihe befinden. Die zweite Zahl ( H ) stellt die Höhe des Bienenstocks dar - oder - wie viele Sechsecke sich auf jeder Spalte befinden.

Ein einzelnes Sechseck wird aus drei ASCII-Zeichen gebildet: _ , / et \ und drei Zeilen:

 __
/  \
\__/

Die Sechsecke vervollständigen sich gegenseitig: Die erste Spalte des Bienenstocks ist "niedrig", die zweite "hoch" - abwechselnd und in demselben Muster, das W Sechsecke bildet. Dies wird H Mal wiederholt, um insgesamt WxH Sechsecke zu bilden.

Testfälle:

Input:
    1 1
Output:
     __
    /  \
    \__/

Input:
    4 2
Output:
        __    __
     __/  \__/  \
    /  \__/  \__/
    \__/  \__/  \
    /  \__/  \__/
    \__/  \__/

Input:
    2 5
Output:
        __ 
     __/  \
    /  \__/
    \__/  \
    /  \__/
    \__/  \
    /  \__/
    \__/  \
    /  \__/
    \__/  \
    /  \__/
    \__/

Input:
    11 3
Output:
        __    __    __    __    __
     __/  \__/  \__/  \__/  \__/  \__
    /  \__/  \__/  \__/  \__/  \__/  \
    \__/  \__/  \__/  \__/  \__/  \__/
    /  \__/  \__/  \__/  \__/  \__/  \
    \__/  \__/  \__/  \__/  \__/  \__/
    /  \__/  \__/  \__/  \__/  \__/  \
    \__/  \__/  \__/  \__/  \__/  \__/

Die Anzahl der Codes umfasst die Ein- und Ausgabe (d. h. das gesamte Programm).

21voto

mob Punkte 113680

Perl, 99 Zeichen

@P=map{$/.substr$".'__/  \\'x99,$_,$W||=1+3*pop}0,(3,6)x pop;
chop$P[0-$W%2];print"    __"x($W/6),@P

Letzte Bearbeitung : Ein Zeichen eingespart und ersetzt -($W%2) con 0-$W%2 (danke A. Rex)

Erläuterung:

Bei der Breite W und der Höhe H ist die Ausgabe 2+2 * H Zeilen lang und 3 * W+1 Zeichen breit, mit vielen Wiederholungen in der Mitte der Ausgabe.

Der Einfachheit halber lassen wir $W ist 3 * W + 1, die Breite der Ausgabe in Zeichen.

Die oberste Zeile besteht aus dem Muster " __" , wiederholt W/2 == $W/6 Zeiten.

Die geradzahligen Zeilen bestehen aus dem sich wiederholenden Muster "\__/ " , gekürzt auf $W Zeichen. Die zweite Zeile der Ausgabe ist ein Sonderfall, bei dem das erste Zeichen der zweiten Zeile ein Leerzeichen statt eines \ .

Die ungeraden Zeilen bestehen aus dem sich wiederholenden Muster "/ \__" , gekürzt auf $W Zeichen.

Wir konstruieren eine Zeichenkette: " " . "__/ \" x 99 . Beachten Sie, dass der Anfang dieser Zeichenkette die gewünschte Ausgabe für die zweite Zeile ist. Diese Zeile ab Position 3 ist die gewünschte Ausgabe für die ungeraden Zeilen, und ab Position 6 für die geraden Zeilen.

Das LIST-Argument für den Befehl map Aufruf beginnt mit 0 und wird von H Wiederholungen von (3,6) gefolgt. Die map erstellt eine Liste der Teilzeichenketten, die an den entsprechenden Stellen beginnen und die $W = 3 * W + 1 Zeichen lang.

Vor dem Drucken der Ergebnisse muss noch eine weitere Anpassung vorgenommen werden. Wenn W ungerade ist, dann gibt es ein zusätzliches Zeichen in der zweiten Zeile ( $P[0] ), die sein muss chop abtreten. Wenn W gerade ist, gibt es ein zusätzliches Zeichen in der unteren Zeile ( $P[-1] ) zu hacken.

10voto

recursive Punkte 80517

Python 2.6 - 144 Zeichen einschließlich Zeilenumbrüche

Ich kann etwa 20 Zeichen mehr einsparen, wenn die Eingaben durch Kommata getrennt werden können.

C,R=map(int,raw_input().split())
print C/2*"    __"+"\n "+("__/  \\"*99)[:3*C-C%2]
r=0
exec'r+=3;print ("\__/  "*99)[r:r+3*C+1-r/6/R*~C%2];'*2*R

Die Version, die Eingaben über die Befehlszeile entgegennimmt, hat 4 Bytes mehr:

import sys
C,R=map(int,sys.argv[1:])
print C/2*"    __"+"\n "+("__/  \\"*99)[:3*C-C%2]
r=0
exec'r+=3;print ("\__/  "*99)[r:r+3*C+1-r/6/R*~C%2];'*2*R

10voto

strager Punkte 86191

C89 (136 Zeichen)

x;y;w;main(h){for(h=scanf("%d%d",&w,&h)*h+2;y++
<h;++x)putchar(x>w*3-(y==(w&1?2:h))?x=-1,10:
"/  \\__"[--y?y-1|x?(x+y*3)%6:1:x%6<4?1:5]);}

6voto

ephemient Punkte 189038

Perl, 160 Zeichen

$w=shift;for$h(-1..2*shift){push@a,join'',(('\__','/  ')x($w+$h))[$h..$w+$h]}
$a[0]=~y#\\/# #;$a[1]=~s/./ /;s/_*$//for@a;$a[$w%2||$#a]=~s/. *$//;print$_,$/for@a

Dazu bedarf es keiner Raffinesse: Füllen Sie einfach das Feld mit Zeichen und entfernen Sie dann die, die hässlich aussehen.

strager's Meisterwerk ist nur 137 Zeichen lang, wenn man es nach Perl portiert, aber alle Anerkennung gebührt ihm.

$w=shift;$\=$/;for$y(1..($h=2+2*shift)){print map+(split//,'_ \__/  ')
[$y-1?$y-2|$_?($_+$y%2*3)%6+2:1:$_%6<4],0..$w*3-!($w&1?$y-2:$y-$h)}

6voto

ephemient Punkte 189038

J , 143 Zeichen

4(1!:2)~(10{a.)&,"1({.4 :0{:)".(1!:1)3
|:(18,(}:,32-+:@{:)3 3 8 1 1 10$~3*x){(,' '&(0})"1,' '&(0 1})"1)(,}."1)(}."1,}:"1)(3++:y)$"1'/\',:' _'
)

Die Verwendung von J fühlt sich sehr umständlich an, wenn es um Strings mit variabler Länge und die Art der konsolenorientierten Benutzerinteraktion geht, die in anderen Sprachen vorausgesetzt wird. Trotzdem ist das wohl nicht zu schlecht...

Noch einmal Ideen klauen (J ist viel einfacher zu bearbeiten, wenn man einen Weg gefunden hat, das Problem in einer Array-Struktur zu betrachten), hier ist mobrule's Meisterwerk portiert in 124 (ick, es ist länger als das Original):

4(1!:2)~({.4 :0{:)".(1!:1)3
(x}~' '_1}(x=.-1-+:2|x){])((10{a.),(' ',,99#'__/  \',:'    __'){~(i.>:3*x)+])"0]595 0,3 6$~+:y
)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X