Odwróć tablicę N-wymiarową

10

Detale

Napisz funkcję lub program, który przy danej tablicy (lub liście), zawierającej tylko liczby całkowite, zwraca lub wyprowadza tablicę z odwróconymi wszystkimi podelementami. Oznacza to, że odwróć wszystkie elementy najgłębszej tablicy, a następnie drugą najgłębszą itd. Nie trzeba określać wymiarów, ale funkcja lub program musi działać dla tablic poszarpanych w rodzimym formacie języka programowania.


Przykłady

To:

[[1,2], [3,4]]

Byłby to:

[[4,3], [2,1]]

To:

[[[ 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]]]

Byłby to:

[[[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]]]

To:

[[[1,2]],
 [[3,4], [5]],
 [[6,7,8], [9], [10,11]],
 [[[12,13], [14,15]], [16], [17,18,19,20]],
 [21]]

Byłby to:

[[21],
 [[20,19,18,17], [16], [[15,14], [13,12]]],
 [[11,10], [9], [8,7,6]],
 [[5], [4,3]],
 [[2,1]]]

Premia

Mam nadzieję , że zachęci to do odpowiedzi w niektórych obiektowych językach programowania ...

-50% Bytecount Jeśli twój program może przyjmować jako dane wejściowe tablicę (lub listę) ze swoim członkiem różnych typów (mogą być w postaci obiektów) i pomyślnie odwrócić wszystkie tablice.

To:

[["Foo",["Bar",1]],
  2,
 ["Baz"],
 [[["Qux"],3],3.14]]

Byłby to:

[[3.14,[3,["Qux"]]],
 ["Baz"],
  2,
 [[1,"Bar"],"Foo"]]
MrPublic
źródło
1
W dodatkowym przykładzie traktujesz łańcuchy jako atomy. Twierdziłbym, że są one pod-tablicami, dlatego też należy je odwrócić. Tak właśnie działa moje rozwiązanie APL po zasileniu normalnych ciągów, ponieważ APL nie ma typu danych ciągu, a jedynie typy znaków. Łańcuchy są zatem jednowymiarowymi tablicami znaków. Jeśli chcesz, aby ciągi pozostały w normalnej kolejności, musisz po prostu uczynić je obiektami w formie wyświetlania.
Adám
@ Nᴮᶻ Czy uważasz, że -50% Bytecount jest zbyt hojny? Mogę zrobić coś podobnego do -30% Bytecount dla różnych typów danych i coś w rodzaju -10% Bytecount do odwracania ciągów, -15% Bytecount do odwracania liczby całkowitej (123 -> 321) i -15% Bytecount do odwracania typ zmiennoprzecinkowy (3,14 -> 41,3).
MrPublic
1
Generalnie nie lubię bonusów. Odwracanie liczb całkowitych i liczb zmiennoprzecinkowych jest ... interesujące.
Adám
4
Zostaw to na razie, ale następnym razem możesz użyć piaskownicy, aby znaleźć takie rzeczy.
Adám
5
O bonusach ...
Martin Ender

Odpowiedzi:

9

Pyth, 11-50% = 5,5 bajtów

L?+IbY_yMbb

Wypróbuj online: pakiet demonstracyjny lub testowy .

To definiuje funkcję y. Dodatkowe 3 bajty <newline>yQpo prostu wywołują funkcję z listą danych wejściowych i dlatego nie muszą być liczone do całkowitej liczby bajtów.

Wyjaśnienie:

L?+IbY_yMbb
L             define a function y(b), that returns:
 ?+IbY           if b + [] == b (test if b is a list):
      _yMb           recursively call y on all elements in b, then reverse the list
          b      else: b
Jakube
źródło
6

Dyalog APL , 14-50 % = 7 bajtów

{∇¨⍣(×|≡⍵)⌽⍵}

⌽⍵odwróć argument,
⍣(×|≡⍵)jeśli argument nie jest atomem (znak [absolutnej] głębokości) ...
∇¨... zastosuj funkcję do każdego elementu (odwróconego argumentu).

Jeśli ⎕ML←3(styl IBM), co ma miejsce w systemach migrowanych z APL2, jeden bajt można zapisać przez usunięcie |.

Wypróbuj APL online.

Dla ciekawości proponowane odwrócenie int i float:

{∇¨⍣(×≡⍵){0::⌽⍵⋄⍎⌽⍕⍵}⍵}

Funkcja wewnętrzna:

0::⌽⍵jeśli wystąpi jakikolwiek błąd, po prostu zwróć ujawniony argument
⍎⌽⍕make na ciąg znaków, odwróć, make na liczbę

Adám
źródło
4

Prolog, 40-50% = 20 bajtów

a(X,Y):-reverse(X,Z),maplist(a,Z,Y);X=Y.

To rekurencyjnie wywołuje predykat a/2z maplist/3, dla każdego członka listy, aż do reverse/2niepowodzenia (tzn. Ostatni element nie był listą).

Fatalizować
źródło
4

Python 2, 40-50% = 20

f=lambda x:map(f,x)[::-1]if"">x>[]else x

Tylko niewielkie modyfikacje potrzebne od podstawowego sposobu są potrzebne, aby otrzymać bonus. Wykorzystuje fakt, że wszystkie listy są mniejsze niż pusty ciąg, a wszystkie liczby są mniejsze niż pusta lista.

Wszystkie przypadki testowe

FryAmTheEggman
źródło
Tylko uwaga, że ​​jest to wersja bez bonusu f=lambda x:map(f,x)[::-1]if x>[]else x.
mbomb007
3

Emacs Lisp, 46 bajtów * 0,5 = 23

(defun g(x)(if(atom x)x(mapcar'g(reverse x))))

Przykład użycia: (g '((1 2) 3 (four 5)))->((5 four) 3 (2 1))

Klasyczne podejście rekurencyjne: jeśli argument nie jest listą, nie zmieniaj go, jeśli jest listą, zamapuj funkcję na odwrocie listy.

nimi
źródło
2

Mathematica, 34/2 = 17 bajtów

Quiet[Reverse//@#]/.Reverse->(#&)&

Lub po prostu, Reverse//@#&jeśli chcesz Reversewszędzie mnóstwo ton błędów .

CalculatorFeline
źródło
2

Clojure 43/2 = 21,5 bajtów

(defn f[x](if(coll? x)(reverse(map f x))x))
wilkesybear
źródło
1

JavaScript ES6, 42-50% = 21 bajtów

Mój wynik jest doskonały na wiele sposobów. Implementuje funkcję, rktóra rekurencyjnie stosuje się do elementów swojego wkładu.

r=a=>Array.isArray(a)?a.reverse().map(r):a

Jeśli założymy, że żaden obiekt nie ma właściwości pop, wówczas staje się (31 - 50% = 15,5), dzięki dev-null:

r=a=>a.pop?a.reverse().map(r):a

Lub, jeśli założymy, że obiekt ma rozsądną reversewłaściwość, moglibyśmy to zrobić (35–50% = 17,5):

r=a=>a[R="reverse"]?a[R]().map(r):a
Conor O'Brien
źródło
Myślę, że można bezpiecznie sprawdzić na tablicy tak: a.pop?a.reverse().map(r):a. Zakładając, że nie ma potrzeby obsługi void 0i dostosowywania obiektów.
andlrc
1

Lua, 111 99 * .5 = 55,5 49,5 bajtów

function r(a)local t={}for i,v in next,a do t[#a+1-i]=type(v)=="table"and r(v)or v end return t end

Dobra rekurencja

Trebuchette
źródło
1

CJam, 20 bajtów * 50% = 10

{_`0='[={W%{F}%}&}:F

Definiuje nazwany blok, Fktóry można zastosować do tablicy na szczycie stosu (lub cokolwiek innego, w którym to przypadku jest to brak opcji).

Sprawdź to tutaj.

Martin Ender
źródło
1

Brachylog , 5–50 % = 2,5 bajtów

ċ↔↰ᵐ|

Wypróbuj online!

         The input
ċ        which is a list
 ↔       reversed
   ᵐ     with each element
  ↰      passed through this same predicate
    |    is the output. If the input isn't a list,
         it is the output.

Ponieważ mogą również odwracać ciągi i liczby całkowite, musimy jawnie zawieść nie-listy z ċ.

Niepowiązany ciąg
źródło
1

Wolfram Language (Mathematica) , 23-50% = 11,5 bajtów

#/.List->Reverse@*List&

Wypróbuj online!

Lists w Mathematica ( {...}) są równoważne z List[...]. @*Operator jest kompozycja, więc zastąpienie co wystąpienie Listz Reverse@*Listodwraca każdej listy, które występuje na początku ( Reverse@*List[...]= Reverse[{...}]).


24-50% = 12 bajtów

#~Reverse~Range@Depth@#&

Wypróbuj online!

Działa nie tylko na Lists.

attinat
źródło
1

Clojure, 38 bajtów

(i chyba premia, ale Clojure to dynamiczny język, więc jest dostępny za darmo)

(fn f[x](if(seq? x)(map f(into()x))x))

To dobry początek, ale nie wykorzystałem tych optymalizacji:

  • Zdefiniuj anonimową funkcję za pomocą fnzamiast nazwanej za pomocą defn. Ale nadal potrzebujemy nazwy „zasięgowej” fdo rekurencji
  • Weź dane wejściowe jako listę zamiast wektora, a następnie możemy użyć seq?zamiastcoll?
  • Użyj (into () ...)zamiastreverse
  • Odwróć xprzed mapowaniem, nie potrzebujemy wtedy tylu spacji
NikoNyrh
źródło
0

Rubinowy , 32-50% = 16 bajtów

Funkcja rekurencyjna. Użycie rescuedo wyłapania NoMethodErrorwyzwalacza podczas próby reverseuzyskania liczby lub mapciągu okazuje się być o 2 bajty krótsze niż sprawdzenie, czy dane wejściowe są tablicą za pośrednictwem a==[*a].

f=->a{a.reverse.map(&f)rescue a}

Wypróbuj online!

Wartość tuszu
źródło