подробности
Напишите функцию или программу, которая, учитывая массив (или список), содержащий только целые числа, возвращает или выводит массив со всеми обращенными субэлементами. То есть, поверните все элементы самого глубокого массива, затем второй самый глубокий и т. Д. Размеры указывать не нужно, но функция или программа должны работать для зубчатых массивов в собственном формате вашего языка программирования.
Примеры
Эта:
[[1,2], [3,4]]
Стало бы это:
[[4,3], [2,1]]
Эта:
[[[ 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]]]
Стало бы это:
[[[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]]]
Эта:
[[[1,2]],
[[3,4], [5]],
[[6,7,8], [9], [10,11]],
[[[12,13], [14,15]], [16], [17,18,19,20]],
[21]]
Стало бы это:
[[21],
[[20,19,18,17], [16], [[15,14], [13,12]]],
[[11,10], [9], [8,7,6]],
[[5], [4,3]],
[[2,1]]]
бонус
Мы надеемся, что это поощрит ответы на некоторых объектно-ориентированных языках программирования ...
-50% Bytecount Если ваша программа может принимать в качестве входных данных массив (или список) со своими членами различных типов (они могут быть в форме объектов) и успешно реверсировать все массивы.
Эта:
[["Foo",["Bar",1]],
2,
["Baz"],
[[["Qux"],3],3.14]]
Стало бы это:
[[3.14,[3,["Qux"]]],
["Baz"],
2,
[[1,"Bar"],"Foo"]]
Ответы:
Pyth, 11 - 50% = 5,5 байт
Попробуйте онлайн: демонстрация или тестовый набор .
Это определяет функцию
y
. Дополнительные 3 байта<newline>yQ
просто вызывают функцию со списком ввода и, следовательно, не должны учитываться в общем количестве байтов.Объяснение:
источник
Dyalog APL , 14 - 50% = 7 байт
⌽⍵
обратный аргумент,⍣(×|≡⍵)
если аргумент не является атомом (знак [абсолютной] глубины) ...∇¨
... применить функцию к каждому элементу (обратного аргумента).Если
⎕ML←3
(стиль IBM), что имеет место в системах, которые мигрировали из APL2, один байт можно сохранить, удалив|
.Попробуйте APL онлайн.
Для любопытства, предлагаемые int и float реверс:
Внутренняя функция:
0::⌽⍵
если возникает какая-либо ошибка, просто верните найденный аргумент⍎⌽⍕
make в строку, переверните, make в числоисточник
Пролог, 40 - 50% = 20 байт
Это рекурсивно вызывает предикат
a/2
сmaplist/3
, для каждого члена списка, доreverse/2
сбоя (т.е. последний элемент не был списком).источник
Python 2, 40 - 50% = 20
Для получения бонуса необходимы лишь незначительные изменения, необходимые для базового способа сделать это. Используется тот факт, что все списки меньше пустой строки, а все числа меньше пустого списка.
Все тесты
источник
f=lambda x:map(f,x)[::-1]if x>[]else x
.Emacs Lisp, 46 байт * 0,5 = 23
Пример использования:
(g '((1 2) 3 (four 5)))
->((5 four) 3 (2 1))
Классический рекурсивный подход: если аргумент не является списком, возьмите его без изменений, если это список, сопоставьте функцию с обратным списком.
источник
Mathematica, 34/2 = 17 байт
Или просто,
Reverse//@#&
если вы хотите кучу ошибок иReverse
повсюду.источник
Clojure 43/2 = 21,5 байт
источник
JavaScript ES6, 42 - 50% = 21 байт
Мой счет идеален во многих отношениях. Реализует функцию
r
которая рекурсивно применяет себя к членам своего ввода.Если мы предположим, что ни один объект не имеет свойства
pop
, то это становится (31 - 50% = 15,5) благодаря dev-null:Или, если мы предположим, что объект обладает вменяемым
reverse
свойством, мы могли бы сделать это также (35 - 50% = 17,5):источник
a.pop?a.reverse().map(r):a
. При условии, что нет необходимости обрабатыватьvoid 0
и настраиваемые объекты.Lua,
11199 * .5 =55,549,5 байтХорошая часть рекурсии
источник
CJam, 20 байтов * 50% = 10
Определяет названный блок
F
который может быть применен к массиву поверх стека (или чего-либо еще, в этом случае это неоперация).Проверьте это здесь.
источник
Брахилог , 5 - 50% = 2,5 байта
Попробуйте онлайн!
Так как
↔
может также переворачивать строки и целые числа, мы должны явно отказывать в не-списках с помощьюċ
.источник
Wolfram Language (Mathematica) , 23 -50% = 11,5 байт
Попробуйте онлайн!
List
s в Mathematica ({...}
) эквивалентныList[...]
.@*
является оператором композиции, поэтому замена каждого вхожденияList
сReverse@*List
обращает все списки, которые встречаются на входе (Reverse@*List[...]
=Reverse[{...}]
).24 -50% = 12 байт
Попробуйте онлайн!
Работает не только на
List
с.источник
Clojure, 38 байт
(и бонус, я думаю, но Clojure - динамический язык, поэтому он поставляется бесплатно)
Это хорошее начало, но я не использовал эти оптимизации:
fn
вместо именованной с помощьюdefn
. Но нам все еще нужно «ограниченное» имяf
для рекурсииseq?
вместоcoll?
(into () ...)
вместоreverse
x
перед отображением, нам не нужно столько пробеловисточник
Рубин , 32 - 50% = 16 байт
Рекурсивная функция. Использование
rescue
для перехвата того,NoMethodError
что срабатывает при попыткеreverse
получить число илиmap
строку, оказывается на 2 байта короче, чем проверка, является ли входной массив массивом черезa==[*a]
.Попробуйте онлайн!
источник