Membalikkan array N-Dimensi

10

Detail

Tulis fungsi atau program yang, diberi array (atau daftar), hanya berisi integer, mengembalikan atau output array dengan semua sub-elemen terbalik. Yaitu, balikkan semua elemen dari array terdalam, kemudian yang terdalam kedua, dll. Dimensi tidak perlu ditentukan, tetapi fungsi atau program harus bekerja untuk array bergerigi dalam format asli bahasa pemrograman Anda.


Contohnya

Ini:

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

Akan menjadi ini:

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

Ini:

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

Akan menjadi ini:

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

Ini:

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

Akan menjadi ini:

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

Bonus

Mudah - mudahan ini akan mendorong jawaban dalam beberapa bahasa pemrograman berorientasi objek ...

-50% Bytecount Jika program Anda dapat mengambil sebagai input array (atau daftar) dengan anggotanya dari berbagai jenis (ini bisa dalam bentuk objek) dan berhasil membalikkan semua array.

Ini:

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

Akan menjadi ini:

[[3.14,[3,["Qux"]]],
 ["Baz"],
  2,
 [[1,"Bar"],"Foo"]]
Tuan Umum
sumber
1
Dalam contoh bonus Anda, Anda memperlakukan string sebagai atom. Saya berpendapat bahwa mereka adalah sub-array, dan karenanya harus dibalik juga. Inilah yang sebenarnya dilakukan oleh solusi APL saya ketika memasukkan string normal, karena APL tidak memiliki tipe data string, hanya tipe data karakter. Oleh karena itu string adalah array karakter satu dimensi. Jika Anda ingin string tetap dalam urutan normal, Anda hanya perlu membuatnya objek dengan bentuk tampilan.
Adám
@ Nᴮᶻ Apakah Anda percaya bahwa Bytecount -50% terlalu murah hati? Saya dapat melakukan sesuatu di sepanjang garis -30% Bytecount untuk berbagai tipe data, dan sesuatu seperti -10% Bytecount untuk membalikkan Strings, -15% Bytecount untuk membalikkan tipe integer (123 -> 321) dan -15% Bytecount untuk membalikkan tipe mengambang (3.14 -> 41.3).
Tuan Umum
1
Saya biasanya tidak suka bonus. Membalikkan bilangan bulat dan mengapung adalah ... menarik.
Adám
4
Biarkan saja untuk saat ini, tetapi lain kali, Anda mungkin ingin menggunakan kotak pasir untuk mencari tahu hal-hal seperti itu.
Adám
5
Tentang bonus ...
Martin Ender

Jawaban:

9

Pyth, 11 - 50% = 5,5 byte

L?+IbY_yMbb

Cobalah online: Demonstrasi atau Test Suite .

Ini mendefinisikan suatu fungsi y. 3 byte tambahan <newline>yQcukup memanggil fungsi dengan daftar input dan karenanya tidak perlu dihitung terhadap total byte.

Penjelasan:

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
sumber
6

Dyalog APL , 14 - 50% = 7 byte

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

⌽⍵argumen terbalik
⍣(×|≡⍵)jika argumen itu bukan atom (tanda kedalaman [absolut]) ...
∇¨... terapkan fungsinya ke setiap elemen (dari argumen terbalik).

Jika ⎕ML←3(gaya IBM), yang merupakan kasus pada sistem yang bermigrasi dari APL2, satu byte dapat disimpan dengan menghapus |.

Coba APL online.

Untuk rasa ingin tahu, int dan float reversing yang diusulkan :

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

Fungsi batin:

0::⌽⍵jika ada kesalahan, kembalikan argumen yang
⍎⌽⍕dibuat menjadi string, balikkan, buat menjadi angka

Adm
sumber
4

Prolog, 40 - 50% = 20 byte

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

Predikat panggilan rekursif ini a/2dengan maplist/3, untuk setiap anggota daftar, hingga reverse/2gagal (yaitu elemen terakhir bukan daftar).

Fatalisasi
sumber
4

Python 2, 40 - 50% = 20

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

Hanya beberapa modifikasi kecil yang diperlukan dari cara dasar untuk melakukannya diperlukan untuk mendapatkan bonus. Menggunakan fakta bahwa semua daftar kurang dari string kosong, dan semua angka kurang dari daftar kosong.

Semua uji kasus

FryAmTheEggman
sumber
Catat saja bahwa versi tanpa bonusnya f=lambda x:map(f,x)[::-1]if x>[]else x.
mbomb007
3

Emacs Lisp, 46 byte * 0,5 = 23

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

Contoh penggunaan: (g '((1 2) 3 (four 5)))->((5 four) 3 (2 1))

Pendekatan rekursif klasik: jika argumennya bukan daftar, anggaplah tidak berubah, jika itu daftar, petakan fungsinya di balik daftar.

nimi
sumber
2

Mathematica, 34/2 = 17 byte

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

Atau hanya Reverse//@#&jika Anda ingin banyak kesalahan dan ada Reversedi mana-mana.

CalculatorFeline
sumber
2

Clojure 43/2 = 21,5 byte

(defn f[x](if(coll? x)(reverse(map f x))x))
Wilkesybear
sumber
1

JavaScript ES6, 42 - 50% = 21 byte

Skor saya sempurna dalam banyak hal. Menerapkan fungsi ryang secara rekursif berlaku sendiri untuk anggota inputnya.

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

Jika kita menganggap tidak ada objek yang memiliki properti pop, maka ini menjadi (31 - 50% = 15.5), terima kasih kepada dev-null:

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

Atau, jika kita mengasumsikan objek memiliki sifat waras reverse, kita dapat melakukannya juga (35 - 50% = 17,5):

r=a=>a[R="reverse"]?a[R]().map(r):a
Conor O'Brien
sumber
Saya kira Anda bisa dengan aman memeriksa array seperti ini: a.pop?a.reverse().map(r):a. Dengan asumsi tidak perlu menangani void 0dan objek kustom.
andlrc
1

Lua, 111 99 * .5 = 55,5 49,5 byte

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

Sedikit rekursi yang bagus

Trebuchette
sumber
1

CJam, 20 byte * 50% = 10

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

Menentukan blok bernama Fyang dapat diterapkan ke array di atas tumpukan (atau apa pun, dalam hal ini adalah no-op).

Uji di sini.

Martin Ender
sumber
1

Brachylog , 5 - 50% = 2,5 byte

ċ↔↰ᵐ|

Cobalah 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.

Karena dapat juga membalik string dan integer, kita harus secara eksplisit gagal dengan non-list ċ.

String yang tidak terkait
sumber
1

Bahasa Wolfram (Mathematica) , 23 -50% = 11,5 byte

#/.List->Reverse@*List&

Cobalah online!

Lists di Mathematica ( {...}) setara dengan List[...]. @*adalah operator komposisi, jadi mengganti setiap kemunculan Listdengan Reverse@*Listmembalikkan setiap daftar yang terjadi pada input ( Reverse@*List[...]= Reverse[{...}]).


24 -50% = 12 byte

#~Reverse~Range@Depth@#&

Cobalah online!

Tidak hanya berfungsi pada Lists.

attinat
sumber
1

Clojure, 38 byte

(dan bonus saya rasa, tetapi Clojure adalah bahasa yang dinamis sehingga gratis)

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

Ini adalah awal yang baik tetapi tidak menggunakan optimasi ini:

  • Tetapkan fungsi anonim dengan fnalih - alih yang bernama dengan defn. Tetapi kita masih membutuhkan nama "cakupan" funtuk rekursi
  • Ambil input sebagai daftar alih-alih vektor, maka kita bisa menggunakan seq?sebagai gantinyacoll?
  • Gunakan (into () ...)sebagai gantireverse
  • Membalikkan xsebelum pemetaan, kita tidak membutuhkan banyak ruang saat itu
NikoNyrh
sumber
0

Ruby , 32 - 50% = 16 byte

Fungsi rekursif. Menggunakan rescueuntuk menangkap NoMethodErrorpemicu ketika mencoba untuk reversenomor atau mapstring ternyata lebih pendek 2 byte daripada memeriksa apakah input adalah array melaluia==[*a] .

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

Cobalah online!

Nilai Tinta
sumber