Étant donné un tableau orthogonal à N dimensions (non irrégulier) d'entiers non négatifs et une indication des dimensions à inverser, renvoyez le tableau mais inversé le long de ces dimensions. L'indication peut être donnée sous la forme d'une liste booléenne de longueur N ou d'une liste d'un sous-ensemble des N premières dimensions indexées de 0 ou 1.
Veuillez indiquer vos formats d'entrée. Les explications du code sont très appréciées.
Exemple guidé
On nous donne le tableau 3D à 2 couches, 3 rangées et 4 colonnes
[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]],
[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]]]
et l'un des
[true,false,true]
(Liste booléenne)
[0,2]
(liste indexée 0)
[1,3]
(liste indexée 1)
Nous devons inverser l'ordre des première et dernière dimensions, c'est-à-dire les couches et les éléments des lignes (les colonnes), mais pas les lignes de chaque couche. Tout d'abord (l'ordre réel dans lequel vous le faites n'a pas d'importance), nous inversons l'ordre des couches:
[[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]],
[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]]]
puis on inverse l'ordre des éléments de chaque ligne:
[[[16,15,14,13],
[20,19,18,17],
[24,23,22,21]],
[[ 4, 3, 2, 1],
[ 8, 7, 6, 5],
[12,11,10, 9]]]
Cas de test
[[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[13,14,15,16],[17,18,19,20],[21,22,23,24]]]
[true,false,true]
/ [0,2]
/ [1,3]
↓
[[[16,15,14,13],[20,19,18,17],[24,23,22,21]],[[4,3,2,1],[8,7,6,5],[12,11,10,9]]]
[[1,2,3],[4,5,6]]
[true,false]
/ [0]
/ [1]
↓
[[4,5,6],[1,2,3]]
[[1],[4]]
[true,false]
/ [0]
/ [1]
↓
[[4],[1]]
[[7]]
[true,true]
/ [0,1]
/ [1,2]
↓
[[7]]
[1,2,3,4,5,6,7]
[true]
/ [0]
/ [1]
↓
[7,6,5,4,3,2,1]
[]
[true]
/ [0]
/ [1]
↓
[]
[[],[]]
[false,false]
/ []
/ []
↓
[[],[]]
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
[true,false,true,true]
/ [0,2,3]
/ [1,3,4]
↓
[[[[4,6,2,6],[4,8,3,2]],[[5,9,7,2],[3,8,3,3]]],[[[6,2,9,5],[1,4,1,3]],[[3,9,7,9],[8,5,3,5]]]]
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
[false,true,false,false]
/ [1]
/ [2]
↓
[[[[5,3,5,8],[9,7,9,3]],[[3,1,4,1],[5,9,2,6]]],[[[3,3,8,3],[2,7,9,5]],[[2,3,8,4],[6,2,6,4]]]]
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
[false,false,false,false]
/ []
/ []
↓
[[[[3,1,4,1],[5,9,2,6]],[[5,3,5,8],[9,7,9,3]]],[[[2,3,8,4],[6,2,6,4]],[[3,3,8,3],[2,7,9,5]]]]
reverse
fonctionne sur des tableaux arbitraires mais ne se soucie que du premier niveau), des génériques ou des classes récursives (classes de type / objet selon la fonction ou POO, mais cas d'utilisation similaire). Les deux derniers sont généralement beaucoup plus verbeux.Réponses:
APL (Dyalog) ,
209 octetsEssayez-le en ligne!
Comment?
/
- réduire - prendre l'élément le plus à droite dans l'entrée (le tableau) et appliquer la fonction avec l'élément gauche suivant comme argument gauche{⌽[⍺]⍵}
- inverser dans la dimensionleft argument
(⍺
)⊃
- aplatir le tableau ferméla source
APL (Dyalog Unicode) , 9 octets
Essayez-le en ligne!
Il semble qu'Uriel ait d'abord été édité en quelque chose de presque identique , mais je l'ai développé indépendamment. Je pensais que ce format d'entrée n'était pas valide.
la source
JavaScript (Node.js) ,
58555345 octets8 octets enregistrés grâce à @Shaggy
Prend l'entrée comme
(indications)(array)
, où les indications sont une liste booléenne.Essayez-le en ligne!
Commenté
la source
r
simple fait d' utiliser inplace ofr||-1
semble fonctionner .f=([r,...b])=>a=>1/r?a.sort(_=>r).map(f(b)):a
marcherait? Sur mon téléphone, je ne peux donc pas tester correctement.Python 2 ,
5655 octetsEssayez-le en ligne!
la source
Gelée , 8 octets
Prend une liste de dimensions indexée 0.
Essayez-le en ligne!
Comment ça marche
la source
R ,
807877 octetsCréez l'appel à l'extracteur de R
[
en créant une liste de séquences inversées où indiqué. Ils contiennent en fait des zéros, qui sont ignorés en silence. Ledrop=F
est nécessaire pour empêcher la chute par défaut des dimensions de R. Nous avons besoin de l'rev
appel à l'indicateur inverse de dimension, en raison de la façon dont R remplit les tableaux.-2 merci @Giuseppe
-1 en utilisant l'affectation en ligne.
Essayez-le en ligne!
Mention honorable à @JayCe qui a proposé une variation qui obtient le même résultat dans la même longueur:
Essayez-le en ligne!
la source
do.call
- il est plus long à 83 octets, en postant toujours ceci ici comme commentaire pour référence: TIOHaskell,
120119 octetsla fonction f prend la liste N-dimensionnelle et une liste de bool comme entrée
la source
F r
.05AB1E ,
231110 octetsEssayez-le en ligne.
-12 octets grâce à @ Mr.Xcoder .
Entrez en tant que valeurs de vérité indexées 0 (c'est-à-dire
[0,2,3]
), qui est la première entrée.Explication:
Par exemple: si la liste d'entrée des index est
[0,2,3]
, elle créera la chaîne suivante:Qui va:
Réponse originale de 23 octets:
Entrez comme boolean-list (ie
[1,0,1,1]
), qui est la première entrée.Essayez-le en ligne.
Explication:
Par exemple: si la liste d'entrées booléenne est
[1,0,1,1]
, elle créera la chaîne suivante:Qui va:
la source
'x*
pour répéterx
n fois sans utiliser des
wap, mais cela ne fonctionne pas avec'€*
? .. EDIT: Seulement dans l'héritage cependant ..€
est toujours analysée en tant qu'opérateur même si elle est dans un littéral char? Pas sûr d'être honnête. Dans la nouvelle version,*
ne se comporte pas néanmoins de la même manière.JavaScript (Node.js) , 60 octets
Une approche différente (récursive). ne bat pas la réponse d'Arnauld ... pour l'instant ...
Prend l'entrée comme
array, boolean list
la source
Pyth , 15 octets
Essayez-le ici!
De façon ennuyeuse, la gestion du cas de liste de dimensions vide ne prend pas moins de 2 octets ... Je préfère utiliser
ss
à la place dejk.n
mais: | Suppose que la liste à transformer peut être donnée en syntaxe Pyth native, sous forme de chaîne. J'ai écrit un convertisseur en syntaxe Pyth pour faciliter les tests. Dans le cas malheureux que le PO choisit de ne pas autoriser cela, un 17 octets le "réparera":la source
Japt ,
1514 octetsAvec une certaine inspiration de la solution d' Arnauld .
Prend les indications comme première entrée, comme un tableau booléen de
1
s et0
s.Essayez-le
Explication
la source
Nettoyer ,
122112 octetsEssayez-le en ligne!
Une version de la réponse Haskell de Damien utilisant le système de type golfeur de Clean. Montre vraiment les similitudes importantes entre les deux langues.
Expliqué:
la source
Rubis , 54 octets
Essayez-le en ligne!
la source
(non testé mais je pense que c'est correct. La sortie asm du compilateur ressemble à ce que j'attends. Mettra à jour si / quand je trouve le temps d'écrire un faisceau de test qui crée et imprime cette structure de données.)
GNU C ++ (portable) 148 octets
GNU C ++ (int = pointeur et tombe d'une fonction non vide UB) 120 octets
Il s'agit d'une structure de compteur de profondeur, de longueur, d'un tableau de {entiers ou pointeurs}. Au niveau inférieur de cet arbre non binaire (
depth==0
), le tableau deintptr_t
est un tableau d'entiers. Dans les niveaux supérieurs, c'est unstruct m*
stocké dansintptr_t
. Traversal prend un plâtre.La
R()
fonction inverse est une fonction membre, car elle enregistre la déclaration d'un argument et enregistre beaucoup dep->
syntaxe pour référencer les membres de la structure par rapport authis
pointeur implicite .La seule extension GNU est le membre de tableau flexible C99 pour créer une structure de taille variable , qui est prise en charge en C ++ en tant qu'extension GNU. J'aurais pu utiliser un
*a
membre pointant vers un tableau alloué séparément et que ce soit ISO C ++ simple. (Et cela sauverait en fait un octet sans nécessiter d'autres modifications). J'ai écrit ceci comme une implémentation de maquette / référence pour une version asm.La version courte avec juste
int
déclare égalementR()
comme renvoyantint
au lieu devoid
. Ces deux morceaux de piratage ne sont pas liés; ce n'est que la version "fonctionne sur au moins une implémentation".Cela devrait fonctionner correctement sur les cibles 32 bits (où
int
peut contenir un pointeur), tant que vous compilez avec gcc7 ou une version antérieure, ou désactivez les optimisations. (gcc8 -O3
suppose que l'exécution ne peut pas atteindre le bas d'une non-void
fonction car ce serait UB.) x86gcc -m32 -O3
devrait fonctionner correctement avec gcc7, comme sur Godbolt où j'ai inclus les deux versions (dans des espaces de noms différents) et une version sans fonction membre. .Non golfé
La fonction arg,,
int r[]
est un tableau d'entiers 0 / non nul qui indique si une profondeur donnée doit être permutée, en commençant par le niveau le plus externe.Lorsque nous récurons, nous passons
r+1
, donc vérifier la profondeur actuelle est toujours*r
.Une version antérieure est passée
r
inchangée et vérifiéer[d]
. Avec un membre de tableau flexible, j'avais besoin de stocker une sorte d'indicateur de dernier niveau car cea[]
n'est pas un pointeur, c'est un vrai tableau sans indirection. Mais avec unintptr_t *a
membre, je ne pouvais pas simplement avoir celanullptr
pour le niveau feuille, parce que je veux que ce soit des valeurs.Inverser le niveau actuel avant ou après la traversée de l'arbre ne devrait pas avoir d'importance. Je n'ai pas essayé de le faire pendant .
Je ne suis pas sûr que cela
std::reverse
vaut le nombre d'octets par rapport à une boucle manuelle, surtout si je peux travailler en appelantR()
chaque pointeur exactement une fois quelque part dans cette boucle. Mais seulement sid!=0
la source
Mathematica, 7 octets
Une fonction. Donnez-lui une liste imbriquée comme premier argument et la liste basée sur 1 de niveaux / dimensions à inverser comme deuxième argument. Essayez-le en ligne!
Enfin, un autre défi où Mathematica a une fonction intégrée!
la source