明らかにAPLトレインを括弧で囲みます


19

APLでは、trainsと呼ばれる暗黙の関数を作成できます。それらがどのように機能するかは、この課題とは無関係です。関数として使用して、グループ化するさまざまな方法を次に示します。

⍴      -> ⍴
⍴⍴     -> ⍴⍴
⍴⍴⍴    -> ⍴⍴⍴
⍴⍴⍴⍴   -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴  -> ⍴⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴⍴))
...

順序は同じままです。手順は、厳密に3つ以上の関数がある限り、最後の3つの関数が1つの関数にグループ化されることです。ネストされたトレインに出会った場合、先に進む前にまずそれを括弧で囲みます。以下に適用される手順を示します⍴⍴⍴⍴⍴⍴

Step 0: ⍴⍴⍴⍴⍴⍴
There are strictly more than 3 functions, repeat.
Step 1: ⍴⍴⍴(⍴⍴⍴)
There are strictly more than 3 functions, repeat.
Step 2: ⍴(⍴⍴(⍴⍴⍴))
There are 3 or less functions, we're done.

以下に同じ手順を適用し⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴ます:

Step 0: ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴⍴⍴(⍴⍴⍴)
  There are strictly more than 3 functions, repeat.
  We have met a nested train, applying procedure to that first:
    Step 0: ⍴⍴⍴
    There are 3 or less functions, we're done.
  Step 1: ⍴⍴(⍴⍴(⍴⍴⍴))
  There are 3 or less functions, we're done.
Step 1: ⍴⍴⍴(⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴
  There are 3 or less functions, we're done.
Step 2: ⍴⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴))
There are strictly more than 3 functions, repeat.
Step 3: ⍴(⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)))
There are 3 functions or less, we're done.

入力

この課題では、入力が簡素化されます。これは、括弧の選択とは異なる2つの異なる文字を括弧の開閉に使用し、関数に1つの文字を選択できることを意味します。選択する文字は一貫している必要があります。入力は空ではなく、コンテンツのない括弧(つまり())は含まれません。

出力

繰り返しますが、3つの異なる文字を選択できます。2つは括弧、1つは関数です。入力用に選択したものと同じである必要はありませんが、一貫している必要があります。

ルール

  • 入力内の1つの関数のみを囲む括弧がある場合は、出力からそれらを削除する必要があります。出力に不要な括弧を含めることはできません(つまり、1つの関数のみを囲む、または出力全体を囲む)。
  • ソリューションがこの課題に対して有効である限り、ここで使用されるアルゴリズムを実装する必要はありません。
  • 入力および出力は、入力および出力セクションで説明されている形式の文字列です。入力には少なくとも1つの文字が含まれます。
  • 標準の抜け穴の使用は固く禁じられています。
  • これはなので、最短の回答が勝ちます。ただし、これは言語ごとの競争であり、このタスクが他の言語で書かれたコードと比較して長いコードになる言語での回答を奨励するため、受け入れられた回答はありません。

テストケース

ここで使用される()⍴文字はです。選択した文字に置き換える必要があります。

⍴                          -> ⍴
⍴                          -> ⍴
⍴⍴                         -> ⍴⍴
⍴⍴⍴                        -> ⍴⍴⍴
⍴⍴⍴⍴                       -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴            -> ⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴⍴))))))
⍴⍴⍴⍴⍴(⍴⍴⍴)⍴⍴(⍴(⍴⍴⍴)⍴⍴⍴)⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴((⍴⍴⍴)⍴(⍴(⍴(⍴⍴⍴)(⍴⍴⍴))(⍴⍴⍴)))))
(⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)            -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
(⍴⍴⍴)(⍴⍴⍴)⍴⍴⍴              -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
⍴⍴(⍴)⍴⍴                    -> ⍴⍴(⍴⍴⍴)
((⍴⍴))                     -> ⍴⍴
⍴⍴((⍴⍴))⍴⍴                 -> ⍴⍴((⍴⍴)⍴⍴)

このチャレンジはサンドボックスに投稿されました。必要な特権を持っている場合は、サンドボックスの投稿をここで表示できます。


2
FullyClearlyよりも良いタイトルだと思います。
アダム


@Adám私はその参照の答えを期待していましたが、多くの賛成票は得られません;)
エリック・ザ・アウトゴルファー

@Adám タイトルのClearly部分は、不要な括弧を削除する必要があるという事実を指します。完全にあなたが挑戦に答えるときあなたがするべきことです; p
エリックアウトゴルファー

この関数は常にdem等であるというのは本当ですか?
エソランジングフルーツ

回答:


7

APL(Dyalog Classic)71 68 65 63バイト

0{⍵≡⍕⍵:⍵⋄⍬≡⍵:'⍬'1=≢⍵:⍺∇⊃⍵⋄3≥≢⍵:⍺⌽')(',⍣⍺∊1∇¨⍵⋄⍺∇¯3(↓,∘⊂1∇↑)⍵}⍎

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

私はI / Oのために選択した文字は'('')''⍬'

このソリューション自体がAPLトレインです。

入力をネストされた配列- 葉として空の数値ベクトル()を持つツリーであるかのように解析します。

dfn(つまりlambda- { })はツリーを再帰的に走査し、適切に括弧で囲まれた文字列に変換します。左の引数は、必要に応じて現在のレベルに括弧を追加するかどうかを制御します。

dfnは、正しい引数に基づいて次のケースを処理します。

  • すでに文字列(⍵≡⍕⍵)である場合は、それを返します

  • の場合、charを返します'⍬'

  • シングルトンの場合は、さらに深く掘り下げます(再帰呼び出しのシンボルです)

  • 長さが≤3の場合、各アイテムを再帰し()、必要に応じて囲みます

  • それ以外の場合は、3テールを再帰し、3テール以外をすべて追加して、再度再帰します


63文字のように見えますが、ほとんどはUnicodeです。これに対して63バイトを生成する文字エンコーディングは何ですか?UTF8で141バイトにします。
コーリー



@Adámありがとうございます。私は探しましたが、その答えを得るために何を検索すればよいかわかりませんでした。
コリー

3

Python 2224の 208 204バイト

Mr. Xcoderのおかげで-16バイト ovsのおかげで-4バイト

r=str.replace
p='p'
def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l
print r(r(r(r(r(`c(eval(r(r(r(input(),'(p)',p),p,'[],'),')','),')))`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]

オンラインでお試しください!またはすべてのテストケースを試す

コードは、3つの主要なステップに分けられます。
入力をネストされたリストに変換し、置き換え(p)->pます。単一の関数pは空のリストに置き換えられます。

eval(r(r(r(input(),'(p)',p),p,'[],'),')','),'))

現在のリストに「3以下」ルールを適用し、すべてのサブリストで自分自身を呼び出す再帰関数。

def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l

目的の出力形式にフォーマットするための多くの置換

r(r(r(r(r(`c(...)`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]


1
これは単純化((pp))(またはp((pp))p)しません。
マーティンエンダー

2

CJam、56バイト

APLを打ち負かす!

lW%~]]]{{_,{K_,({~}|}&}%{_,3>}{3/(aa\+:~}w}:K~~`1>W<W%S/

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

これはうまくいくと思いますが、理由はわかりません...

入力文字は][Tfor ()⍴であり、出力文字は][0forです()⍴(はい、これはあなたが期待するものとは逆であることを意味します;例えば、を渡すかもしれませんTTT]TT[T]TTTT]TTT[[TT)。

高レベルの概要

このプログラムは入力が逆方向に機能するため、より便利です。入力を解析するには、CJamのパーサーを活用します。入力を反転して実行すると、入力の(後方)解析形式が提供されます。

次に、手順を定義しますKK提出のためにほとんどの作業を行い、次のように機能します。

  • 入力配列は、ゼロと空でないサブ配列の混合になります。サブアレイを特定し、再帰的に適用Kします。結果は別の配列になり、この配列が単一の要素のみで構成されている場合は、それをアンパックします(これにより、余分な括弧が削除されます)。
  • 結果に3つ以上の要素がある限り、最初の3つ(最後の3つではなく、入力が逆方向に処理されていることを思い出してください)を1つのリストにグループ化します。
  • 結果を返します。

K入力に適用することで、適切に括弧で囲まれた形式の入力を取得します(注意すべき唯一のことは、実際にシングルトンリストで入力をラップし、その後アンラップすることです;これは、シングルトンをアンパックするスニペットが必要なためですサブアレイだけでなく、最上位プログラムに適用します)。その後、結果を得るためにいくつかの最小限のフォーマットを適用するだけです。

ゴルフビットの説明

私が最も誇りに思うゴルフは,、整数と配列の間のチェックを実行するために使用しています。

  • top-of-stackが整数nの場合,、範囲[0..n)を生成します。遭遇する整数はであるため0、これは常に空のリストを提供しますが[]、これは偽です。
  • スタックの最上部が配列の場合、,その長さがかかります。遭遇するすべての配列は空ではないため、これは常に正の整数を与えます。これは真実です。

興味深いかもしれないもう1つのゴルフは、配列の最初の3つの要素をグループ化する方法です。これは、私の「完全な言語インタープリターコードゴルフのチューリング」の提出にやや似てます。CJamには、配列を2つの部分に分割する簡単な方法がありません(元の配列とインデックスをスタックに保持したまま、最初の部分と次に他の部分を切り取ろうとしますが、うまくいきません)ので、代わりに使用するの3/は、配列を3のブロックにグループ化することです。その後、最初の要素をポップし、(配列を2回ラップしaaてから、リストの先頭に追加し直します\+。配列を2回ラップするの:~は、配列の残りの部分もセクションにグループ化しただけなので、でレイヤーを外す必要があるためです。


Nitpick:これは組み込みなしで APLに勝ります。
エリックアウトゴルファー

@EriktheOutgolferまあまあ。
エソランジングフルーツ

0

JavaScript(ES6)、149 146バイト

i='a';f=s=>s==(s=s[R='replace'](/\((\w+)\)/,(q,t)=>(f[q=i+=0]=f(t),q)))&&s==(s=s[R](/(?!^)((a0+|p){3})$/,"($1)"))?s[R](/a0+/g,t=>`(${f[t]})`):f(s)
<textarea cols=80 id=I>ppp(pp)p(pppp(ppp))pp</textarea><br>
<button onclick=O.innerText=f(I.value)>Run</button><br>
<pre id=O></pre>

を使用()pしますが、別の文字を使用する場合はp、最後に向かって変更するだけです。

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