Crédito
Mi agradecimiento a la pregunta basada en cartas de Rand Al'Thor por la inspiración para este desafío de código de golf.
Antecedentes
La naturaleza de este desafío se basa en el algoritmo mencionado por Rand en su "Un triángulo formado por tres letras":
- Comience con una secuencia de 10 letras, cada una de las cuales es X, Y o Z.
- Debajo de cada fila, construya la siguiente fila de la siguiente manera. Si dos letras adyacentes son iguales, escriba la misma letra debajo de ellas; Si son diferentes, escriba la tercera letra debajo de ellos.
Luego repetirías el paso anterior hasta que tengas una letra en tu décima fila.
Desafío
Vamos a darle un giro matemático al algoritmo anterior:
- Comencemos con una secuencia de 10 dígitos, cada uno separado por un espacio, y cada uno de los cuales es 1, 2 o 3.
- Debajo de cada fila, construya la siguiente fila de la siguiente manera. Si dos dígitos adyacentes son iguales, escriba el mismo dígito debajo de ellos; si son diferentes, escriba el tercer dígito debajo de ellos.
- Repita el paso anterior hasta que tenga un número final.
Entonces, siguiendo este algoritmo, si comienza con la fila 1 2 3 3 1 3 1 3 1 2
, por ejemplo, se genera el siguiente triángulo:
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1 2 3 3 1 3 1 3 1 2
3 1 3 2 2 2 2 2 3
2 2 1 2 2 2 2 1
2 3 3 2 2 2 3
1 3 1 2 2 1
2 2 3 2 3
2 1 1 1
3 1 1
2 1
3
También tengo curiosidad por saber la suma de todos los dígitos en el triángulo numérico, así que agregue todos estos dígitos y coloque este total en la undécima fila, justificada a la derecha hasta el último dígito en la primera fila. Entonces, nuestro triángulo numérico tendrá un aspecto similar al siguiente (los espacios en mi ejemplo están representados a continuación por el .
carácter para mostrar el formato).
Input: 1 2 3 3 1 3 1 3 1 2
Output:
1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109
Su desafío es escribir código que pueda comenzar con una cadena / matriz / etc. de diez dígitos, según mi ejemplo, y luego aplique el algoritmo para generar las diez filas que crearían el triángulo numérico, seguido de una fila 11 que mostrará el total de todos los dígitos con justificación a la derecha.
Pruebas
La prueba de esta cadena se puede realizar con una cadena generada aleatoriamente de diez dígitos de su elección, o una generada a partir del fragmento a continuación ...
c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");
$("#btn").click(function(){
$("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.
Reglas
- Se aplican las reglas de código de golf, por lo que el menor número de bytes gana el desafío. En el caso de que haya dos entradas con el mismo puntaje bajo, el ganador se otorgará en función del número de votos positivos.
- Básicamente, lo que buscamos son 11 filas, 19 caracteres de largo ... La forma en que renderiza su salida final depende completamente de usted: matriz, consola, salida de archivo, STDOUT, etc., así que use el método de salida que desee trabaja a tu favor. La única regla en el resultado es que tenemos 11 filas con 19 caracteres en cada fila en un formato similar al anterior ...
- Si ayuda a su código, use cualquier separador para los dígitos ... Solo recuerde que la legibilidad puede ser un factor contribuyente.
- No hay escapatorias tontas .
- La codificación rígida de la entrada no está permitida. El propósito de este código es tal que puede usarse para producir resultados diferentes cada vez con una entrada variable. La codificación rígida de,
1 1 1 1 1 1 1 1 1 1
por ejemplo, niega por completo el punto completo del algoritmo.
¡Esperamos ver lo que todos ustedes pueden inventar!
Respuestas:
05AB1E ,
3226 bytesExplicación
Pruébalo en línea!
fuente
Mathematica,
104979094 bytesExplicación
Particiona la entrada en longitud 2, compensa 1 particiones.
Toma cada partición y calcula la salida correspondiente.
Un truco involucrado aquí. Agregué los dos números, tomé el mod 3 y resté el resultado de 3. Eso da el número deseado. (por ejemplo, 3 - ((2 + 1) mod 3) = 3)
Repite el proceso anterior nueve veces, dando todas las iteraciones como salida.
Formatee cada iteración en filas y coloque todo en una columna (alineada al centro), creando un triángulo.
Toma el total de todos los números.
Combine el triángulo y el total, y alinee a la derecha todo (el triángulo ya está alineado, por lo que su alineación no se ve afectada).
fuente
JavaScript (ES6),
143142 bytesGuardado 1 byte gracias a @Neil
Intenté combinar varias partes, pero terminó 5 bytes más:
fuente
3-((x+y)%3)
ser de alguna ayuda para reducir este código?p^c||p
ya es un poco más corto :-)i?p^(p=c)||p:c
qué puedes usari&&p^(p=c)||c
?Ruby,
134101bytesUsando el truco del módulo de JHM.
Véalo en eval.in: https://eval.in/649993
fuente
CJam ,
4440 bytesPruébalo en línea!
Explicación
fuente
Python 2, 164 bytes
Una solución iterativa relativamente simple.
Pruébalo en línea
fuente
PHP, 143 bytes
fuente
JavaScript (ES6),
11210096 bytesToma una matriz como entrada y construye recursivamente un triángulo separado por comas.
fuente