Hình dung các chữ số của Giáo hội


9

Lý lịch

Trực quan hóa các thuật ngữ-tính toán

John Tromp nổi tiếng (và golfer mã ) John Tromp đã nghĩ ra một hình dung thú vị của các thuật ngữ trong-tính toán. Theo lời anh:

trừu tượng hóa (lambdas) được thể hiện bằng các đường ngang, biến bằng các đường thẳng đứng phát ra từ lambda ràng buộc của chúng và các ứng dụng bằng các liên kết ngang kết nối các biến ngoài cùng bên trái.

Ví dụ: thuật ngữ lambda f.λx.f (f (f (fx))) tương ứng với trực quan hóa:

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

Đọc nó từ trên xuống dưới:

  • Đường ngang đầu tiên đại diện cho đầu tiên.
  • Bốn dòng giảm dần từ nó đại diện cho f s trong cơ thể.
  • Tương tự, đường ngang thứ hai đại diện cho second thứ hai và dòng mới duy nhất giảm dần từ nó đại diện cho x trong cơ thể.
  • Dòng f ngoài cùng bên phải và dòng x được kết nối bằng một đường nằm ngang thể hiện một ứng dụng (f x) .
  • Ứng dụng tiếp theo là (f (f x)) , et cetera.

Chữ số nhà thờ

Các số của Giáo hội là một chuỗi các thuật ngữ cụ thể trong phép tính λ, theo mẫu sau:

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

Bài tập

Cho số đầu vào n , in một số nghệ thuật ASCII trực quan hóa chữ số Church thứ n . Chẳng hạn, ví dụ trên là đầu ra mục tiêu của bạn khi được n = 4 . Với n = 0 , in:

---

---
 |
 |

Các trường hợp thử nghiệm

Câu trả lời của bạn phải xuất chính xác cùng một văn bản (dòng mới theo modulo) vì đoạn mã ngăn xếp này cho tất cả các đầu vào số nguyên n ≥ 0 :

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


Đoạn trích của bạn cho tôi lỗi.
Nữ tu bị rò rỉ

@LeakyNun trình duyệt nào? Một số trình duyệt không hỗ trợ .repeat.
Conor O'Brien

Được dấu không gian cho phép?
Loovjo

Không, chỉ có dòng mới. (Đây là à la golf tình trạng hỗn loạn, và tôi có cảm giác như đó là quy tắc thiết lập tốt nhất cho ascii-nghệ thuật thách thức.)
Lynn

Câu trả lời:


4

Võng mạc , 74 67 63 byte

Số lượng byte giả định mã hóa ISO 8859-1.

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

Đầu vào là đơn nhất , sử dụng bất kỳ ký tự nào ngoại trừ nguồn cấp dưới dạng chữ số.

Hãy thử trực tuyến!

Giải trình

.
 |  

Chúng tôi bắt đầu bằng cách biến từng chữ số unary thành | (lưu ý các dấu cách). Điều này cung cấp cho chúng tôi dòng thứ hai của đầu ra (cộng với hai khoảng trắng ở cuối nếu đầu vào ít nhất 1).

^
$.'$*----¶

Chúng tôi khớp với phần đầu của chuỗi để thêm dòng đầu tiên. Điều này được thực hiện bằng cách sử dụng một số tính năng thay thế dành riêng cho Retina. $*lặp đi lặp lại nhân vật bên phải nhiều lần như bên trái của nó. $.'đánh giá số lượng ký tự bên phải của trận đấu. Vì trận đấu chỉ là phần đầu của chuỗi, điều này mang lại nhiều -như có các ký tự trong chuỗi và ---nối thêm ba chuỗi nữa. Đây là một bí danh cho một nguồn cấp dữ liệu. Vì vậy, bây giờ chúng tôi đã có hai dòng đầu tiên.

\z
¶$` |

Bây giờ chúng tôi nối hai dòng tiếp theo. Chúng tôi thực hiện điều này bằng cách khớp phần cuối của chuỗi và nối thêm một nguồn cấp dữ liệu, toàn bộ chuỗi một lần nữa và sau đó |để có được dòng thứ tư đúng.

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

Thời gian cho các ứng dụng. Việc dẫn đầu +khiến Retina lặp lại giai đoạn này cho đến khi đầu ra ngừng thay đổi (trong trường hợp này vì regex không khớp lâu). Regex khớp với toàn bộ dòng cuối cùng, miễn là nó chứa một khoảng |trắng theo sau. Chúng tôi nắm bắt mọi thứ cho đến |(sẽ là thứ hai cuối cùng) trong nhóm 1. Chúng tôi viết lại dòng với $&, một nguồn cấp dữ liệu, sau đó nhóm 1 (do đó bỏ dòng cuối cùng |) và sau đó ----.

$
¶ |

Điều này chỉ thêm dòng cuối cùng chỉ chứa một |.

  ¶
¶

Cuối cùng, chúng ta cần phải thoát khỏi các dấu cách trên dòng thứ hai.


2

JavaScript (ES6), 112 byte

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>


Có phải tất cả các dòng mới cần thiết? Ngoài ra, có f=cần thiết?
NoOneIsHãy là

@NoOneIsHere Các dòng mới là một phần của chuỗi mẫu. Đây f=không phải là một phần của câu trả lời, nó chỉ cần cho đoạn trích và không được tính là một phần của tổng số byte.
Neil

2

Python, 201 byte

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 byte

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)

Hàm này chứa một tham số phụ, nhưng nó chỉ dành cho sử dụng nội bộ. Nó có một giá trị mặc định và nên được bỏ qua khi gọi hàm. Tôi hy vọng điều này không vi phạm các quy tắc.

Hàm vẽ 5 hàng đầu tiên, sau đó gọi đệ quy chính nó để vẽ các hàng còn lại.

Dùng thử trực tuyến

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.