교회 숫자를 시각화


9

배경

λ 미적분 용어 시각화

유명한 람다 저글러 (및 코드 골퍼 ) 인 존 트롬 프 (John Tromp) 는 λ 미적분학에서 흥미로운 용어 시각화 를 고안했습니다 . 그의 말로 :

추상화 (람다)는 가로선, 바인딩 람다에서 나오는 세로선에 의한 변수 및 가장 왼쪽에있는 변수를 연결하는 가로 링크에 의한 응용으로 표시됩니다.

예를 들어, λf.λx.f (f (f (fx))) 람다는 시각화에 해당합니다.

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

위에서 아래로 읽으십시오 :

  • 첫 번째 수평선은 첫 번째 λ를 나타냅니다.
  • 그로부터 내려 오는 4 개의 선 은 신체 의 fs를 나타냅니다 .
  • 마찬가지로, 두 번째 수평선은 두 번째 λ를 나타내고 그 아래의 새 줄 은 본문 의 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

@LeakyNun 어떤 브라우저? 일부 브라우저는을 지원하지 않습니다 .repeat.
코너 오브라이언

후행 공백이 허용됩니까?
Loovjo

아니요, 후행 줄 바꿈 만합니다. (이다 라 à 무정부 골프, 나는 그것을위한 최선의 규칙 세트의 기분 아스키 기술의 도전.)

답변:


4

망막 , 74 67 63 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

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

줄 바꿈을 제외한 모든 문자를 숫자로 사용하여 입력이 단항 입니다.

온라인으로 사용해보십시오!

설명

.
 |  

우리는 각 단항 자릿수로 바꾸는 것으로 시작 | 합니다 (후행 공백에주의하십시오). 이것은 우리에게 출력의 두 번째 줄을 제공합니다 (입력이 적어도 경우 두 개의 후행 공백 1).

^
$.'$*----¶

첫 줄을 앞에 추가하기 위해 문자열의 시작 부분을 일치시킵니다. 이것은 일부 Retina 특정 대체 기능을 사용하여 수행됩니다. $*오른쪽의 문자를 왼쪽 arugment만큼 반복합니다. $.'일치하는 오른쪽의 문자 수를 평가합니다. 일치는 문자열의 시작일 뿐이므로 문자열 -에 문자가있는 수 만큼을 제공하고 ---세 개를 더 추가합니다. 는 라인 피드의 별칭입니다. 이제 우리는 처음 두 줄을 얻었습니다.

\z
¶$` |

이제 다음 두 줄을 추가합니다. 문자열의 끝을 일치시키고 줄 바꿈을 추가하고 전체 문자열을 다시 추가 한 다음 |네 번째 줄을 올바르게 가져옵니다.

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

응용 프로그램을위한 시간입니다. 리딩 +은 출력이 변경을 멈출 때까지 Retina가이 단계를 반복하게합니다 (이 경우 정규식이 더 이상 일치하지 않기 때문에). 정규 표현식은 |뒤에 공백이 포함 된 마지막 줄 전체와 일치합니다 . 우리 |는 group에서 (두 번째부터 마지막까지) 모든 것을 캡처 1합니다. 우리는 라인에 다시 쓰기 $&, 다음 그룹 1 (따라서 마지막 떨어지는 라인 피드, |다음) 등을 ----.

$
¶ |

이것은 단지 하나만 포함하는 마지막 줄을 추가합니다 |.

  ¶
¶

마지막으로 두 번째 줄에서 후행 공백을 제거해야합니다.


2

자바 스크립트 (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=필요합니까?
NoOneIsHere6

@NoOneIsHere 개행은 템플릿 문자열의 일부입니다. 는 f=그것이 단지 조각을 위해 필요한 해답의 일부가 아닌, 그리고 바이트 전체의 일부로 간주되지 않습니다.
Neil

2

파이썬, 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

파이썬 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.