Catatan: Ini adalah # 2 dalam serangkaian tantangan manipulasi array . Untuk tantangan sebelumnya, klik di sini .
Memisahkan Daftar Bersarang
Untuk memisahkan nilai dalam daftar bersarang, ratakan, lalu bungkus masing-masing nilai sehingga pada kedalaman yang sama seperti sebelumnya.
Artinya, daftar ini:
[1, [2, 3], [4, 4, [5, 2], 1]]
Akan menjadi:
[1, [2], [3], [4], [4], [[5]], [[2]], [1]]
Tantangan
Tugas Anda adalah menulis sebuah program yang mengambil semua daftar bilangan bulat positif (dalam batas bahasa Anda) dan melakukan operasi pemisahan ini.
Anda dapat mengirimkan fungsi yang menjadikan daftar sebagai argumen, atau program lengkap yang menjalankan I / O.
Karena ini adalah kode-golf , pengiriman terpendek (dalam byte) menang! *
* Lubang golf standar dilarang. Kamu tahu latihannya.
Uji Kasus
Daftar input hanya akan berisi bilangan bulat dalam ukuran bilangan bulat standar bahasa Anda. Untuk menghindari kendala bahasa yang mencegahnya bersaing, nilai tidak akan disarangkan lebih dari 10.
Anda dapat berasumsi bahwa input tidak akan memiliki sub-daftar kosong: misalnya - [[5, []]]
tidak akan diberikan. Namun, daftar utama bisa kosong.
[] -> []
[[1, 2]] -> [[1], [2]]
[3, [4, 5]] -> [3, [4], [5]]
[3, [3, [3]]] -> [3, [3], [[3]]]
[[6, [[7]]]] -> [[6], [[[7]]]]
[[5, 10], 11] -> [[5], [10], 11]
Jangan ragu untuk meninggalkan komentar jika saya melewatkan sudut kotak.
Contoh
Aku melemparkan bersama-sama cepat (ungolfed) Python 3 solusi sebagai contoh - Anda bisa mengujinya pada repl.it .
sumber
Jawaban:
Brachylog , 16 byte
Cobalah online!
Penjelasan
sumber
Z
argumen tentang TIO? Tanpanya, ini sepertinya keluaran dengan true / false, yang membuatnya tampakZ
perlu dalam hitungan byte.Z
memberi tahu Brachylog bahwa argumen keluaran adalah variabel. Ini adalah variabel yang disatukan dengan output yang dihasilkan. Saat Anda menghapusnya, ini memberi tahu Brachylog bahwa outputnya adalah variabel anonim, dan sebagai gantinya akan mencetak apakah predikat utama berhasil atau gagal. Ini sama dengan di Prolog di mana hasilnya "dimasukkan" ke dalam variabel.Mathematica,
2421 byteatau salah satunya:
Penjelasan
Alasan mengapa hal ini begitu singkat adalah karena pada dasarnya rekursi yang tidak memerlukan kasus dasar yang eksplisit.
Ada banyak gula sintaksis di sini, jadi mari kita mulai dengan ungolfing ini.
&
menunjukkan fungsi yang tidak disebutkan namanya yang tersisa, yang argumennya ditulis sebagai#
. Di dalam fungsi ini#0
mengacu pada fungsi itu sendiri, yang memungkinkan seseorang untuk menulis fungsi rekursif tanpa nama. Tapi mari kita mulai dengan memberi nama fungsi bagian dalam dan menariknya:Gula sintaksis penting lainnya adalah
f/@x
yang merupakan kependekan dariMap[f, x]
yaitu gula yang memanggilf
setiap elemenx
. Alasannyaf[x_] := ... f /@ x
tidak menyebabkan rekursi yang tak terbatas adalah bahwa pemetaan sesuatu di atas atom membuat atom tidak berubah tanpa benar-benar memanggil fungsi. Oleh karena itu, kita tidak perlu memeriksa kasus dasar (elemen saat ini adalah bilangan bulat) secara eksplisit.Jadi fungsi
f
pertama kali berulang ke daftar terdalam di dalamx
, di mana titikf/@
menjadi no-op. Lalu kita sebut menggunakan##& @@ List /@
itu. MemetakanList
daftar hanya membungkus setiap elemen dalam daftar yang terpisah, jadi{1, 2, 3}
jadilah{{1}, {2}, {3}}
. Kemudian kita menerapkannya##&
, yang berarti kepala (yaitu daftar luar) diganti oleh##&
, jadi ini berubah menjadi##&[{1}, {2}, {3}]
. Tetapi##&
hanya mengembalikan argumen itu sebagaiSequence
(yang dapat Anda anggap sebagai daftar yang tidak terbuka, atau semacam operator "percikan" dalam bahasa lain).Jadi
##& @@ List /@
mengubah daftar{1, 2, 3}
menjadi{1}, {2}, {3}
(semacam, hal terakhir yang benar-benar terbungkus di kepalaSequence
, tetapi itu menghilang begitu kita menggunakan nilai di mana saja).Itu meninggalkan pertanyaan mengapa
f
itu sendiri belum menjadi solusi untuk tantangan tersebut. Masalahnya adalah bahwa daftar terluar harus diperlakukan secara berbeda. Jika kami memiliki input,{{1, 2}, {3, 4}}
kami ingin{{1}, {2}, {3}, {4}}
dan tidak{{1}}, {{2}}, {{3}}, {{4}}
. Solusi asli saya memperbaikinya dengan meneruskan hasil akhir sebagai daftar argumenJoin
yang akan mengembalikan level terluar dari daftar, tetapi yang ini hanya melompati level terluar dengan menggunakanf
dirinya sendiri dalam peta pada output. Karenanyaf
hanya diterapkan pada elemen individual dari daftar terluar dan tidak pernah menyentuh daftar itu.Adapun tiga solusi lainnya, yang pertama hanya menerapkan rekursi di luar
f
yang juga berfungsi. Dua solusi lainnya menghindariMap
operasi berulang dengan terlebih dahulu menyusun dua fungsi dan kemudian memetakan hasilnya hanya sekali.sumber
J ,
1918 byteIni adalah kata kerja anonim yang mengambil dan mengembalikan array kotak, yang merupakan versi bertumpuk array J (agak rumit). Lihat lulus semua kasus uji.
Penjelasan
Ini menggunakan operasi yang agak eksotis
{::
( peta ) danS:
( menyebar ), yang beroperasi pada array kotak.{::
mengganti setiap daun dengan jalur kotak ke daun itu.S:
menerapkan kata kerja yang diberikan ke kedalaman bersarang yang diberikan, kemudian memercikkan hasilnya ke dalam array.sumber
R, 199 byte
Pertanyaan ini SULIT. Daftar R agak aneh dan sama sekali tidak mudah untuk mengulang semua elemen sublists. Juga tidak mudah untuk kemudian menentukan kedalaman daftar itu. Kemudian tantangannya adalah menciptakan kembali daftar dengan semua elemen yang terpisah, jadi kita juga perlu cara untuk secara adaptif membuat daftar kedalaman tertentu.
Solusinya terdiri dari dua bagian besar. Fungsi rekursif yang melingkupi semua daftar dan mencatat kedalaman:
Ketika kami memiliki kedalaman dari setiap entri vektor
unlist(l)
, disimpand
, kami secara implisit membuat daftar melaluilapply
, dan mengisinya dengan fungsi berikut:Dalam panggilan yang berlaku ini, kami membuat objek
q
dengan nilai entri dalam daftar, memeriksa kedalamannya dan melihat apakah itu bukan nol. Jika nol, kita bisa membiarkannya sebagai nilai numerik. Jika bukan nol, kita perlu membuatnya dalam jumlah daftar itu. Jadi kami memanggil for-loopd
kali dan berulang kali meneleponq=list(q)
.lapply
kemudian masukkan semua nilai ini keq
dalam daftar, buat output yang diinginkan.Selesaikan program dengan jarak yang tepat dan semacamnya:
sumber
is.list(y)
bukanclass(y)=='list'
? tidak dapat memverifikasi bahwa itu benar-benar berfungsi.Retina , 34 byte
Cobalah online!
sumber
(?<-2>)
kerjanya?C (gcc), 147 byte
Input contoh:
Contoh output:
sumber
ditumpuk , tidak bersaing, 25 byte
Ini adalah fungsi yang memodifikasi anggota atas tumpukan. Jika Anda ingin fungsi bonafide, cukup tambahkan
[
dan]
ke awal dan akhir. Coba di sini!Ini versi yang bisa dibaca:
Kasus cobaan:
Output tanpa baris baru:
sumber
*
seperti argumen ke blok kode?d-1
.$func
adalah fungsi yang dapat dimanipulasi.PHP,
10194 bytedisimpan 1 byte berkat @Christoph, disimpan 6 lainnya terinspirasi oleh itu.
fungsi rekursif, cukup lurus ke depan
kerusakan
sumber
$r
mendapatkan elemen dalam loop atau fungsi mengembalikan array kosong. Ini mungkin menghasilkan pemberitahuan, tetapi itu tidak dicetak dengan konfigurasi default.!cos()
.cos()
mengembalikannull
untuk setiap larik dan float! = 0 untuk setiap bilangan bulat positiv. Maksud saya ... siapa yang peduli dengan peringatan?is_int
: Membalikkan kondisi tidak menyelamatkan apa pun; Saya membutuhkan ruang antaraelse
danforeach
. TAPI:$b[0]
untuk integer adalahNULL
.Python 2,
122106 byteSkor yang sangat buruk, hanya implementasi yang mudah.
Terima kasih kepada Zachary T karena telah membantu menghemat 16 byte!
Panggil
x
dengan satu argumen untuk dijalankan. Untuk beberapa alasan hanya dapat dijalankan sekali.sumber
a+=[n(l,d)]
kea+=n(l,d),
(perhatikan tanda koma)t
?n
ke fungsi dan menghapus argumen pertama karena selalu akan begitul
.JavaScript (Firefox 30-57), 53 byte
Jawaban ES6 terbaik yang saya miliki sejauh ini adalah 76 byte:
sumber
f=
.Pyth - 29 byte
Test Suite .
sumber
Perl 6 ,
6047 byte( Cobalah online. )
Penjelasan:
[... for |$^a]
: Iterate atas array input, dan buat array baru dari array tersebut.$_ ~~ List ?? ... !! ...
: Untuk setiap elemen, periksa apakah itu sendiri array.|([$_] for .&f)
: Jika elemen adalah array, secara rekursif terapkan fungsinya, lakukan iterate pada elemen-elemen array baru yang dikembalikan dari panggilan rekursif itu, bungkus setiap elemen dalam arraynya sendiri, dan selipkan ke dalam daftar luar.$_
: Jika elemen tersebut bukan sebuah array, berikan itu apa adanya.sumber
Haskell, 71 byte
Sekali lagi saya harus mendefinisikan tipe daftar saya sendiri, karena daftar asli Haskell tidak dapat disarangkan secara sewenang-wenang. Tipe baru ini
L
dapat dikembalikan dari suatu fungsi tetapi tidak dicetak secara default, jadi untuk melihat hasilnya, saya mendefinisikanshow
instance untukL
:Sekarang kita dapat melakukan beberapa tes di REPL:
Cara kerjanya: rekursi sederhana yang melewati level bersarang sebagai fungsi
C
konstruktor. Kami mulai dengan fungsi identitasid
dan setiap kali ada daftar (-> pencocokan polad#C l=
) kami menambahkan lapisan lebih lanjutC
(->C .pure.d
) ke panggilan rekursif#
ke semua elemen daftar. Jika kita menemukan nomor, kita cukup menerapkan fungsi level-bertelurd
ke nomor tersebut.sumber
APL (Dyalog) , 44 byte *
Fungsi awalan diam-diam anonim. Mengambil daftar APL bersarang sebagai argumen dan mengembalikan array APL bersarang.
Cobalah online!
{
...}
terapkan fungsi eksplisit berikut di mana argumen diwakili oleh⍵
:⎕JSON⍵
ubah argumen menjadi JSONj←
simpan dij
'[]'∘.=
tabel di manaj
sama dengan kurung buka (baris atas) dan tutup (baris bawah)-⌿
baris atas dikurangi baris bawah (pengurangan perbedaan vertikal)+\
jumlah kumulatif (ini memberikan tingkat bersarang untuk setiap karakter)(
...)⊆
partisi, memulai partisi baru setiap kali 1 tidak didahului dengan 1 in ...j∊⎕D
di mana setiap karakterj
adalah anggota dari set D igits⊃¨
pilih yang pertama dari masing-masing (ini memberikan tingkat bersarang per nomor multi-digit)∊{
...}¨
terapkan fungsi berikut ini untuk setiap level bersarang (⍵
), menggunakan elemen yang sesuai dari argumen ϵ nlisted (diratakan) sebagai argumen kiri (⍺
):,⍺
ravel (sebutkan) nomornya (karena skalar tidak dapat dilampirkan)⊂⍣⍵
lampirkan⍵
kali⊃
mengungkapkan (karena daftar yang paling dalam itu sendiri adalah sebuah selungkup)* Menggunakan Dyalog klasik dengan
⎕ML←3
(default pada banyak sistem), menggantikan⊂
untuk⊆
dan↑
untuk⊃
. Tio!sumber