Diberikan array ortogonal N-dimensional (non-compang-camping) dari bilangan bulat non-negatif, dan indikasi yang dimensi untuk membalik, mengembalikan array tetapi terbalik sepanjang dimensi tersebut. Indikasi dapat diberikan sebagai daftar panjang Boolean N atau daftar subset dari dimensi N pertama yang diindeks dari 0 atau 1.
Silakan sebutkan format input Anda. Penjelasan kode sangat dihargai.
Contoh walked-through
Kami diberi 2-layer 3-baris 4-kolom 3D-array
[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]],
[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]]]
dan salah satunya
[true,false,true]
(Daftar Boolean)
[0,2]
( daftar 0-diindeks)
[1,3]
( daftar 1-diindeks)
Kita perlu membalik urutan dimensi pertama dan terakhir, yaitu lapisan dan elemen dari baris (kolom), tetapi bukan baris dari setiap lapisan. Pertama (urutan sebenarnya Anda melakukan ini tidak masalah) kami membalikkan urutan lapisan:
[[[13,14,15,16],
[17,18,19,20],
[21,22,23,24]],
[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9,10,11,12]]]
dan kemudian kita membalik urutan elemen dari setiap baris:
[[[16,15,14,13],
[20,19,18,17],
[24,23,22,21]],
[[ 4, 3, 2, 1],
[ 8, 7, 6, 5],
[12,11,10, 9]]]
Uji kasus
[[[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
bekerja pada array arbitrer tetapi hanya peduli pada level pertama), generik, atau kelas rekursif (kelas tipe / objek tergantung pada fungsional atau OOP, tetapi serupa kasus penggunaan). Dua yang terakhir biasanya jauh lebih bertele-tele.Jawaban:
APL (Dyalog) ,
209 byteCobalah online!
Bagaimana?
/
- kurangi - ambil elemen paling kanan dalam input (array) dan terapkan fungsi dengan elemen kiri berikutnya sebagai argumen kiri{⌽[⍺]⍵}
- mundur dalam dimensileft argument
(⍺
)⊃
- Ratakan array yang tertutupsumber
APL (Dyalog Unicode) , 9 byte
Cobalah online!
Sepertinya Uriel mengedit sesuatu yang hampir identik dulu, tetapi saya mengembangkannya secara mandiri. Saya pikir format input ini tidak valid.
sumber
JavaScript (Node.js) ,
58555345 byteDisimpan 8 byte berkat @Shaggy
Mengambil input sebagai
(indications)(array)
, di mana indikasi adalah daftar Boolean.Cobalah online!
Berkomentar
sumber
r
inplace ofr||-1
tampaknya berhasil .f=([r,...b])=>a=>1/r?a.sort(_=>r).map(f(b)):a
bekerja Di ponsel saya jadi tidak bisa menguji dengan benar.Python 2 ,
5655 byteCobalah online!
sumber
Jelly , 8 byte
Mengambil daftar dimensi 0-diindeks.
Cobalah online!
Bagaimana itu bekerja
sumber
R ,
807877 byteBuat panggilan ke extractor R
[
dengan membuat daftar urutan terbalik di mana ditunjukkan. Mereka sebenarnya mengandung angka nol, yang diam-diam diabaikan. Haldrop=F
ini diperlukan untuk mencegah menjatuhkan dimensi R secara default. Kita perlurev
panggilan ke indikator kebalikan dimensi, karena cara R mengisi array.-2 terima kasih @Giuseppe
-1 menggunakan penugasan sebaris.
Cobalah online!
Sebutan terhormat kepada @JayCe yang datang dengan variasi yang mendapatkan hasil yang sama dengan panjang yang sama:
Cobalah online!
sumber
do.call
- lebih panjang pada 83 byte, masih memposting ini di sini sebagai komentar untuk referensi: TIOHaskell,
120119 bytefungsi f mengambil daftar dimensi-N dan daftar bool sebagai input
sumber
F r
.05AB1E ,
231110 byteCobalah online.
-12 byte terima kasih kepada @ Mr.Xcoder .
Input sebagai 0 nilai indeks kebenaran (yaitu
[0,2,3]
), yang merupakan input pertama.Penjelasan:
Sebagai contoh: jika daftar input indeks adalah
[0,2,3]
, itu akan membuat string berikut:Yang mana akan:
Jawaban 23 byte asli:
Input sebagai boolean-list (yaitu
[1,0,1,1]
), yang merupakan input pertama.Cobalah online.
Penjelasan:
Sebagai contoh: Jika daftar input boolean adalah
[1,0,1,1]
, itu akan membuat string berikut:Yang mana akan:
sumber
'x*
bekerja berulangx
kali dan tanpa menggunakans
wap, tetapi tidak berhasil'€*
? EDIT: Hanya dalam warisan ..€
masih diurai sebagai operator meskipun itu dalam karakter literal? Tidak yakin jujur. Di versi yang baru,*
tetap saja tidak berlaku sama.JavaScript (Node.js) , 60 byte
Pendekatan (rekursif) yang berbeda. belum mengalahkan jawaban Arnauld ... belum ....
Mengambil input sebagai
array, boolean list
sumber
Pyth , 15 byte
Coba di sini!
Mengganggu, menangani case daftar dimensi kosong membutuhkan tidak kurang dari 2 byte ... Saya lebih suka menggunakan
ss
di tempatjk.n
tapi: | Mengasumsikan bahwa daftar yang akan diubah dapat diberikan dalam sintaks Pyth asli, sebagai string. Saya telah menulis konverter ke sintaks Pyth untuk membuat pengujian lebih mudah. Dalam kasus yang disayangkan bahwa OP memilih untuk tidak mengizinkan ini, 17-byter akan "memperbaikinya":sumber
Japt ,
1514 byteDengan beberapa inspirasi dari solusi Arnauld .
Mengambil indikasi sebagai input pertama, sebagai array boolean dari
1
s dan0
s.Cobalah
Penjelasan
sumber
Bersih ,
122112 byteCobalah online!
Versi jawaban Hasami Damien menggunakan sistem tipe pegolf Clean. Benar-benar menunjukkan kesamaan luas antara kedua bahasa.
Dijelaskan:
sumber
Rubi , 54 byte
Cobalah online!
sumber
(Tidak teruji tapi saya pikir benar. keluaran as kompiler terlihat seperti apa yang saya harapkan. Akan diperbarui jika / ketika saya menemukan waktu untuk menulis test harness yang membuat dan mencetak struktur data ini.)
GNU C ++ (portable) 148 byte
GNU C ++ (int = pointer dan jatuh dari fungsi non-void UB) 120 byte
Ini adalah struct penghitung kedalaman, panjang, array {integer atau pointer}. Di tingkat bawah pohon non-biner ini (
depth==0
), arrayintptr_t
adalah array bilangan bulat. Di level yang lebih tinggi, inistruct m*
disimpan diintptr_t
. Traversal mengambil peran.Fungsi
R()
sebaliknya adalah fungsi anggota karena itu menyimpan mendeklarasikan argumen, dan menyimpan banyakp->
sintaks untuk mereferensikan anggota struct vsthis
pointer implisit .Satu-satunya ekstensi GNU adalah anggota array fleksibel C99 untuk membuat struct berukuran variabel , yang didukung dalam C ++ sebagai ekstensi GNU. Saya bisa menggunakan
*a
anggota yang menunjuk ke array yang dialokasikan secara terpisah dan memiliki ini menjadi ISO C ++ biasa. (Dan itu sebenarnya akan menghemat byte tanpa memerlukan perubahan lain). Saya menulis ini sebagai implementasi mockup / referensi untuk versi asm.Versi yang lebih pendek dengan hanya
int
menyatakanR()
sebagai kembali,int
bukanvoid
. Kedua bit hackery ini tidak berhubungan; ini hanya versi "berfungsi pada setidaknya satu implementasi".Ini harus bekerja dengan baik pada target 32-bit (di mana
int
dapat menyimpan pointer), selama Anda mengkompilasi dengan gcc7 atau lebih tua, atau menonaktifkan optimasi. (gcc8 -O3
mengasumsikan bahwa eksekusi tidak dapat mencapai bagian bawah dari non-void
fungsi karena itu akan menjadi UB.) x86gcc -m32 -O3
harus berfungsi dengan baik dengan gcc7, seperti pada Godbolt mana saya memasukkan kedua versi (dalam ruang nama yang berbeda) dan versi non-anggota-fungsi .Tidak disatukan
Function arg,,
int r[]
adalah larik bilangan bulat 0 / non-nol yang menunjukkan apakah kedalaman yang diberikan harus ditukar, dimulai dengan level paling luar.Ketika kita berulang, kita lewat
r+1
, jadi memeriksa kedalaman saat ini selalu*r
.Versi sebelumnya baru saja lewat
r
tidak berubah, dan diperiksar[d]
. Dengan anggota array yang fleksibel, saya perlu menyimpan beberapa jenis indikator tingkat terakhir karenaa[]
bukan pointer, ini adalah array yang benar tanpa tipuan. Tetapi denganintptr_t *a
anggota, saya tidak bisa hanya memiliki itunullptr
untuk tingkat daun, karena saya ingin itu menjadi nilai.Membalikkan level saat ini sebelum atau setelah melintasi pohon seharusnya tidak menjadi masalah. Saya tidak mencoba melakukannya selama .
Saya tidak yakin itu
std::reverse
sepadan dengan jumlah byte vs loop manual, terutama jika saya bisa bekerja pada memanggilR()
setiap pointer tepat di suatu tempat di dalam loop itu. Tapi hanya jikad!=0
sumber
Mathematica, 7 byte
Fungsi. Berikan daftar bersarang sebagai argumen pertama, dan daftar level / dimensi 1 berbasis untuk membalikkan sebagai argumen kedua. Cobalah online!
Akhirnya, tantangan lain di mana Mathematica memiliki builtin!
sumber