L'idée
Nous avons déjà fait des spirales matricielles, et des rotations complètes, et même des rotations diagonales , mais pas, autant que je sache, des rotations de serpents !
Qu'est-ce qu'une rotation de serpent?
Imaginez les rangées d'une matrice serpentant d'avant en arrière, avec des séparateurs entre eux comme les séparateurs d'une longue file d'attente:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15|
+------------ |
20 19 18 17 16|
+--------------+
Imaginez maintenant faire pivoter ces éléments par 2. Chaque élément avance, comme les personnes se déplaçant en ligne, et les éléments à la fin se répandent et reviennent au début:
+--------------+
--> 19 20 1 2 3|
+------------ |
| 8 7 6 5 4|
| +-----------+
| 9 10 11 12 13|
+------------ |
<-- 18 17 16 15 14|
+--------------+
S'il y a un nombre impair de lignes, il sortira par la droite, mais continuera au début. Par exemple, voici une rotation de 3:
+--------------+
1 2 3 4 5|
+------------ |
|10 9 8 7 6|
| +-----------+
|11 12 13 14 15
+--------------+
+--------------+
--> 13 14 15 1 2|
+------------ |
| 7 6 5 4 3|
| +-----------+
| 8 9 10 11 12 -->
+--------------+
Une rotation négative vous fera reculer. Voici une rotation de -2:
+--------------+
<-- 3 4 5 6 7|
+------------ |
|12 11 10 9 8|
| +-----------+
|13 14 15 1 2 <--
+--------------+
Le défi
Votre fonction ou programme prendra 2 entrées, dans n'importe quel format pratique:
- Une matrice
- Un entier (positif ou négatif) indiquant le nombre d'emplacements pour le faire pivoter.
Il renverra:
- La matrice tournée
Remarques:
- Code golf. Le moins d'octets gagne.
- Les matrices n'ont pas besoin d'être carrées, mais contiendront au moins 2 lignes et 2 colonnes
- Les entiers positifs feront pivoter la ligne 1 vers la droite
- Les entiers négatifs feront pivoter la ligne 1 vers la gauche
- Vous pouvez inverser la signification des nombres de rotation positifs / négatifs, si cela vous convient
- Le numéro de rotation peut être supérieur au nombre d'articles. Dans ce cas, il se terminera. Autrement dit, il sera équivalent au nombre modulo le nombre d'articles.
- La matrice ne contiendra que des entiers, mais elle peut contenir des entiers, y compris des répétitions
Cas de test
Format:
- Matrice
- Numéro de rotation
- Valeur de retour attendue
4 5
6 7
1
6 4
7 5
2 3 4 5
6 7 8 9
10 11 12 13
-3
5 9 8 7
12 11 10 6
13 2 3 4
8 8 7 7
5 5 6 6
10
5 5 8 8
6 6 7 7
Réponses:
Gelée , 10 octets
Un lien dyadique acceptant le marix à gauche et l'entier de rotation à droite (utilise le sens inverse de positif / négatif)
Essayez-le en ligne!
Comment?
la source
R ,
121110101 octetsEssayez-le en ligne!
Procédure pas à pas
la source
Python 3.8 (pré-version SSSS) , 119 octets
Une fonction sans nom acceptant
matrix, rotation
qui donne la nouvelle matrice.Utilise le signe de rotation opposé.
Essayez-le en ligne!
Comment?
Nous avons configuré
n=-1
upfront pour économiser sur les parenthèses plus tard et prendre la matrice commem
et la rotation commer
.Une nouvelle matrice est construite avec les mêmes dimensions que
m
- avec une largeur dew
(w:=len(m[0])
) et une hauteur deh
(h:=len(m)
).Toutes les autres lignes de cette matrice sont inversées (
[::n**j]
).Les valeurs sont recherchées en calculant leur ligne et leur colonne dans l'original, en
m
utilisant la ligne d'éléments actuelle,,i
et la colonne,j
...Nous nous sommes mis
s
àr+i
etk
à(j+s//w)%h
.k
est la ligne de l'original à laquelle accéder pour notre élément actuel.Afin d'accéder facilement aux lignes indexées impaires à partir de la droite, nous inversons ces lignes avant d'accéder à leurs éléments (avec
[:n**k]
), cela signifie que l'élément d'intérêt est às%w
.la source
J ,
413021 octets-11 octets grâce à Jonah!
-9 octets grâce à FrownyFrog & ngn!
Essayez-le en ligne!
Renversé
+/-
la source
$@]t@$(|.,@(t=.#\,`(|.@,)/.]))
( Essayez-le en ligne! )&.
perdre l'argument de gauche tout le temps, c'est pourquoi j'ai abandonné.JavaScript (Node.js) , 102 octets
Prend l'entrée comme
(matrix)(integer)
. La signification du signe de l'entier est inversée.Essayez-le en ligne!
Fonction d'assistance
Fonction principale
la source
05AB1E , 16 octets
Essayez-le en ligne!
Merci à Emigna pour -5. Malheureusement, je ne vois pas comment jouer la partie redondante. :(
la source
Fusain , 36 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Inversez les lignes alternées de l'entrée.
Aplatissez le tableau.
Faites pivoter le réseau aplati.
Divisez le tableau en lignes.
Inversez les rangées alternées.
Convertissez chaque entrée en chaîne et sortez dans le format de sortie par défaut qui est un nombre par ligne avec des lignes à double interligne. (Le formatage avec un séparateur coûterait la longueur du séparateur.)
la source
Pyth, 20 octets
Essayez-le en ligne ici .
la source
Japt , 28 octets
Essayez-le
Réponse du port d' Arnauld . Le plus grand défi était de créer une fonction réutilisable. En particulier, il existe une fonction d'aide pour inverser toutes les autres lignes. L'approche que je prends est de faire un appel récursif et selon qu'une variable est définie ou non.
Transpiled JS:
la source
Python 3 , 94 octets
Essayez-le en ligne!
Utilisé l'inversion de ligne impaire de la réponse de Jonathan Allan .
la source
APL (Dyalog Classic) , 20 octets
Essayez-le en ligne!
la source
C # (Visual C # Interactive Compiler) , 141 octets
Essayez-le en ligne!
-5 octets au total grâce à @someone!
Fonction anonyme qui effectue une modification sur place de la matrice d'entrée.
Une boucle unique parcourt les cellules. Vous pouvez numériser de haut en bas et de gauche à droite en utilisant les formules suivantes:
row=i/w
col=i%w
Où
i
est un compteur de boucles etw
le nombre de colonnes. Cela varie légèrement lors de la numérisation dans un motif de serpent.row=i/w
col=i%w
(0e, 2e, 4e, etc. rangée)col=w-i%w-1
(1ère, 3ème, 5ème, etc. rangée)Une autre chose à noter est que
%
dans C # ne se convertit pas en une valeur positive comme il le fait dans certains autres langages. Quelques octets supplémentaires sont nécessaires pour tenir compte de cela.la source
dynamic
; commenter aussi l. Essayez-le en ligne!var
pour le golf qui ne vous permet pas de déclarer une liste de variables. Probablement pourquoi j'ai raté ça. Bonne prise!y
entièrement pour économiser 2 octets: essayez-le en ligne!