Transformez ce tableau en matrice


13

Prenez un tableau non imbriqué en entrée. Transformez-le en matrice en utilisant la méthode suivante:

Disons que mon tableau est [1, 2, 3, 4, 5]

Tout d'abord, je répète ce tableau 5 fois: (la longueur)

[[1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5],
 [1, 2, 3, 4, 5]]

Ensuite, je l'ai lu le long des diagonales:

[[1],
 [2, 1],
 [3, 2, 1],
 [4, 3, 2, 1],
 [5, 4, 3, 2, 1],
 [5, 4, 3, 2],
 [5, 4, 3],
 [5, 4],
 [5]]

J'aplatis ce tableau et le divise en morceaux de cinq (la longueur):

[[1, 2, 1, 3, 2],
 [1, 4, 3, 2, 1],
 [5, 4, 3, 2, 1],
 [5, 4, 3, 2, 5],
 [4, 3, 5, 4, 5]]

C'est le golf de code. Le moins d'octets gagne.


La prochaine fois, veuillez CAPITALISER les choses.
Oliver Ni

Comment cela fonctionne-t-il si le tableau d'origine a une longueur autre que 5?

@ ais523 Je suppose que c'est la même chose, vous remplacez simplement «cinq» par la longueur
Oliver Ni

Pouvons-nous supposer que les nombres sont toujours des nombres entiers positifs?
Luis Mendo

7
@JohnCena Vous ne devriez pas accepter la première réponse, vous devez donner au poste un peu de temps pour gagner du terrain et d'autres réponses.
Kade

Réponses:


2

05AB1E, 13 octets

.p¹.sR¦«í˜¹gä

Essayez-le en ligne!

Explication:

                # Implicit input
 .p             # Get prefixes
   ¹            # Get first input
    .s          # Get suffixes
      R         # Reverse
       ¦        # Remove first element
        «       # Concatenate
         í      # Reverse every one
          ˜     # Flatten
           ¹gä  # Split into pieces of the length
                # Implicit print

n'avez-vous pas besoin de l'imprimer

et comment avez-vous demandé des commentaires

1
Beaucoup de ces langages de golf, comme 05AB1E, ont intégré des règles par défaut pour demander une entrée et produire une sortie, afin que le programmeur n'ait pas à gaspiller d'octets dessus.

1
La sortie ne correspond pas vraiment à la sortie souhaitée. Ce n'est pas une matrice et les chiffres ne correspondent pas.
Karl Napf

1
Eh bien, c'est une matrice, mais les chiffres ne sont pas corrects (ou tryitonline.net calcule mal)
Karl Napf

6

Gelée , 11 octets

WẋLŒDUṙLFsL

Essayez-le en ligne!

Explication

               Input: array z
WẋL            length(z) copies of z
   ŒD          Diagonals (starting with main diagonal)
     U         Reverse each
      ṙL       Rotate left length(z) places
               (now the top-left diagonal is in front)
        F      Flatten
         sL    Split into chunks of size length(z)

Hmm quand je l'ai essayé avec Lça a fait des trucs bizarres, donc j'ai utilisé le registre: / Je viens de l'essayer à nouveau et ça fonctionne ... en gros le même donc je suppose que je vais juste supprimer le mien
Jonathan Allan

1
Bien sûr, Jelly a des "diagonales" intégrées .... :)
Greg Martin

3

Python 2, 105 96 octets

-1 et -4 et -4 octets grâce à Flp.Tkc

a=input()
n=len(a)
L,M=[],[]
for i in range(n):L+=a[i::-1];M+=a[:i:-1]
print zip(*[iter(L+M)]*n)

La boucle for ajoute les éléments comme dans la description, la vraie magie opère dans le zip qui est d' ici


désolé pour le spam, mais maintenant que R n'est utilisé qu'une seule fois, vous pouvez simplement le mettre directement ici: P
FlipTack

@ Flp.Tkc pas de problème, je suis heureux :)
Karl Napf

3

JavaScript (ES6) 100 101 105

a=>eval("for(u=r=[],i=l=a.length;i+l;i--)for(j=l;j--;v&&((u%=l)||r.push(s=[]),s[u++]=v))v=a[j-i];r")

Moins golfé

a => {
  u = 0
  for(r=[], i=l=a.length; i+l>0; i--)
    for(j=l; j--; )
    {
      v = a[j-i]
      if (v) 
      {
        u %= l
        if (u==0) r.push(s=[])
        s[u++] = v
      }
    }
  return r
}

Tester

F=
a=>eval("for(u=r=[],i=l=a.length;i+l;i--)for(j=l;j--;v&&((u%=l)||r.push(s=[]),s[u++]=v))v=a[j-i];r")

function update() {
  var a=I.value.match(/\d+/g)
  if (a) {
    var r=F(a)
    O.textContent = r.join`\n`
  }
}

update()
<input id=I value='1 2 3 4 5' oninput='update()'>
<pre id=O></pre>


1
Wow, c'est une façon très intelligente d'éviter le return. Vous devriez publier un conseil à ce sujet dans le fil de la pointe ES6.
ETHproductions

@ETHproductions il a une portée très étroite. La plupart du temps, eval est meilleur.
edc65

@ETHproductions evalest en effet encore meilleur cette fois :(
edc65

@ETHproductions J'ai posté l'astuce, même si elle est rarement utile, juste au cas où
edc65

2

MATL , 17 octets

!Gg*tRwZRhPXzGne!

Essayez-le en ligne!

Comment ça fonctionne

L'explication suivante utilise l'entrée [1 2 3 4 5]comme exemple. Pour visualiser les résultats intermédiaires, insérez% (symbole de commentaire) après toute instruction dans le code.

Notez que ;c'est le séparateur de lignes pour les matrices. Il en [1 2]est de même d'un vecteur ligne, d' [1; 2]un vecteur colonne et de [1 0; 0 1]la matrice d'identité 2 × 2.

!     % Implicitly input a row vector. Transpose. Gives a column vector
      % STACK: [1; 2; 3; 4; 5]
Gg    % Push input with all (nonzero) values replaced by ones
      % STACK: [1; 2; 3; 4; 5], [1 1 1 1 1]
*     % Multiply, with broadcast. Gives a square matrix
      % STACK: [1 1 1 1 1;
                2 2 2 2 2;
                3 3 3 3 3;
                4 4 4 4 4;
                5 5 5 5 5]
tR    % Duplicate. Upper triangular part
      % STACK: [1 1 1 1 1;
                2 2 2 2 2;
                3 3 3 3 3;
                4 4 4 4 4;
                5 5 5 5 5],
               [1 1 1 1 1
                0 2 2 2 2;
                0 0 3 3 3;
                0 0 0 4 4;
                0 0 0 0 5]
wZR   % Swap. Lower triangular part, below main diagonal 
      % STACK: [1 1 1 1 1;
                0 2 2 2 2;
                0 0 3 3 3;
                0 0 0 4 4;
                0 0 0 0 5],
               [0 0 0 0 0;
                2 0 0 0 0;
                3 3 0 0 0;
                4 4 4 0 0;
                5 5 5 5 0]
h     % Concatenate horizontally
      % STACK: [1 1 1 1 1 0 0 0 0 0;
                0 2 2 2 2 2 0 0 0 0;
                0 0 3 3 3 3 3 0 0 0;
                0 0 0 4 4 4 4 4 0 0;
                0 0 0 0 5 5 5 5 5 0]
P     % Flip vertically
      % STACK: [0 0 0 0 5 5 5 5 5 0;
                0 0 0 4 4 4 4 4 0 0;
                0 0 3 3 3 3 3 0 0 0;
                0 2 2 2 2 2 0 0 0 0;
                1 1 1 1 1 0 0 0 0 0]
Xz    % Column vector of nonzeros, taken in column-major order
      % STACK: [1;2;1;3;2;1;4;3;2;1;5;4;3;2;1;5;4;3;2;5;4;3;5;4;5]
Gne   % Reshape into a matrix with as many rows as input size
      % STACK: [1 1 5 5 4;
                2 4 4 4 3;
                1 3 3 3 5;
                3 2 2 2 4;
                2 1 1 5 5]
 !    % Transpose. Implicitly display
      % STACK: [1 2 1 3 2;
                1 4 3 2 1;
                5 4 3 2 1;
                5 4 3 2 5;
                4 3 5 4 5]

1

JavaScript (ES6), 116 octets

a=>a.map(_=>b.splice(0,a.length),b=[].concat(...a.map((_,i)=>a.slice(~i)),...a.map((_,i)=>a.slice(0,~i))).reverse())

Eh bien, c'est un début ...


1

R, 84 octets

t(matrix(unlist(split(m<-t(matrix(rev(x<-scan()),l<-sum(1|x),l)),row(m)-col(m))),l))

Lit l'entrée de stdin et génère / renvoie une matrice R.

reversed_x <- rev(x<-scan())                # Read input from stdin and reverse
m <- t(matrix(reversed_x,l<-sum(1|x),l))    # Repeat and fit into matrix
diag_list <- split(m,row(m)-col(m))         # Split into ragged list of diagonals
t(matrix(unlist(diag_list),l))              # Flatten and transform back to matrix

Expliqué

L'aspect le plus intéressant de cette réponse est la façon dont les diagonales sont récupérées. En général, un objet peut être divisé en utilisant la splitfonction si un objet contenant des facteurs sur lequel l'objet est divisé est fourni. Pour créer ces facteurs, nous pouvons utiliser colet rowqui renvoient une matrice contenant respectivement les indices de colonne et de ligne. En prenant les différences: row(m)-col(m)on obtient une matrice comme:

     [,1] [,2] [,3] [,4] [,5]
[1,]    0   -1   -2   -3   -4
[2,]    1    0   -1   -2   -3
[3,]    2    1    0   -1   -2
[4,]    3    2    1    0   -1
[5,]    4    3    2    1    0

dans lequel chaque diagonale est identifiée de manière unique. Nous pouvons maintenant diviser en fonction de cette matrice et la transformer en une liste irrégulière en appliquant split:

$`-4`
[1] 1
$`-3`
[1] 2 1 
$`-2`
[1] 3 2 1
$`-1`
[1] 4 3 2 1
$`0`
[1] 5 4 3 2 1
$`1`
[1] 5 4 3 2
$`2`
[1] 5 4 3
$`3`
[1] 5 4
$`4`
[1] 5

(Notez comment le nom de chaque vecteur correspond aux valeurs diagonales dans la matrice ci-dessus).

La dernière étape consiste simplement à l'aplatir et à la transformer en une matrice de la forme:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    1    3    2
[2,]    1    4    3    2    1
[3,]    5    4    3    2    1
[4,]    5    4    3    2    5
[5,]    4    3    5    4    5

0

Mathematica 93 octets

Partition[Flatten[Table[If[i>n,#[[n;;(i-n+1);;-1]],#[[i;;1;;-1]]],{i,1,2(n=Length@#)-1}]],n]&

Voici comment j'écrirais habituellement ce code (109 octets):

Partition[Reverse@Flatten[Table[Reverse@Diagonal[ConstantArray[Reverse@#,n],k],{k,-(n=Length@#)+1,n-1}]],n]&

Ce graphique matriciel donne une bonne idée de la structure en raison d'un vecteur d'entrée croissant de manière séquentielle.

entrez la description de l'image ici

Voici le graphique matriciel avec un vecteur d'entrée aléatoire. De toute évidence, une certaine structure existe toujours.

entrez la description de l'image ici


0

Mathematica, 92 octets

n=NestList[#2,(r=Reverse)@#,(l=Length@#)-1]&;{Most@r[#~n~Rest],#~n~Most}~ArrayReshape~{l,l}&

Fonction sans nom prenant une liste comme argument. Il pourrait y avoir d'autres structures pour une telle fonction, mais j'espère que j'ai bien joué cette structure ...

La première partie n=NestList[#2,(r=Reverse)@#,(l=Length@#)-1]&définit une fonction nde deux arguments: la première est une liste de longueur l, et la seconde est une fonction à appliquer aux listes. napplique cette fonction l-1à la liste des arguments inversés, en enregistrant tous les résultats dans sa liste de sortie. (Définir ret en lcours de route ne fait que jouer au golf.)

nest appelé deux fois sur la liste d'origine, une fois avec la fonction étant Rest(supprimer le premier élément de la liste) et une fois avec la fonction étant Most(supprimer le dernier élément). Cela produit toutes les sous-listes souhaitées, mais toute la liste est là deux fois (d'où l'extra Most) et la première moitié est là dans l'ordre inverse (d'où le r[...]). Enfin, ~ArrayReshape~{l,l}oublie la structure de liste actuelle et la force à être un tableau lx l.


0

Mathematica, 85 octets

Effectuer littéralement les étapes suggérées:

(l=Length@#;Partition[Flatten@Table[Reverse@Diagonal[Table[#,l],i],{i,-l+1,l-1}],l])&

Mon instinct dit qu'il devrait y avoir un moyen intelligent d'utiliser Partpour faire cela plus court, mais chaque tentative que j'ai faite a été plus longue que 85 octets.


0

Rubis (110 octets)

n=a.size
b=[*(0...n)]
b.product(b).group_by{|i,j|i+j}.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}.each_slice(n).to_a
  #=> [[1, 2, 1, 3, 2],
  #    [1, 4, 3, 2, 1],
  #    [5, 4, 3, 2, 1],
  #    [5, 4, 3, 2, 5],
  #    [4, 3, 5, 4, 5]]

le sort opération n'est peut-être pas nécessaire, mais le document pour Enumerable # group_by ne garantit pas l'ordre des valeurs dans les valeurs de hachage (qui sont des tableaux), mais les versions actuelles de Ruby fournissent l'ordre auquel on s'attendrait et l'ordre dont j'aurais besoin sisort c'était supprimé de mon code.

Les étapes sont les suivantes.

n=a.size 
  #=> 5 
b=[*(0...n)]
  #=> [0, 1, 2, 3, 4] 
c = b.product(b)
  #=> [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [1, 0], [1, 1], [1, 2], [1, 3],
  #    [1, 4], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [3, 0], [3, 1], [3, 2],
  #    [3, 3], [3, 4], [4, 0], [4, 1], [4, 2], [4, 3], [4, 4]] 
d=c.group_by{|i,j|i+j}
  #=> {0=>[[0, 0]],
  #    1=>[[0, 1], [1, 0]],
  #    2=>[[0, 2], [1, 1], [2, 0]],
  #    3=>[[0, 3], [1, 2], [2, 1], [3, 0]],
  #    4=>[[0, 4], [1, 3], [2, 2], [3, 1], [4, 0]],
  #    5=>[[1, 4], [2, 3], [3, 2], [4, 1]],
  #    6=>[[2, 4], [3, 3], [4, 2]],
  #    7=>[[3, 4], [4, 3]],
  #    8=>[[4, 4]]} 
e=d.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}
  #=> [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5] 
f=e.each_slice(n)
  #=> #<Enumerator: [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2,
  #                  5, 4, 3, 5, 4, 5]:each_slice(5)>

Enfin, f.to_aretourne le tableau ci-dessus.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.