En el juego de estrategia "Hexplode" , los jugadores se turnan para colocar fichas en un tablero hexagonal. Una vez que la cantidad de fichas es igual a la cantidad de fichas adyacentes, esa ficha explota y mueve todas las fichas a los vecinos circundantes. Puedes jugar el juego en línea aquí .
Me gusta este juego, pero a veces es difícil saber exactamente cuántas fichas hay en un mosaico específico; Siempre estoy contando el número de vecinos. Sería realmente conveniente si tuviera un arte ASCII para ayudarme a recordar cuántas fichas hay en cada mosaico.
Usted tiene que escribir un programa o función que toma un entero positivo como entrada, y produce esta representación ASCII del hexágono de tamaño N . Cada mosaico será el número de vecinos que tiene ese mosaico. Dado que 1 es un caso de esquina extraño con cero vecinos, solo tiene que manejar entradas mayores que 1.
Puede tomar este número en cualquier formato razonable, como STDIN, argumentos de función, argumentos de línea de comandos, de un archivo, etc. La salida también puede estar en cualquier formato razonable, como imprimir en STDOUT, escribir en un archivo, regresar una lista de cadenas, una cadena separada por una nueva línea, etc.
Aquí hay algunos resultados de muestra para las primeras 5 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
Y el patrón continúa de manera similar. Como de costumbre, se aplican las lagunas estándar, ¡y la respuesta con el conteo de bytes más bajo se coronará como el ganador!
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](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>
Respuestas:
MATL ,
3937 bytesPruébalo en línea! O verificar todos los casos de prueba .
Explicación
¡Puedo usar la convolución nuevamente!
Considere la entrada
n = 3
. El código primero crea una matriz de tamaño4*n-3
×n
al agregar el vector de columna al vector[1; 2; ...; 9]
de fila[1, 2, 3]
con difusión. Esto significa calcular una matriz de matriz 2D de todas las adiciones por pares:Reemplazar números
1
pares por números impares0
da el patrón de tablero de ajedrezEsto se usará para generar (parte de) la cuadrícula hexagonal. Unos representarán puntos en la cuadrícula y los ceros representarán espacios.
La esquina superior derecha se elimina poniendo a cero todas las entradas por encima de la "diagonal" principal de la matriz:
En cuanto al elemento, al multiplicar esta matriz por una versión verticalmente invertida de sí misma, también se elimina la esquina inferior derecha. Transponer luego da
Esto comienza a parecerse a un hexágono. Usando simetría, la cuadrícula se extiende para producir la mitad superior:
Ahora necesitamos reemplazar cada entrada igual a una por el número de vecinos. Para esto usamos convolución con un vecindario 3 × 5 (es decir, el núcleo es una matriz de unos 3 × 5). El resultado,
tiene dos problemas (que se resolverán más adelante):
1
.El código ahora se agrega
47
a cada valor calculado. Esto corresponde a restar1
para resolver el problema (2) y sumar48
(ASCII para'0'
), que convierte cada número en el punto de código de su correspondiente carácter.La matriz resultante se multiplica por una copia de la cuadrícula cero. Esto resuelve el problema (1) anterior, haciendo que los puntos que no son parte de la cuadrícula hexagonal sean iguales a cero nuevamente:
Finalmente, este conjunto de números se convierte en un conjunto de caracteres. Los caracteres cero se muestran como espacio, lo que da el resultado final:
fuente
JavaScript (ES6),
118117bytesDonde
\n
representa un carácter de nueva línea literal. Explicación: supongamosn=4
. Comenzamos con el siguiente cuadrado de dígitos separados por espacios:Los primeros
|n-i|
0
s se eliminan, pero los espacios permanecen:Hexágono instantáneo! Entonces es suficiente calcular el valor apropiado en lugar de cada uno
0
verificando si estamos en la primera o última fila y / o columna. Editar: guardado 1 byte gracias a @Arnauld.fuente
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 bytesLas pruebas están en ideone
Corre desde la parte superior hasta las filas del medio
for r in range(n)
, construyendo cadenas:- haciendo dos esquinas o dos bordes
'34'[r%m>0]*2
,;- llenar por unirse a ellos con repetida
'6'
o'4'
,'46'[r>0]*(r+m-1)
;- unir las esquinas y bordes con
' '
;- anteponiendo con espacios,
' '*(m-r)
;Luego imprime esto y se refleja en la fila central unida por nuevas líneas,
print'\n'.join(t+t[-2::-1])
fuente
Python 2, 96 bytes
Esto se ve bastante desordenado y algo golfable ...
fuente
Java,
375363361339329317293 bytesSin golf
Uso :
Estoy seguro de que el horrible bloque if-else anidado se puede reescribir para que sea más pequeño, pero no puedo entenderlo en este momento. Cualquier sugerencia es bienvenida :-)
Actualizar
fuente
Integer.parseInt
se pueden jugarInteger.decode
.l=(h*4-3-s.trim().length())/2;if(l==0)
se puede jugar al golfif((l=(h*4-3-s.trim().length())/2)==0)
. Además, es completamente aceptable simplemente publicar un método sin clase (a menos que la pregunta indique lo contrario), por lo que, envoid f(int i){...use i...}
lugar deinterface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}
, eso también debería ahorrarle unos pocos bytes. Cuando tenga más tiempo, buscaré más.l=(h*4-3-s.trim().length())/2;if(l==0)
es en realidad la misma longitud conif((l=(h*4-3-s.trim().length())/2)==0)
.05AB1E , 44 bytes
Explicación
Como la parte superior e inferior del hexágono se reflejan, solo necesitamos generar la parte superior.
Entonces, para una entrada de X necesitamos generar X filas. Eso es lo que hace el bucle principal.
Luego hacemos la parte central de las filas.
Esto es 4 para la primera fila y 6 para el resto (ya que solo estamos haciendo la parte superior).
Concatenamos este número con un espacio ya que el patrón requerirá un espacio entre los números.
Luego repetimos esta cadena X-2 + N veces, donde N es la fila actual indexada en 0 y antepone un espacio en el lado izquierdo.
Después de esto es hora de las esquinas. Serán 3 para la primera y última fila y 4 para las filas del medio.
Ahora debemos asegurarnos de que las filas estén alineadas correctamente agregando espacios al frente de cada fila. El número de espacios agregados será X-1-N .
Ahora que hemos terminado la parte superior de la cuadrícula, agregamos las filas a una lista, creamos una copia invertida y eliminamos el primer elemento de esa copia (ya que solo necesitamos la fila central una vez), luego combinamos estas 2 listas juntas y impresión.
Pruébalo en línea!
Solución adicional, también 44 bytes:
fuente
Rubí, 87 bytes
La función anónima toma n como argumento y devuelve una matriz de cadenas.
Sin golf en el programa de prueba
Entrada a través de stdin. Escribe toda la forma en stdout. Bastante autoexplicativo.
fuente
V , 60 bytes
Pruébalo en línea!
Esto es realmente demasiado tiempo. Aquí hay un hexdump, ya que contiene caracteres no imprimibles:
fuente
Raqueta, 487 bytes
Pruebas:
Versión detallada:
fuente