Biorąc pod uwagę N-wymiarową ortogonalną (niewyrównaną) tablicę liczb całkowitych nieujemnych oraz wskazanie, które wymiary należy odwrócić, zwróć tablicę, ale odwróci się wzdłuż tych wymiarów. Wskazanie może być podane jako logiczna lista długości N lub lista podzbioru pierwszych N wymiarów indeksowanych od 0 lub 1.
Proszę podać formaty wejściowe. Wyjaśnienia kodu są bardzo mile widziane.
Przykład przejścia
Otrzymujemy 2-warstwowy 3-rzędowy 4-kolumnowy układ 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]]]
i jeden z
[true,false,true]
(Lista boolowska)
[0,2]
( lista 0-indeksowana)
[1,3]
( lista 1-indeksowana)
Musimy odwrócić kolejność pierwszego i ostatniego wymiaru, czyli warstw i elementów wierszy (kolumn), ale nie wierszy każdej warstwy. Po pierwsze (faktyczna kolejność, w jakiej to robisz, nie ma znaczenia) odwracamy kolejność warstw:
[[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]],
[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]]]
a następnie odwracamy kolejność elementów każdego wiersza:
[[[16,15,14,13],
[20,19,18,17],
[24,23,22,21]],
[[ 4, 3, 2, 1],
[ 8, 7, 6, 5],
[12,11,10, 9]]]
Przypadki testowe
[[[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
działa na dowolnych tablicach, ale zależy tylko na pierwszym poziomie), ogólne lub klasy rekurencyjne (klasy typu / obiektu w zależności od funkcjonalności lub OOP, ale podobny przypadek użycia). Te dwa ostatnie są zwykle bardziej szczegółowe.Odpowiedzi:
APL (Dyalog) ,
209 bajtówWypróbuj online!
W jaki sposób?
/
- zmniejsz - weź element znajdujący się najbardziej na prawo w wejściu (tablicę) i zastosuj funkcję z następnym lewym elementem jako lewym argumentem{⌽[⍺]⍵}
- odwróć wleft argument
(⍺
wymiarze )⊃
- spłaszczyć załączoną tablicęźródło
APL (Dyalog Unicode) , 9 bajtów
Wypróbuj online!
Wygląda na to, że Uriel był najpierw edytowany w coś prawie identycznego , ale opracowałem go niezależnie. Myślałem, że ten format wejściowy jest nieprawidłowy.
źródło
JavaScript (Node.js) ,
58555345 bajtówZaoszczędź 8 bajtów dzięki @Shaggy
Pobiera dane wejściowe jako
(indications)(array)
, gdzie wskazaniami jest lista boolowska.Wypróbuj online!
Skomentował
źródło
r
zamiast miejscar||-1
wydaje się działać .f=([r,...b])=>a=>1/r?a.sort(_=>r).map(f(b)):a
zadziała? Na moim telefonie nie mogę poprawnie przetestować.Python 2 ,
5655 bajtówWypróbuj online!
źródło
Galaretka , 8 bajtów
Pobiera indeksowaną listę 0 wymiarów.
Wypróbuj online!
Jak to działa
źródło
R ,
807877 bajtówUtwórz wywołanie do ekstraktora R,
[
tworząc listę sekwencji odwróconych tam, gdzie jest to wskazane. W rzeczywistości zawierają zera, które są dyskretnie ignorowane. Jestdrop=F
to konieczne, aby zapobiec domyślnemu upuszczaniu wymiarów R. Potrzebujemyrev
wywołania do odwrotnego wskaźnika wymiaru, ponieważ R wypełnia tablice.-2 dzięki @Giuseppe
-1 przy użyciu przypisania liniowego.
Wypróbuj online!
Wyróżnienie dla @JayCe, który wymyślił odmianę, która uzyskuje ten sam wynik w tej samej długości:
Wypróbuj online!
źródło
do.call
- ma on więcej niż 83 bajty, wciąż zamieszczając to tutaj jako komentarz w celach informacyjnych: TIOHaskell,
120119 bajtówfunkcja f przyjmuje jako dane wejściową listę N-wymiarową i listę bool
źródło
F r
.05AB1E ,
231110 bajtówWypróbuj online.
-12 bajtów dzięki @ Mr.Xcoder .
Wprowadź jako indeksowane wartości 0 (tj.
[0,2,3]
), Które są pierwszym wejściem.Wyjaśnienie:
Na przykład: jeśli lista wejściowa indeksów to
[0,2,3]
, utworzy następujący ciąg:Które będą:
Oryginalna 23 bajtowa odpowiedź:
Wprowadź jako listę boolean (tj.
[1,0,1,1]
), Która jest pierwszym wejściem.Wypróbuj online.
Wyjaśnienie:
Na przykład: jeśli boolowska lista wejściowa jest
[1,0,1,1]
, utworzy następujący ciąg:Które będą:
źródło
'x*
działa powtarzaniex
n razy bez użycias
WAP, ale nie działa z'€*
? .. EDYCJA: Tylko w starszej wersji ...€
nadal jest analizowana jako operator, nawet jeśli jest w literałach char? Nie jestem szczery. W nowej wersji*
nie zachowuje się jednak tak samo.JavaScript (Node.js) , 60 bajtów
Inne (rekurencyjne) podejście. nie bije odpowiedzi Arnaulda ... jeszcze ...
Przyjmuje dane wejściowe jako
array, boolean list
źródło
Pyth , 15 bajtów
Wypróbuj tutaj!
Irytująco, obchodzenia się pusta lista wymiar sprawy nie mniej niż 2 bajtów zajmuje ... Wolę używać
ss
w miejscujk.n
, ale: | Zakłada, że lista do transformacji może być podana w natywnej składni języka Pyth jako ciąg. Napisałem konwerter do składni Pyth, aby ułatwić testowanie. W niefortunnym przypadku, gdy OP zdecyduje się na to nie zezwalać, 17-bajtowy „naprawi” to:źródło
Japt ,
1514 bajtówZ pewną inspiracją z rozwiązania Arnauld .
Pobiera wskazania jako pierwsze wejście, jako boolowską tablicę
1
s i0
s.Spróbuj
Wyjaśnienie
źródło
Czysty ,
122112 bajtówWypróbuj online!
Wersja odpowiedzi Damiena Haskella, wykorzystująca system golfisty Clean'a. Naprawdę pokazuje duże podobieństwa między tymi dwoma językami.
Wyjaśnił:
źródło
Rubinowy , 54 bajty
Wypróbuj online!
źródło
(niesprawdzone, ale myślę poprawne. Wyjście asm kompilatora wygląda tak, jak się spodziewam. Zaktualizuje się, jeśli / kiedy znajdę czas na napisanie testowej wiązki, która tworzy i drukuje tę strukturę danych.)
GNU C ++ (przenośny) 148 bajtów
GNU C ++ (int = wskaźnik i spada z nie-pustej funkcji UB) 120 bajtów
Jest to struktura licznika głębokości, długości, tablicy {liczb całkowitych lub wskaźników}. Na dolnym poziomie tego niebinarnego drzewa (
depth==0
) tablicaintptr_t
jest tablicą liczb całkowitych. Na wyższych poziomach jeststruct m*
przechowywany wintptr_t
. Traversal bierze obsadę.Funkcja
R()
odwrotna jest funkcją składową, ponieważ oszczędza to deklarowanie argumentu i wielep->
składni, aby odwoływać się do elementów struktury w porównaniu z domniemanymthis
wskaźnika.Jedynym rozszerzeniem GNU jest elastyczny element tablicy C99, który tworzy strukturę o zmiennej wielkości , który tworzy , która jest obsługiwana w C ++ jako rozszerzenie GNU. Mógłbym użyć
*a
elementu wskazującego na osobno przydzieloną tablicę i mieć to zwykły ISO C ++. (I to faktycznie zaoszczędziłoby bajt bez konieczności wprowadzania jakichkolwiek innych zmian). Napisałem to jako implementację makiety / referencji dla wersji asm.Krótsza wersja z po prostu
int
deklaruje równieżR()
jako powracającąint
zamiastvoid
. Te dwa fragmenty hakerów nie są ze sobą powiązane; to tylko wersja „działa na co najmniej jednej implementacji”.Powinien działać dobrze na 32-bitowych
int
obiektach docelowych (gdzie może zawierać wskaźnik), o ile kompilujesz z gcc7 lub starszym, lub wyłączasz optymalizacje. (gcc8 -O3
zakłada, że wykonanie nie może dotrzeć do dolnej częścivoid
niefunkcji, ponieważ byłby to UB). x86gcc -m32 -O3
powinien działać poprawnie z gcc7, jak na Godbolt gdzie obie wersje (w różnych przestrzeniach nazw) i wersję nie będącą funkcją członka .Bez golfa
Funkcja arg,
int r[]
jest tablicą liczb całkowitych 0 / niezerowych, które wskazują, czy dana głębokość powinna zostać zamieniona, zaczynając od najbardziej zewnętrznego poziomu.Kiedy wracamy, mijamy
r+1
, więc sprawdzanie bieżącej głębokości jest zawsze*r
.Wcześniejsza wersja przeszła
r
bez zmian i sprawdzonar[d]
. Dzięki elastycznemu elementowi tablicy musiałem przechowywać jakiś wskaźnik ostatniego poziomu, ponieważa[]
nie jest wskaźnikiem, to prawdziwa tablica bez pośrednictwa. Ale zintptr_t *a
członkiem nie mogłem tego po prostu miećnullptr
na poziomie liścia, ponieważ chcę, żeby były to wartości.Odwrócenie bieżącego poziomu przed lub po przejściu przez drzewo nie powinno mieć znaczenia. Nie próbowałem tego robić podczas .
Nie jestem pewien , czy
std::reverse
jest to warte liczenia bajtów w porównaniu z ręczną pętlą, zwłaszcza jeśli mogę zadzwonićR()
do każdego wskaźnika dokładnie raz gdzieś w tej pętli. Ale tylko jeślid!=0
źródło
Mathematica, 7 bajtów
Funkcjonować. Daj mu zagnieżdżoną listę jako pierwszy argument, a opartą na 1 listę poziomów / wymiarów do odwrócenia jako drugi argument. Wypróbuj online!
Wreszcie, kolejne wyzwanie, w którym Mathematica ma wbudowane!
źródło