(Il existe des questions connexes sur les tas de sable infinis et sur la recherche d'éléments d'identité des tas de sable .)
Étant donné une matrice d'entiers non négatifs, renvoyez une matrice de mêmes dimensions, mais renversée :
- Si la matrice ne contient aucune valeur supérieure à 4, renvoyez-la.
- Chaque "cellule" supérieure à 3 est réduite de 4, et toutes les cellules directement voisines (au-dessus, en dessous, à gauche et à droite) sont incrémentées, si elles existent.
- GOTO 1.
Exemples:
0 1 0 0 2 0
2 4 0 -> 3 0 1
0 0 3 0 1 3
1 2 3 2 3 4 2 5 1 4 1 2 0 3 3 0 3 3 0 3 3
4 5 6 -> 2 4 4 -> 4 2 3 -> 0 5 4 -> 3 2 1 -> 3 3 1 -> 3 3 2
7 8 9 5 7 7 2 6 5 4 3 2 0 5 3 1 1 4 1 2 0
(Il vous suffit de renvoyer le résultat final. Le chemin sur lequel vous l'atteignez peut différer de celui illustré ici: peu importe l'ordre dans lequel vous effectuez les opérations de basculement, ils conduisent tous au même résultat.)
Pour une explication plus approfondie et une motivation, voir cette vidéo Numberphile ou l'article Wikipedia sur le modèle de tas de sable abélien .
Règles:
- Vous pouvez prendre des entrées et des sorties de n'importe quelle manière standard
- Les échappatoires sont interdites
- L'entrée et la sortie peuvent être:
- une liste imbriquée:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- une liste simple:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
et la forme - une sorte de type de matrice native
- une chaîne, par exemple
1 2 3\n4 5 6\n7 8 9
- ou tout ce qui fonctionne dans votre langue.
- une liste imbriquée:
- L'entrée et la sortie doivent être sous la même forme
- L'entrée peut contenir des nombres plus grands que ceux indiqués ici, mais la taille peut être limitée par les limites de votre langue (équivalents MAXINT, le cas échéant)
- La matrice peut avoir n'importe quelle forme (par exemple 1x1, 2x2, 3x3, 4x4, 2x7, 11x3, ...)
- Vous n'avez pas besoin de gérer le cas où la forme est 0xN ou Nx0.
Cas de test
[[2, 5, 4], [8, 6, 4], [1, 2, 3]] -> [[3, 3, 0], [1, 2, 2], [1, 3, 2]]
[[0, 0, 2], [1, 3, 3], [0, 0, 0]] -> [[0, 0, 2], [1, 3, 3], [0, 0, 0]]
[[9, 9, 9], [9, 9, 9], [9, 9, 9]] -> [[1, 3, 1], [3, 1, 3], [1, 3, 1]]
[[4, 5], [2, 3]] -> [[2, 3], [0, 1]]
[[2, 3, 5], [2, 2, 0]] -> [[3, 0, 2], [2, 3, 1]]
[[7]] -> [[3]]
C'est codegolf , le code le plus court (par langue) l'emporte.
Réponses:
MATL , 17 octets
Essayez-le sur MATL Online! Ou vérifiez tous les cas de test .
Explication
Le programme répète autant de fois que la somme de l'entrée. Il s'agit d'une limite supérieure lâche sur le nombre d'itérations requis.
Pour chaque itération, des entrées dans la matrice de tas de sable dépassant
3
sont détectées, donnant une matrice de1
et0
, qui est convolue avec le masque à 4 voisins. Les entrées dépassant3
dans la matrice de tas de sable sont réduites de4
, et le résultat de la convolution est ajouté.Pour les dernières itérations, dans lesquelles la matrice de tas de sable n'a pas de nombres dépassant
3
, des zéros sont soustraits et ajoutés à elle, de sorte qu'elle n'est pas affectée.la source
Mathematica, 65 octets
Explication
Transformez à plusieurs reprises l'entrée en renversant toutes les piles supérieures à 3. Ce processus s'arrête automatiquement lorsque la transformation ne parvient pas à changer la matrice (c'est-à-dire lorsqu'il n'y a plus de grandes piles). Dans l'expression suivante, la matrice est appelée
s
.Créez une matrice qui a un
1
chaque fois que la matrice actuelle a un4
ou plus et un zéro sinon. Il s'agit essentiellement d'un masque qui indique quelles piles doivent être renversées. Appelle le masquex
.D'abord, nous calculons le nombre de sable ajouté à chaque tas en raison des tas voisins renversés. Cela se fait avec une convolution de la matrice suivante sur
x
:Essentiellement, il en ajoute un à la cellule actuelle pour chacun de ses voisins von-Neumann dans le masque.
Nous ajoutons le résultat précédent à
s
, puis nous en soustrayons quatre fois le masque pour réduire les piles renversées.la source
Octave, 65 octets
Cela ne semble pas très bon, il me manque des trucs ...
la source
input(0)
?>> version ans = 4.0.1
JavaScript (ES6),
10195 octetsPrend la largeur de la matrice
w
et un tableau de valeursa
dans la syntaxe de curry(w)(a)
. Renvoie un tableau de valeurs.Formaté et commenté
Cas de test
Afficher l'extrait de code
la source
JavaScript (ES6),
118114104 octetsSauvegardé 2 octets grâce à @Neil
la source
(i-=x)|y-j?i*i+
aide?a.find(...b.find(...c>3&&a.map(...)))&&f(a)
..map
ne mute pas ...f=a=>a.find((b,x)=>b.find((c,y)=>c>3&&a.map(b=>b.map((_,j)=>b[j]+=x|(j-=y)?x*x+j*j==1:-4)&x--)))&&f(a)
C ++,
261258250 octetsPrend l'entrée comme référence à un vecteur de vecteurs et le modifie directement.
Essayez-le en ligne!
la source