アレイを平らにします!


34

この課題では、あなたの仕事は、ネストされた配列を取り込んで、一次元の平坦化された配列を返すプログラムを作成することです。たとえば、[10,20,[30,[40]],50]出力する必要があります[10,20,30,40,50]


入力

入力はネストされた配列になります(例:)[10,20,[[[10]]]]。整数(負と正の両方)、文字列、配列のみが含まれます。入力を関数の引数、STDIN、または言語に適したものとして受け取ることができます。入力配列に空の配列がないと仮定できます。


出力

出力は、ネストされた配列と同じ順序で同じタイプの同じ要素を持つフラット化された1次元配列になります。


テストケース

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


コメントを使用して、説明を求めてください。これはなので、バイト単位の最短コードが勝ちです!

注: 言語にこれが組み込まれている場合は、使用しないでください。


編集

コードを実行できるWebサイトへのリンクも含めてください。


7
一部の言語は文字列を配列として扱いますが、[["Hi"]、[[10]]]-> ["H"、 "i"、10]は大丈夫ですか?
アダム

4
@Mego PPCGにはunflatten疑問はあるが疑問はないことを知り、私も驚いたflatten
アルジュン

3
あなたの言語が同じサイズのサブアレイのみをサポートしている場合はどうなりますか?(たとえば、Java?)各要素のタイプが同じでなければならない場合はどうなりますか?(たとえば、Java、C ++など?)また、たとえば["[",[["[",],'[',"['['"]]テストケースとして追加してください。
flawr

4
@flawrそのテストケースにのみサポートボットその言語のために理にかなっている'し、"区切り文字として。(しかし、私はテストケースが関与することに同意し[]"および\文字列内有用であろう。)
マーティン・エンダー

4
テストケースでは、これらの種類の複数のタイプの配列、または配列リテラルの別の表記法をサポートしない言語も除外します。
-flawr

回答:


40

K、3バイト

,//

これはかなり一般的なイディオムです。「収束に参加」。

ここでoKで試してください

使い方:

Join(,)は、アトムまたはリストを融合してリストを作成します。Over(/)は動詞(この場合はjoin)を取り、リストの各要素の間に左から右に適用します。したがって、化合物,/はリストのすべての最上位要素を平坦化します。/実際には、シンボルは、それが複合される動詞の価(引数の数)に応じて異なる意味を持ちます。,/動詞として提供する場合、最終/は「収束」として機能し,/ます。変更が停止するまで、入力に繰り返し適用されます。他の一部の言語では、このような機能を「固定小数点コンビネーター」と呼んでいます。最下位レベルのリストを繰り返し融合することにより、最終的に単一のフラットリストに到達し、要素の順序を乱す操作はありません。これで問題が解決したようです。


1
わかりました、説明ありがとう!獲得した+1を獲得してください。
バリューインク


1
私は同じアルゴリズムを思いつきました(この言語ではありません)。適切な言語を選択して実装するための+1
チョイス

@Cyoceここで使用している3つの演算子と同等の言語がある場合、それは非常に自然なソリューションです。必ずバリエーションを投稿してください。
-JohnE

1
@JohnE長い話、私は思いついたアルゴリズムから言語を導出しているので、言語はまだ完成していない(したがって実装されていない)。
チョイス

38

JavaScript(ES6)、35バイト

@ user81655の回答に触発された:

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

3
非常に賢い!不足しているキーを処理するJSの奇妙な方法を[ab]使用するための+1!
チョイス

私はそれを打ち負かすことができます。
ハゲバンタ

@BaldBantha:あなたの答えを楽しみにしています:
ベルギ

2
NVMのクラッシュテストケースの1つで33バイトソリューションが失敗します。NOOOO
白頭バンサ

2
@ BaldBantha、join-splitは文字列内のコンマで失敗します。
Qwertiy

19

Mathematica、16 14バイト

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

リストを取得して返す名前のない関数。例:

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

説明

構文糖衣パーティー!

理解するためにどのようにこの作品は、ノートMathematicaのすべての式は、原子のいずれかであること(例えば数値、文字列、記号)またはフォームの複合式f[a, b, c, ...]fabc任意の式そのものをされています。ここで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ことに、アトムに何かを加えても、アトムは変更されないままなので、式のタイプをまったく区別する必要はありません。

最後に、小さな問題が1つありfます。これは、最も外側のレベルにも適用されるため、最も外側のレベルも削除されますがList、これは望ましくありません。それに対抗する最も短い方法は、結果をリストに再度ラップすることSequenceです。これにより、周囲が安全に消えることができます。

コードにApplySequenceコードにもないことに注意してください。@@は、演算子形式でApplyあり##&、長い組み込み名を短縮するための標準的なゴルフトリックSequenceです。それで、すべてを少しでも手放すと、次のようになります。

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

##&動作の仕組みと理由の詳細については、Mathematicaのヒントに対する回答の「引数のシーケンス」のセクションを参照してください。


初めて見た//@。知っておくととても便利です!
DavidC

//@きちんとしたパターンをキャプチャします。Joyの再帰的な組み合わせの一部を思い出します。Mathematicaの関連関数への良いリファレンスへのリンクはありますか?私はプログラムから明示的な再帰をファクタリングする方法に非常に興味があります。
ヨーネ

1
@JohnEさて、ここにドキュメントがあります。また、のようなものを見て可能性がありMapMapAtApply、などReplaceと関連する機能。一般的には、オプションのlevelspecパラメータを使用する関数がたくさんありますが(私の元の16バイトのソリューションを参照)、一度に複数/すべてのレベルで関数を適用できます。
マーティンエンダー

12

Python 2、43バイト

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

リスト上で、要素を再帰し、結果を連結します。文字列または数値では、シングルトンリストに入れます。

残念ながら、Python 2の型の順序は他の型の間にint < list < string挟まlistれているため、チェックするには2つの不等式が必要です。だから、代わりに、l*0空のリストと照合され[]そう与える、0または""


10

ルビー、43 42 34バイト

再帰的なソリューション。例外処理が追加されました!(ただし、変更を促した@akostadinovの功績でもあります)

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

IDEOneリンク


短さの称賛、素晴らしい
akostadinov

私はあなたがrescueそのように使用できることを知りませんでした
チョイス

1
@Cyoce Rubyには技術的にtryブロックがないためだと思うので、begin代わりにキャッチしたい部分とそうでない部分を区別するために使用します。それで、あなたはその前の残りのブロック全体をキャッチしているので、技術的には必要ないのですか?Rubyは、ラインを解釈するので、残りはちょうど、空白をトリミングしている...inject(:+) rescue [a]
バリューインク

1
@ KevinLau-notKenny、いいえ、同じ行での救助は異なり、その行を救うだけです。例えば、a = raise("haha") rescue 1割り当てます1a。それ」
アコスタディノフ

@ KevinLau-notKenny rescueインラインがifありwhileます。インラインとがあります。
ファンドモニカの訴訟

8

JavaScript(ES6)、41バイト

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バイト

{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またはsのNリストであるノードのいずれかであるカスタムデータ型を定義しますD。混合要素の場合Either、ここでは2つのタイプを1つに結合する定義済みのデータタイプを使用しますEither String Integer。新しい型Dとflatten関数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

オンラインで試す:デモンストレーションまたはテストスイート

しかし、もちろん、また、ちょうど2バイトでビルドイン機能、そのハンドルタスクがあります:.nテストスイート


現在の勝者からわずか3離れています!+1
アルジュン

@Sting:別のバイトを打ち上げました。G私が書いていない場合、Pythが最後の文字を暗黙的に追加することを忘れていました。
寂部

おめでとうございます!
アルジュン

6

JavaScript(Firefox 30-57)、43バイト

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

使用を避けることさえできたからconcatです。


ECMAScript 6Firefox 30以降ではありませんか?
ソロモンウッコ

1
@SolomonUckoいいえ、[for(of)]Firefox 30 以降でのみ利用可能です。ES7に提案されましたが、後に削除されました。
ニール

1
説明してくれてありがとう!ほとんどの場合、私はちょうどそれだと思ったfor(__ in __)
ソロモンUcko

@SolomonUcko [for(in)]は、オブジェクトのキーを提供する実験的な代替構文でした。
ニール

5

Perl、34 29バイト

関数。

のようにフラット化する必要がある場合my @a = f(@a)、29バイト:

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

Ideoneでテストする

my $a = f($a)34バイトのような配列refにフラット化する必要がある場合:

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

Ideoneでテストします。

Perl 5.22.0 +、27バイト

ホッブズに感謝します。

のようにフラット化する必要がある場合my @a = f(@a)、27バイト:

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

JDoodleでテストする

my $a = f($a)32バイトのような配列refにフラット化する必要がある場合:

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

JDoodleでテストします


私はそれをテストしていません?@{f@$_}:?@{f(@$_)}:、2バイトを節約する代わりに動作するはずだと思います。
msh210

1
@ msh210いいえ、機能していません。コンパイラfは、fまだ宣言されていないため、それが関数であることを認識しません。sub f{}sub f{... f@$_ ...}ワーキング。
デニスイバエフ

1. ref2バイトを節約するために、括弧を使用する必要はありません。2.私が見る限りsub f{map{ref?f(@$_):$_}@_}、ルール内にあり、別の5. fを保存します。配列(nonref)をリストとして取得し、同じものを返すことができます。
ホッブズ

@hobbs 1.括弧がない場合ref、コンパイラは、のような操作を開始している?と想定します。そのため、コンパイラは2番目に検索し、エラーをスローします。?PATTERN?ref(?PATTERN?)?
デニスイバエフ

@DenisIbaevああ。?PATTERN?5.22.0で削除されました(m?PATTERN?まだ動作します)。最近のバージョンでテストしています。したがって、5.22 +を指定することにより、これらの2バイトを獲得できます。
ホッブズ

4

ジュリア、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には配列、文字列リテラル、または数字の概念がないため、文字列内で任意の文字(特に、それ自体)をエスケープするために使用できる[...,...]スタイル配列と"-delimited文字列の「共通」入力フォーマットを\使用することにしました。"\

プログラム自体は、完全な文字列または角かっこに単純に一致し、それらを$1文字列を保持して角かっこを削除するものに置き換えます。制限1>は最初の一致をスキップするため、先頭を削除しません[。ただし、これにより末尾のが削除される]ため、別の段階で追加します。


3

パイク、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 `]`

または、stdoutへの印刷が許可されている場合は2バイトです(これは組み込みで行われる場合があります)

M
<newline required>

ここで試してみてください!

これprint_newlineにより、入力内のすべての非シーケンス項目に関数が深く適用され、シーケンス項目の再帰が行われます。


Kからわずか4 +1
アルジュン

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
不要なスペース、タブ、改行をすべて削除します。に変更oafo、に変更flattenfます。
-NoOneIsHere

2
あなたは必要としないfinal、あなたが必要としない、全部がラムダすることができ、Sをpublic static...
デヴィッド・コンラッド

1
あなたの代わりにオブジェクトをジェネリックを使用する場合は、カップルの文字を救うことができる
user902383

1
あなたはまた、2バイトの保存あなたは置き換えることができればfalse1>2、そして追加の2つのバイトが、あなたは(コンパイラが自動的に0として定義)を定義nを宣言した場合に得ることはありませんでした
user902383

2

Python、57バイト

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

オンラインで試す:Python 2Python 3

list==type(x)トリックをくれたケビン・ラウに感謝します。


2
type(x)==listはより短いisinstance(x,list)
バリューインク

1
「これは、文字列と配列のみを整数(負と正の両方)が含まれています。」いかが[`x`>'['and...?(これはPython 2でのみ機能します。)
リン

2

ルビー

組み込みflattenメソッドがあります。

ここで実行できます:http : //www.tutorialspoint.com/execute_ruby_online.php

1つの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

@NoOneIsHere、ありがとう、知らなかった
akostadinov

1
私の新しいアップデートは、あなたのものに対して時間的にどのようにスタックしますか?また、ちょうど私の新しい答えのように、あなたは周りのスペースを削除することができますrescue
Value Ink

@ KevinLau-notKenny更新、ありがとう!javarescuetry/catch
akostadinov

1
あまりにもあなた:バイト、更新
バリューインク


2

Clojure、68バイト

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

mapcat最初に各要素に関数を適用し、次に結果を連結します。そのため、1つの「ネストレベル」が連結されるたびに失われます。concatはシーケンスでは動作しないため、要素がベクトルでない場合は要素をベクトルにラップする必要があります。

こちらで試すことができます:http : //www.tryclj.com

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

素敵な最初のコードゴルフ。+1 :)
アルジュン

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へようこそ!
マーティンエンダー

1
PPCGへようこそ!素敵な最初のゴルフ。頑張ってください!
アルジュン

ありがとう!他の場所でコメント特権を得ることができるように、私のポイントを上げる試みでした。アカウントが異なるポータル用であるように、物事は機能しないようです。:DIは、c ++の優れた機能を使用できるかどうかを確認します。
amritanshu

2

JavaScript 20バイト

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

配列+配列はarray.toStringと等しい


@WheatWizardは歓迎してくれてありがとう。私はこのサイトを初めて利用しました。実際にaは関数の引数です。関数を編集してみましょう。
i--

@WheatWizardで大丈夫だと思います。これに問題がある場合はお知らせください
i--

1
実際にjavaScriptのドキュメントを見ると、匿名関数は間違いなく短くなり、a=>コードの先頭に追加するだけで済みます。
小麦ウィザード

@WheatWizardあなたが言及したように、矢印関数で更新しました。ただし、矢印関数は直接呼び出しをサポートしていないため、スニペットを削除する必要があります。コールバック専用です
-i--

1
これは、カンマを含む文字列を正しく処理しません
Jo King

2

C#、48バイト

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

まだ誰もC#ソリューションを提供していないので、私も投稿すると思いました。提案を歓迎します!


サイトへようこそ。私はしばらくの間C#でプログラミングしていませんが、いくつかの問題があるかもしれません。一つには、どのようにi初期化されますか?そして、それは[["[]"],"[]"]例で動作しますか?
ウィートウィザード

申し訳ありませんが、iは文字列として渡される入力です。空の配列は空の文字列に変換されます。
PmanAce

最後のテストケースはどうですか?また、私はあなたがするつもりだったと思いますi=>$"{i.Replace("[","").Replace("]","")}"ますか?
無知の具現化

悲しいことに最後のケースでは機能せず、空の配列を取り除きます。:(
PmanAce

この答えは最終テストケースに合格しません。数か月間修正されていないため、削除することを決めています。
mbomb007

1

ラケット、63バイト

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

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

クラスにゴルフをかけない:

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

この答えはに基づいています ジェレミー・ハートンのアプローチにます。私はそれをいくつかの場所で変更し、よりゴルフのようなバージョンを作成しました。


"array"でArrays.asList()を使用し、ラムダを使用してforeachを実行し、これをCollectorで終了する場合、それは良くないでしょうか?
Serverfrog

1

JavaScript、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ます。
ワシントンゲデス

これは、カンマが含まれる文字列では機能しません
Jo King


1

アタッシュ、14バイト

{Reap[Sow@>_]}

オンラインでお試しください!

幸いなことに、Attacheには「ベクトル化」演算子があり、リストのアトムに関数を適用します。この場合は、私たちが行う必要があるすべては、と死神設定することですReapし、Sow入力のすべての原子を_@>。とてもエレガントだと思います。

代替案

15バイト: Fixpoint{`'^^_}

16バイト: Fixpoint!&Concat

17バイト: {q:=[]q&Push@>_q}

17バイト: Fixpoint[&Concat]


1

エリクサー、74バイト

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

エリクサーの最初の答えなので、おそらく少しゴルフをすることができます。

オンラインでお試しください。

説明:

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

オンラインでお試しください。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.