Nombre de triangles

11

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

  1. 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.
  2. 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 ...
  3. 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.
  4. Pas de failles idiotes .
  5. 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 1par exemple, annule complètement le point entier de l'algorithme.

Au plaisir de voir ce que vous pourrez tous trouver!

WallyWest
la source
1
Ai-je besoin d'un séparateur si mon triangle est aligné au centre (ce qui est donc lisible)?
JungHwan Min
1
Cela ressemble à ceci sans l'espace (ma réponse a de l'espace, ce qui prend 10 octets).
JungHwan Min
2
Permission accordée
WallyWest
1
Notez que pour une chaîne de 10 (ou tout nombre 1 supérieur à une puissance de 3) chiffres, le dernier chiffre est calculé trivialement à partir du premier et du dernier chiffre de la chaîne; les autres chiffres ne font aucune différence.
Neil

Réponses:

1

05AB1E , 32 26 octets

DvÐOˆðýðN×.ø,ü+3%3^}\¯O19j

Explication

D                 # duplicate input
v                 # for y,N in input,len(input): (10 times do)
 Ð                # triplicate current list
 Oˆ               # sum one copy and add it to global array
 ðý               # merge one copy on spaces
   ðN×.ø          # surround it with N spaces
        ,         # and print it
 ü+               # reduce one copy by addition
   3%             # modulus 3
     3^           # XOR 3
                  # this is the list sent to the next iteration
}                 # end loop
\                 # drop empty list left over from last iteration of loop
 ¯O               # sum the global array giving the triangles total sum
   19j            # join with spaces up to 19 chars

Essayez-le en ligne!

Emigna
la source
7

Mathematica, 104 97 90 94 octets

{Grid[List@*Row/@#],#~Total~2}~Column~Right&[NestList[3-Mod[+##,3]&@@@Partition[#,2,1]&,#,9]]&

Explication

Partition[#,2,1]

Partitionne l'entrée en longueur 2, décalez 1 partition.

3-Mod[+##,3]&@@@

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)

NestList[ ... ,9]

Répète le processus ci-dessus neuf fois, donnant toutes les itérations en sortie.

Grid[List@*Row/@#]

Formatez chaque itération en lignes et mettez le tout dans une colonne (aligné au centre), créant un triangle.

#~Total~2

Prenez le total de tous les nombres.

{...}~Column~Right

Combinez le triangle et le total et alignez le tout à droite (le triangle est déjà aligné, donc son alignement n'est pas affecté).

JungHwan Min
la source
1
Approche inspirée avec une seule fonction qui prend en charge à la fois les types de parents identiques et différents ... J'aime ça!
WallyWest
3

JavaScript (ES6), 143 142 octets

1 octet enregistré grâce à @Neil

a=>a.map((_,i)=>(q=" ".repeat(i))+(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+q,x=0).join`
`+`
`+(" ".repeat(18)+x).slice(-19)

J'ai essayé de combiner différentes parties, mais cela a fini par 5 octets de plus:

a=>[...a.map((_,i)=>(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+" ".repeat(i),x=0),x].map(q=>(" ".repeat(18)+q).slice(-19)).join`
`
ETHproductions
la source
Bon travail! L'astuce de JHM pourrait-elle 3-((x+y)%3)aider à réduire ce code?
WallyWest
2
Nan. p^c||pest déjà un peu plus court :-)
ETHproductions
Maintenant, comment diable ai-je pu manquer ça? Bien sûr! Les fonctions XOR fonctionnent bien ici!
WallyWest
1
XOR?! Je n'aurais pas pu y penser. Cela étant dit, malheureusement, l'utilisation de XOR
allonge
Pour i?p^(p=c)||p:cpouvez-vous utiliser i&&p^(p=c)||c?
Neil
2

Rubis, 134 101 octets

Utiliser l'astuce modulo de JHM.

->a{b=*a
(0..8).map{|i|[" "*i,a=a.each_cons(2).map{|x,y|b<<n=3-(x+y)%3
n}]*" "}<<"%19d"%b.reduce(:+)}

Voir sur eval.in: https://eval.in/649993

Jordan
la source
2

CJam ,  44  40 octets

l~{S*\_S*\2ew{:+3%3^}%2$N@}A%_s:~:+sJSe[

Essayez-le en ligne!

Explication

l~       e# Read and evaluate input.
{        e# Map this block over i in the range [0 1 ... 9].
  S*     e#   Get a string of i spaces (the indentation).
  \_     e#   Swap with the current line of trits and duplicate it.
  S*     e#   Join the trits with spaces.
  \2ew   e#   Swap with the other copy of the trits and get all consecutive pairs.
  {      e#   Map this block over the pairs...
    :+   e#     Sum the pair.
    3%   e#     Modulo 3.
    3^   e#     XOR 3.
         e#     This expression (x+y)%3 ^ 3 computes the required mapping.
  }%     e#   Now this is the next line.
  2$     e#   Copy the indentation (to pad the lines to equal length).
  N      e#   Push a linefeed.
  @      e#   Pull up the next line.
}A%      e# The result of this is a nested array whose string representation is
         e# the required triangle.
_s       e# Duplicate and flatten into a string.
:~       e# Eval each character which gives a list of all the trits.
:+       e# Sum that.
s        e# Turn the sum into a string.
JSe[     e# Left-pad it with spaces to width 19.
Martin Ender
la source
Comme toujours, très impressionnant! Vous êtes en tête jusqu'à présent!
WallyWest
1
@WallyWest Merci. :) Attendez juste Pyth, Jelly et MATL. ;)
Martin Ender
En fait, je suis curieux de savoir à quoi ressemblera la solution GolfScript ...;)
WallyWest
Oh, quelqu'un peut-il publier une solution SQL? ;)
WallyWest
1

Python 2, 164 octets

Une solution itérative relativement simple.

L=input()
s=0
for i in range(len(L)):
    print" "*-~i+" ".join(`L`[1::3]);s+=sum(L);N=L;L=[]
    for a,b in zip(N,N[1:]):L+=[list({1,2,3}-{a,b}),[a]][a==b]
print"%19s"%s

Essayez-le en ligne

mbomb007
la source
1

PHP, 143 octets

<?for($t=$_GET[t];$i<181;$s+=$v,$i+=2)$t[$i+20]=($v=$t[$i])*($z=$t[$i+2])>0&$i!=18?($v+$z)%3^3:" ";echo chunk_split($t.str_pad($s,8," ",0),19);
Jörg Hülsermann
la source
0

JavaScript (ES6), 112 100 96 octets

Prend un tableau en entrée et crée récursivement un triangle séparé par des virgules.

f=(s,p=`
`,S=0)=>p+(s[0]?s+f(s.map((v,i)=>(S+=v,v^s[i-1]||v)).slice(1),p+' ',S):(p+S).slice(-9))

console.log(f([1,2,3,3,1,3,1,3,1,2])); // reference example
console.log(f([3,3,2,1,3,1,2,1,2,1])); // random example
console.log(f([1,1,1,1,1,1,1,1,1,1])); // all ones (test case for sum < 100)

Arnauld
la source