No jogo de estratégia "Hexplode" , os jogadores se revezam colocando fichas em um tabuleiro hexagonal. Uma vez que o número de tokens seja igual ao número de blocos adjacentes, esse bloco é hexodificado e move todos os toques para os vizinhos vizinhos. Você pode jogar o jogo online aqui .
Eu gosto deste jogo, mas às vezes é difícil saber exatamente quantos tokens vão em um bloco específico; Eu estou sempre contando o número de vizinhos. Seria realmente conveniente se eu tivesse uma arte ASCII para me ajudar a lembrar quantos tokens vão em cada bloco.
Você precisa escrever um programa ou função que recebe um inteiro positivo como entrada e produz esta representação ASCII de hexágono de tamanho N . Cada bloco será o número de vizinhos que o bloco possui. Como 1 é um caso de canto estranho com zero vizinhos, você só precisa manipular entradas maiores que 1.
Você pode levar esse número em qualquer formato razoável, como STDIN, argumentos de função, argumentos de linha de comando, de um arquivo etc. A saída também pode estar em qualquer formato razoável, como imprimir em STDOUT, gravar em um arquivo, retornar uma lista de strings, uma nova linha separada, etc.
Aqui está um exemplo de saída para as 5 primeiras entradas:
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
E o padrão continua de maneira semelhante. Como de costume, as brechas padrão se aplicam e a resposta com a menor contagem de bytes será coroada a vencedora!
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:
# [><>](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>
Respostas:
MATL ,
3937 bytesExperimente online! Ou verifique todos os casos de teste .
Explicação
Eu uso convolução novamente!
Considere entrada
n = 3
. O código primeiro cria uma matriz de tamanho4*n-3
×n
adicionando o vetor de coluna[1; 2; ...; 9]
ao vetor de linha[1, 2, 3]
com broadcast. Isso significa calcular uma matriz de matriz 2D de todas as adições em pares:Substituir números pares por
1
e números ímpares0
fornece o padrão quadriculadoIsso será usado para gerar (parte da) grade hexagonal. Uns representam pontos na grade e zeros representam espaços.
O canto superior direito é removido zerando todas as entradas acima da "diagonal" principal da matriz:
A multiplicação de elementos desta matriz por uma versão invertida verticalmente remove também o canto inferior direito. A transposição dá então
Isso começa a parecer um hexágono. Usando simetria, a grade é estendida para produzir a metade superior:
Agora precisamos substituir cada entrada igual a uma pelo número de vizinhos. Para isso, usamos a convolução com uma vizinhança 3 × 5 (ou seja, o núcleo é uma matriz 3 × 5). O resultado,
tem dois problemas (que serão resolvidos posteriormente):
1
.O código agora adiciona
47
a cada valor calculado. Isso corresponde à subtração1
para resolver o problema (2) e adição48
(ASCII para'0'
), que converte cada número no ponto de código do seu caractere correspondente.A matriz resultante é então multiplicada por uma cópia da grade zero-um. Isso resolve o problema (1) acima, tornando os pontos que não fazem parte da grade hexagonal iguais a zero novamente:
Finalmente, essa matriz de números é convertida em uma matriz de caracteres. Zero caracteres são exibidos como espaço, o que dá o resultado final:
fonte
JavaScript (ES6),
118117 bytesOnde
\n
representa um caractere literal de nova linha. Explicação: Suponhan=4
. Começamos com o seguinte quadrado de dígitos separados por espaço:Os primeiros
|n-i|
0
s são excluídos, mas os espaços permanecem:Hexágono instantâneo! Basta calcular o valor apropriado no lugar de cada um
0
, verificando se estamos na primeira ou na última linha e / ou coluna. Editar: salvou 1 byte graças a @Arnauld.fonte
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 bytesOs testes estão em ideone
Percorre o topo até as linhas do meio
for r in range(n)
, construindo cordas:- fazendo dois cantos ou duas arestas
'34'[r%m>0]*2
;- enchimento, ligando-os com repetida
'6'
ou'4'
,'46'[r>0]*(r+m-1)
;- unir os cantos e bordas com
' '
;- precedido de espaços
' '*(m-r)
;Em seguida, imprime isso e é refletido na linha do meio unida por novas linhas,
print'\n'.join(t+t[-2::-1])
fonte
Python 2, 96 bytes
Isso parece muito bagunçado e um pouco jogável ...
fonte
Java,
375363361339329317293 bytesUngolfed
Uso :
Estou certo de que o horrível bloco aninhado if-else pode ser reescrito para ser menor, mas não consigo descobrir no momento. Todas as sugestões são bem-vindas :-)
Atualizar
fonte
Integer.parseInt
pode jogar golfeInteger.decode
.l=(h*4-3-s.trim().length())/2;if(l==0)
pode ser jogado golfe paraif((l=(h*4-3-s.trim().length())/2)==0)
. Além disso, é completamente aceitável postar apenas um método sem classe (a menos que a pergunta indique o contrário); portanto, aovoid f(int i){...use i...}
invés deinterface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}
, isso também deve economizar alguns bytes. Quando tiver mais tempo, procurarei mais.l=(h*4-3-s.trim().length())/2;if(l==0)
é realmente o mesmo comprimento comif((l=(h*4-3-s.trim().length())/2)==0)
.05AB1E , 44 bytes
Explicação
Como as partes superior e inferior do hexágono são espelhadas, precisamos gerar apenas a parte superior.
Portanto, para uma entrada de X , precisamos gerar X linhas. É isso que o loop principal faz.
Então fazemos a parte central das linhas.
Isso é 4 na primeira linha e 6 no restante (como estamos fazendo apenas na parte superior).
Concatenamos esse número com um espaço, pois o padrão exigirá espaçamento entre os números.
Em seguida, repetimos essa sequência X-2 + N vezes, em que N é a linha atual indexada em 0 e adicionamos um caractere de espaço no lado esquerdo.
Depois disso, é hora das curvas. Serão 3 na primeira e na última linha e 4 na linha do meio.
Agora, precisamos garantir que as linhas estejam alinhadas corretamente, adicionando espaços à frente de cada linha. O número de espaços adicionados será X-1-N .
Agora que já temos a parte superior da grade, adicionamos as linhas a uma lista, criamos uma cópia invertida e removemos o primeiro item dessa cópia (como precisamos apenas da linha central uma vez), depois juntamos essas duas listas e impressão.
Experimente online!
Solução adicional, também 44 bytes:
fonte
Ruby, 87 bytes
A função anônima recebe n como argumento e retorna uma matriz de seqüências de caracteres.
Ungolfed in program program
Entrada através de stdin. Grava toda a forma em stdout. Bastante auto-explicativo.
fonte
V , 60 bytes
Experimente online!
Isso é realmente muito longo. Aqui está um hexdump, pois contém caracteres não imprimíveis:
fonte
Raquete, 487 bytes
Teste:
Versão detalhada:
fonte