Détails
Écrivez une fonction ou un programme qui, étant donné un tableau (ou une liste), contenant uniquement des entiers, retourne ou génère un tableau avec tous les sous-éléments inversés. Autrement dit, inversez tous les éléments du tableau le plus profond, puis le deuxième le plus profond, etc. Les dimensions n'ont pas besoin d'être spécifiées, mais la fonction ou le programme doit fonctionner pour les tableaux irréguliers au format natif de votre langage de programmation.
Exemples
Cette:
[[1,2], [3,4]]
Deviendrait ceci:
[[4,3], [2,1]]
Cette:
[[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]],
[[10,11,12], [13,14,15], [16,17,18]],
[[19,20,21], [22,23,24], [25,26,27]],
[[28,29,30], [31,32,33], [34,35,36]],
[[37,38,39], [40,41,42], [43,44,45]],
[[46,47,48], [49,50,51], [52,53,54]]]
Deviendrait ceci:
[[[54,53,52], [51,50,49], [48,47,46]],
[[45,44,43], [42,41,40], [39,38,37]],
[[36,35,34], [33,32,31], [30,29,28]],
[[27,26,25], [24,23,22], [21,20,19]],
[[18,17,16], [15,14,13], [12,11,10]],
[[ 9, 8, 7], [ 6, 5, 4], [ 3, 2, 1]]]
Cette:
[[[1,2]],
[[3,4], [5]],
[[6,7,8], [9], [10,11]],
[[[12,13], [14,15]], [16], [17,18,19,20]],
[21]]
Deviendrait ceci:
[[21],
[[20,19,18,17], [16], [[15,14], [13,12]]],
[[11,10], [9], [8,7,6]],
[[5], [4,3]],
[[2,1]]]
Prime
Cela nous espérons encourager les réponses dans certains langages de programmation orientés objet ...
-50% Bytecount Si votre programme peut prendre en entrée un tableau (ou une liste) avec ses membres de différents types (ceux-ci peuvent être sous la forme d'objets) et inverser avec succès tous les tableaux.
Cette:
[["Foo",["Bar",1]],
2,
["Baz"],
[[["Qux"],3],3.14]]
Deviendrait ceci:
[[3.14,[3,["Qux"]]],
["Baz"],
2,
[[1,"Bar"],"Foo"]]
Réponses:
Pyth, 11 - 50% = 5,5 octets
Essayez-le en ligne: démonstration ou suite de tests .
Cela définit une fonction
y
. Les 3 octets supplémentaires<newline>yQ
appellent simplement la fonction avec la liste d'entrée et n'ont donc pas besoin d'être comptés dans le total des octets.Explication:
la source
Dyalog APL , 14 - 50% = 7 octets
⌽⍵
argument inverse⍣(×|≡⍵)
si l'argument n'est pas un atome (signe de la profondeur [absolue]) ...∇¨
... applique la fonction à chaque élément (de l'argument inversé).Si
⎕ML←3
(style IBM), ce qui est le cas sur les systèmes ayant migré depuis APL2, un octet peut être enregistré en le supprimant|
.Essayez APL en ligne.
Par curiosité, les int et float proposés s'inversent:
La fonction intérieure:
0::⌽⍵
si une erreur se produit, il suffit de renvoyer l'argument revesed⍎⌽⍕
make into string, reverse, make into numberla source
Prolog, 40 - 50% = 20 octets
Cela appelle récursivement un prédicat
a/2
avecmaplist/3
, pour chaque membre de la liste, jusqu'à ce qu'ilreverse/2
échoue (c'est-à-dire que le dernier élément n'était pas une liste).la source
Python 2, 40 - 50% = 20
Seules quelques modifications mineures nécessaires par rapport à la méthode de base pour le faire sont nécessaires pour obtenir le bonus. Utilise le fait que toutes les listes sont inférieures à la chaîne vide et que tous les nombres sont inférieurs à la liste vide.
Tous les cas de test
la source
f=lambda x:map(f,x)[::-1]if x>[]else x
.Emacs Lisp, 46 octets * 0,5 = 23
Exemple d'utilisation:
(g '((1 2) 3 (four 5)))
->((5 four) 3 (2 1))
Approche récursive classique: si l'argument n'est pas une liste, ne le modifiez pas, s'il s'agit d'une liste, mappez la fonction sur l'inverse de la liste.
la source
Mathematica, 34/2 = 17 octets
Ou tout simplement
Reverse//@#&
si vous voulez une tonne d'erreurs et deReverse
partout.la source
Clojure 43/2 = 21,5 octets
la source
JavaScript ES6, 42 - 50% = 21 octets
Mon score est parfait à bien des égards. Implémente une fonction
r
qui s'applique récursivement aux membres de son entrée.Si nous supposons qu'aucun objet n'a la propriété
pop
, cela devient (31 - 50% = 15,5), grâce à dev-null:Ou, si nous supposons que l'objet a une
reverse
propriété saine , nous pourrions également le faire (35 - 50% = 17,5):la source
a.pop?a.reverse().map(r):a
. En supposant qu'il n'est pas nécessaire de gérervoid 0
et d'objets personnalisés.Lua,
11199 * .5 =55,549,5 octetsBon peu de récursivité
la source
CJam, 20 octets * 50% = 10
Définit le bloc nommé
F
qui peut être appliqué à un tableau au-dessus de la pile (ou toute autre chose, auquel cas il s'agit d'un no-op).Testez-le ici.
la source
Brachylog , 5 - 50% = 2,5 octets
Essayez-le en ligne!
Puisque
↔
peut également inverser des chaînes et des entiers, nous devons explicitement échouer les non-listes avecċ
.la source
Wolfram Language (Mathematica) , 23 -50% = 11,5 octets
Essayez-le en ligne!
List
s dans Mathematica ({...}
) sont équivalents àList[...]
.@*
est l'opérateur de composition, donc remplacer chaque occurrence deList
parReverse@*List
inverse chaque liste qui se produit dans l'entrée (Reverse@*List[...]
=Reverse[{...}]
).24 à 50% = 12 octets
Essayez-le en ligne!
Ne fonctionne pas seulement sur l'
List
al.la source
Clojure, 38 octets
(et un bonus je suppose, mais Clojure est un langage dynamique donc il est gratuit)
Cette un bon début, mais je n'ai pas utilisé ces optimisations:
fn
au lieu d'une fonction nommée avecdefn
. Mais nous avons encore besoin d'un nom "scoped"f
pour la récursivitéseq?
au lieu decoll?
(into () ...)
au lieu dereverse
x
avant la cartographie, nous n'avons donc pas besoin d'autant d'espacesla source
Rubis , 32 - 50% = 16 octets
Fonction récursive. Utiliser
rescue
pour attraper leNoMethodError
qui se déclenche lorsque vous essayez de saisirreverse
un nombre oumap
une chaîne s'avère être 2 octets plus court que de vérifier si l'entrée est un tableau viaa==[*a]
.Essayez-le en ligne!
la source