Permet de définir une matrice de 9 comme:
Permet de définir un nombre qui explose comme un nombre à la position qui peut être décomposé en entiers égaux entre tous ses voisins adjacents (y compris lui-même) et la valeur absolue de chaque partie est supérieure à 0.
De la matrice précédente, permet d'exploser le nombre à la position (0 indexé)
Parfois, décomposer le résultat en un nombre rationnel supérieur à 1. C'est quelque chose que nous devons éviter lors de l'explosion des nombres. Dans ce cas, le reste sera affecté au numéro éclaté.
Pour le démontrer, continuons à travailler avec notre matrice précédente. Cette fois, nous allons exploser le nombre en position
Ici, nous avons 3 quartiers et le numéro lui-même. Ici , l'équation est quelque chose comme qui nous donnent 2 pour chacun et 2 en reste.
De plus, parfois un nombre ne sera pas assez grand pour être décomposé en parties égales (où l'abs est supérieur à 0) entre ses voisins (| nombre rationnel | <1). Dans ce cas, nous devons "emprunter" au nombre éclaté afin de maintenir la condition "supérieur à 0" . Continuons avec notre exemple précédent et explosons le nombre à la position .
Le défi est, étant donné une liste de positions et un tableau fini non vide de nombres naturels, de renvoyer la forme éclatée après que chaque nombre de la liste de positions a été éclaté.
Cas de test
Contribution: initial matrix: [[3, 3, 3], [3, 3, 3], [3, 3, 3]], numbers: [[0,0],[0,1],[0,2]]
Sortie: [[1, 0, 1], [5, 6, 5], [3, 3, 3]]
Contribution: Initial matrix: [[9, 8, 7], [8, 9, 7], [8, 7, 9]], numbers: [[0,0],[1,1],[2,2]]
Sortie: [[4, 11, 8],[11, 5, 10],[9, 10, 4]]
Contribution: Initial matrix: [[0, 0], [0, 0]], numbers: [[0,0],[0,0],[0,0]]
Sortie: [[-9, 3],[3, 3]]
Contribution: Initial Matrix: [[10, 20, 30],[30, 20, 10],[40, 50, 60]], numbers: [[0,2],[2,0],[1,1],[1,0]]
Sortie: [[21, 38, 13], [9, 12, 21], [21, 71, 64]]
Contribution: Initial Matrix: [[1]], numbers: [[0,0]]
Sortie: [[1]]
Contribution: Initial Matrix: [[1, 2, 3]], numbers: [[0,0], [0, 1]]
Sortie: [[1, 1, 4]]
Remarques
Les règles d'entrée / sortie s'appliquent
Vous pouvez supposer que la matrice d'entrée ne sera jamais vide
Vous pouvez supposer que les coordonnées seront toujours valides
La coordonnée d'entrée dans les cas de test est donnée sous la forme (ligne, colonne). Si vous en avez besoin (x, y), vous pouvez échanger les valeurs. Si oui, veuillez l'indiquer dans votre réponse
Réponses:
C (GCC)
220216214212 octetscrédit à @ceilingcat pour 2 octets
Exécutez-le ici
une version légèrement moins golfée
Le code appelant avec un exemple
et la sortie
la source
JavaScript (ES7),
126 125 123121 121 octetsSauvegardé 2 octets grâce à @Shaggy
Prend l'entrée comme
(matrix)(list)
. Sorties en modifiant la matrice.Essayez-le en ligne!
Comment?
Au lieu de cela, nous utilisons une fonction récursive qui exécute un flux d'opérations plus simple, répété autant de fois que nécessaire:
Le principal avantage est que nous n'avons besoin que d'une boucle sur la matrice. Le deuxième avantage est que nous n'avons pas du tout à calculer de quotient.
Exemple
Après l' étape 1 de la première itération , nous avons:
Et après l' étape 2 de la première itération :
Après l' étape 1 de la deuxième itération , nous avons:
Et après l' étape 2 de la deuxième itération :
Étape 3 de la deuxième itération : cette fois, nous avons8 < 9 , nous nous arrêtons donc là.
Nous incrémentons maintenant la cellule de référence deux fois ( étape 4 des deux itérations ), conduisant au résultat final:
Commenté
la source
(0)
par 2 backticks.R ,
163162161159155 155146 octetsEssayez-le en ligne!
Explication
(Correspond à une version précédente du code)
la source
Nettoyer ,
181167 octetsEssayez-le en ligne!
Sous la forme d'un littéral de fonction partiellement appliqué.
Développé (première version):
la source
Rouille - 295 octets
Ceci est assez long car Rust nécessite une indexation entière non signée des vecteurs, mais oblige les entiers signés à effectuer une soustraction entraînant des négatifs. Cependant, je crois que mon algorithme est jusqu'à présent "l'algorithme le plus court". Il n'y a en fait pas besoin de gérer la détection des bords, du fond, etc.
Remarquez trois choses: premièrement, la somme de toutes les cellules est toujours constante. Deuxièmement, il s'agit d'une situation de division / reste, nous pouvons donc appliquer la pensée de style algorithme de Bresenham. Troisièmement, la question ajoute toujours le même nombre à toutes les cellules situées à une certaine distance de la cellule de position spéciale, avant de traiter les éléments "supplémentaires" dans la position spéciale.
Algorithme:
Stockez la valeur d'origine de la cellule à la position P dans M.
Commencer la boucle:
Itérer sur chaque cellule I de la matrice. Si la position de la cellule I est à moins de 3 quadrances (distance au carré) de la position P, soustrayez 1 de la cellule P et ajoutez 1 à la cellule I. Comptez combien de fois cela est fait en une seule itération à travers la matrice.
Si la valeur restante dans la cellule à la position P est inférieure ou égale à M / Count + M modulo Count, alors rompez la boucle. Sinon, recommencez la boucle.
La matrice résultante sera la version éclatée. Le comptage est essentiellement un moyen de compter les voisins sans traiter les bords. Le bouclage est un moyen de décomposer la substance de division / addition en une seule addition / soustraction répétée d'une seule. Le contrôle modulo garantit que nous aurons le reste approprié à la position P pour faire face aux «explosions» qui ne sont pas également réparties entre les voisins. La structure de boucle do / while permet à P <0 de fonctionner correctement.
Version non golfée sur le terrain de jeu de Rust
la source
f
. Mais vous pourriez probablement économiser encore plus d'octets, en utilisant une fonction anonyme:|p:(i8,i8),v:&mut Vec<Vec<i8>>|{...}
Java 10,
194193 193191190184182171 octetsPort itératif de la réponse JavaScript de @Arnauld .
-17 octets grâce à @Arnauld .
Modifie la matrice d'entrée au lieu d'en renvoyer une nouvelle pour économiser des octets.
Essayez-le en ligne.
Explication:
la source
m[y]
avecm[y][x]
avecundefined[x]
échouerait. Quoi qu'il en soit, votre(x-X)**2+(y-Y)**2<3
chèque est assez intelligent. Besoin de me rappeler que lorsque je veux vérifier des valeurs dans une matrice dans un bloc 3x3 (et dans des limites) autour d'elle. Je pense que j'ai en fait quelques réponses comme ça, où j'utilise maintenant un try-catch, et dans un cas, j'essaye enfin .. Je les examinerai quand j'aurai du temps.Lisp commun , 498 octets
Essayez-le en ligne!
Utilisez cette fonction comme
(print (c #2A((3 3 3) (3 3 3) (3 3 3)) '((0 0)(0 1)(0 2))))
Meilleure version lisible:
Exemple de sortie:
la source
Python 2 , 171 octets
Essayez-le en ligne!
la source