Faire pivoter chaque ligne et colonne dans une matrice

15

Le défi

Étant donné une n x nmatrice d'entiers avecn >= 2

1 2
3 4

et une liste d'entiers avec exactement des 2néléments

[1,2, -3, -1]

sortie de la matrice tournée. Cette matrice est construite de la manière suivante:

  • Prenez le premier entier de la liste et faites pivoter la première ligne vers la droite de cette valeur.
  • Prenez l'entier suivant et faites pivoter la première colonne vers le bas de cette valeur.
  • Prenez l'entier suivant et faites pivoter la deuxième ligne vers la droite de cette valeur, etc. jusqu'à ce que vous ayez fait pivoter une fois chaque ligne et colonne de la matrice.

La liste peut contenir des entiers négatifs, ce qui signifie que vous déplacez la ligne / colonne vers la gauche / vers le haut au lieu de la droite / vers le bas. Si l'entier est zéro, ne faites pas pivoter la ligne / colonne.

Exemple utilisant l'entrée ci-dessus

Élément de liste Matrice Explication
-------------------------------------------------- ----------
1 2 1 Tournez la 1ère rangée vers la droite de 1
                   3 4

2 2 1 Tournez la 1ère colonne vers le bas de 2
                   3 4

-3 2 1 Faire pivoter la 2e rangée vers la gauche de 3
                   4 3

-1 2 3 Faites pivoter la 2e colonne de 1 vers le haut
                   4 1

Règles

  • Vous pouvez choisir le format d'entrée le plus convenable. Indiquez simplement lequel vous utilisez.
  • Fonction ou programme complet autorisé.
  • Règles par défaut pour les entrées / sorties.
  • Des échappatoires standard s'appliquent.
  • Il s'agit de , donc le nombre d'octets le plus bas l'emporte. Tiebreaker est une soumission antérieure.

Cas de test

Le format d'entrée est ici une liste de listes pour la matrice et une liste normale pour les entiers.

[[1,2], [3,4]], [1,2, -3, -1] -> [[2,3], [4,1]]
[[1,2], [3,4]], [1,1,1,1] -> [[3,2], [4,1]]
[[1,2], [3,4]], [0,0,0,0] -> [[1,2], [3,4]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [1, -2,0, -1,3,4] -> [[7, 5,0], [- 3, -8,2], [- 4,1,6]]
[[1,2, -3], [- 4,5,6], [7, -8,0]], [3,12, -3,0, -6, -3] -> [[1 , 2, -3], [- 4,5,6], [7, -8,0]]

Codage heureux!

Denker
la source
mapcar devrait aider…
msh210

Réponses:

6

CJam, 13 octets

{{a.m>1m<z}/}

Un bloc sans nom (fonction) qui prend la matrice et la liste en haut de la pile (dans cet ordre) et laisse la nouvelle matrice à leur place.

Exécutez tous les cas de test.

Même idée, même nombre d'octets, implémentations différentes:

{{\(@m>a+z}/}
{{(Im>a+z}fI}
{{:\Im>]z}fI}

Explication

Idéalement, nous voulons traiter chaque instruction de la liste de la même manière et l'utiliser pour faire pivoter la première ligne de la matrice. Cela peut être fait assez facilement en transformant un peu la matrice après chaque instruction et en s'assurant que toutes ces transformations supplémentaires s'annulent à la fin. Donc, après le traitement de chaque instruction, nous faisons pivoter toutes les lignes une vers le haut (de sorte que l'instruction suivante dans la même dimension traite la ligne suivante), puis transposons la matrice, de sorte que nous traitions en fait les colonnes suivantes. Ces transformations supplémentaires sont orthogonales aux instructions de la liste et ont une période d'exactement2n ce dont nous avons besoin.

Quant au code:

{      e# For each instruction...
  a    e#   Wrap it in a singleton array.
  .m>  e#   Combine it element-wise with the matrix to rotate right. This is
       e#   a fairly common idiom to apply a binary operation only to the first
       e#   element of an array, since element-wise operations just retain all the
       e#   unpaired elements of the longer array.
  1m<  e#   Rotate the rows one up.
  z    e#   Transpose.
}/
Martin Ender
la source
4

APL (Dyalog Extended) , 17 15 14 13 octets

-3 octets par Adám

(⍉1⊖⌽`@1⍢⌽)/⌽

Essayez-le en ligne!

Prend l'entrée comme une liste où le premier élément est la matrice et les éléments restants sont les quantités de rotation. Si ⌽ tournait vers la droite au lieu de la gauche, cela battrait CJam.

(⍉1⊖⌽@1 1⍢⌽)/⌽    Monadic train:
(⍉1⊖⌽@1 1⍢⌽)      Helper function to rotate and transpose once.
                        Takes args  (amount to rotate) and  (current array)
                      Function to rotate left
        1 1             2-element vector containing 1.
                        The second 1 is redundant, but saves 1 byte over (,1).
     ⌽@1 1             Function to rotate the 1st row left by ⍺.
     ⌽@1 1⍢⌽          Reverse ⍵, rotate 1st row left by ⍺, then reverse again.
                        This rotates the first row of  to the *right*.
  1                   Rotate all the rows upward,
                                                  then transpose.
(⍉1⊖⌽@1 1⍢⌽)/⌽   Fold (/) this function over the reversed input.
                     If our input is ⍵, _1, _2, ..., _2n,
                     the reversed input will be _2n, ..., _1, ⍵.
                     The / operator applies the function right to left,
                     so the  is necessary.
lirtosiast
la source
{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)mais pouvez-vous m'expliquer pourquoi @1ne fonctionnera pas à la place de @(⍳1)ou @(,1)? De plus, OP peut vous permettre de prendre une entrée en sens inverse.
Adám
Il s'avère donc que dfns ' atqui est derrière l'extension @n'est pas une extension compatible. Cependant, vous pouvez utiliser le natif @avec `@1lequel vous enregistrez un octet @1 1.
Adám
la rotation fonctionne-t-elle différemment dans apl vs J? j'essaie de traduire cela en J et je le trouve beaucoup plus verbeux ...
Jonah
2

Python 2, 96 octets

def f(m,v):
    for i,x in enumerate(v):x%=len(m);r=m[i/2];m[i/2]=r[-x:]+r[:-x];m=zip(*m)
    return m

Les tests

frenvoie une liste de tuples. Chaque ligne du corps de la fonction est mise en retrait avec 1 caractère de tabulation.

vaultah
la source
Une ligne droite ne return zip(*m)vous ferait-elle pas économiser 5 octets?
Denker
@DenkerAffe: proposez-vous de remplacer m=zip(*m);return mpar juste return zip(*m)? Je ne peux pas faire ça parce que ça fait m=zip(*m)partie de la forboucle
vaultah
Oui, c'était ma pensée. Je n'ai pas vu que c'est dans la boucle, ma mauvaise.
Denker