La tornade matricielle est comme toute autre tornade: elle est constituée de choses tournant autour d'un centre. Dans ce cas, des éléments de la matrice au lieu de l'air.
Voici un exemple de tornade matricielle:
Tout d'abord, nous commençons par sectionner la matrice en anneaux carrés, chaque section est constituée d'éléments qui sont plus éloignés de la frontière de la même distance. Ces sections seront tournées dans le sens horaire autour du centre. Dans les vraies tornades, la gravité augmente vers le centre, tout comme l'étape de rotation dans une tornade à matrice: la section la plus à l'extérieur (la rouge) est tournée d'un pas, la suivante (la jaune) est tournée de 2, et ainsi de suite sur. Une étape de rotation est une rotation de 90 ° autour du centre.
Tâche:
Votre tâche, si vous l'acceptez, consiste à écrire une fonction ou un programme qui prend en entrée une matrice carrée, à lui appliquer l'effet de tornade puis à sortir la matrice résultante.
Contribution:
L'entrée doit être une matrice carrée d'ordre n
où n >= 1
. Aucune hypothèse n'est à faire sur les éléments de la matrice, ils pourraient être n'importe quoi.
Sortie:
Une matrice carrée du même ordre qui serait le résultat de l'application de l'effet tronado à la matrice d'entrée.
Exemples:
Une matrice d'ordre n = 1
:
[['Hello']] ===> [['Hello']]
Une matrice d'ordre n = 2
:
[[1 , 2], ===> [[5 , 1],
[5 , 0]] [0 , 2]]
Une matrice d'ordre n = 5
:
[[A , B , C , D , E], [[+ , 6 , 1 , F , A],
[F , G , H , I , J], [- , 9 , 8 , 7 , B],
[1 , 2 , 3 , 4 , 5], ===> [/ , 4 , 3 , 2 , C],
[6 , 7 , 8 , 9 , 0], [* , I , H , G , D],
[+ , - , / , * , %]] [% , 0 , 5 , J , E]]
;)
Réponses:
Python 3 , 100 octets
Essayez-le en ligne!
la source
a[1:-1,1:-1]=f(a[1:-1,1:-1])
comme si c'était la chose la plus normale au monde pour obtenir et définir directement l'intérieur d'un tableau à 2 dimensionsnumpy
numpy.rot90(a,1,(1,0))
est plus court de 3 octets et devrait également fonctionner.if len(a):a=...
-1 octet).Fusain , 44 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Fonctionne uniquement sur les carrés de caractères car les E / S par défaut de Charcoal ne rendent pas justice aux tableaux normaux. Explication:
Lisez le carré des caractères.
Boucle jusqu'à ce qu'elle soit vide.
Faire pivoter.
Imprimez-le, mais déplacez ensuite le curseur sur un carré en diagonale depuis le coin d'origine.
Coupez l'extérieur du tableau.
la source
Gelée , 27 octets
Essayez-le en ligne!
Je pense que cela pourrait être beaucoup plus court.
la source
µG
le pied de page et affirmer que votre soumission est de 25.Perl 6 ,
78 7372 octetsMerci à nwellnhof pour -5 octets!
Essayez-le en ligne!
Bloc de code récursif qui prend un tableau 2D aplati et renvoie un tableau aplati similaire.
Explication:
la source
@a[*;*]
au lieu demap |*,@a
pour aplatir le tableau. (Ce serait bien s'il y avait un moyen de travailler avec des tableaux non aplatis et des indices multidimensionnels, mais je ne peux pas y penser.)@a[1..*-2;1..@a-2].=$!
marche.Octave ,
8681 octetsEssayez-le en ligne!
Je suis conscient que les fonctions anonymes récursives ne sont pas la méthode la plus courte pour faire des choses dans Octave, mais elles sont de loin la méthode la plus amusante . C'est la fonction anonyme la plus courte que j'ai pu trouver, mais j'aimerais être dépassé.
Explication
La fonction récursive est définie selon cette réponse de conseils par le plafond.
q=f(f=@(g)@(M) ... g(g)(M) ...
est la structure de base d'une telle fonction anonyme, avecg(g)(M)
l'appel récursif. Depuis cela indéfiniment récursif, nous terminerons l'appel récursif dans un réseau de cellules sous condition:{@()g(g)(M),M}{condition}()
. La fonction anonyme avec une liste d'arguments vide retarde l'évaluation après la sélection de la condition (bien que plus tard, nous voyons que nous pouvons utiliser cette liste d'arguments pour la définirz
). Jusqu'à présent, il s'agissait simplement d'une comptabilité de base.Maintenant, pour le travail réel. Nous voulons que la fonction retourne
rot90(P,-1)
avec P une matrice sur laquelleg(g)
a été récursivement appelée la partie centrale de M. Nous commençons par définirz=2:end-1
ce que nous pouvons cacher dans l'indexation de M. De cette façon,M(z,z)
sélectionne la partie centrale de la matrice qui doit être être encore tornado par un appel récursif. La,3
pièce garantit que les rotations sont dans le sens horaire. Si vous vivez dans l'hémisphère sud, vous pouvez supprimer ce bit pour -2 octets.Nous faisons alors
M(z,z)=g(g)M(z,z)
. Cependant, la valeur de résultat de cette opération n'est que la partie centrale modifiée plutôt que laP
matrice entière . Par conséquent, nous faisons{M(z,z)=g(g)M(z,z),M}{2}
ce qui est essentiellement volé de cette réponse de conseils par Stewie Griffin.Enfin,
condition
c'est juste que la récursivité s'arrête lorsque l'entrée est vide.la source
R , 87 octets
Essayez-le en ligne!
la source
seq(0.5)
renvoie 1 au lieu d'un vecteur vide)MATL ,
25 24 2322Essayez-le en ligne!
L'indexation en MATL n'est jamais facile, mais avec un peu de golf, elle bat en fait la meilleure réponse actuelle de Jelly ...
* Pour une
n x n
matrice, ce programme nen
itérations, alors que vous n'avez vraiment besoin que den/2
rotations. Cependant, l'indexation dans MATL (AB) est suffisamment flexible pour que l'indexation des plages impossibles soit juste un no-op. De cette façon, il n'est pas nécessaire de gaspiller des octets pour obtenir le bon nombre d'itérations.la source
Python 2 , 98 octets
Essayez-le en ligne!
la source
K (ngn / k) ,
413938 octetsEssayez-le en ligne!
{
}
fonction avec argumentx
#x
longueur dex
- la hauteur de la matrice2##x
deux copies - hauteur et largeur (supposées identiques)s:
affecter às
pour "forme"!s
tous les indices d'une matrice de formes
, par exemple ,!5 5
estIl s'agit d'une matrice à 2 lignes (liste de listes) et ses colonnes correspondent aux indices dans une matrice 5x5.
&/
minimum sur les deux rangées:i&|i:
assigneri
, inverser (|
) et prendre des minima (&
) aveci
Ce sont les nombres d'anneaux aplatis d'une matrice 5x5:
4!1+
ajouter 1 et prendre des restes modulo 4(+|:)
est une fonction qui tourne en inversant (|
- nous avons besoin de le:
pour le forcer à être monadique) puis en transposant (+
- puisque ce n'est pas le verbe le plus à droite dans le "train", nous n'avons pas besoin d'un:
)4(+|:)\x
l'appliquer 4 foisx
, en préservant les résultats intermédiaires,/'
aplatir chacun+
transposer(
)@'
indexer chaque valeur à gauche avec chaque valeur à droites#
remodeler ens
la source
JavaScript (ES6), 99 octets
Essayez-le en ligne!
Comment?
tandis que les autres restent inchangés.
Cela équivaut à dire qu'une cellule n'est pas tournée si nous avons:
qui est le test utilisé dans le code:
la source
Gelée , 24 octets
Essayez-le en ligne!
- Lynn
la source
ḷ""
me semble magique ^^ vous voulez ajouter une explication?ḷ""
magique. C'est justeḷ"
avec un extra"
... oh, il y a une légère possibilité quiḷ"
est aussi quelque chose que j'ai "inventé" qui n'a pas été beaucoup utilisé car il peut souvent être remplacé par un seul atome (pas dans ce cas, comme le peut0
également contenir ).Haskell , 108 octets
Essayez-le en ligne!
J'ai utilisé la transposition de Laikoni et l' ai légèrement modifiée pour faire pivoter un tableau de 90 °:
Explication
r
fait pivoter un réseau de 90 °.(!)
est une fonction de niveau supérieur: «appliquer au centre».g![1,2,3,4,5]
est[1] ++ g[2,3,4] ++ [5]
.f
est la fonction tornade: les cas de base sont de taille 1 et 2 (en quelque sorte, 0 ne fonctionne pas).La dernière ligne est l'endroit où la magie opère: nous appliquons
r.r.r.(f!).r
sur les rangées du milieux
puis tournons le résultat. Appelons les lignes du milieu M . Nous voulons revenir sur les colonnes centrales de M , et pour y arriver, nous pouvons faire pivoter M et ensuite utiliser(f!)
. Ensuite, nous utilisonsr.r.r
pour faire revenir M dans son orientation d'origine.la source
Java 10,
198192 octets-6 octets grâce à @ceilingcat .
Essayez-le en ligne.
Explication:
b
est essentiellement utilisé pour indiquer à quel anneau nous nous trouvons. Et il fera ensuite tourner cet anneau, y compris tout ce qu'il contient une fois dans le sens des aiguilles d'une montre à chaque itération.Le remplacement de la matrice d'entrée se fait parce que Java est passe-par-référence, donc un simple réglage
r=m
signifierait que les deux matrices sont modifiées lors de la copie à partir de cellules, provoquant des résultats incorrects. Nous devons donc créer une nouvelleObject
matrice (nouvelle référence) et copier les valeurs dans chaque cellule une par une à la place.la source
MATLAB, 93 octets
Je suis sûr que cela peut être joué un peu plus en quelque sorte.
Explication
la source
C (gcc) ,
128118115 octets-15 octets de @ceilingcat
Essayez-le en ligne!
la source
Haskell, 274 octets
w
est la fonction principale, qui a le type[[a]] -> [[a]]
que vous attendez.Je suis sûr qu'un golfeur Haskell plus expérimenté pourrait améliorer cela.
la source