Dalam tantangan ini, tugas Anda adalah membuat program yang menggunakan array bersarang dan mengembalikan array datar satu dimensi. Sebagai contoh [10,20,[30,[40]],50]
harus output [10,20,30,40,50]
.
Memasukkan
Input akan berupa array bersarang (mis. [10,20,[[[10]]]]
). Ini hanya akan berisi Integer (baik negatif dan positif), String dan Array. Anda dapat mengambil input sebagai argumen fungsi, STDIN atau apa pun yang sesuai dengan bahasa Anda. Anda dapat mengasumsikan bahwa array input tidak akan memiliki array kosong.
Keluaran
Outputnya akan berupa array dimensi tunggal yang rata dengan elemen yang sama dengan tipe yang sama seperti pada array bersarang dan dalam urutan SAMA.
Uji Kasus
[10,20,30] -> [10,20,30]
[[10]] -> [10]
[["Hi"],[[10]]] -> ["Hi",10]
[[[20],["Hi"],"Hi",20]] -> [20,"Hi","Hi",20]
[[["[]"],"[]"]] -> ["[]","[]"]
Jangan ragu untuk meminta klarifikasi dengan menggunakan komentar. Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
Catatan: Jika bahasa Anda mengandung built-in untuk ini, maka Anda TIDAK harus menggunakannya.
Edit
Harap sertakan juga tautan ke situs web tempat kode Anda dapat dieksekusi.
unflatten
pertanyaan tapi tidak adaflatten
pertanyaan tentang PPCG.["[",[["[",],'[',"['['"]]
sebagai kasus uji.'
dan"
sebagai pembatas. (Tapi saya setuju bahwa kasus uji yang melibatkan[
,]
,"
dan\
di dalam string akan berguna.)Jawaban:
K, 3 byte
Ini adalah ungkapan yang cukup umum. "Bergabunglah di konvergensi".
coba di sini dengan OK .
Bagaimana itu bekerja:
Bergabunglah (
,
) bergabung bersama atom atau daftar untuk menghasilkan daftar. Over (/
) mengambil kata kerja (dalam hal ini bergabung) dan menerapkannya di antara setiap elemen daftar, dari kiri ke kanan. Dengan demikian, senyawa,/
akan meratakan semua elemen tingkat atas daftar. Simbol/
sebenarnya memiliki arti yang berbeda tergantung pada valensi (jumlah argumen) dari kata kerja yang dengannya diperparah. Ketika kami menyediakan,/
sebagai kata kerja,/
tindakan terakhir sebagai "konvergen" - itu berulang kali berlaku,/
untuk input sampai berhenti berubah. Beberapa bahasa lain menyebut fitur seperti ini sebagai "kombinator titik tetap". Dengan berulang kali menggabungkan daftar tingkat bawah, Anda pada akhirnya akan tiba pada satu daftar datar, dan tidak ada operasi yang akan mengganggu urutan elemen. Ini sepertinya menyelesaikan masalah.sumber
JavaScript (ES6), 35 byte
Terinspirasi oleh jawaban @ user81655 :
sumber
Mathematica,
1614 byteFungsi tanpa nama yang mengambil dan mengembalikan daftar, misalnya:
Penjelasan
Pesta gula sintaksis!
Untuk memahami cara kerja ini, catatan bahwa setiap ekspresi dalam Mathematica adalah salah atom (misalnya angka, string, simbol-simbol) atau ekspresi senyawa dari bentuk
f[a, b, c, ...]
, di manaf
,a
,b
,c
itu sendiri ekspresi sewenang-wenang. Di sini,f
disebut kepala ekspresi. Yang lainnya hanyalah gula sintaksis. Misalnya{a, b, c}
sajaList[a, b, c]
.Kami mulai dengan
//@
yang memetakan fungsi di semua tingkatan daftar. Contohnya:Perhatikan bahwa ini memetakan
f
atom dan juga ekspresi majemuk. Apa yang sekarang kita cari adalah cara untuk menyingkirkan daftar kepala dan menyimpan yang lainnya.The
Apply
Fungsi ini biasanya digunakan untuk memberi makan elemen dari daftar sebagai argumen terpisah untuk fungsi, tetapi definisi yang sebenarnya adalah lebih umum dan hanya menggantikan kepala ekspresi. MisalnyaApply[g, f[a, b]]
memberig[a, b]
.Sekarang ada "kepala" khusus yang disebut
Sequence
yang hilang begitu saja. Misalnya{a, Sequence[b, c], d}
hanya mengevaluasi{a, b, c, d}
. Gagasan untuk meratakan daftar adalah dengan mengganti kepala semua daftar bagian dalamSequence
sehingga mereka dapat disebarkan ke daftar di sekitarnya. Jadi yang kita inginkan adalahApply
menujuSequence
ke daftar. Mudahnya jika kita melakukanApply
sesuatu pada atom, itu hanya membuat atom tidak berubah, jadi kita tidak harus membedakan antara jenis ekspresi sama sekali.Akhirnya, ada satu masalah kecil:
f
juga diterapkan ke tingkat terluar, sehingga juga menghilangkan terluarList
, yang tidak kita inginkan. Cara paling pendek untuk membalasnya adalah dengan hanya membungkus hasilnya dalam daftar lagi, sehingga sekitarnyaSequence
dapat dengan aman menghilang.Perhatikan bahwa ada tidak
Apply
atauSequence
dalam kode.@@
adalah bentuk operatorApply
dan##&
merupakan trik golf standar untuk mempersingkat nama bawaan yang panjangSequence
. Jadi ungolfing semuanya sedikit, kita mendapatkan sesuatu seperti:Untuk detail lebih lanjut tentang bagaimana dan mengapa
##&
kerjanya, lihat bagian tentang "Urutan argumen" dalam jawaban saya untuk kiat Mathematica .sumber
//@
. Sangat berguna untuk diketahui!//@
menangkap pola yang rapi. Mengingatkan saya pada beberapa combinator rekursif dalam Joy. Apakah Anda memiliki tautan ke referensi yang bagus ke berbagai fungsi terkait di Mathematica? Saya sangat tertarik dengan cara anjak rekursi eksplisit dari program.Map
,MapAt
,Apply
, sertaReplace
dan fungsi-fungsi terkait. Secara umum meskipun ada banyak fungsi yang mengambil parameter levelspec opsional (lihat solusi 16-byte asli saya), yang memungkinkan Anda menerapkan fungsi di beberapa / semua level sekaligus.Python 2, 43 byte
Pada daftar, berulang pada elemen dan menyatukan hasilnya. Pada string atau angka, membungkus dalam daftar tunggal.
Sayangnya, pemesanan Python 2 untuk
int < list < string
sandwich jenislist
antara yang lain, membutuhkan dua ketidaksetaraan untuk memeriksa. Jadi, sebaliknya,l*0
diperiksa terhadap daftar kosong[]
, jika tidak memberi0
atau""
.sumber
Ruby,
434234 byteSolusi rekursif. Sekarang dengan penanganan pengecualian! (mungkin juga kredit @akostadinov untuk menginspirasi perubahan itu)
Tautan IDEOne
sumber
rescue
seperti itutry
blok, jadi Anda gunakanbegin
untuk membedakan bagian yang ingin Anda tangkap dan bagian yang tidak Anda tangkap. Jadi karena Anda menangkap seluruh sisa blok sebelum itu, Anda secara teknis tidak membutuhkannya? Sisanya hanya dipangkas spasi, karena Ruby menafsirkan garis sebagai...inject(:+) rescue [a]
a = raise("haha") rescue 1
akan menugaskan1
untuka
. Iturescue
, seperti ada inlineif
danwhile
.JavaScript (ES6), 41 byte
sumber
Perl 6 , 24 byte
Penjelasan:
Uji:
sumber
Haskell, 43 byte
Haskell tidak memiliki daftar bersarang dengan kedalaman sublists yang berbeda atau tipe campuran untuk elemen daftar. Untuk bersarang, saya mendefinisikan tipe data khusus
D
yang merupakan daunL
yang menampung beberapa elemen atau simpulN
yang merupakan daftarD
s. Untuk elemen campuran saya menggunakan tipe data yang telah ditetapkanEither
yang menggabungkan dua tipe menjadi satu, di siniEither String Integer
. Jenis baruD
dan fungsi rataf
sepenuhnya polimorfik dalam jenis elemen daun, jadi saya tidak perlu lebih berhati-hati dalam hal apa punEither
.Contoh penggunaan:
f (N[N[L(Right 20)], N[L(Left "Hi")], L(Left "Hi") , L(Right 20)])
->[Right 20,Left "Hi",Left "Hi",Right 20]
.sumber
Pyth,
765 byteCobalah online: Demonstrasi atau Test Suite
Tapi tentu saja, ada juga fungsi built-in, yang menangani tugas hanya dalam 2 byte:
.n
( Test Suite )sumber
G
secara implisit, jika saya tidak menulisnya.JavaScript (Firefox 30-57), 43 byte
Hanya karena saya bahkan bisa menghindari penggunaan
concat
.sumber
[for(of)]
hanya tersedia di Firefox 30+. Diusulkan untuk ES7 tetapi kemudian dibatalkan.for(__ in __)
Perl,
3429 byteFungsi
Jika perlu diratakan ke daftar like
my @a = f(@a)
, 29 bytes:Uji di Ideone
Jika perlu rata ke array seperti ref
my $a = f($a)
, 34 byte:Uji di Ideone .
Perl 5.22.0+, 27 byte
Terima kasih untuk hobbs .
Jika perlu diratakan ke daftar like
my @a = f(@a)
, 27 byte:Uji di JDoodle
Jika perlu meratakan ke array ref seperti
my $a = f($a)
, 32 byte:Uji di JDoodle .
sumber
?@{f@$_}:
harus bekerja alih-alih?@{f(@$_)}:
, menghemat dua byte.f
merupakan fungsi karenaf
belum dideklarasikan.sub f{}sub f{... f@$_ ...}
kerja.ref
tidak perlu orangtua untuk bekerja, menghemat 2 byte. 2. Sejauh yang saya bisa lihat,sub f{map{ref?f(@$_):$_}@_}
ada dalam aturan dan menyimpan 5. lainnyaf
mengambil array (nonref) sebagai daftar, sehingga dapat mengembalikan yang sama.ref
maka kompiler menganggap bahwa?
mulai?PATTERN?
beroperasi sukaref(?PATTERN?)
. Jadi kompiler mencari yang kedua?
dan melempar kesalahan.?PATTERN?
telah dihapus di 5.22.0 (m?PATTERN?
masih berfungsi) dan saya sedang menguji pada versi terbaru. Jadi, Anda dapat memperoleh dua byte tersebut dengan menentukan 5.22+.Julia, 29 byte
Ini adalah pemolesan rekursif menjadi fungsi gabungan hingga mencapai titik perbaikan. Contoh
sumber
Retina , 30 byte
Cobalah online!(Baris pertama hanya digunakan untuk menjalankan beberapa uji sekaligus.)
Retina tidak memiliki konsep array, string literal atau angka, jadi saya memutuskan untuk pergi dengan format input "umum" dari
[...,...]
array gaya dan"
string -drivisi, di mana\
dapat digunakan di dalam string untuk melepaskan karakter apa pun (khususnya"
dan\
itu sendiri).Program itu sendiri hanya cocok dengan string penuh atau braket persegi, dan menggantinya dengan
$1
yang membuat string dan menghilangkan tanda kurung. Batas1>
melewati pertandingan pertama sehingga kami tidak menghapus yang pertama[
. Namun, ini menghapus trailing]
, jadi kami menambahkannya kembali dalam tahap terpisah.sumber
Pyke, 11 byte
Coba di sini!
Penjelasan:
Atau 7 byte setelah perbaikan bug
Coba di sini!
Penjelasan:
Atau bahkan 2 byte jika pencetakan ke stdout diizinkan (Ini mungkin termasuk built-in)
Coba di sini!
Ini sangat menerapkan
print_newline
fungsi untuk setiap item non-urutan dalam input dan berulang untuk item urutan.sumber
Java (v8)
390276 byteHanya untuk kelengkapan dan semua itu. :) Tidak bisa mengatakan kode Java yang efisien.
sumber
oaf
keo
, dan ubahflatten
kef
.final
s, semuanya bisa menjadi lambda, Anda tidak perlupublic static
...false
dengan1>2
, dan tambahan 2 byte yang bisa Anda dapatkan jika Anda mendeklarasikan n tetapi tidak mendefinisikan (kompiler secara otomatis mendefinisikannya sebagai 0)Python, 57 byte
Cobalah online: Python 2 , Python 3
Terima kasih kepada Kevin Lau untuk
list==type(x)
triknya.sumber
type(x)==list
lebih pendek dariisinstance(x,list)
.[`x`>'['and...
? (Itu hanya bekerja di Python 2.)Rubi
ada
flatten
metode builtin .Anda dapat menjalankannya di sini: http://www.tutorialspoint.com/execute_ruby_online.php
Satu 43 byte, tetapi berpikir untuk berbagi:
Satu 45 byte yang lebih efisien daripada jawaban ruby sebelumnya dan lainnya:
inilah tolok ukur:
hasil:
sumber
Note: If your language contains a built-in for this, then you must NOT use it
.rescue
rescue
tampaknya agak lambat, sepertitry/catch
di javaPerl,
3934 + 1 (-p
bendera) 35 byteOneliner. Terinspirasi oleh Martin Büttner .
Uji di Ideone .
sumber
Clojure, 68 byte
mapcat
pertama berlaku fungsi untuk setiap elemen dan kemudian hasil concat. Jadi setiap kali ia menyimpulkan satu 'level bersarang' hilang. Concat tidak bekerja pada urutan tidak jadi elemen harus dibungkus menjadi vektor jika mereka bukan vektor.Anda dapat mencobanya di sini: http://www.tryclj.com
sumber
ANSI C, 193 byte
: - /, ada saran? Btw, saya memang mencoba mencari sumber online untuk mengkompilasi ini tetapi WL ketat untuk mengkompilasi kode ini. Ini akan bekerja untuk VS dan gcc sebaliknya.
sumber
JavaScript 20 byte
Array + array sama dengan array.toString
sumber
a
adalah argumen fungsi. Saya akan mencoba mengedit fungsinya sekarang.a=>
ke awal kode Anda.C #, 48 byte
Kupikir aku akan mempostingnya juga karena belum ada yang memberikan solusi C #. Saran diterima!
sumber
i
diinisialisasi? dan apakah Anda yakin itu berfungsi pada[["[]"],"[]"]
contoh?i=>$"{i.Replace("[","").Replace("]","")}"
?Racket, 63 byte
sumber
Java 8 165 karakter
Tidak digabung ke dalam kelas:
Jawaban ini didasarkan pada pendekatan Jeremy Harton . Saya menggunakannya mengubahnya di beberapa tempat dan membuat versi yang lebih seperti golf.
sumber
JavaScript, 17 Bytes
Akhirnya, konversi tipe JavaScript dapat dimanfaatkan dengan baik! Harap dicatat bahwa ini sebenarnya akan menghasilkan array, tetapi konversi string (memasukkannya ke dalam HTML) menyebabkannya menjadi daftar yang dipisahkan koma.
Jika daftar yang dipisahkan koma adalah keluaran yang dapat diterima, maka yang berikut ini valid:
7 Bytes
CATATAN: Cuplikan rusak karena beberapa alasan
sumber
["["]
... Saya mencoba menjalankan(a=>eval(
[$ {a}]))(["["])
dan mendapatSyntaxError
oninput
acara dengan sekalibutton
klik.PHP, 73 Bytes
sumber
Attache , 14 byte
Cobalah online!
Untungnya, Attache memiliki operator "vektorisasi", yang menerapkan fungsi pada atom-atom daftar. Dalam hal ini, semua kebutuhan kita lakukan adalah untuk mendirikan sebuah penuai dengan
Reap
danSow
semua atom dari input_
dengan@>
. Saya pikir itu cukup elegan.Alternatif
15 byte:
Fixpoint{`'^^_}
16 byte:
Fixpoint!&Concat
17 byte:
{q:=[]q&Push@>_q}
17 byte:
Fixpoint[&Concat]
sumber
Elixir , 74 byte
Elixir pertama menjawab, jadi mungkin bisa bermain golf sedikit.
Cobalah online.
Penjelasan:
Tentu saja, jika builtin diizinkan, ini bisa jadi 25 byte :
Cobalah online.
sumber
Jelly , 4 byte
Cobalah online!
Penjelasan
Built-in
F
akan menjadi satu byte jika diizinkan.sumber
Bahasa Wolfram (Mathematica) , 13 byte
Cobalah online!
Tidak golf:
F[x_] := Level[x, {-1}]
memilih elemen struktur pada tingkat terakhir dari bentuk pohonnya . Saya tidak yakin ini dianggap sebagai "menghindari builtin" (yang akan menjadi
Flatten
).sumber