แผ่อาเรย์!


34

ในความท้าทายนี้งานของคุณคือการสร้างโปรแกรมที่ใช้ในอาร์เรย์ซ้อนกันและส่งกลับอาร์เรย์แบบแบนมิติเดียว ตัวอย่างเช่นการส่งออกควร [10,20,[30,[40]],50][10,20,30,40,50]


อินพุต

อินพุตจะเป็นอาร์เรย์ซ้อนกัน (เช่น[10,20,[[[10]]]]) มันจะมีจำนวนเต็มเท่านั้น (ทั้งลบและบวก) สตริงและอาร์เรย์ คุณสามารถรับอินพุตเป็นอาร์กิวเมนต์ฟังก์ชัน STDIN หรืออะไรก็ได้ที่เหมาะกับภาษาของคุณ คุณสามารถสันนิษฐานได้ว่าอาร์เรย์อินพุตจะไม่มีอาร์เรย์ว่างเปล่า


เอาท์พุต

เอาต์พุตจะเป็นอาเรย์แบบมิติเดียวที่มีองค์ประกอบเดียวกับชนิดเดียวกันในอาร์เรย์ที่ซ้อนกันและในลำดับเดียวกัน


กรณีทดสอบ

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


รู้สึกฟรีเพื่อขอคำชี้แจงใด ๆ โดยใช้ความคิดเห็น นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ!

หมายเหตุ: หากภาษาของคุณมีอยู่ในตัวสำหรับสิ่งนี้คุณจะต้องไม่ใช้มัน


แก้ไข

โปรดระบุลิงก์ไปยังเว็บไซต์ที่สามารถใช้รหัสของคุณได้


7
บางภาษาถือว่าสตริงเป็นอาร์เรย์ [["Hi"], [[10]]] -> ["H", "i", 10] ตกลงไหม?
2559

4
@ ฉันก็รู้สึกประหลาดใจเหมือนกันที่พบว่ามีunflattenคำถาม แต่ไม่มีflattenคำถามเกี่ยวกับ PPCG
Arjun

3
จะเป็นอย่างไรถ้าภาษาของคุณรองรับเฉพาะขนาดย่อยที่มีขนาดเท่ากัน (เช่น Java?) จะทำอย่างไรถ้าประเภทของแต่ละองค์ประกอบต้องเหมือนกัน? (เช่น Java, C ++ เป็นต้น?) นอกจากนี้โปรดเพิ่มเช่น["[",[["[",],'[',"['['"]]เป็นกรณีทดสอบ
ข้อบกพร่อง

4
@flawr กรณีทดสอบนั้นเหมาะสมสำหรับภาษาที่รองรับบอท'และ"ตัวคั่นเท่านั้น ( แต่ผมยอมรับว่ากรณีทดสอบที่เกี่ยวข้องกับ[, ], "และ\ภายในสตริงจะเป็นประโยชน์.)
มาร์ตินเอนเดอร์

4
กรณีทดสอบยังไม่รวมภาษาที่ไม่รองรับอาเรย์ประเภทนี้ที่มีหลายประเภทหรือมีสัญกรณ์อื่นสำหรับตัวอักษรอาร์เรย์
ข้อบกพร่อง

คำตอบ:


40

K, 3 ไบต์

,//

นี่เป็นสำนวนที่ค่อนข้างธรรมดา "เข้าร่วมบรรจบกัน"

ลองนี่ตกลง

มันทำงานอย่างไร:

เข้าร่วมกับ ( ,) ฟิวส์อะตอมกันหรือรายการในการผลิตรายการ เกิน ( /) ใช้กริยา (ในกรณีนี้เข้าร่วม) และใช้มันระหว่างองค์ประกอบของรายการแต่ละรายการจากซ้ายไปขวา ดังนั้นสารประกอบ,/จะแบนองค์ประกอบระดับบนสุดของรายการทั้งหมด สัญลักษณ์/มีความหมายต่างกันจริงขึ้นอยู่กับวาเลนซ์ (จำนวนอาร์กิวเมนต์) ของคำกริยาที่ประกอบกัน เมื่อเราให้,/เป็นคำกริยาสุดท้าย/ทำหน้าที่เป็น "มาบรรจบ" - มันนำ,/ไปใช้ซ้ำกับอินพุตจนกว่ามันจะหยุดการเปลี่ยนแปลง ภาษาอื่นบางภาษาเรียกคุณสมบัติเช่นนี้ว่า "combinator จุดคงที่" ด้วยการหลอมรวมรายการระดับล่างซ้ำแล้วซ้ำอีกในที่สุดคุณจะมาถึงรายการแบนเดียวและไม่มีการดำเนินการใดที่จะรบกวนลำดับขององค์ประกอบ ดูเหมือนว่าจะแก้ปัญหาได้


1
เอาล่ะขอบคุณสำหรับคำอธิบาย! มี +1 ที่ได้รับมาอย่างดี
ค่าหมึก


1
ฉันคิดอัลกอริทึมเดียวกัน (แต่ไม่ใช่ในภาษานี้) +1 สำหรับการเลือกภาษาที่ถูกต้องเพื่อใช้ใน!
Cyoce

@Cyoce หากภาษาของคุณเทียบเท่ากับผู้ให้บริการสามรายที่ใช้ในที่นี้มันเป็นคำตอบที่เป็นธรรมชาติมาก โดยทั้งหมดโพสต์รูปแบบของคุณ
JohnE

1
@JohnE เรื่องยาวฉันได้รับภาษาจากอัลกอริธึมที่ฉันคิดขึ้นมาดังนั้นภาษายังไม่เสร็จสมบูรณ์
Cyoce

38

JavaScript (ES6), 35 ไบต์

แรงบันดาลใจจากคำตอบของ @ user81655 :

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

3
ฉลาดมาก! +1 สำหรับ [ab] โดยใช้วิธีแปลก ๆ ในการจัดการคีย์ที่หายไปของ JS!
Cyoce

ฉันสามารถเอาชนะได้
Bald Bantha

@BaldBantha: เรารอคอยคำตอบของคุณ :-)
Bergi

2
Crap NVM โซลูชัน 33 ไบต์ของฉันล้มเหลวในกรณีทดสอบข้อใดข้อหนึ่ง NOOOO
Bald Bantha

2
@BaldBantha การเข้าร่วมแยกจะล้มเหลวในเครื่องหมายจุลภาคที่อยู่ในสตริง
Qwertiy

19

Mathematica, 16 14 ไบต์

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

ฟังก์ชั่นที่ไม่มีชื่อซึ่งใช้และส่งกลับรายการเช่น:

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

คำอธิบาย

ปาร์ตี้น้ำตาลซินแทคติก!

เพื่อให้เข้าใจถึงวิธีการทำงานนี้ทราบว่าการแสดงออกในทุกมาติกาเป็นทั้งอะตอม (เช่นตัวเลข, สตริง, สัญลักษณ์) หรือการแสดงออกของสารประกอบของแบบฟอร์มf[a, b, c, ...]ที่f, a, b, cตัวเองโดยพลการแสดงออก ที่นี่fเรียกว่าส่วนหัวของการแสดงออก ทุกอย่างอื่นนอกเหนือจากนั้นเป็นเพียงน้ำตาลประโยค เช่นเป็นเพียง{a, b, c}List[a, b, c]

เราเริ่มต้นด้วยการ//@แมปฟังก์ชั่นในทุกระดับของรายการ ตัวอย่างเช่น

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

โปรดทราบว่าสิ่งนี้จะแม็พfกับอะตอมรวมถึงนิพจน์เชิงประกอบ สิ่งที่เรากำลังมองหาคือวิธีกำจัดหัวรายการและเก็บทุกอย่างไว้

โดยApplyปกติแล้วฟังก์ชันนี้ใช้เพื่อป้อนองค์ประกอบของรายการเป็นอาร์กิวเมนต์ที่แยกกันไปยังฟังก์ชัน แต่นิยามที่แท้จริงของมันนั้นกว้างกว่าและแทนที่หัวของนิพจน์ เช่นให้Apply[g, f[a, b]]g[a, b]

ตอนนี้มี "หัว" พิเศษที่เรียกSequenceว่าหายไป เช่นเพียงแค่ประเมิน{a, Sequence[b, c], d} {a, b, c, d}แนวคิดสำหรับการทำให้รายการแบนคือการแทนที่ส่วนหัวของรายการภายในทั้งหมดSequenceเพื่อให้ได้รับการแบ่งเป็นรายการโดยรอบ ดังนั้นสิ่งที่เราต้องการคือApplyมุ่งหน้าSequenceไปยังรายการ สะดวกถ้าเรามีApplyอะไรบางอย่างกับอะตอมมันแค่ปล่อยให้อะตอมไม่เปลี่ยนแปลงดังนั้นเราจึงไม่ต้องแยกแยะระหว่างประเภทของนิพจน์เลย

ในที่สุดก็มีปัญหาเล็ก ๆ น้อยหนึ่ง: fถูกนำไปใช้กับระดับนอกสุดเพื่อที่จะกำจัดสิ่งนอกสุดListที่เราไม่ต้องการ วิธีที่สั้นที่สุดในการตอบโต้คือเพียงห่อผลในรายการอีกครั้งเช่นว่าสภาพแวดล้อมโดยรอบSequenceจะหายไปได้อย่างปลอดภัย

โปรดทราบว่าไม่มีApplyหรือไม่มีSequenceในรหัส @@เป็นรูปแบบที่ผู้ประกอบการApplyและเป็นเคล็ดลับการเล่นกอล์ฟมาตรฐานที่จะลดลงในตัวชื่อยาว##& Sequenceดังนั้นทุกอย่างที่ไม่น่ารังเกียจเราได้รับ:

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

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการและเหตุผลที่##&ผลงานให้ดูส่วนที่เกี่ยวกับ "ลำดับของการขัดแย้ง" ในคำตอบของฉันสำหรับเคล็ดลับ Mathematica


//@ครั้งแรกที่ผมได้เห็น มีประโยชน์มากที่จะรู้เกี่ยวกับ!
DavidC

//@จับรูปแบบเรียบร้อย เตือนให้ฉันนึกถึง combinators ซ้ำ ๆ ในจอย คุณมีลิงค์ไปอ้างอิงที่ดีกับฟังก์ชันที่เกี่ยวข้องใน Mathematica หรือไม่? ฉันสนใจวิธีการแยกแยะการเรียกซ้ำอย่างชัดเจนของโปรแกรม
JohnE

1
@JohnE ดีนี่เป็นเอกสาร นอกจากนี้คุณยังสามารถมองไปที่สิ่งที่ชอบMap, MapAt, Applyเช่นเดียวกับReplaceและฟังก์ชั่นที่เกี่ยวข้อง โดยทั่วไปแม้ว่าจะมีฟังก์ชั่นมากมายซึ่งใช้พารามิเตอร์ตัวเลือกlevelspec (ดูโซลูชัน 16 ไบต์เดิมของฉัน) ซึ่งช่วยให้คุณสามารถใช้ฟังก์ชั่นได้หลายระดับ / ทุกระดับพร้อมกัน
Martin Ender

12

Python 2, 43 ไบต์

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

ในรายการให้เรียกองค์ประกอบซ้ำและเชื่อมผลลัพธ์เข้าด้วยกัน บนสตริงหรือตัวเลขให้เข้ารหัสในรายการซิงเกิล

น่าเสียดายที่ Python 2 สั่งให้ทำint < list < stringแซนด์วิชประเภทต่างๆlistระหว่างกันทำให้ต้องตรวจสอบความไม่เท่าเทียมกันสองอย่าง ดังนั้นแทนที่จะl*0ถูกตรวจสอบกับรายการที่ว่างเปล่า[]มิฉะนั้นให้หรือ0""


10

Ruby, 43 42 34 ไบต์

โซลูชันแบบเรียกซ้ำ ขณะนี้มีข้อยกเว้นการจัดการ! (อาจเป็นเครดิต @akostadinov สำหรับสร้างแรงบันดาลใจให้กับการเปลี่ยนแปลง)

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

ลิงก์ IDEOne


ความรุ่งโรจน์สำหรับความห้วน, น่ากลัว
akostadinov

ฉันไม่ทราบว่าคุณสามารถใช้rescueเช่นนั้นได้
Cyoce

1
@Cyoce ฉันคิดว่าเป็นเพราะในทางเทคนิคแล้ว Ruby ไม่มีtryบล็อกดังนั้นคุณใช้beginแทนเพื่อแยกแยะส่วนต่าง ๆ ที่คุณต้องการให้จับได้และชิ้นส่วนที่คุณไม่ต้องการ ดังนั้นเมื่อคุณจับบล็อกที่เหลือทั้งหมดก่อนหน้านี้คุณไม่จำเป็นต้องใช้มันในทางเทคนิคใช่ไหม ส่วนที่เหลือเป็นเพียงการตัดช่องว่างออกเนื่องจาก Ruby ตีความบรรทัดเป็น...inject(:+) rescue [a]
Ink Value

1
@ KevinLau-notKenny ไม่การช่วยเหลือในบรรทัดเดียวกันนั้นแตกต่างกันเพียงแค่ช่วยในบรรทัดนั้น เช่นa = raise("haha") rescue 1จะกำหนดไป1 aมัน '
akostadinov

@ KevinLau-notKenny มีอินไลน์เป็นrescueเหมือนมีอินไลน์และif while
Nic Hartley


8

Perl 6 , 24 ไบต์

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

คำอธิบาย:

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

ทดสอบ:

#! /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 ไบต์

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

Haskell ไม่มีรายการซ้อนกันที่มีความลึกแตกต่างกันของรายการย่อยหรือประเภทผสมสำหรับองค์ประกอบรายการ สำหรับการซ้อนฉันกำหนดชนิดข้อมูลที่กำหนดเองDซึ่งเป็นใบไม้Lที่มีองค์ประกอบบางอย่างหรือโหนดNซึ่งเป็นรายการของDs สำหรับองค์ประกอบที่ผสมผมใช้ชนิดข้อมูลที่กำหนดไว้ล่วงหน้าซึ่งรวมสองประเภทไว้ในที่เดียวที่นี่Either Either String Integerรูปแบบใหม่Dและฟังก์ชั่นการแบนfนั้นมีความหลากหลายในรูปแบบขององค์ประกอบของใบไม้ดังนั้นฉันจึงไม่จำเป็นต้องดูแลอะไรเป็นEitherพิเศษ

ตัวอย่างการใช้งาน: ->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 ไบต์

us+]Y

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

แต่แน่นอนว่ายังมีฟังก์ชั่น build-in ที่จัดการงานด้วย 2 ไบต์: .n( Test Suite )


เพียง 3 ห่างจากผู้ชนะปัจจุบัน! +1
Arjun

@Sting: กอล์ฟไปไบต์อื่น ลืมไปว่า Pyth ต่อท้ายตัวละครสุดท้ายGโดยปริยายถ้าฉันไม่เขียน
Jakube

ขอแสดงความยินดี!
Arjun

6

JavaScript (Firefox 30-57), 43 ไบต์

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

concatเพียงเพราะฉันยังสามารถหลีกเลี่ยงการใช้


ไม่ใช่ECMAScript 6ไม่ใช่Firefox 30+ใช่ไหม
โซโลมอน Ucko

1
@SolomonUcko ไม่[for(of)]สามารถใช้ได้ใน Firefox 30+ เท่านั้น มันถูกเสนอสำหรับ ES7 แต่ลดลงในภายหลัง
Neil

1
ขอบคุณที่อธิบาย! ส่วนใหญ่ฉันแค่คิดว่ามันเป็นfor(__ in __)
โซโลมอน Ucko

@SolomonUcko [สำหรับ (ใน)] เป็นไวยากรณ์ทดลองทางเลือกซึ่งให้กุญแจของวัตถุแก่คุณ
Neil

5

Perl, 34 29 ไบต์

ฟังก์ชั่น.

หากต้องการให้แบนเหมือนรายการmy @a = f(@a)29 ไบต์:

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

ทดสอบบน Ideone

หากต้องการให้แบนเหมือนอาเรย์อ้างอิงเช่นmy $a = f($a)34 ไบต์:

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

ทดสอบบน Ideone

Perl 5.22.0+, 27 ไบต์

ขอขอบคุณที่ฮอบส์

หากต้องการย่อให้อยู่ในรายการเช่นmy @a = f(@a)27 ไบต์:

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

ทดสอบบน JDoodle

ถ้าต้องการให้แบนเหมือน array อ้างอิงmy $a = f($a)32 ไบต์:

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

ทดสอบบน JDoodle


ฉันยังไม่ได้ทดสอบ แต่คิดว่า?@{f@$_}:ควรจะทำงานแทน?@{f(@$_)}:ประหยัดสองไบต์
msh210

1
@ msh210 ไม่มันไม่ทำงาน คอมไพเลอร์ไม่ได้fเป็นฟังก์ชันเพราะfยังไม่ได้ประกาศ sub f{}sub f{... f@$_ ...}การทำงาน
เดนิส Ibaev

1. refไม่จำเป็นต้องใช้ parens ในการทำงานช่วยประหยัด 2 ไบต์ 2. เท่าที่ฉันเห็นsub f{map{ref?f(@$_):$_}@_}อยู่ภายในกฎและบันทึกอีก 5. fใช้อาเรย์ (nonref) เป็นรายการเพื่อให้สามารถส่งคืนได้
ฮอบส์

@hobbs 1. หากไม่มีเครื่องหมายวงเล็บrefในคอมไพเลอร์จะถือว่า?เป็นการเริ่ม?PATTERN?การทำงานเช่นref(?PATTERN?)นั้น ดังนั้นคอมไพเลอร์ค้นหาที่สอง?และพ่นข้อผิดพลาด
เดนิส Ibaev

@DenisIbaev อา ?PATTERN?ถูกลบใน 5.22.0 ( m?PATTERN?ยังคงใช้งานได้) และฉันกำลังทดสอบรุ่นล่าสุด ดังนั้นคุณสามารถรับสองไบต์นั้นได้โดยระบุ 5.22+
hobbs

4

Julia, 29 ไบต์

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

นี่คือการกระจายซ้ำในฟังก์ชันเชื่อมต่อจนกว่าจะถึงจุดแก้ไข ตัวอย่าง

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

3

เรติน่า 30 ไบต์

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

ลองออนไลน์! (บรรทัดแรกใช้เพื่อเรียกใช้หลายกรณีทดสอบพร้อมกัน)

Retina ไม่มีแนวคิดเกี่ยวกับอาร์เรย์ตัวอักษรสตริงหรือตัวเลขดังนั้นฉันจึงตัดสินใจที่จะใช้รูปแบบอินพุต "ทั่วไป" ของ[...,...]อาร์เรย์สไตล์และ"สตริงที่ จำกัด ซึ่ง\สามารถใช้ภายในสตริงเพื่อหลีกเลี่ยงอักขระใด ๆ (โดยเฉพาะ"และ\ตัวมันเอง)

ตัวโปรแกรมนั้นตรงกับสตริงเต็มหรือวงเล็บเหลี่ยมและแทนที่มันด้วย$1ซึ่งเก็บสตริงและลบวงเล็บเหลี่ยม ขีด จำกัด การข้ามนัดแรกเพื่อที่เราจะไม่เอาชั้นนำ1> [อย่างไรก็ตามนี่จะเป็นการลบส่วนท้าย]ดังนั้นเราจึงเพิ่มกลับเข้าไปในสเตจแยกต่างหาก


3

Pyke 11 ไบต์

.F~]+=])K~]

ลองที่นี่!

คำอธิบาย:

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

หรือ 7 ไบต์หลังจากแก้ไขข้อผิดพลาด

M?+]K~]

ลองที่นี่!

คำอธิบาย:

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

หรือแม้กระทั่ง 2 ไบต์หากอนุญาตให้พิมพ์ไปยัง stdout (สิ่งนี้อาจมาพร้อมกับบิวด์อิน)

M
<newline required>

ลองที่นี่!

สิ่งนี้จะใช้print_newlineฟังก์ชั่นอย่างลึกซึ้งกับทุกรายการที่ไม่มีลำดับในอินพุตและเรียกซ้ำสำหรับรายการลำดับ


เพียง 4 ห่างจาก K! +1
Arjun

3

Java (v8) 390 276 ไบต์

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

เพียงเพื่อความสมบูรณ์และทุกสิ่งที่ :) ไม่สามารถพูดรหัสประสิทธิภาพของ Java


3
สวัสดีและยินดีต้อนรับสู่ PPCG! คำถามนี้คือcode-golfดังนั้นโปรดลองลดรหัสของคุณให้เล็กที่สุด ขอบคุณ!
NoOneIsHere

3
ลบช่องว่างแท็บและการขึ้นบรรทัดใหม่ที่ไม่จำเป็นทั้งหมด เปลี่ยนoafไปoและการเปลี่ยนแปลงไปflatten f
NoOneIsHere

2
คุณไม่จำเป็นต้องfinals สิ่งที่ทั้งสามารถแลมบ์ดา, คุณไม่จำเป็นต้องpublic static...
เดวิดคอนราด

1
คุณสามารถบันทึกอักขระคู่หากคุณใช้ generics แทนวัตถุ
user902383

1
คุณสามารถบันทึก 2 ไบต์หากคุณแทนที่falseด้วย1>2และอีก 2 ไบต์คุณจะได้รับถ้าคุณประกาศ n แต่ไม่ได้กำหนด (คอมไพเลอร์กำหนดโดยอัตโนมัติเป็น 0)
user902383

2

Python ขนาด 57 ไบต์

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

ลองใช้งานออนไลน์: Python 2 , Python 3

ขอบคุณ Kevin Lau สำหรับlist==type(x)เคล็ดลับ


2
type(x)==listisinstance(x,list)จะสั้นกว่า
มูลค่าหมึก

1
“มันจะมีเพียงจำนวนเต็ม (ทั้งบวกและลบ) สตริงและอาร์เรย์.”วิธีการเกี่ยวกับ[`x`>'['and...? (ใช้งานได้กับ Python 2 เท่านั้น)
Lynn

2

ทับทิม

มีflattenวิธีการในตัว

คุณสามารถเรียกใช้ที่นี่: http://www.tutorialspoint.com/execute_ruby_online.php

43 ไบต์เดียว แต่คิดว่าจะแชร์:

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

45 ไบต์หนึ่งไบต์ที่มีประสิทธิภาพมากกว่าคำตอบทับทิมก่อนหน้าและคำตอบอื่น ๆ :

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

มาตรฐานที่นี่:

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

ผล:

       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
สวัสดีและยินดีต้อนรับสู่ PPCG! Note: If your language contains a built-in for this, then you must NOT use itแต่น่าเสียดายที่คำตอบของคุณไม่ถูกต้องเพราะกฎนี้:
NoOneIsHere

@ NoOne อยู่ที่นี่ขอบคุณไม่รู้ว่า
akostadinov

1
การอัปเดตใหม่ของฉันจะจัดการกับเวลาของคุณได้อย่างไร นอกจากนี้เช่นเดียวกับคำตอบใหม่ของฉันคุณสามารถลบช่องว่างรอบ ๆrescue
Value Ink

@ KevinLau-notKenny อัพเดตขอบคุณ! rescueดูเหมือนว่าจะช้า btw เช่นtry/catchใน java
akostadinov

1
อัปเดตจำนวน bytecount ของคุณด้วย
Value Ink


2

Clojure, 68 ไบต์

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

mapcatก่อนใช้ฟังก์ชั่นกับแต่ละองค์ประกอบแล้ว concats ผลลัพธ์ ดังนั้นทุกครั้งที่มีการทำระดับ 'ซ้อน' จะหายไป Concat ไม่ทำงานบนลำดับไม่ดังนั้นองค์ประกอบจะต้องถูกห่อเป็นเวกเตอร์หากพวกเขาไม่ใช่เวกเตอร์

คุณสามารถลองได้ที่นี่: http://www.tryclj.com

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

Nice รหัสแรกกอล์ฟ +1 :)
Arjun

2

ANSI C, 193 ไบต์

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

: - / ข้อเสนอแนะใด ๆ แต่ฉันพยายามค้นหาแหล่งข้อมูลออนไลน์เพื่อรวบรวมสิ่งนี้ แต่ WL นั้นเข้มงวดสำหรับการรวบรวมรหัสนี้ มันจะทำงานกับ VS และ gcc เป็นอย่างอื่น


2
ยินดีต้อนรับสู่ PPCG!
Martin Ender

1
ยินดีต้อนรับสู่ PPCG! กอล์ฟครั้งแรกที่ดี ขอให้โชคดีไปข้างหน้า!
Arjun

ขอบคุณ! มันเป็นความพยายามที่จะเพิ่มคะแนนของฉันเพื่อที่ฉันจะได้รับสิทธิพิเศษในการแสดงความคิดเห็นที่อื่น ดูเหมือนว่าสิ่งต่างๆจะไม่ทำงานเหมือนที่บัญชีใช้สำหรับพอร์ทัลที่ต่างกัน : DI จะดูว่ามีคุณสมบัติที่ดีจาก c ++ หรือไม่
amritanshu

2

JavaScript 20 ไบต์

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

อาร์เรย์ + อาร์เรย์เท่ากับ array.toString


@WeatWizard ขอบคุณสำหรับการต้อนรับและฉันยังใหม่กับเว็บไซต์ อันที่จริงaเป็นข้อโต้แย้งของฟังก์ชั่น ฉันจะพยายามแก้ไขฟังก์ชั่นทันที
i--

ฉันคิดว่าตอนนี้มันโอเค @WheatWizard โปรดแจ้งให้เราทราบหากมีปัญหาเกี่ยวกับเรื่องนี้
i--

1
การดูจาวาสคริปต์ docs ฟังก์ชั่นที่ไม่ระบุชื่อจะสั้นลงอย่างแน่นอนคุณจะต้องเพิ่มa=>ไปยังจุดเริ่มต้นของรหัสของคุณเท่านั้น
ข้าวสาลีตัวช่วยสร้าง

@WheatWizard ฉันอัปเดตด้วยฟังก์ชั่นลูกศรตามที่คุณพูดถึง แต่ฉันต้องลบตัวอย่างเพราะฟังก์ชั่นลูกศรไม่รองรับการเรียกใช้โดยตรง มันใช้สำหรับการโทรกลับเท่านั้น
i--

1
สิ่งนี้ไม่จัดการกับสตริงด้วยเครื่องหมายจุลภาคในนั้นอย่างถูกต้อง
Jo King

2

C #, 48 ไบต์

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

คิดว่าฉันจะโพสต์มันเพราะยังไม่มีใครให้วิธีแก้ปัญหา C # ยินดีต้อนรับข้อเสนอแนะ!


ยินดีต้อนรับสู่เว็บไซต์ ฉันยังไม่ได้ตั้งโปรแกรมใน C # นาน ๆ แต่ดูเหมือนว่าฉันอาจมีปัญหาสองสามข้อ สำหรับวิธีiเริ่มต้นอย่างไร และคุณแน่ใจหรือว่ามันใช้กับ[["[]"],"[]"]ตัวอย่างได้?
ข้าวสาลีตัวช่วยสร้าง

ขออภัยฉันป้อนเข้าเป็นสตริง อาร์เรย์ที่ว่างเปล่าจะแปลเป็นสตริงที่ว่างเปล่า
PmanAce

วิธีการเกี่ยวกับการทดสอบครั้งสุดท้าย? นอกจากนี้ฉันคิดว่าคุณตั้งใจจะทำi=>$"{i.Replace("[","").Replace("]","")}"อย่างไร
ศูนย์รวมแห่งความไม่รู้

น่าเศร้าที่ใช้ไม่ได้ในกรณีสุดท้ายมันจะกำจัดอาเรย์ที่ว่างเปล่า :(
PmanAce

คำตอบนี้ไม่ผ่านกรณีทดสอบขั้นสุดท้าย เนื่องจากยังไม่ได้รับการแก้ไขเป็นเวลาสองสามเดือนฉันจึงลงคะแนนเพื่อลบ
mbomb007


1

Java 8 165 ตัวอักษร

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 ในชั้นเรียน:

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

คำตอบนี้จะขึ้นอยู่กับวิธีการที่เจเรมี Harton ของ ฉันใช้มันเปลี่ยนไปในบางสถานที่และสร้างเวอร์ชันที่เหมือนกอล์ฟมากขึ้น


มันจะไม่ดีกว่าเมื่อใช้ Arrays.asList () กับ "array" แล้วไปข้างหน้าด้วยแลมบ์ดาและจบสิ่งนี้ด้วยตัวสะสม
Serverfrog

1

จาวาสคริปต์, 17 ไบต์

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

ในที่สุดการแปลงประเภทของ JavaScript สามารถนำไปใช้ประโยชน์ได้บ้าง! โปรดทราบว่าสิ่งนี้จะส่งออกอาร์เรย์จริงๆ แต่การแปลงสตริง (วางลงใน HTML) ทำให้มันกลายเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาค

หากรายการที่คั่นด้วยเครื่องหมายจุลภาคเป็นเอาต์พุตที่ยอมรับได้ดังนั้นสิ่งต่อไปนี้ที่ถูกต้อง:

7 ไบต์

a=>""+a

หมายเหตุ: ตัวอย่างข้อมูลใช้งานไม่ได้ด้วยเหตุผลบางประการ

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


3
ดูเหมือนจะไม่ทำงานเมื่อทำงานในคอนโซลสำหรับการป้อนข้อมูล["["]... ฉันลองใช้(a=>eval([$ {a}] ))(["["])และได้รับSyntaxError
jrich

@jrich คุณเพิ่งได้รับข้อผิดพลาดนี้เมื่อคุณพิมพ์อักขระตามตัวอักษร หากคุณคัดลอกและวางอาร์เรย์ที่ถูกต้องมันจะทำงานตามที่คาดไว้ โดยวิธีการตอบที่ดี SpeedNinja ฉันจะเปลี่ยนoninputเหตุการณ์ได้ด้วยbuttonคลิกเดียว
Washington Guedes

สิ่งนี้ใช้ไม่ได้กับสตริงที่มีเครื่องหมายจุลภาคอยู่
Jo King


1

ทูตขนาด 14 ไบต์

{Reap[Sow@>_]}

ลองออนไลน์!

โชคดีที่ Attache มีโอเปอเรเตอร์ "vectorization" ซึ่งใช้ฟังก์ชั่นที่อะตอมของรายการ ในกรณีนี้เราทุกคนต้องทำคือการตั้งค่าที่เกี่ยวกับReapและSowทุกอะตอมของท่านด้วย_ @>ฉันคิดว่ามันค่อนข้างหรูหรา

ทางเลือก

15 ไบต์: Fixpoint{`'^^_}

16 ไบต์: Fixpoint!&Concat

17 ไบต์: {q:=[]q&Push@>_q}

17 ไบต์: Fixpoint[&Concat]


1

Elixir , 74 ไบต์

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

คำตอบแรกของ Elixir ดังนั้นอาจเป็นเรื่องของกอล์ฟ

ลองออนไลน์

คำอธิบาย:

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

แน่นอนว่าถ้าอนุญาตบิวอินแล้วอาจเป็น25 ไบต์แทน:

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

ลองออนไลน์



1

ภาษา Wolfram (Mathematica)ขนาด 13 ไบต์

#~Level~{-1}&

ลองออนไลน์!

ยกเลิกแข็งแรงเล่นกอล์ฟ: F[x_] := Level[x, {-1}]

หยิบออกองค์ประกอบของโครงสร้างในระดับสุดท้ายของรูปแบบต้นไม้ ผมไม่แน่ใจว่าข้อหานี้เป็น "การหลีกเลี่ยงในตัวว่า" (ซึ่งจะเป็นFlatten)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.