Làm phẳng mảng!


34

Trong thử thách này, nhiệm vụ của bạn là tạo ra một chương trình lấy một mảng lồng nhau và trả về một mảng phẳng một chiều. Ví dụ [10,20,[30,[40]],50]nên xuất ra [10,20,30,40,50].


Đầu vào

Đầu vào sẽ là một mảng lồng nhau (ví dụ. [10,20,[[[10]]]]). Nó sẽ chỉ chứa các số nguyên (cả âm và dương), Chuỗi và Mảng. Bạn có thể lấy đầu vào làm đối số chức năng, STDIN hoặc bất cứ điều gì phù hợp với ngôn ngữ của bạn. Bạn có thể giả sử rằng mảng đầu vào sẽ không có mảng trống.


Đầu ra

Đầu ra sẽ là một mảng một chiều được làm phẳng với các phần tử cùng loại như trong mảng lồng nhau và theo thứ tự CÙNG.


Các trường hợp thử nghiệm

[10,20,30] -> [10,20,30]
[[10]] -> [10]
[["Hi"],[[10]]] -> ["Hi",10]
[[[20],["Hi"],"Hi",20]] -> [20,"Hi","Hi",20]
[[["[]"],"[]"]] -> ["[]","[]"]


Hãy yêu cầu làm rõ bất kỳ bằng cách sử dụng ý kiến. Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Lưu ý: Nếu ngôn ngữ của bạn có tích hợp sẵn cho việc này, thì bạn KHÔNG được sử dụng ngôn ngữ đó.


Chỉnh sửa

Vui lòng bao gồm một liên kết đến một trang web nơi mã của bạn có thể được thực thi.


7
Một số ngôn ngữ coi các chuỗi là mảng, là [["Hi"], [[10]]] -> ["H", "i", 10] ok?
Adám

4
@Mego Tôi cũng ngạc nhiên khi biết rằng có một unflattencâu hỏi nhưng không có flattencâu hỏi nào về PPCG.
Arjun

3
Điều gì sẽ xảy ra nếu ngôn ngữ của bạn chỉ hỗ trợ các chương trình con có cùng kích thước? (Ví dụ Java?) Nếu loại của mỗi phần tử phải giống nhau thì sao? (Ví dụ: Java, C ++, v.v.?) Ngoài ra, vui lòng thêm ví dụ ["[",[["[",],'[',"['['"]]như một trường hợp thử nghiệm.
flawr

4
@flawr Trường hợp thử nghiệm đó chỉ có ý nghĩa đối với các ngôn ngữ hỗ trợ bot '"dưới dạng phân cách. (Nhưng tôi đồng ý rằng một trường hợp thử nghiệm liên quan đến [, ], "\bên trong một chuỗi sẽ có ích.)
Martin Ender

4
Các trường hợp thử nghiệm cũng loại trừ các ngôn ngữ không hỗ trợ các loại mảng này với nhiều loại hoặc với một ký hiệu khác cho các mảng bằng chữ.
flawr

Câu trả lời:


40

K, 3 byte

,//

Đây là một thành ngữ khá phổ biến. "Tham gia hội tụ".

thử nó ở đây với oK .

Làm thế nào nó hoạt động:

Nối ( ,) hợp nhất các nguyên tử hoặc danh sách để tạo ra một danh sách. Over ( /) lấy một động từ (trong trường hợp này là nối) và áp dụng nó giữa mỗi thành phần của danh sách, từ trái sang phải. Do đó, hợp chất ,/sẽ làm phẳng tất cả các yếu tố cấp cao nhất của danh sách. Biểu tượng /thực sự có ý nghĩa khác nhau tùy thuộc vào hóa trị (số lượng đối số) của động từ mà nó được ghép. Khi chúng tôi cung cấp ,/dưới dạng động từ, cuối cùng /đóng vai trò là "hội tụ" - nó liên tục áp dụng ,/cho đầu vào cho đến khi nó ngừng thay đổi. Một số ngôn ngữ khác gọi một tính năng như thế này là "tổ hợp điểm cố định". Bằng cách liên tục kết hợp các danh sách cấp dưới, cuối cùng bạn sẽ đến một danh sách phẳng duy nhất và không có thao tác nào sẽ làm xáo trộn thứ tự các phần tử. Điều này dường như để giải quyết vấn đề.


1
Được rồi, cảm ơn đã giải thích! Có +1 kiếm được tốt của bạn.
Mực giá trị


1
Tôi đã đưa ra thuật toán tương tự (nhưng không phải bằng ngôn ngữ này). +1 để chọn ngôn ngữ phù hợp để triển khai ngôn ngữ đó!
Cyoce

@Cyoce Nếu ngôn ngữ của bạn tương đương với ba toán tử được sử dụng ở đây, thì đó là một giải pháp cực kỳ tự nhiên. Bằng tất cả các phương tiện gửi biến thể của bạn.
JohnE

1
@JohnE Câu chuyện dài, tôi đang lấy một ngôn ngữ từ các thuật toán mà tôi nghĩ ra, vì vậy ngôn ngữ vẫn chưa kết thúc (và do đó được triển khai).
Cyoce

38

JavaScript (ES6), 35 byte

Lấy cảm hứng từ câu trả lời của @ user81655 :

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

3
Rất thông minh! +1 cho [ab] bằng cách sử dụng cách xử lý các khóa bị thiếu của JS!
Cyoce

Tôi có thể đánh bại điều đó.
Hói Bantha

@BaldBantha: Chúng tôi đang mong chờ câu trả lời của bạn :-)
Bergi

2
Crap NVM Giải pháp 33 byte của tôi không thành công trên một trong các trường hợp thử nghiệm. NOOOO
Hói Bantha

2
@BaldBantha, chia tách sẽ không thành công trên dấu phẩy bên trong chuỗi.
Qwertiy

19

Toán học, 16 14 byte

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

Một hàm không tên sẽ nhận và trả về một danh sách, ví dụ:

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

Giải trình

Bữa tiệc đường cú pháp!

Để hiểu cách thức hoạt động này, lưu ý rằng tất cả các biểu hiện trong Mathematica là một trong hai nguyên tử (ví dụ số, chuỗi, biểu tượng) hoặc một biểu thức hợp chất của hình thức f[a, b, c, ...], nơi f, a, b, clà tự biểu tùy ý. Ở đây, fđược gọi là đầu của biểu thức. Tất cả mọi thứ khác trên đó chỉ là cú pháp đường. Ví dụ {a, b, c}là chỉ List[a, b, c].

Chúng tôi bắt đầu với //@việc ánh xạ một chức năng qua tất cả các cấp của danh sách. Ví dụ:

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

Lưu ý rằng bản đồ này ftrên các nguyên tử cũng như các biểu thức ghép. Những gì chúng ta đang tìm kiếm là một cách để loại bỏ những người đứng đầu danh sách và giữ mọi thứ khác.

Các Applychức năng thường được sử dụng để nuôi các yếu tố của một danh sách như các đối số riêng biệt để một chức năng, nhưng định nghĩa thực tế của nó là tổng quát hơn và chỉ cần thay thế người đứng đầu của một biểu thức. Vd Apply[g, f[a, b]]cho g[a, b].

Bây giờ có một "cái đầu" đặc biệt gọi là Sequenceđơn giản biến mất. Ví dụ: {a, Sequence[b, c], d}chỉ đánh giá {a, b, c, d}. Ý tưởng làm phẳng danh sách là thay thế các đầu của tất cả các danh sách bên trong Sequenceđể chúng được chia thành danh sách xung quanh. Vì vậy, những gì chúng tôi muốn là Applyngười đứng đầu Sequencedanh sách. Thuận tiện nếu chúng ta Applymột cái gì đó cho một nguyên tử, nó chỉ khiến nguyên tử không thay đổi, vì vậy chúng ta không phải phân biệt giữa các loại biểu thức.

Cuối cùng, có một vấn đề nhỏ: fcũng được áp dụng cho cấp độ ngoài cùng, do đó, nó cũng loại bỏ lớp ngoài cùng Listmà chúng ta không muốn. Cách ngắn nhất để chống lại điều đó chỉ đơn giản là bọc lại kết quả trong một danh sách, sao cho xung quanh Sequencecó thể biến mất một cách an toàn.

Lưu ý rằng không có Applyhoặc cũng không có Sequencetrong mã. @@là một hình thức vận hành Apply##&là một thủ thuật đánh golf tiêu chuẩn để rút ngắn tên tích hợp dài Sequence. Vì vậy, không hiểu mọi thứ một chút, chúng tôi nhận được một cái gì đó như:

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

Để biết thêm chi tiết về cách thức và lý do ##&công việc, hãy xem phần "Trình tự lập luận" trong câu trả lời của tôi để biết các mẹo Toán học .


Lần đầu tiên tôi nhìn thấy //@. Rất hữu ích để biết về!
DavidC

//@chụp một mô hình gọn gàng. Nhắc nhở tôi một chút về một số tổ hợp đệ quy trong Joy. Bạn có một liên kết đến một tài liệu tham khảo tốt cho bất kỳ chức năng liên quan nào trong Mathematica không? Tôi rất quan tâm đến các cách bao thanh toán đệ quy rõ ràng ra khỏi các chương trình.
JohnE

1
@JohnE Vâng, đây là tài liệu . Bạn cũng có thể nhìn vào những thứ như Map, MapAt, Apply, cũng như Replacecác chức năng liên quan. Nói chung, mặc dù có rất nhiều hàm có tham số levelspec tùy chọn (xem giải pháp 16 byte gốc của tôi), cho phép bạn áp dụng hàm ở nhiều / tất cả các cấp cùng một lúc.
Martin Ender

12

Python 2, 43 byte

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

Trong một danh sách, đệ quy về các yếu tố và nối các kết quả. Trên một chuỗi hoặc số, nằm trong một danh sách đơn.

Thật không may, việc đặt hàng của Python 2 cho các loại int < list < stringbánh sandwich listgiữa các loại khác, đòi hỏi hai bất đẳng thức để kiểm tra. Vì vậy, thay vào đó, l*0được kiểm tra đối với danh sách trống [], nếu không thì cho 0hoặc "".


10

Ruby, 43 42 34 byte

Giải pháp đệ quy. Bây giờ với xử lý ngoại lệ! (cũng có thể tín dụng @akostadinov để truyền cảm hứng cho sự thay đổi)

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

Liên kết IDEOne


kudos cho sự ngắn gọn, tuyệt vời
akostadinov

Tôi không biết bạn có thể sử dụng rescuenhư thế
Cyoce

1
@Cyoce Tôi nghĩ rằng vì Ruby về mặt kỹ thuật không có trykhối, nên beginthay vào đó bạn sử dụng để phân biệt các phần bạn muốn bắt và các phần mà bạn không có. Vì vậy, vì bạn đang nắm bắt toàn bộ phần còn lại của khối trước nó, về mặt kỹ thuật bạn không cần nó? Phần còn lại chỉ là khoảng trắng được cắt bớt, vì Ruby diễn giải dòng này là...inject(:+) rescue [a]
Ink Ink

1
@ KevinLau-notKenny, không, giải cứu trên cùng một dòng là khác nhau, chỉ cần giải cứu dòng đó. ví dụ a = raise("haha") rescue 1sẽ gán 1cho a. Nó '
akostadinov

@ KevinLau-notKenny Có một nội tuyến rescue, giống như có một nội tuyến ifwhile.
Vụ kiện của Quỹ 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}}}

Giải trình:

{ # 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 $_
      }
    )
  }
}

Kiểm tra:

#! /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 không có danh sách lồng nhau với độ sâu khác nhau của danh sách phụ cũng như loại hỗn hợp cho các thành phần danh sách. Để lồng nhau, tôi định nghĩa một kiểu dữ liệu tùy chỉnh Dlà một lá Lchứa một số phần tử hoặc một nút Nlà một danh sách của Ds. Đối với các phần tử hỗn hợp, tôi sử dụng kiểu dữ liệu được xác định trước Eitherkết hợp hai loại thành một, ở đây Either String Integer. Loại mới Dvà chức năng làm phẳng fhoàn toàn đa hình trong loại phần tử lá, vì vậy tôi không phải quan tâm thêm bất cứ điều gì liên quan Either.

Ví dụ sử dụng: 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

Bình thường, 7 6 5 byte

us+]Y

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Nhưng tất nhiên, cũng có một hàm dựng sẵn, xử lý tác vụ chỉ trong 2 byte: .n( Test Suite )


Chỉ cần 3 từ người chiến thắng hiện tại! +1
Arjun

@Sting: Chơi gôn một byte khác. Quên rằng Pyth nối thêm ký tự cuối cùng G, nếu tôi không viết nó.
Jakube

Xin chúc mừng!
Arjun

6

JavaScript (Firefox 30-57), 43 byte

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

Chỉ vì tôi thậm chí có thể tránh sử dụng concat.


Có phải đó là ECMAScript 6 không phải Firefox 30+ ?
Solomon Ucko

1
@SolomonUcko Không, [for(of)]chỉ khả dụng trong Firefox 30+. Nó đã được đề xuất cho ES7 nhưng sau đó đã bỏ.
Neil

1
cảm ơn vì đã giải thích! Hầu hết, tôi chỉ nghĩ rằng đó làfor(__ in __)
Solomon Ucko

@SolomonUcko [for (in)] là một cú pháp thử nghiệm thay thế cung cấp cho bạn các khóa của đối tượng.
Neil

5

Perl, 34 29 byte

Chức năng.

Nếu cần làm phẳng để liệt kê như thế my @a = f(@a), 29 byte:

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

Kiểm tra nó trên Ideone

Nếu cần làm phẳng để tham chiếu mảng my $a = f($a), 34 byte:

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

Kiểm tra nó trên Ideone .

Perl 5.22.0+, 27 byte

Cảm ơn hobbs .

Nếu cần làm phẳng để liệt kê như my @a = f(@a), 27 byte:

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

Kiểm tra nó trên JDoodle

Nếu cần làm phẳng để tham chiếu mảng như my $a = f($a)32 byte:

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

Kiểm tra nó trên JDoodle .


Tôi đã không kiểm tra nó, nhưng nghĩ rằng ?@{f@$_}:nên hoạt động thay vì ?@{f(@$_)}:, tiết kiệm hai byte.
msh210

1
@ msh210 Không, nó không hoạt động. Trình biên dịch không khow đó flà một hàm vì fchưa được khai báo. sub f{}sub f{... f@$_ ...}đang làm việc.
Denis Ibaev

1. refkhông cần parens để làm việc, tiết kiệm 2 byte. 2. Theo như tôi có thể thấy, sub f{map{ref?f(@$_):$_}@_}nằm trong các quy tắc và lưu thêm 5. flấy một mảng (không phản xạ) làm danh sách, để nó có thể trả về cùng.
hobbs

@hobbs 1. Nếu không có dấu ngoặc đơn refthì trình biên dịch giả định rằng ?đang bắt đầu ?PATTERN?hoạt động như thế nào ref(?PATTERN?). Vì vậy, trình biên dịch tìm kiếm thứ hai ?và ném lỗi.
Denis Ibaev

@DenisIbaev ah. ?PATTERN?đã bị xóa trong 5.22.0 ( m?PATTERN?vẫn hoạt động) và tôi đang thử nghiệm trên một phiên bản gần đây. Vì vậy, bạn có thể đạt được hai byte đó bằng cách chỉ định 5.22+.
hobbs

4

Julia, 29 byte

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

Đây là phép nối đệ quy vào một hàm ghép cho đến khi đạt đến một điểm cố định. Thí dụ

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

3

Võng mạc , 30 byte

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

Hãy thử trực tuyến!(Dòng đầu tiên chỉ được sử dụng để chạy nhiều trường hợp thử nghiệm cùng một lúc.)

Retina không có khái niệm về mảng, chuỗi ký tự hoặc số, vì vậy tôi đã quyết định sử dụng định dạng đầu vào "phổ biến" của [...,...]mảng kiểu và "chuỗi phân cách, \có thể được sử dụng bên trong chuỗi để thoát bất kỳ ký tự nào (cụ thể "\chính nó).

Bản thân chương trình chỉ đơn giản khớp với một chuỗi đầy đủ hoặc dấu ngoặc vuông và thay thế chúng bằng $1chuỗi giữ và loại bỏ dấu ngoặc vuông. Giới hạn 1>bỏ qua trận đấu đầu tiên để chúng tôi không xóa vị trí dẫn đầu [. Tuy nhiên, điều này không xóa dấu vết ], vì vậy chúng tôi thêm nó trở lại trong một giai đoạn riêng biệt.


3

Pyke, 11 byte

.F~]+=])K~]

Hãy thử nó ở đây!

Giải trình:

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

Hoặc 7 byte sau một lỗi

M?+]K~]

Hãy thử nó ở đây!

Giải trình:

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

Hoặc thậm chí 2 byte nếu cho phép in ra thiết bị xuất chuẩn (Điều này có thể được tích hợp sẵn)

M
<newline required>

Hãy thử nó ở đây!

Điều này áp dụng sâu sắc print_newlinechức năng cho mọi mục không tuần tự trong đầu vào và đệ quy cho các mục trình tự.


Chỉ cần 4 từ 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();
}  

Chỉ cần cho đầy đủ và tất cả những thứ đó. :) Không thể nói mã Java hiệu quả.


3
Xin chào, và chào mừng đến với PPCG! Câu hỏi này là code-golf , vì vậy hãy cố gắng giảm thiểu mã của bạn. Cảm ơn!
NoOneIsHãy

3
Xóa tất cả các khoảng trắng, tab và dòng mới không cần thiết. Thay đổi oafđể o, và thay đổi flattenđể f.
NoOneIsHãy

2
Bạn không cần finals, toàn bộ có thể là lambda, bạn không cần public static...
David Conrad

1
bạn có thể lưu vài ký tự nếu bạn sử dụng tướng thay vì đối tượng
user902383

1
bạn cũng có thể tiết kiệm 2 byte nếu bạn thay thế falsevới 1>2, và thêm 2 byte bạn có thể nhận được nếu bạn khai báo n nhưng không xác định (biên dịch tự động xác định nó như là 0)
user902383

2

Python, 57 byte

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

Dùng thử trực tuyến: Python 2 , Python 3

Cảm ơn Kevin Lau cho list==type(x)mánh khóe.


2
type(x)==listngắn hơn isinstance(x,list).
Mực giá trị

1
“Nó sẽ chỉ chứa số nguyên (cả tiêu cực và tích cực), Strings và Mảng.” Làm thế nào về [`x`>'['and...? (Chỉ hoạt động trong Python 2.)
Lynn

2

Hồng ngọc

có nội dung flatten phương pháp .

Bạn có thể chạy ở đây: http://www.tutorialspoint.com/execute_ruby_online.php

Một 43 byte, nhưng được cho là để chia sẻ:

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

Một 45 byte hiệu quả hơn so với câu trả lời trước đó và câu trả lời khác của ruby:

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

đây là điểm chuẩn:

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

kết quả:

       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
Xin chào, và chào mừng đến với PPCG! Thật không may, câu trả lời của bạn không hợp lệ, vì quy tắc này : Note: If your language contains a built-in for this, then you must NOT use it.
NoOneIsHere 18/05/2016

@NoOneIsHere, cảm ơn, không biết điều đó
akostadinov

1
Làm thế nào để ngăn xếp cập nhật mới của tôi chống lại thời gian chống lại bạn? Ngoài ra, giống như câu trả lời mới của tôi, bạn có thể xóa các khoảng trống xung quanhrescue
Ink Ink

@ KevinLau-notKenny được cập nhật, cảm ơn! rescuecó vẻ khá chậm btw, như try/catchtrong java
akostadinov

1
Cũng cập nhật bytecount của bạn
Ink Ink


2

Clojure, 68 byte

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

mapcatđầu tiên áp dụng chức năng cho từng yếu tố và sau đó concat kết quả. Vì vậy, mỗi khi nó che giấu một 'cấp độ lồng' sẽ bị mất. Concat không hoạt động trên các chuỗi không phải vì vậy các phần tử phải được gói vào vector nếu chúng không phải là vector.

Bạn có thể thử nó ở đây: http://www.tryclj.com

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

Đẹp đầu tiên mã golf. +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(_);}

:-/, bất kỳ đề xuất? Btw, tôi đã cố gắng tìm một nguồn trực tuyến để biên dịch cái này nhưng WL rất nghiêm ngặt đối với mã này để biên dịch. Nó sẽ làm việc cho VS và gcc nếu không.


2
Chào mừng đến với PPCG!
Martin Ender

1
Chào mừng đến với PPCG! Sân golf đầu tiên đẹp. Chúc may mắn phía trước!
Arjun

Cảm ơn! Đó là một nỗ lực để tăng điểm của tôi để tôi có thể nhận được các đặc quyền nhận xét ở nơi khác. Có vẻ như mọi thứ không hoạt động như các tài khoản dành cho các cổng khác nhau. : DI sẽ xem nếu một số tính năng tiện lợi từ c ++ có thể được sử dụng.
amritanshu

2

JavaScript 20 byte

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

Mảng + mảng bằng với mảng.toString


@WheatWizard cảm ơn vì sự chào đón và tôi mới vào trang web. thực sự alà một đối số của hàm. Tôi sẽ cố gắng để chỉnh sửa các chức năng bây giờ.
tôi--

Tôi nghĩ bây giờ nó ổn rồi @WheatWizard. Xin vui lòng cho tôi biết nếu có vấn đề với điều này
i--

1
Trên thực tế, nhìn vào các tài liệu javaScript, một hàm ẩn danh chắc chắn sẽ ngắn hơn, bạn sẽ chỉ phải thêm a=>vào phần đầu của mã.
Phù thủy lúa mì

@WheatWizard Tôi đã cập nhật chức năng mũi tên như bạn đã đề cập. Nhưng tôi phải xóa đoạn trích vì chức năng mũi tên không hỗ trợ gọi trực tiếp. Nó chỉ dành cho các cuộc gọi lại
i--

1
Điều này không xử lý các chuỗi có dấu phẩy trong đó một cách chính xác
Jo King

2

C #, 48 byte

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

Tôi nghĩ tôi cũng sẽ đăng nó vì chưa ai đưa ra giải pháp C #. Gợi ý chào mừng!


Chào mừng đến với trang web. Tôi đã không lập trình trong C # trong một thời gian nhưng có vẻ như tôi có thể có một số vấn đề. Đối với một làm thế nào được ikhởi tạo? và bạn có chắc nó hoạt động trên [["[]"],"[]"]ví dụ?
Thuật sĩ lúa mì

Xin lỗi, tôi là đầu vào được truyền vào dưới dạng một chuỗi. Một mảng trống sẽ chỉ dịch thành một chuỗi trống.
PmanAce

Làm thế nào về các thử nghiệm cuối cùng? Ngoài ra, tôi đoán bạn có nghĩa là để làm gì i=>$"{i.Replace("[","").Replace("]","")}"?
Hiện thân của sự thiếu hiểu biết

Đáng buồn là không hoạt động trong trường hợp cuối cùng, nó sẽ thoát khỏi mảng trống. :(
PmanAce

Câu trả lời này không vượt qua trường hợp thử nghiệm cuối cùng. Vì nó đã không được sửa trong một vài tháng, tôi sẽ bỏ phiếu để xóa nó.
mbomb007

1

Vợt, 63 byte

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

1

Java 8 165 ký tự

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();}

Ungolfed vào một lớp học:

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();
    }
}

Câu trả lời này dựa trên phương pháp của Jeremy Harton . Tôi đã sử dụng nó đã thay đổi nó ở một số nơi và tạo ra một phiên bản giống như golf hơn.


sẽ không tốt hơn khi sử dụng Arrays.asList () trên "mảng" và sau đó đi tìm kiếm với lambda và kết thúc điều này với Collector?
Serverfrog

1

JavaScript, 17 byte

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

Cuối cùng, chuyển đổi loại của JavaScript có thể được sử dụng tốt! Xin lưu ý rằng điều này thực sự sẽ tạo ra một mảng, nhưng chuyển đổi chuỗi (đưa nó vào HTML) làm cho nó trở thành một danh sách được phân tách bằng dấu phẩy.

Nếu danh sách được phân tách bằng dấu phẩy là đầu ra có thể chấp nhận, thì sau đây là hợp lệ:

7 byte

a=>""+a

LƯU Ý: Đoạn trích bị hỏng vì một số lý do

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


3
Điều này dường như không hoạt động khi chạy trong bảng điều khiển cho đầu vào ["["]... Tôi đã thử chạy (a=>eval([$ {a}] ))(["["])và nhận đượcSyntaxError
jrich

@jrich. Bạn chỉ nhận được lỗi này khi bạn nhập từng ký tự. Nếu bạn sao chép và dán bất kỳ mảng hợp lệ nào , nó sẽ hoạt động như mong đợi. Nhân tiện, trả lời tốt đẹp SpeedNinja, tôi sẽ chỉ thay đổi oninputsự kiện với một buttoncú nhấp chuột.
Washington Guedes

Điều này không hoạt động đối với các chuỗi có dấu phẩy trong đó
Jo King


1

Tùy viên , 14 byte

{Reap[Sow@>_]}

Hãy thử trực tuyến!

May mắn thay, Attache có toán tử "vector hóa", áp dụng một hàm tại các nguyên tử của danh sách. Trong trường hợp này, tất cả những gì chúng ta cần làm là thiết lập một máy gặt với ReapSowtất cả các nguyên tử của đầu vào _với @>. Tôi nghĩ nó khá thanh lịch.

Lựa chọn thay thế

15 byte: Fixpoint{`'^^_}

16 byte: Fixpoint!&Concat

17 byte: {q:=[]q&Push@>_q}

17 byte: Fixpoint[&Concat]


1

Thuốc tiên , 74 byte

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

Câu trả lời đầu tiên của Elixir, vì vậy có lẽ có thể được đánh gôn một chút.

Hãy thử trực tuyến.

Giải trình:

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

Tất nhiên, nếu nội dung được cho phép, thì điều này có thể là 25 byte thay thế:

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

Hãy thử trực tuyến.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.