Crédit
Merci à Rand Al'Thor de poser une question par lettre pour l'inspiration pour ce défi de code-golf.
Contexte
La nature de ce défi est basée sur l'algorithme mentionné par Rand dans son "Un triangle formé de trois lettres":
- Commencez avec une séquence de 10 lettres dont chacune est X, Y ou Z.
- Sous chaque ligne, construisez la ligne suivante comme suit. Si deux lettres adjacentes sont identiques, écrivez la même lettre sous elles; s'ils sont différents, écrivez la troisième lettre sous eux.
Vous répéteriez alors l'étape précédente jusqu'à ce que vous ayez une lettre dans votre dixième rangée.
Défi
Nous allons mettre un spin mathématique sur l'algorithme ci-dessus:
- Commençons par une séquence de 10 chiffres, chacun séparé par un espace, et chacun étant soit 1, 2 ou 3.
- Sous chaque ligne, construisez la ligne suivante comme suit. Si deux chiffres adjacents sont identiques, écrivez le même chiffre sous eux; s'ils sont différents, écrivez le troisième chiffre sous eux.
- Répétez l'étape précédente jusqu'à ce que vous ayez un dernier numéro.
Ainsi, en suivant cet algorithme, si vous commencez par la ligne 1 2 3 3 1 3 1 3 1 2
, par exemple, le triangle suivant est généré:
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
Je suis également curieux de connaître la somme de tous les chiffres du triangle numérique, alors ajoutez tous ces chiffres et placez ce total sur une onzième ligne, justifié à droite au dernier chiffre de la première ligne. Ainsi, notre triangle numérique ressemblera à ce qui suit (les espaces dans mon exemple sont représentés ci-dessous par le .
caractère pour montrer la mise en forme.)
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
Votre défi est d'écrire du code qui peut commencer par une chaîne / un tableau / etc. de dix chiffres, comme dans mon exemple, puis appliquez l'algorithme pour générer les dix lignes qui créeraient le triangle numérique, suivi d'une 11e ligne qui afficherait le total de tous les chiffres avec une justification à droite.
Essai
Le test de cette chaîne peut être effectué avec une chaîne générée aléatoirement de dix chiffres de votre choix, ou une générée à partir de l'extrait ci-dessous ...
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.
Règles
- Les règles de code-golf s'appliquent, donc le plus petit nombre d'octets remporte le défi. Dans le cas où il y aurait deux entrées avec le même score faible, le gagnant sera attribué en fonction du nombre de votes positifs.
- Ce que nous cherchons essentiellement, c'est 11 lignes, 19 caractères ... La façon dont vous rendez votre sortie finale dépend entièrement de vous: tableau, console, sortie de fichier, STDOUT, etc., veuillez donc utiliser la méthode de sortie que vous souhaitez travailler à votre avantage. La seule règle dans la sortie est que nous avons 11 lignes avec 19 caractères dans chaque ligne dans un format similaire à celui ci-dessus ...
- Si cela aide votre code, utilisez n'importe quel séparateur pour les chiffres ... N'oubliez pas que la lisibilité peut être un facteur contributif.
- Pas de failles idiotes .
- Le codage en dur de l'entrée n'est pas autorisé. Le but de ce code est tel qu'il peut être utilisé pour produire des résultats différents à chaque fois avec une entrée variable. Le codage en dur de,
1 1 1 1 1 1 1 1 1 1
par exemple, annule complètement le point entier de l'algorithme.
Au plaisir de voir ce que vous pourrez tous trouver!
Réponses:
05AB1E ,
3226 octetsExplication
Essayez-le en ligne!
la source
Mathematica,
104979094 octetsExplication
Partitionne l'entrée en longueur 2, décalez 1 partition.
Prend chaque partition et calcule la sortie correspondante.
Un truc impliqué ici. J'ai additionné les deux nombres, pris le mod 3 et soustrait le résultat de 3. Cela donne le nombre souhaité. (par exemple 3 - ((2 + 1) mod 3) = 3)
Répète le processus ci-dessus neuf fois, donnant toutes les itérations en sortie.
Formatez chaque itération en lignes et mettez le tout dans une colonne (aligné au centre), créant un triangle.
Prenez le total de tous les nombres.
Combinez le triangle et le total et alignez le tout à droite (le triangle est déjà aligné, donc son alignement n'est pas affecté).
la source
JavaScript (ES6),
143142 octets1 octet enregistré grâce à @Neil
J'ai essayé de combiner différentes parties, mais cela a fini par 5 octets de plus:
la source
3-((x+y)%3)
aider à réduire ce code?p^c||p
est déjà un peu plus court :-)i?p^(p=c)||p:c
pouvez-vous utiliseri&&p^(p=c)||c
?Rubis,
134101 octetsUtiliser l'astuce modulo de JHM.
Voir sur eval.in: https://eval.in/649993
la source
CJam ,
4440 octetsEssayez-le en ligne!
Explication
la source
Python 2, 164 octets
Une solution itérative relativement simple.
Essayez-le en ligne
la source
PHP, 143 octets
la source
JavaScript (ES6),
11210096 octetsPrend un tableau en entrée et crée récursivement un triangle séparé par des virgules.
la source