Dans le jeu de stratégie "Hexplode" , les joueurs placent à tour de rôle des jetons sur un plateau hexagonal. Une fois que le nombre de jetons est égal au nombre de tuiles adjacentes, cette tuile hexode et déplace tous les jetons sur elle vers les voisins environnants. Vous pouvez jouer au jeu en ligne ici .
J'aime ce jeu, mais il est parfois difficile de savoir exactement combien de jetons vont sur une tuile spécifique; Je compte toujours le nombre de voisins. Ce serait vraiment pratique si j'avais un art ASCII pour m'aider à me souvenir du nombre de jetons sur chaque tuile.
Vous devez écrire un programme ou une fonction qui prend un entier positif en entrée, et produit cette représentation ASCII de l' hexagone de taille N . Chaque tuile sera le nombre de voisins que la tuile a. Étant donné que 1 est un cas d'angle étrange avec zéro voisin, vous n'avez qu'à gérer des entrées supérieures à 1.
Vous pouvez prendre ce nombre dans n'importe quel format raisonnable, tel que STDIN, arguments de fonction, arguments de ligne de commande, à partir d'un fichier, etc. La sortie peut également être dans n'importe quel format raisonnable, comme imprimer sur STDOUT, écrire dans un fichier, retourner une liste de chaînes, une chaîne séparée par des sauts de ligne, etc.
Voici quelques exemples de sortie pour les 5 premières entrées:
2)
3 3
3 6 3
3 3
3)
3 4 3
4 6 6 4
3 6 6 6 3
4 6 6 4
3 4 3
4)
3 4 4 3
4 6 6 6 4
4 6 6 6 6 4
3 6 6 6 6 6 3
4 6 6 6 6 4
4 6 6 6 4
3 4 4 3
5)
3 4 4 4 3
4 6 6 6 6 4
4 6 6 6 6 6 4
4 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 3
4 6 6 6 6 6 6 4
4 6 6 6 6 6 4
4 6 6 6 6 4
3 4 4 4 3
6)
3 4 4 4 4 3
4 6 6 6 6 6 4
4 6 6 6 6 6 6 4
4 6 6 6 6 6 6 6 4
4 6 6 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 6 6 3
4 6 6 6 6 6 6 6 6 4
4 6 6 6 6 6 6 6 4
4 6 6 6 6 6 6 4
4 6 6 6 6 6 4
3 4 4 4 4 3
Et le schéma se poursuit d'une manière similaire. Comme d'habitude, les lacunes standard s'appliquent et la réponse avec le nombre d'octets le plus bas sera couronnée gagnante!
Classements
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec 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 rayant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=92194,OVERRIDE_USER=31716;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Réponses:
MATL ,
3937 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Je peux à nouveau utiliser la convolution!
Tenez compte des commentaires
n = 3
. Le code construit d'abord une matrice de taille4*n-3
×n
en ajoutant le vecteur colonne au vecteur[1; 2; ...; 9]
ligne[1, 2, 3]
avec diffusion. Cela signifie calculer un tableau matriciel 2D de tous les ajouts par paire:Le remplacement des nombres pairs par
1
et des nombres impairs0
donne le motif en damierIl sera utilisé pour générer (une partie de) la grille hexagonale. Les uns représenteront les points de la grille et les zéros représenteront les espaces.
Le coin supérieur droit est supprimé en mettant à zéro toutes les entrées au-dessus de la "diagonale" principale de la matrice:
La multiplication par élément de cette matrice par une version inversée verticalement d'elle-même supprime également le coin inférieur droit. Transposer donne alors
Cela commence à ressembler à un hexagone. En utilisant la symétrie, la grille est étendue pour produire la moitié supérieure:
Maintenant, nous devons remplacer chaque entrée égale à une par le nombre de voisins. Pour cela, nous utilisons la convolution avec un voisinage 3 × 5 (c'est-à-dire que le noyau est une matrice de 3 × 5). Le résultat,
a deux problèmes (qui seront résolus plus tard):
1
.Le code ajoute maintenant
47
à chaque valeur calculée. Cela correspond à la soustraction1
pour résoudre le problème (2) et à l'ajout48
(ASCII pour'0'
), qui convertit chaque nombre au point de code de son caractère correspondant.La matrice résultante est ensuite multipliée par une copie de la grille zéro-un. Cela résout le problème (1) ci-dessus, ce qui rend les points qui ne font pas partie de la grille hexagonale égaux à zéro:
Enfin, ce tableau de nombres est converti en un tableau de caractères. Aucun caractère n'est affiché sous forme d'espace, ce qui donne le résultat final:
la source
JavaScript (ES6),
118117 octetsOù
\n
représente un caractère de nouvelle ligne littéral. Explication: Supposonsn=4
. Nous commençons par le carré de chiffres séparé par un espace suivant:Les premiers
|n-i|
0
s sont supprimés, mais les espaces restent:Hexagone instantané! Il suffit alors de calculer la valeur appropriée à la place de chacun
0
en vérifiant si nous sommes sur la première ou la dernière ligne et / ou colonne. Edit: 1 octet enregistré grâce à @Arnauld.la source
n=>{for(i=n+--n;i--;)console.log(' '.repeat(l=i>n?i-n:n-i)+(j=3+!l%n)+` ${l-n?6:4}`.repeat(2*n-l-1)+' '+j)}
3+!i%n
!Python 2,
125123 octetsLes tests sont sur idéone
Fonctionne du haut vers les rangées du milieu
for r in range(n)
, construisant des chaînes:- faisant deux coins ou deux bords
'34'[r%m>0]*2
,;- remplissage en les joignant à répétition
'6'
ou'4'
,'46'[r>0]*(r+m-1)
;- joindre les coins et les bords avec
' '
;- préfixer avec des espaces,
' '*(m-r)
;Imprime ensuite ceci et c'est la réflexion dans la rangée du milieu rejoint par de nouvelles lignes,
print'\n'.join(t+t[-2::-1])
la source
Python 2, 96 octets
Cela semble assez désordonné et quelque peu golfable ...
la source
Java,
375363361339329317293 octetsNon golfé
Utilisation :
Je suis sûr que l'horrible bloc imbriqué if-else peut être réécrit pour être plus petit, mais je ne peux pas le comprendre pour le moment. Toutes les suggestions sont les bienvenues :-)
Mise à jour
la source
Integer.parseInt
peut être joué au golfInteger.decode
.l=(h*4-3-s.trim().length())/2;if(l==0)
peut être joué au golfif((l=(h*4-3-s.trim().length())/2)==0)
. En outre, il est tout à fait acceptable de simplement publier une méthode sans classe (sauf indication contraire de la question), doncvoid f(int i){...use i...}
au lieu de celainterface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}
, cela devrait vous faire économiser quelques octets également. Quand j'aurai plus de temps, je regarderai plus loin.l=(h*4-3-s.trim().length())/2;if(l==0)
est en fait la même longueur avecif((l=(h*4-3-s.trim().length())/2)==0)
.05AB1E , 44 octets
Explication
Comme le haut et le bas de l'hexagone sont en miroir, il suffit de générer la partie supérieure.
Donc, pour une entrée de X, nous devons générer X lignes. C'est ce que fait la boucle principale.
Ensuite, nous faisons la partie centrale des rangées.
C'est 4 pour la première rangée et 6 pour le reste (car nous ne faisons que la partie supérieure).
Nous concaténons ce nombre avec un espace car le motif nécessitera un espacement entre les nombres.
Nous répétons ensuite cette chaîne X-2 + N fois, où N est la ligne actuelle indexée 0 et ajoutons un caractère espace sur le côté gauche.
Après cela, il est temps pour les virages. Ils seront 3 pour la première et la dernière rangée et 4 pour les rangées du milieu.
Maintenant, nous devons nous assurer que les lignes sont alignées correctement en ajoutant des espaces au début de chaque ligne. Le nombre d'espaces ajoutés sera X-1-N .
Maintenant que la partie supérieure de la grille est terminée, nous ajoutons les lignes à une liste, créons une copie inversée et supprimons le premier élément de cette copie (car nous n'avons besoin qu'une seule fois de la ligne centrale), puis fusionnons ces 2 listes et impression.
Essayez-le en ligne!
Solution supplémentaire, également 44 octets:
la source
Rubis, 87 octets
La fonction anonyme prend n comme argument et renvoie un tableau de chaînes.
Non testé dans le programme de test
Entrée via stdin. Écrit la forme entière sur stdout. Assez explicite.
la source
V , 60 octets
Essayez-le en ligne!
C'est vraiment trop long. Voici un hexdump, car il contient des caractères non imprimables:
la source
Raquette, 487 octets
Essai:
Version détaillée:
la source