Dans le cadre de son algorithme de compression, le standard JPEG déroule une matrice en un vecteur le long d'antidiagonales de sens alternant:
Votre tâche consiste à prendre une matrice (pas nécessairement carrée) et à la renvoyer sous forme déroulée. Par exemple:
[1 2 3 4
5 6 7 8
9 1 2 3]
devrait céder
[1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3]
Règles
Vous pouvez supposer que les éléments de la matrice sont des entiers positifs inférieurs à 10
.
Vous pouvez écrire un programme ou une fonction en prenant l’entrée via STDIN (ou l’alternative la plus proche), un argument de ligne de commande ou une argumentation de fonction et en générant le résultat via STDOUT (ou l’alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
La matrice d'entrée peut être donnée dans une liste ou un format de chaîne approprié, non ambigu, sans équivoque, ou sous forme de liste simple avec les deux dimensions de la matrice. (Ou bien sûr, en tant que type de matrice si votre langue en possède.)
Le vecteur de sortie peut être dans n'importe quel format commode, non ambigu, de liste à plat ou de chaîne.
Les règles standard de code-golf s'appliquent.
Cas de test
[[1]] => [1]
[[1 2] [3 1]] => [1 2 3 1]
[[1 2 3 1]] => [1 2 3 1]
[[1 2 3] [5 6 4] [9 7 8] [1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 3 4] [5 6 7 8] [9 1 2 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 6 3 1 2] [5 9 4 7 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1 2 5 9 6 3 4 7 1 2 8 3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
[[1] [2] [5] [9] [6] [3] [4] [7] [1] [2] [8] [3]] => [1 2 5 9 6 3 4 7 1 2 8 3]
Défis associés
- Reconstruire une matrice zigzagifiée (la transformation inverse un peu plus délicate)
- Faire pivoter les anti-diagonales
la source
Réponses:
J,
3130141211 octetsYch . Trop grand.Prend une matrice en entrée.
Explication
J a un avantage ici. Il existe une commande appelée oblique (
/.
) qui prend les lignes obliques à leur tour et leur applique un verbe. Dans ce cas, j'utilise un gérondif pour appliquer deux verbes en alternance:<
( boîte ) et<@|.
( inverse et boîte). Ensuite, il suffit de déballer tout avec;
( raze ).la source
Pyth,
24232120191817 octetsVersion alternative de 17 octets:
ssuL_G=!T.T+LaYkQ
Merci à @FryAmTheEggman pour un octet, @Jakube pour 2 octets et @isaacg pour un octet!
Explication de la "magie noire" mentionnée ci-dessus:
m_W=!Td
renverse essentiellement tous les autres sous-réseaux. Pour ce faire, il mappe_W=!T
chaque sous-tableau.W
est une application conditionnelle, donc c’est_
(inverse) tous les sous-tableaux où=!T
est vrai.T
est une variable pré-initialisée à dix (vérité) et un=!T
moyen(T = !T)
. Donc, elle bascule la valeur d'une variable qui commence la vérité et retourne la nouvelle valeur, ce qui signifie qu'elle alternera entre la fausseté, la vérité, la fausseté, la vérité ... (à Jakube pour cette idée)Suite de test ici .
la source
Jelly,
2419151311 octetsPrend le nombre de lignes, le nombre de colonnes et une liste simple en tant qu'arguments de ligne de commande distincts.
Essayez-le en ligne!
Comment ça marche
la source
⍁
et⍂
? Ou peut-être scandinaveø
etǿ
?MATL ,
2827 octetsAdapté de ma réponse ici . L'idée générale est de créer un tableau 2D de la même taille que l'entrée, rempli de valeurs qui augmentent dans le même ordre que le chemin en zig-zag. Ensuite, la version linéarisée (aplatie) de ce tableau est triée et les indices de ce tri sont conservés. Ce sont les indices qui doivent être appliqués à l'entrée pour produire le chemin en zig-zag.
L'entrée est sous la forme
Explication
Essayez-le en ligne!
la source
Matlab, 134 octets
J'ai juste essayé de mon mieux pour raccourcir mon code dans Matlab, comme pour le télégraphier.
Remarques:
M
est unem×n
matrice.a
etb
les deux matrices ont la même tailleM
, chaque ligne de sea
compose de nombres égaux à son numéro de ligne, tandis que chaque colonne deb
est égale à son numéro de colonne. Ainsi,a
+b
est une matrice dont l'élément est égal à la somme de ses numéros de ligne et de colonne, c'est-à-dirematrix(p,q)=p+q
.A(p,q)=p+q-1
; etB(p,q)=p-q
.C
est mathématiquement exprimé comme l'équation ci-dessous. avec l'équation, une matrice croissant de manière zigzagique peut être réalisée comme indiqué ci-dessous.C
indique l'ordre des éléments de M dans les résultats zigzagifiés. Ensuite,[~,I]=sort(C(:));
retourne la commande, c’est-à-dire queI
, ainsi,V=V(I)'
est le résultat.la source
JavaScript (SpiderMonkey 30+), 99 octets
Testé dans Firefox 44. Prend l'entrée sous forme de tableau 2D.
la source
Python 2, 84 octets
Portage La réponse de Nimi . Prend un tableau plat avec une largeur et une hauteur données. xsot a sauvegardé un octet.
88 octets:
Prend un tableau plat avec une largeur et une hauteur données. Trie les coordonnées 2D correspondantes
(i/w,i%w)
par ordre croissant en zigzag de la somme pour obtenir des diagonales, liées par une valeur de ligne croissante ou décroissante, en fonction du caractère pair ou impair de la ligne plus colonne.la source
Haskell,
797873 octetsL'entrée est une liste simple avec le nombre de lignes et de colonnes, par exemple
( [1,2,6,3,1,2,5,9,4,7,8,3] # 2) 6
->[1,2,5,9,6,3,4,7,1,2,8,3]
.Comment ça marche: parcourez les coordonnées x et y de la matrice (
h
lignes,w
colonnes) dans deux boucles imbriquées:c'est-à-dire de haut / droite à bas / gauche, sautant des index hors limites (
y
etx
doivent satisfairey<h
etx-y<w
). Quandx
est pair, l'ordre de la boucle interne est inversé:y
va dex
à0
. Je le fais en choisissant une fonction de modification pour la plage y,[0..x]
qui est lex
thème de[reverse,id,reverse,id,...]
.Edit: @xnor a réorganisé les boucles et enregistré 5 octets. Merci!
la source
g=id:reverse:g
.(y-x)*w
peuvent être coupées en transposant le problème:(m#h)w=[m!!(x*w+y-x)|y<-[0..h+w],x<-g!!y$[0..y],x<h,y-x<w] g=reverse:id:g
. Traduire en Python enregistre 3 caractères par rapport à ce que j'avais.Python 2 + NumPy, 122 octets
Je l'admets. J'ai travaillé devant. Malheureusement, cette même méthode ne peut pas être facilement modifiée pour résoudre les 2 autres problèmes liés ...
Prend un tableau numpy en entrée. Affiche une liste.
Essayez-le en ligne
Explication:
Un lambda a la même longueur:
la source
Python 3,
131118115107 octetsBasé sur le même principe que ma réponse au défi de Deusovi
Je suppose que nous ne pouvons pas avoir zéro dans la matrice d'entrée
Explication
comment ça marche :
Résultats
la source
reverse even line
être à lareverse odd lines
place?