Mash Up Time!
Il s'agit de l'épisode 5 de ma série Random Golf of the Day et de l'Art ASCII du jour de l' Optimizer . Votre soumission (s) dans ce défi comptera pour les deux classements (dont vous pouvez trouver les messages liés). Bien sûr, vous pouvez traiter cela comme n'importe quel autre défi de golf de code et y répondre sans vous soucier des deux séries.
Trou 5: pavage de diamants
Un hexagone ordinaire peut toujours être carrelé avec des diamants comme ceci:
Nous utiliserons une représentation artistique ASCII de ces pavages. Pour un hexagone de longueur latérale 2, il existe 20 pavages de ce type:
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \_\/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/ \_\/_/ \_\/_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/_/_/\ /\_\_\ /_/\_\ /_/_/\ /_/\_\ /_/\_\ /_/_/\ /_/_/\ /_/_/\ /_/_/\
/\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
\/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
\/_/_/ \_\_\/ \_\/_/ \_\/_/ \_\_\/ \_\_\/ \_\/_/ \_\_\/ \_\_\/ \_\_\/
Étant donné une longueur de côté N
, vous devez générer un tel pavage pour un hexagone de longueur de côté N
au hasard. La distribution exacte n'a pas d'importance, mais chaque pavage doit être renvoyé avec une probabilité non nulle.
Pour N ≤ 4
, votre soumission doit produire un pavage en 1 minute au moins 80% du temps et au moins 80% des pavages doivent potentiellement être générés en 1 minute. La plupart des approches n'auront pas à se soucier de cette règle (elle est très indulgente) - il s'agit simplement d'exclure des algorithmes très naïfs basés sur le rejet qui génèrent des chaînes arbitraires jusqu'à ce que l'un se trouve être un pavage.
Vous aimerez peut-être savoir que le nombre total de pavages possibles pour un N donné peut être trouvé dans OEIS A008793 .
Vous pouvez écrire un programme complet ou une fonction et prendre une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et produire une sortie via STDOUT (ou l'alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
Vous ne devez pas générer plus d'espaces de tête que nécessaire pour aligner l'hexagone (c'est-à-dire que le coin gauche de l'hexagone ne doit pas avoir d'espace devant). Chaque ligne peut contenir jusqu'à N
des espaces de fin (pas nécessairement de manière cohérente, vous pouvez par exemple avoir une sortie rectangulaire, imprimant la boîte englobante de l'hexagone).
Il s'agit du code golf, donc la soumission la plus courte (en octets) l'emporte. Et bien sûr, la soumission la plus courte par utilisateur entrera également dans le classement général de la série.
Classements
Le premier message de chaque série génère un classement.
Pour vous assurer que vos réponses s'affichent, veuillez commencer chaque réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(La langue n'est pas actuellement affichée, mais l'extrait de code l'exige et l'analyse, et je pourrai ajouter un classement par langue à l'avenir.)
For N ≤ 4, your submission must produce a tiling within 1 minute at least 80% of the time.
trop facile: 80% du temps le même, carrelage de base, sinon je trouve un autre carrelage dans le temps que je veuxRéponses:
CJam, 105 octets
Ajout d'une nouvelle ligne pour éviter le défilement. Essayez-le en ligne
Explication:
Cette solution commence chaque ligne en zigzag, puis place N traits de soulignement dessus, en fonction de leur position sur la ligne précédente et de quelques règles. Je l'ai obtenu à partir d'une série d'observations en regardant la sortie comme une matrice 2D simple de caractères:
/\
dans la moitié supérieure,\/
dans la moitié inférieure)/_/
ne peut changer que de -1 ou 0, et\_\
ne peut changer que de 0 ou 1"_ "
motif ou un" _"
motif, les deux sont très bienJ'ai donc décidé de l'implémenter en conservant les positions de soulignement précédentes, en les modifiant avec un facteur aléatoire (2 choix pour chaque trait de soulignement) et en répétant jusqu'à ce que les règles soient satisfaites. En cours d'optimisation, je suis passé à des positions de soulignement par rapport au côté gauche de l'hexagone (sans les espaces).
Ancienne version "3D", 189 octets:
Essayez-le en ligne
la source
Python 2,
337335324318311300296 octetsL'idée est de créer d'abord un hexagone de diamants, comme ceci:
Et puis remplissez-le avec des chemins de soulignement vers le bas, comme ceci:
Le résultat final avec tous les chemins ajoutés ressemblerait alors à ceci:
Il faut pas mal de code pour s'assurer que ces chemins ne sortent pas des limites ou ne se croisent pas.
Le code non golfé:
la source
randint(0,1)*(p<n*3+i*2-j)
àrandint(0,p<n*3+i*2-j)
.Perl,
174 168 166161 161Essayez- moi .
la source
JavaScript ( ES6 ), 376
416 494Juste pour être là ...
Cela construit tous les pavages, puis choisissez-en un au hasard. Le temps pour les pavages 232848 pour N = 4 est d'environ 45 secondes sur mon ordinateur portable. Je n'ai pas essayé N = 5.
Étant EcmaScript 6, il fonctionne uniquement sur Firefox.
la source
dom.max_script_run_time
. C'est une préférence mondiale dans environ: config, le mien est défini sur 30.SmileBASIC, 241 octets
Fortement basé sur la réponse de Matty
la source