リストのリストを悲しいリストに解析する


12

この課題では、リストのリストをより単純なリスト形式に解析する必要があります。

この課題は、私のsadflakパーサーに基づいています。私のsadflakパーサーでは、すべての()が削除され、リストの先頭にある()の合計に置き換えられて、プログラムの実行が速くなります。

Sad-Listに解析するには、これを行う必要があります(Python実装のこと、タプルのタプルを使用します):

def sadlistfunc(list):
    new-sadlist = [0]
    for i in list:
        if i == ():
            new-sadlist[0]+=1
        else:
            new-sadlist.append(sadlistfunc(i))

これは再帰的な関数です。リストの場合、リスト入力からの()の数で始まる新しいリストを開始し、このリストの残りはリスト入力からの()でないすべてのリストの悲しいリストバージョンです。リストを返します。

入力:

いくつかの異なる形式で入力することができます。

  • あなたはそれをリストとして取ることができます
  • あなたはタプルとしてそれを取ることができます
  • あなたはそれを文字列として取ることができます

文字列として使用する場合は、brain-flakに表示されるように、いくつかのブラケットセットを使用する必要があります。文字1と2は使用できません

ただ合理的です

入力は常に1つのリスト内にありますが、プログラムは入力外の暗黙的なリストレイヤー、つまり()()()=(()()())を想定するか、または選択しない場合があります。例は明示的な外部リストを使用します

出力:

リスト、タプル、文字列、その他何でもかまいません。メタコンセンサスと同様に、合理的な出力形式を使用できます。

例:

(()()()) = [3]
(((()))) = [0,[0,[1]]]
((())()(())) = [1, [1], [1]]
() = invalid input, if the outside bracket is explicit.
((((())())())(())()) = [1, [1, [1, [1]]], [1]]

入力は厳密ではないことに注意してください。これらの入力は次のとおりです。

[[],[],[]]
[[[[]]]]
[[[]],[],[[]]]
[]
[[[[[]],[]],[]],[[]],[]]

またはその他の合理的な形式

テストケースの説明:

(()()((())())())

これを「sadify」するには、まず()の数を数えます

 ()()        ()
(    ((())())  )

3.次にこれらを削除し、最初に3を追加します

(3,((())()))

このリストには1つのリストがあります。これを悲しい

((())())

幾つ ()?

     ()
((())  )

1.最初に1を削除して追加します

(1,(()))

これにはリストが1つあります

(())

カウント

 ()
(  )

削除してカウントを追加

(1)

次に、これをリストに戻します

(1,(1))

次に、これをリストに戻します

(3,(1,(1)))

やった

これはなので、短いほど良い


実際のSAD-FLAKパーサーで、()の数は、実際にリストの2番目の項目であり、第1の項目はコマンドの指標であることに注意してください
破壊可能レモン

JavaScriptを使用してfor... in、なぜ使用しないのかを思い出させます:フィドル
スティーブン

する((((())())())(())()) = [1, [1, [1, [1]], [1]]必要があります((((())())())(())()) = [1, [1, [1, [1]]], [1]]
レンゾ

回答:




2

Brachylog、21バイト

;[[]]x{↰₀}ᵐA&{∋∅}ᶜg,A

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


バイトと文字は同等ではありません。UTF-8を使用すると、21文字しかありませんが、33バイトかかります。
サマディ


ああ、分かった。私がして少し混乱します。明確にしてくれてありがとう!
サマディ

@Samadi問題ありません、この質問はいつも聞かれます。
リーキー修道女

2

Mathematica、42バイト

{#~Count~{0},##&@@#~DeleteCases~{0}}&//@#&

ツリー内のすべてのノードに関数をマッピングする//@MapAll)を使用して、明示的な再帰を回避します。これは、関数がリーフから上に向かって実行されることも意味します。ただし、そのプロセス{}に変換される対象にも適用され{0}ます。そのため、{0}代わりにカウントして削除します{}



2

Clojure、59バイト

(fn f[i](conj(map f(remove #{[]}i))(count(filter #{[]}i))))

CommonLispの回答と大差ありません。そのcountremoveビットよりよい構造物を受け入れるように見える、ここで私はセットを使用する必要がありました。


2

実際には、12バイト

;[]@c@;░Q£Mo

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

入力を、明示的な外側のかっこを持つカンマ区切りの角かっこリストとして取得します。

説明:

;[]@c@;░Q£Mo
;[]@c         count the number of empty lists
     @;░      filter out empty lists
        Q£Mo  recurse with filtered list and append result

2

パイソン269の 46 45バイト

f=lambda l:[l.count([])]+map(f,filter(len,l))

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


私はあなたが追加する必要があると思いf=ますが、関数fを使用していることから、あなた:バイトに、それ以外の場合は、それを命名すると、あなたのソリューションを破る
レオ

@レオあなたは正しい。
-ovs

1

ゼリー、10バイト

Tị߀;@ċ“”$

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

入力をリストのリストのリストとして取得します...

もちろん、他の回答が使用するアルゴリズムを使用します。;)


10バイトではありません。10 文字です。バイト数は、使用するエンコーディングによって異なります。
サマディ

2
@Samadiいいえ、Jellyにはデフォルトの専用文字セットがあり、これらの文字をそれぞれ1バイトとして表すことができます。こちらをご覧ください
アダム

そうですか。説明をありがとう!
サマディ

1

Haskell、102バイト

data L=I Int|T[L]deriving Show
(I n:r)#m=r#(n+m)
(x:r)#m=x:r#m
_#m=[I m]
f(T[])=I 1
f(T t)=T$map f t#0

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

Haskellは厳密に型指定されているため、任意にネストされたリストはありません。治療薬としてdata L=I Int|T[L]deriving Show Intsまたは空のリストをリーフとして持つツリー状のネストされたリストを宣言します。

入力は2番目の例の形式のように、T各開き括弧の前に追加のコンストラクターがありますT[T[T[]],T[],T[T[]]]。出力についても同じことが言え、各番号の前にconstructorが付きIます。関数f悲しみを実行しますます。

テストケースの出力:

T [I 3]
T [T [T [I 1],I 0],I 0]
T [T [I 1],T [I 1],I 1]
T [T [T [T [I 1],I 1],I 1],T [I 1],I 1]

1

Javascript(ES6)、77バイト

ゴルフ済み:

let m=a=>!a.length||a.map(m).reduce((b,c)=>(c.length?b.push(c):b[0]++,b),[0])

ゴルフをしていない:

const traverse = arr => !arr.length || arr
    .map(traverse)
    .reduce(
        (accum, val) => (val.length ? accum.push(val) : accum[0]++, accum),
        [0]
    );

デモ

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