Ratakan Array!


34

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


7
Beberapa bahasa memperlakukan string sebagai array, apakah [["Hai"], [[10]]] -> ["H", "i", 10] ok?
Adám

4
@Mego Saya terkejut juga mengetahui bahwa ada unflattenpertanyaan tapi tidak ada flattenpertanyaan tentang PPCG.
Arjun

3
Bagaimana jika bahasa Anda hanya mendukung subarrays dengan ukuran yang sama? (Misalnya Java?) Bagaimana jika jenis setiap elemen harus sama? (Misalnya Java, C ++ dll?) Juga, silakan tambahkan misalnya ["[",[["[",],'[',"['['"]]sebagai kasus uji.
flawr

4
@ flawr Test case itu hanya masuk akal untuk bahasa yang mendukung bot 'dan "sebagai pembatas. (Tapi saya setuju bahwa kasus uji yang melibatkan [, ], "dan \di dalam string akan berguna.)
Martin Ender

4
Kasing uji juga mengecualikan bahasa yang tidak mendukung jenis array ini dengan beberapa jenis, atau dengan notasi lain untuk literal array.
flawr

Jawaban:


40

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.


1
Baiklah, terima kasih atas penjelasannya! Dapatkan +1 Anda dengan baik.
Value Ink


1
Saya datang dengan algoritma yang sama (tetapi tidak dalam bahasa ini). +1 untuk memilih bahasa yang tepat untuk mengimplementasikannya!
Cyoce

@Cyoce Jika bahasa Anda memiliki padanan dengan tiga operator yang digunakan di sini, ini adalah solusi yang sangat alami. Dengan segala cara memposting variasi Anda.
JohnE

1
@JohnE Ceritanya panjang, saya mendapatkan bahasa dari algoritma yang saya buat, jadi bahasa belum selesai (dan dengan demikian diimplementasikan).
Cyoce

38

JavaScript (ES6), 35 byte

Terinspirasi oleh jawaban @ user81655 :

f=a=>a.map?[].concat(...a.map(f)):a

3
Sangat pintar! +1 untuk [ab] menggunakan cara aneh JS dalam menangani kunci yang hilang!
Cyoce

Saya bisa mengalahkan itu.
Botak Bantha

@BaldBantha: Kami menantikan jawaban Anda :-)
Bergi

2
Crap NVM Solusi 33 byte saya gagal pada salah satu kasus uji. Tidaaaak
Botak Bantha

2
@BaldBantha, join-split akan gagal pada koma di dalam string.
Qwertiy

19

Mathematica, 16 14 byte

{##&@@#&//@#}&

Fungsi tanpa nama yang mengambil dan mengembalikan daftar, misalnya:

{##&@@#&//@#}& @ {{{20}, {"Hi"}, "Hi", 20}}
(* {20, "Hi", "Hi", 20} *)

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 mana f, a, b, citu sendiri ekspresi sewenang-wenang. Di sini, fdisebut kepala ekspresi. Yang lainnya hanyalah gula sintaksis. Misalnya {a, b, c}saja List[a, b, c].

Kami mulai dengan //@yang memetakan fungsi di semua tingkatan daftar. Contohnya:

f //@ {{{20}, {"Hi"}, "Hi", 20}}
(* f[{f[{f[{f[20]}], f[{f["Hi"]}], f["Hi"], f[20]}]}] *)

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 ApplyFungsi 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. Misalnya Apply[g, f[a, b]]memberi g[a, b].

Sekarang ada "kepala" khusus yang disebut Sequenceyang 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 dalam Sequencesehingga mereka dapat disebarkan ke daftar di sekitarnya. Jadi yang kita inginkan adalah Applymenuju Sequenceke daftar. Mudahnya jika kita melakukan Applysesuatu pada atom, itu hanya membuat atom tidak berubah, jadi kita tidak harus membedakan antara jenis ekspresi sama sekali.

Akhirnya, ada satu masalah kecil: fjuga diterapkan ke tingkat terluar, sehingga juga menghilangkan terluar List, yang tidak kita inginkan. Cara paling pendek untuk membalasnya adalah dengan hanya membungkus hasilnya dalam daftar lagi, sehingga sekitarnya Sequencedapat dengan aman menghilang.

Perhatikan bahwa ada tidak Applyatau Sequencedalam kode. @@adalah bentuk operator Applydan ##&merupakan trik golf standar untuk mempersingkat nama bawaan yang panjang Sequence. Jadi ungolfing semuanya sedikit, kita mendapatkan sesuatu seperti:

flatten[list_] := { MapAll[Apply[Sequence], list] }

Untuk detail lebih lanjut tentang bagaimana dan mengapa ##&kerjanya, lihat bagian tentang "Urutan argumen" dalam jawaban saya untuk kiat Mathematica .


Pertama kali saya melihat //@. Sangat berguna untuk diketahui!
DavidC

//@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.
JohnE

1
@JohnE Nah, inilah dokumentasi . Anda juga bisa melihat hal-hal seperti Map, MapAt, Apply, serta Replacedan 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.
Martin Ender

12

Python 2, 43 byte

f=lambda l:[l]*(l*0!=[])or sum(map(f,l),[])

Pada daftar, berulang pada elemen dan menyatukan hasilnya. Pada string atau angka, membungkus dalam daftar tunggal.

Sayangnya, pemesanan Python 2 untuk int < list < stringsandwich jenis listantara yang lain, membutuhkan dua ketidaksetaraan untuk memeriksa. Jadi, sebaliknya, l*0diperiksa terhadap daftar kosong [], jika tidak memberi 0atau "".


10

Ruby, 43 42 34 byte

Solusi rekursif. Sekarang dengan penanganan pengecualian! (mungkin juga kredit @akostadinov untuk menginspirasi perubahan itu)

f=->a{a.map(&f).inject:+rescue[a]}

Tautan IDEOne


pujian untuk kependekan, luar biasa
akostadinov

Saya tidak tahu Anda bisa menggunakan rescueseperti itu
Cyoce

1
@Cyoce Saya pikir itu karena Ruby secara teknis tidak memiliki tryblok, jadi Anda gunakan beginuntuk 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]
Nilai Tinta

1
@ KevinLau-notKenny, tidak, menyelamatkan pada jalur yang sama berbeda, hanya menyelamatkan garis itu. misalnya a = raise("haha") rescue 1akan menugaskan 1untuk a. Itu
akostadinov

@ KevinLau-notKenny Ada inline rescue, seperti ada inline ifdan while.
Dana Gugatan Monica

8

JavaScript (ES6), 41 byte

f=a=>[].concat(...a.map(v=>v.pop?f(v):v))
<textarea id="input" rows="6" cols="40">[[[20],["Hi"],"Hi",20]]</textarea><br /><button onclick="result.textContent=JSON.stringify(f(eval(input.value)))">Go</button><pre id="result"></pre>


8

Perl 6 , 24 byte

{gather {$_».&{.take}}}

Penjelasan:

{ # has $_ as an implicit parameter

  gather {

    $_\ # the parameter from the outer block
    »\  # for each single value in the structure
    .&( # call the following block as if it was a method
      { # this block has its own $_ for a parameter
        .take # call the .take method implicitly on $_
      }
    )
  }
}

Uji:

#! /usr/bin/env perl6

use v6.c;
use Test;

my &flatten = {gather {$_».&{.take}}}

my @tests = (
  [10,20,30], [10,20,30],
  [[10,],], [10,],
  [["Hi",],[[10,],],], ["Hi",10],
  [[["[]",],"[]"],], ["[]","[]"],
);

plan @tests / 2;

for @tests -> $input, $expected {
  # is-deeply cares about the exact type of its inputs
  # so we have to coerce the Seq into an Array
  is-deeply flatten($input).Array, $expected, $input.perl;
}
1..4
ok 1 - $[10, 20, 30]
ok 2 - $[[10],]
ok 3 - $[["Hi"], [[10],]]
ok 4 - $[[["[]"], "[]"],]

7

Haskell, 43 byte

data D a=L a|N[D a]
f(L x)=[x]
f(N l)=f=<<l

Haskell tidak memiliki daftar bersarang dengan kedalaman sublists yang berbeda atau tipe campuran untuk elemen daftar. Untuk bersarang, saya mendefinisikan tipe data khusus Dyang merupakan daun Lyang menampung beberapa elemen atau simpul Nyang merupakan daftar Ds. Untuk elemen campuran saya menggunakan tipe data yang telah ditetapkan Eitheryang menggabungkan dua tipe menjadi satu, di sini Either String Integer. Jenis baru Ddan fungsi rata fsepenuhnya polimorfik dalam jenis elemen daun, jadi saya tidak perlu lebih berhati-hati dalam hal apa pun Either.

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


6

Pyth, 7 6 5 byte

us+]Y

Cobalah online: Demonstrasi atau Test Suite

Tapi tentu saja, ada juga fungsi built-in, yang menangani tugas hanya dalam 2 byte: .n( Test Suite )


Hanya 3 dari pemenang saat ini! +1
Arjun

Ss @ting: Golf byte lain. Lupa bahwa Pyth menambahkan karakter terakhir Gsecara implisit, jika saya tidak menulisnya.
Jakube

Selamat!
Arjun

6

JavaScript (Firefox 30-57), 43 byte

f=a=>a.map?[for(b of a)for(c of f(b))c]:[a]

Hanya karena saya bahkan bisa menghindari penggunaan concat.


Bukankah ECMAScript 6 bukan Firefox 30+ ?
Solomon Ucko

1
@SolomonUcko Tidak, [for(of)]hanya tersedia di Firefox 30+. Diusulkan untuk ES7 tetapi kemudian dibatalkan.
Neil

1
terima kasih sudah menjelaskan! Sebagian besar, saya hanya berpikir itufor(__ in __)
Solomon Ucko

@SolomonUcko [untuk (dalam)] adalah sintaks eksperimental alternatif yang memberi Anda kunci objek.
Neil

5

Perl, 34 29 byte

Fungsi

Jika perlu diratakan ke daftar like my @a = f(@a), 29 bytes:

sub f{map{ref()?f(@$_):$_}@_}

Uji di Ideone

Jika perlu rata ke array seperti ref my $a = f($a), 34 byte:

sub f{[map{ref()?@{f(@$_)}:$_}@_]}

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:

sub f{map{ref?f(@$_):$_}@_}

Uji di JDoodle

Jika perlu meratakan ke array ref seperti my $a = f($a), 32 byte:

sub f{[map{ref?@{f(@$_)}:$_}@_]}

Uji di JDoodle .


Saya belum mengujinya, tetapi berpikir ?@{f@$_}:harus bekerja alih-alih ?@{f(@$_)}:, menghemat dua byte.
msh210

1
@ msh210 Tidak, ini tidak berfungsi. Compiler tidak khow yang fmerupakan fungsi karena fbelum dideklarasikan. sub f{}sub f{... f@$_ ...}kerja.
Denis Ibaev

1. reftidak perlu orangtua untuk bekerja, menghemat 2 byte. 2. Sejauh yang saya bisa lihat, sub f{map{ref?f(@$_):$_}@_}ada dalam aturan dan menyimpan 5. lainnya fmengambil array (nonref) sebagai daftar, sehingga dapat mengembalikan yang sama.
hobbs

@ hobbs 1. Jika tidak ada tanda kurung dengan refmaka kompiler menganggap bahwa ?mulai ?PATTERN?beroperasi suka ref(?PATTERN?). Jadi kompiler mencari yang kedua ?dan melempar kesalahan.
Denis Ibaev

@DenisIbaev ah. ?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+.
hobbs

4

Julia, 29 byte

f(x,y=vcat(x...))=x==y?x:f(y)

Ini adalah pemolesan rekursif menjadi fungsi gabungan hingga mencapai titik perbaikan. Contoh

julia> f([1,[2,[3,[4,[5,[6]]]]]])
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

3

Retina , 30 byte

1>`("(\\.|[^"])+")|[][]
$1
$
]

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 $1yang membuat string dan menghilangkan tanda kurung. Batas 1>melewati pertandingan pertama sehingga kami tidak menghapus yang pertama [. Namun, ini menghapus trailing ], jadi kami menambahkannya kembali dalam tahap terpisah.


3

Pyke, 11 byte

.F~]+=])K~]

Coba di sini!

Penjelasan:

.F~]+=])    - Deep for loop
  ~]        -    contents of `]` ([] by default)
    +       -  ^+i
     =]     - `]` = ^
        K~] - Output value
        K   - Remove the output from the for loop
         ~] - Return the contents of `]`

Atau 7 byte setelah perbaikan bug

M?+]K~]

Coba di sini!

Penjelasan:

M?+]    - Deep map
 ?+]    -  `]` = `]`+i
    K~] - Output value
    K   - Remove the output from the for loop
     ~] - Return the contents of `]`

Atau bahkan 2 byte jika pencetakan ke stdout diizinkan (Ini mungkin termasuk built-in)

M
<newline required>

Coba di sini!

Ini sangat menerapkan print_newlinefungsi untuk setiap item non-urutan dalam input dan berulang untuk item urutan.


Hanya 4 jauhnya dari K! +1
Arjun

3

Java (v8) 390 276 byte

public static Object[] f(final Object[]a) {
    List<Object>r=new ArrayList<>();boolean t=false;int n=0;
    for(final Object p:a)
        if(t=p instanceof Object[]){for(final Object q:(Object[])p) r.add(q);}
        else r.add(p);
    return(t)?f(r.toArray()):r.toArray();
}  

Hanya untuk kelengkapan dan semua itu. :) Tidak bisa mengatakan kode Java yang efisien.


3
Halo, dan selamat datang di PPCG! Pertanyaan ini adalah kode-golf , jadi silakan meminimalkan kode Anda. Terima kasih!
NoOneIsHere

3
Hapus semua ruang, tab, dan baris baru yang tidak perlu. Ubah oafke o, dan ubah flattenke f.
NoOneIsHere

2
Anda tidak perlu finals, semuanya bisa menjadi lambda, Anda tidak perlu public static...
David Conrad

1
Anda bisa menyimpan beberapa karakter jika Anda menggunakan objek generik sebagai gantinya
user902383

1
Anda juga dapat menyimpan 2 byte jika Anda mengganti falsedengan 1>2, dan tambahan 2 byte yang bisa Anda dapatkan jika Anda mendeklarasikan n tetapi tidak mendefinisikan (kompiler secara otomatis mendefinisikannya sebagai 0)
user902383

2

Python, 57 byte

f=lambda a:sum([list==type(x)and f(x)or[x]for x in a],[])

Cobalah online: Python 2 , Python 3

Terima kasih kepada Kevin Lau untuk list==type(x)triknya.


2
type(x)==listlebih pendek dari isinstance(x,list).
Value Ink

1
“Ini hanya akan berisi Integer (baik negatif dan positif), String dan Array.” Bagaimana [`x`>'['and...? (Itu hanya bekerja di Python 2.)
Lynn

2

Rubi

ada flattenmetode builtin .

Anda dapat menjalankannya di sini: http://www.tutorialspoint.com/execute_ruby_online.php

Satu 43 byte, tetapi berpikir untuk berbagi:

f=->a{a.inject([]){|r,e|r+(f[e]rescue[e])}}

Satu 45 byte yang lebih efisien daripada jawaban ruby ​​sebelumnya dan lainnya:

f=->a{a.map{|e|Array===e ?f[e]:[e]}.inject:+}

inilah tolok ukur:

require 'benchmark'
n=10^9
arr=[[[20],[[[[[[[[123]]]]]]]],"ads",[[[[[[[4]]]]]]],5,[[[[[[[[[[6]]]]]]]]]],7,8,[[[[[[[[[[9]]]]]]]]]],[[[[[[[[[[0]]]]]]]]]],[[[[[[[[[[[["Hi"]]]]]]]]]]]],[[[[[["Hi"]]]]]],[[[[[20]]]]]]]
Benchmark.bm do |x|
  x.report { f=->a{a.map(&f).inject:+rescue[a]}; f[arr] }
  x.report { f=->a{a.map{|e|e!=[*e]?[e]:f[e]}.inject:+}; f[arr] }
  x.report { f=->a{a.inject([]){|r,e|r+(f[e]rescue[e])}}; f[arr] }
  x.report { f=->a{a.map{|e|Array===e ?f[e]:[e]}.inject:+}; f[arr] }
end

hasil:

       user     system      total        real
   0.010000   0.000000   0.010000 (  0.000432)
   0.000000   0.000000   0.000000 (  0.000303)
   0.000000   0.000000   0.000000 (  0.000486)
   0.000000   0.000000   0.000000 (  0.000228)

1
Halo, dan selamat datang di PPCG! Sayangnya, jawaban Anda adalah tidak sah, karena peraturan ini: Note: If your language contains a built-in for this, then you must NOT use it.
NoOneIsHere

@NoOneIsHere, terima kasih, tidak tahu itu
akostadinov

1
Bagaimana pembaruan baru saya menumpuk terhadap waktu terhadap Anda? Juga, seperti jawaban baru saya, Anda dapat menghapus spasi di sekitarrescue
Value Ink

@ KevinLau-notKenny diperbarui, terima kasih! rescuetampaknya agak lambat, seperti try/catchdi java
akostadinov

1
Perbarui bytecount Anda juga
Value Ink


2

Clojure, 68 byte

(def f #(if(some vector? %)(f(mapcat(fn[z](if(vector? z)z[z]))%))%))

mapcatpertama 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

(f [[[20],["Hi"],"Hi",20]])
(f [[["[]"],"[]"]])

Golf kode pertama yang bagus. +1 :)
Arjun

2

ANSI C, 193 byte

#define b break;
#define c case
#define p putch(_);
char f;main(_){switch(_){c 1:putch(91);b c 34:f^=1;p b c 91:f&&p b c 93:f&&p b c 10:c 13:putch(93);return;default:p}_=getch();main(_);}

: - /, 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.


2
Selamat datang di PPCG!
Martin Ender

1
Selamat datang di PPCG! Golf pertama yang bagus. Semoga beruntung di depan!
Arjun

Terima kasih! Itu adalah upaya untuk meningkatkan poin saya sehingga saya bisa mendapatkan hak komentar di tempat lain. Tampaknya hal-hal yang tidak berfungsi seperti itu adalah akun untuk portal yang berbeda. : DI akan melihat apakah beberapa fitur bagus dari c ++ dapat digunakan.
amritanshu

2

JavaScript 20 byte

a=>(a+[]).split(',')

Array + array sama dengan array.toString


@WheatWizard terima kasih atas sambutannya dan saya baru di situs ini. sebenarnya aadalah argumen fungsi. Saya akan mencoba mengedit fungsinya sekarang.
Aku--

Saya pikir sekarang tidak apa-apa @WheatWizard. Tolong beritahu saya jika ada masalah dengan ini
aku--

1
Sebenarnya melihat dokumen javaScript fungsi anonim pasti akan lebih pendek, Anda hanya perlu menambahkan a=>ke awal kode Anda.
Wheat Wizard

@WheatWizard Saya memperbarui dengan fungsi panah seperti yang Anda sebutkan. Tapi saya harus menghapus snippet karena fungsi panah tidak mendukung pemanggilan langsung. Hal ini hanya untuk callback
aku--

1
Ini tidak menangani string dengan koma di dalamnya dengan benar
Jo King

2

C #, 48 byte

()=>{$"[{i.Replace("[","").Replace("]","")}]";};

Kupikir aku akan mempostingnya juga karena belum ada yang memberikan solusi C #. Saran diterima!


Selamat datang di situs ini. Saya belum diprogram dalam C # dalam beberapa saat tetapi saya merasa Anda mungkin memiliki beberapa masalah. Untuk satu bagaimana idiinisialisasi? dan apakah Anda yakin itu berfungsi pada [["[]"],"[]"]contoh?
Wheat Wizard

Maaf, saya adalah input yang diteruskan sebagai string. Array kosong hanya akan menerjemahkan ke string kosong.
PmanAce

Bagaimana dengan testcase terakhir? Juga, saya kira Anda harus melakukannya i=>$"{i.Replace("[","").Replace("]","")}"?
Perwujudan Ketidaktahuan

Sayangnya tidak berfungsi dalam kasus terakhir, ini akan menghilangkan array kosong. :(
PmanAce

Jawaban ini tidak lulus ujian akhir. Karena belum diperbaiki selama beberapa bulan, saya memilih untuk menghapusnya.
mbomb007

1

Racket, 63 byte

(define(f l)(apply append(map(λ(x)(if(list? x)(f x)`(,x)))l)))

1

Java 8 165 karakter

import java.util.*;<T>T[]f(T[]a){List<T>l=new ArrayList<>();for(T e:a)if(e instanceof Object[])Collections.addAll(l,f((T[])e));else l.add(e);return(T[])l.toArray();}

Tidak digabung ke dalam kelas:

public class Q80096 {

    public static <T> T[] flatten(T[] array) {
        List<T> flattenedList = new ArrayList<>();
        for (T element : array)
            if (element instanceof Object[])
                 Collections.addAll(flattenedList, flatten((T[]) element));
            else
                flattenedList.add(element);
        return (T[]) flattenedList.toArray();
    }
}

Jawaban ini didasarkan pada pendekatan Jeremy Harton . Saya menggunakannya mengubahnya di beberapa tempat dan membuat versi yang lebih seperti golf.


apakah itu tidak lebih baik ketika menggunakan Arrays.asList () pada "array" dan kemudian pergi foreach dengan lambda dan akhiri ini dengan seorang Kolektor?
Serverfrog

1

JavaScript, 17 Bytes

a=>eval(`[${a}]`)

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

a=>""+a

CATATAN: Cuplikan rusak karena beberapa alasan

var subject = 
  a=>eval(`[${a}]`)
<input oninput="try {output.innerHTML = subject(this.value)} catch(e) {output.innerHTML='Invaild Input'}" />
<div id="output"></div>


3
Ini sepertinya tidak berfungsi ketika dijalankan di konsol untuk input ["["]... Saya mencoba menjalankan (a=>eval([$ {a}] ))(["["])dan mendapatSyntaxError
jrich

@ jrich. Anda baru saja mendapatkan kesalahan ini saat Anda mengetik karakter demi karakter. Jika Anda menyalin dan menempelkan array yang valid , itu akan berfungsi seperti yang diharapkan. Ngomong-ngomong, jawab SpeedNinja, aku hanya akan mengubah oninputacara dengan sekali buttonklik.
Washington Guedes

Ini tidak berfungsi untuk string dengan koma di dalamnya
Jo King


1

Attache , 14 byte

{Reap[Sow@>_]}

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 Reapdan Sowsemua 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]


1

Elixir , 74 byte

def d(l)do l|>Stream.flat_map(fn x->if is_list(x)do d(x)else[x]end end)end

Elixir pertama menjawab, jadi mungkin bisa bermain golf sedikit.

Cobalah online.

Penjelasan:

def d(l)do l|>            # Recursive method taking a list as input:
  Stream.flat_map(fn x->  #  Map over each item `x` of the input-list:
    if is_list(x)do       #   If `x` is a list itself:
      d(x)                #    Do a recursive call with `x`
    else                  #   Else:
      [x]                 #    Simply leave `x` unchanged
    end                   #   End of the if-else statements
  end)                    #  End of the map
end                       # End of the recursive method

Tentu saja, jika builtin diizinkan, ini bisa jadi 25 byte :

fn(l)->List.flatten(l)end

Cobalah online.



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.