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"]]
Odpowiedzi:
Pyth, 11-50% = 5,5 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy .
To definiuje funkcję
y
. Dodatkowe 3 bajty<newline>yQ
po prostu wywołują funkcję z listą danych wejściowych i dlatego nie muszą być liczone do całkowitej liczby bajtów.Wyjaśnienie:
źródło
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:
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ęźródło
Prolog, 40-50% = 20 bajtów
To rekurencyjnie wywołuje predykat
a/2
zmaplist/3
, dla każdego członka listy, aż doreverse/2
niepowodzenia (tzn. Ostatni element nie był listą).źródło
Python 2, 40-50% = 20
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
źródło
f=lambda x:map(f,x)[::-1]if x>[]else x
.Emacs Lisp, 46 bajtów * 0,5 = 23
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.
źródło
Mathematica, 34/2 = 17 bajtów
Lub po prostu,
Reverse//@#&
jeśli chceszReverse
wszędzie mnóstwo ton błędów .źródło
Clojure 43/2 = 21,5 bajtów
źródło
JavaScript ES6, 42-50% = 21 bajtów
Mój wynik jest doskonały na wiele sposobów. Implementuje funkcję,
r
która rekurencyjnie stosuje się do elementów swojego wkładu.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:Lub, jeśli założymy, że obiekt ma rozsądną
reverse
właściwość, moglibyśmy to zrobić (35–50% = 17,5):źródło
a.pop?a.reverse().map(r):a
. Zakładając, że nie ma potrzeby obsługivoid 0
i dostosowywania obiektów.Lua,
11199 * .5 =55,549,5 bajtówDobra rekurencja
źródło
CJam, 20 bajtów * 50% = 10
Definiuje nazwany blok,
F
który można zastosować do tablicy na szczycie stosu (lub cokolwiek innego, w którym to przypadku jest to brak opcji).Sprawdź to tutaj.
źródło
Brachylog , 5–50 % = 2,5 bajtów
Wypróbuj online!
Ponieważ
↔
mogą również odwracać ciągi i liczby całkowite, musimy jawnie zawieść nie-listy zċ
.źródło
Wolfram Language (Mathematica) , 23-50% = 11,5 bajtów
Wypróbuj online!
List
s w Mathematica ({...}
) są równoważne zList[...]
.@*
Operator jest kompozycja, więc zastąpienie co wystąpienieList
zReverse@*List
odwraca każdej listy, które występuje na początku (Reverse@*List[...]
=Reverse[{...}]
).24-50% = 12 bajtów
Wypróbuj online!
Działa nie tylko na
List
s.źródło
Clojure, 38 bajtów
(i chyba premia, ale Clojure to dynamiczny język, więc jest dostępny za darmo)
To dobry początek, ale nie wykorzystałem tych optymalizacji:
fn
zamiast nazwanej za pomocądefn
. Ale nadal potrzebujemy nazwy „zasięgowej”f
do rekurencjiseq?
zamiastcoll?
(into () ...)
zamiastreverse
x
przed mapowaniem, nie potrzebujemy wtedy tylu spacjiźródło
Rubinowy , 32-50% = 16 bajtów
Funkcja rekurencyjna. Użycie
rescue
do wyłapaniaNoMethodError
wyzwalacza podczas próbyreverse
uzyskania liczby lubmap
ciągu okazuje się być o 2 bajty krótsze niż sprawdzenie, czy dane wejściowe są tablicą za pośrednictwema==[*a]
.Wypróbuj online!
źródło