31 votes

Code Golf: Beehive

Le défi

Le plus court code par le nombre de caractères qui va générer une ruche à partir de la saisie de l'utilisateur.

Une ruche est défini une grille d'hexagones dans une taille entrés par l'utilisateur deux nombres positifs est supérieur à zéro (pas besoin de valider la saisie). Le premier nombre (W) représente la largeur de la ruche - ou - combien d'hexagones sont sur chaque ligne. Le deuxième nombre (H) représente la hauteur de la ruche - ou - combien d'hexagones sont sur chaque colonne.

Un Seul hexagone est faite à partir de trois caractères ASCII: _, / et \, et trois lignes:

 __
/  \
\__/

Les hexagones se complètent: la première colonne de la ruche sera "faible", et le second sera haute en alternance et en répétant le même motif formant W hexagones. Ce sera répété H fois pour former un total de WxH hexagones.

Des cas de Test:

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


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


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


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


Code de comptage d'entrée/de sortie (j'.e programme complet).

21voto

mob Points 61524

Perl, 99 caractères

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

Dernière édition: Enregistré un caractère de remplacement -($W%2) avec 0-$W%2 (merci A. Rex)

Explication:

Pour la largeur W et de hauteur H, la sortie est de 2+2 * H lignes de long et de 3 * W+1 caractères de large, avec beaucoup de répétition dans le milieu de la sortie.

Pour plus de commodité, nous les laissons $W 3 * W + 1, la largeur de la sortie des personnages.

La ligne supérieure est constituée de la répétition " __", répété W/2 == $W/6 temps.

Les paires lignes sont constituées de la répétition de motif "\__/ ", tronqué à l' $W caractères. La deuxième ligne de sortie est un cas particulier, où le premier caractère de la deuxième ligne devrait être un espace au lieu d'un \.

Le impaires lignes sont constituées de la répétition de motif "/ \__", tronqué à l' $W caractères.

Nous avons construire une chaîne de caractères: " " . "__/ \" x 99. Notez que le début de cette chaîne est la sortie désirée pour la deuxième ligne. Cette ligne de départ à la position 3 est la sortie désirée pour les lignes impaires, et en commençant à la position 6 de la même lignes numérotées.

La LISTE d'argument à l' map appel commence avec 0 et est suivie par H répétitions de (3,6). L' map appel crée une liste de sous-chaînes qui commencent à la position appropriée et sont $W = 3 * N + 1 caractères.

Il y a un ajustement à faire avant d'imprimer les résultats. Si W est impair, alors il y a un caractère supplémentaire sur la deuxième ligne ($P[0]) qui doit être chopped hors tension. Si W est pair, alors il existe un caractère supplémentaire sur la ligne inférieure ($P[-1]) pour hacher.

10voto

recursive Points 34729

Python 2.6 - 144 caractères, y compris les nouvelles lignes

Je peux économiser environ 20 caractères supplémentaires si les entrées sont autorisées à être séparées par des virgules.

 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
 

La version qui prend en entrée de la ligne de commande est de 4 octets supplémentaires:

 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 Points 41713

C89 (136 caractères)

 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 Points 87003

Perl, 160 caractères

 $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
 

Aucune habileté impliquée: remplissez simplement le tableau avec des caractères, puis éliminez ceux qui paraissent laids.

Le chef-d'œuvre de strager n'a que 137 caractères lorsqu'il est porté sur Perl, mais tout le mérite en revient à lui.

 $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 Points 87003

J, 143 caractères

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'/\',:' _'
)

À l'aide de J se sent très à l'aise lorsque vous traitez avec des chaînes de longueur variable et le type de console orientée vers l'interaction de l'utilisateur qui est supposé dans d'autres langues. Encore, je suppose que ce n'est pas trop mauvais...

Voler les idées une fois de plus J est beaucoup plus facile de travailler avec une fois que vous trouver une façon de regarder le problème dans un tableau structuré), voici mobrule du chef-d'œuvre porté dans 124 (ick, il est plus long que l'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
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X