Учитывая N-мерный ортогональный (не рваный) массив неотрицательных целых чисел и указание, какие измерения нужно повернуть, вернуть массив, но обратный по этим измерениям. Указание может быть дано как логический список длины N или список подмножества первых N измерений, проиндексированных от 0 или 1.
Пожалуйста, укажите ваши форматы ввода. Пояснения к коду высоко ценятся.
Проходной пример
Нам дан 2-х слойный 3-х рядный 4-х колоночный 3D-массив
[[[ 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]
(0-проиндексированный список)
[1,3]
(1-индексированный список)
Нам нужно изменить порядок первого и последнего измерений, то есть слоев и элементов строк (столбцов), но не строк каждого слоя. Во-первых (фактический порядок, в котором вы делаете это, не имеет значения) мы меняем порядок слоев:
[[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]],
[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]]]
и затем мы меняем порядок элементов каждой строки:
[[[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,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
работает с произвольными массивами, но заботится только о первом уровне), универсальные или рекурсивные классы (классы типа / объекта в зависимости от функционала) или ООП, но аналогичный вариант использования). Последние два обычно намного более многословны.Ответы:
APL (Dyalog) ,
209 байтовПопробуйте онлайн!
Как?
/
- уменьшить - взять самый правый элемент на входе (массив) и применить функцию со следующим левым элементом в качестве левого аргумента{⌽[⍺]⍵}
- перевернуть вleft argument
(⍺
) измерение⊃
- выровнять вложенный массивисточник
APL (Dyalog Unicode) , 9 байтов
Попробуйте онлайн!
Похоже, сначала Уриэль отредактировал что-то почти идентичное , но я разработал его самостоятельно. Я думал, что этот формат ввода неверен.
источник
JavaScript (Node.js) ,
58555345 байтСохранено 8 байтов благодаря @Shaggy
Принимает ввод как
(indications)(array)
, где указатели являются логическим списком.Попробуйте онлайн!
комментарии
источник
r
вместо .r||-1
f=([r,...b])=>a=>1/r?a.sort(_=>r).map(f(b)):a
работать? На моем телефоне так не могу проверить правильно.Python 2 ,
5655 байтПопробуйте онлайн!
источник
Желе , 8 байт
Принимает 0-индексированный список измерений.
Попробуйте онлайн!
Как это работает
источник
R ,
807877 байтСоздайте вызов экстрактору R,
[
создав список обращенных последовательностей, где указано. Они на самом деле содержат нули, которые молча игнорируются.drop=F
Необходимо для предотвращения капания по умолчанию R в размерностей. Нам нуженrev
вызов индикатора обратного измерения, потому что R заполняет массивы.-2 спасибо @Giuseppe
-1 с использованием встроенного присваивания.
Попробуйте онлайн!
Приветственное упоминание @JayCe, который предложил вариант, который дает тот же результат при той же длине:
Попробуйте онлайн!
источник
do.call
- это уже в 83 байт, все равно отправляю это здесь в качестве комментария для справки: TiOHaskell,
120119 байтфункция f принимает в качестве входных данных N-мерный список и список bool
источник
F r
.05AB1E ,
231110 байтПопробуйте онлайн.
-12 байт благодаря @ Mr.Xcoder .
Вводится как 0-индексированные истинные значения (то есть
[0,2,3]
), что является первым входом.Объяснение:
Например: если входной список индексов есть
[0,2,3]
, он создаст следующую строку:Который будет:
Оригинальный 23-байтовый ответ:
Ввод в виде логического списка (т.е.
[1,0,1,1]
), который является первым вводом.Попробуйте онлайн.
Объяснение:
Например: если указан логический список ввода
[1,0,1,1]
, он создаст следующую строку:Который будет:
источник
'x*
работает, чтобы повторитьx
количество раз без использованияs
WAP, но это не работает'€*
? .. РЕДАКТИРОВАТЬ: Хотя только в наследство ..€
она все еще анализируется как оператор, даже если она находится в символьном литерале? Не уверен, чтобы быть честным. В новой версии, тем*
не менее , не ведет себя так же.JavaScript (Node.js) , 60 байт
Другой (рекурсивный) подход. не превосходит ответ Арно ... пока ...
Принимает вход как
array, boolean list
источник
Pyth , 15 байт
Попробуй это здесь!
Досадно, что обработка пустого списка измерений занимает не менее 2 байтов ... Я бы предпочел вместо
ss
вместоjk.n
: | Предполагается, что преобразуемый список может быть задан в собственном синтаксисе Pyth как строка. Я написал конвертер в синтаксис Pyth, чтобы упростить тестирование. В неудачном случае, когда OP решает не допустить этого, 17-байтовый «исправит» это:источник
Japt ,
1514 байтС некоторым вдохновением от решения Арно .
Принимает указания в качестве первого ввода как логический массив
1
s и0
s.Попытайся
объяснение
источник
Чисто ,
122112 байтПопробуйте онлайн!
Версия ответа Haskell Дэмиена, использующая систему чистоты для игры в гольф. Действительно показывает обширные сходства между двумя языками.
Разъяснение:
источник
Рубин , 54 байта
Попробуйте онлайн!
источник
(Не проверено, но я думаю, что правильно. Вывод asm компилятора выглядит так, как я ожидал. Будет обновляться, если / когда я найду время, чтобы написать тестовый комплект, который создает и печатает эту структуру данных.)
GNU C ++ (переносимый) 148 байт
GNU C ++ (int = указатель и отпадает от непустой функции UB) 120 байтов
Это структура счетчика глубины, длины, массива {целых или указателей}. На нижнем уровне этого недвоичного дерева (
depth==0
) массивintptr_t
представляет собой массив целых чисел. На более высоких уровнях этоstruct m*
хранится вintptr_t
. Обход принимает бросок.Функция
R()
reverse является функцией-членом, потому что она сохраняет объявление arg и сохраняет многоp->
синтаксиса для ссылки на члены структуры вместо неявногоthis
указателя.Единственным расширением GNU является член гибкого массива C99 для создания структуры переменного размера , которая поддерживается в C ++ как расширение GNU. Я мог бы использовать
*a
член, указывающий на отдельно выделенный массив, и иметь простой ISO C ++. (И это фактически спасло бы байт, не требуя никаких других изменений). Я написал это как макет / справочную реализацию для asm-версии.Более короткая версия с просто
int
также объявляетR()
как возвращениеint
вместоvoid
. Эти две части хакерства не связаны; это просто «работает как минимум на одной версии».Он должен хорошо работать на 32-битных целях (где
int
может храниться указатель), если вы компилируете с gcc7 или старше или отключаете оптимизацию. (gcc8 -O3
Предполагается, что выполнение не может достигнуть дна не-void
функции, потому что это будет UB.) x86gcc -m32 -O3
должен нормально работать с gcc7, как на Godbolt, где я включил обе версии (в разных пространствах имен) и версию, не являющуюся членом-функцией ,Ungolfed
Функция arg,,
int r[]
является массивом 0 / ненулевых целых чисел, которые указывают, должна ли данная глубина меняться местами, начиная с самого внешнего уровня.Когда мы рекурсируем, мы проходим
r+1
, поэтому проверка текущей глубины всегда*r
.Более ранняя версия просто прошла
r
без изменений и проверенаr[d]
. С гибким членом массива мне нужно было хранить какой-то индикатор последнего уровня, потому чтоa[]
это не указатель, а истинный массив без косвенного обращения. Но сintptr_t *a
членом я не мог просто иметь этоnullptr
для конечного уровня, потому что я хочу, чтобы это были значения.Изменение текущего уровня до или после обхода дерева не должно иметь значения. Я не пытался сделать это во время .
Я не уверен, что
std::reverse
стоит подсчет байтов по сравнению с ручным циклом, особенно если я могу работатьR()
над вызовом каждого указателя ровно один раз где-то внутри этого цикла. Но только еслиd!=0
источник
Mathematica, 7 байтов
Функция. В качестве первого аргумента укажите вложенный список, а в качестве второго аргумента - список уровней / измерений на основе 1. Попробуйте онлайн!
Наконец, еще одна проблема, где Mathematica имеет встроенную функцию!
источник