教会の数字を視覚化する


9

バックグラウンド

λ計算の用語の視覚化

有名なラムダジャグラー(およびコードゴルファー)ジョントランプは、λ計算の用語の興味深い視覚化を考案しました。彼の言葉では:

抽象化(ラムダ)は水平線で表され、変数はバインディングラムダから下に伸びる垂直線で表され、アプリケーションは左端の変数を接続する水平リンクで表されます。

たとえば、ラムダ項λf.λx.f(f(f(fx)))は視覚化に対応します。

-------------------
 |   |   |   |
-------------------
 |   |   |   |   |
 |   |   |   |----
 |   |   |----
 |   |----
 |----
 |

上から下に読んでください:

  • 最初の水平線は最初のλを表します。
  • それから降順の4本の線はfは、体内のます。
  • 同様に、2番目の水平線は2番目のλを表し、それから降順の1本の新しい線はボディのxを表します。
  • 右端のf線とx線は、アプリケーション(f x)を表す水平線で接続されています。
  • 次のアプリケーションは(f(f x))などです。

教会の数字

教会の数字は、次のパターンに取って、λ計算における用語の特定のシーケンスです:

0 = λf. λx. x
1 = λf. λx. f x
2 = λf. λx. f (f x)
3 = λf. λx. f (f (f x))
...

仕事

入力番号nを指定してn番目の教会の数字を視覚化するASCIIアートを印刷します。たとえば、上記の例は、n = 4を指定した場合のターゲット出力です。以下のため、N = 0、印刷:

---

---
 |
 |

テストケース

あなたの回答を出力しなければならないまさにこのスタックのすべての整数入力のためのスニペットと同じテキスト(モジュロ末尾の改行)のn≥0

これはなので、バイト単位の最も短いコードが優先されます。


スニペットでエラーが発生します。
Leaky Nun、2016年

@LeakyNunどのブラウザ?一部のブラウザはをサポートしていません.repeat
Conor O'Brien

末尾のスペースは許可されますか?
Loovjo 2016

いいえ、末尾の改行のみ。(これはアラナーキーゴルフです。アスキーアートチャレンジのベストルールセットだと思います。)
Lynn

回答:


4

網膜74 67 63バイト

バイト数はISO 8859-1エンコーディングを想定しています。

.
 |  
^
$.'$*----¶
\z
¶$` |
+`(.+\|) .+$
$&¶$1----
$
¶ |
  ¶
¶

入力は単項であり、数字として改行以外の任意の文字を使用します。

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

説明

.
 |  

最初に、各単項数字を | (末尾のスペースに注意)に変換します。これにより、出力の2行目が表示されます(入力が少なくともの場合、2つの末尾スペースが追加されます1)。

^
$.'$*----¶

最初の行を付加するために、文字列の先頭を照合します。これは、一部のRetina固有の置換機能を使用して行われます。$*右側のキャラクターを左側のラゲットメントと同じ回数繰り返します。$.'一致の右側の文字数を評価します。一致は文字列の始まりにすぎないため、文字列-内の文字と同じ数の文字が得られ、---さらに3つ追加されます。改行の別名です。これで、最初の2行が表示されます。

\z
¶$` |

次の2行を追加します。これを行うには、文字列の末尾を照合し、改行と文字列全体を再度追加して |から、4行目を正しいものにします。

+`(.+\|) .+$
$&¶$1----

アプリケーションの時間。リーディング+により、出力が変化しなくなるまでRetinaはこの段階を繰り返します(この場合、正規表現が一致しないため)。正規表現は|、スペースによるフォローが含まれている場合、最後の行全体と一致します。|groupの(最後から2番目になる)までのすべてをキャプチャします1$&改行でラインを書き、次にグループ1(それによって最後のを削除する|)、そして----

$
¶ |

これは、1つだけを含む最後の行を追加するだけ|です。

  ¶
¶

最後に、2行目の末尾のスペースを削除する必要があります。


2

JavaScript(ES6)、112バイト

f=
n=>`${d=`-`.repeat(n*4+3)}
${(b=` |  `.repeat(n)).slice(0,-2)}
${d}
${b} |
${b.replace(/ \|  /g,`$' |----
`)} |`
;
<input id=i type=number min=0 oninput=o.textContent=f(this.value)>
<pre id=o></pre>


すべての改行が必要ですか?また、f=必要ですか?
NoOneIsHere

@NoOneIsHere改行はテンプレート文字列の一部です。f=それが唯一のスニペットのために必要なのは、答えの一部ではなく、バイトの合計の一部としてカウントされません。
Neil

2

Python、201バイト

from pylab import*
n=input()
p=array(list(' -|\n'))
a=zeros((n+5,n*4+4),int)
for k in range(n):l=4*k+5;a[:-k-1,l]=2;a[-k-2,l-3:l+1]=1
a[:,1]=2
a[1,-3]=0
a[0]=a[2]=1
a[:,-1]=3
print''.join(ravel(p[a]))

1

Python 2、138バイト

def f(n,a=1):
 if ~n:b="---\n";c=" |";d="  "+c;print("-"*n*4+b+c*(n>0)+d*(n-1)+"\n"+"-"*n*4+b+c+d*n+"\n")*a+c+d*(n-1)+"-"*4*(n>0);f(n-1,0)

関数には追加のパラメーターが含まれていますが、これは内部でのみ使用されます。これにはデフォルト値があり、関数を呼び出すときに省略してください。これが規則に違反しないことを願っています。

関数は最初の5行を描画してから、それ自体を再帰的に呼び出して残りの行を描画します。

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

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