TTT: Turing Text Tape
Giới thiệu
Ah, INTERCAL ...
Tôi muốn khuyến khích mọi người dùng thử Trực tuyến , đầu ra văn bản chỉ gây khó khăn.
Theo tài liệu, nó sử dụng "Turing Text Model". Mặc dù là một ... khái niệm thú vị , nhưng việc sử dụng nó cũng thú vị như tự bắn vào chân mình. Và chúng ta phải làm gì với một nhiệm vụ như thế này? Tự động hóa nó.
Mô hình văn bản Turing
Các ký tự mà INTERCAL biết được in trên băng tròn chỉ có thể di chuyển theo chiều dương. Việc in được thực hiện bằng cách chuyển các lệnh di chuyển đầu băng trong một mảng tới READ OUTcâu lệnh. Mỗi ký tự ASCII được viết ở bên trong của băng đó (Bên ngoài có các ký tự cho đầu vào trên đó, duh). Điều này dẫn đến các byte của các ký tự trên băng bị ngược lại. Đầu băng cũng di chuyển ngược lại dọc theo danh sách ký tự, vì vị trí của nó dựa trên mặt ngoài của băng.
Đầu bắt đầu ở vị trí 0.
Bây giờ điều kỳ diệu bắt đầu. Tôi sẽ sử dụng lời giải thích của Truttle1 về cách đạt được đầu ra .
- Thiết lập một mảng với độ dài đầu ra.
- Điền vào các mục trong mảng với các giá trị chuyển động của đầu băng.
- Tìm giá trị ASCII của ký tự hiện tại ở dạng nhị phân
- Đảo ngược nó và chuyển đổi lại một số
n. - Trừ
nvị trí đầu hiện tại và mô đun đi 256 nếu cần, dẫn đến một giá trịr rlà giá trị bạn cần lưu trữ trong mảng- Người đứng đầu bây giờ đã vào vị trí
n.
DO READ OUTmảng.
XIN LƯU Ý
- Mảng được khởi tạo trước với
0, chỉ mục đầu tiên là1 - INTERCAL sử dụng các ký tự ASCII 8 bit mở rộng, do đó độ dài băng là 256.
- Từ 1/3 đến 1/5 của tất cả các dòng phải bắt đầu bằng
PLEASE. Lưu ý rằng trong trường hợp đó, bạn bỏDOchoGIVE UPvàREAD OUT, nhưng không bỏ cho bất kỳ thứ gì khác, như đã thấy trong các ví dụ.
Thử thách
Cho một chuỗi đầu vào, hãy xuất một chương trình INTERCAL hợp lệ in chuỗi đó và kết thúc.
Ví dụ
In "BUZZ"
DO ,1 <- #4
DO ,1 SUB #1 <- #190
DO ,1 SUB #2 <- #152
PLEASE DO ,1 SUB #3 <- #336
DO READ OUT ,1
PLEASE GIVE UP
Khoảng trắng là tùy chọn. Các bản in sau "FIZZ"
DO,1<-#4DO,1SUB#1<-#158DO,1SUB#2<-#208DO,1SUB#3<-#312PLEASEREADOUT,1PLEASEGIVEUP
(Ví dụ bị đánh cắp một cách đáng xấu hổ từ chương trình FizzBuzz của Truttle1 từ video.)
Bạn có thể tìm thấy một triển khai tham chiếu không có ma sói trong python 3 tại đây
Quy tắc
- Không có lỗ hổng tiêu chuẩn
- Đây là mã-gôn , mã ngắn nhất sẽ thắng.
- Bạn có thể mong đợi đầu vào> = 1, chỉ các ký tự ASCII.
- Chương trình không được đưa ra bất kỳ lỗi nào ngoài
ICL774I RANDOM COMPILER BUGvàICL666I COMPILER HAS INDIGESTION. Điều đầu tiên xảy ra ngẫu nhiên, điều thứ hai là C-Intercal hết bộ nhớ và vượt qua không phải là một phần của thử thách
Trả lời
Python 3 , 157 byte
t=i=0
p=o='PLEASE'
for c in input():i+=1;k=int(f'{ord(c):08b}'[::-1],2);o+=i%4//3*p+f'DO,1SUB#{i}<-#{t-k&255}';t=k
print(f'DO,1<-#{i}{o}DOREADOUT,1DOGIVEUP')
Hãy thử nó trực tuyến!
Bản in này \$n+3\$hướng dẫn, trong đó \$\left\lfloor \frac{n+5}{4} \right\rfloor\$lịch sự. Tỷ lệ đó vừa đủ trong \$[1/5, 1/3]\$khoảng thời gian lịch sự cho tất cả \$n \geq 1\$.
-1 byte nhờ Neil.
JavaScript (Node.js) , 156 148 byte
s=>`DO,1<-#${Buffer(s).map(c=>o+=`${i++&&~i&3?'':'PLEASE'}DO,1SUB#${i}<-#`+(p-(g=k=>p=k--&&c>>k&1|g(k)*2)(8)&255),i=p=o=""),i+o}DOREADOUT,1DOGIVEUP`
Hãy thử nó trực tuyến!
Hãy thử đầu ra bằng INTERCAL!
Làm sao?
Đảo ngược bit
Chúng ta sử dụng một hàm đệ quy để đảo ngược các bit của ký tự c .
( g = k => // k = bit position counter
k-- && // decrement k; if it was not 0:
c >> k & 1 // bring the k-th bit of c at position 0 and isolate it
| g(k) // bitwise OR with a recursive call,
* 2 // whose result is doubled
)(8) // initial call with k = 8
Lịch sự
Bắt đầu với i = 0, chúng tôi chèn một câu lệnh lịch sự bất cứ khi nào biểu thức sau là sai:
i++ && ~i & 3
Điều này có nghĩa là chúng tôi chèn một PLEASEký tự được xử lý đầu tiên, và sau đó cứ 4 ký tự bắt đầu bằng ký tự thứ 3.
Cả chỉ dẫn đầu và hai hướng dẫn sau đều không lịch sự. Họ được đánh dấu là Lvà TTtương ứng trong bảng sau.
length | output structure | politeness ratio
--------+--------------------+------------------
1 | LPTT | 1/ 4 = 0.250
2 | LP-TT | 1/ 5 = 0.200 <-- lower bound
3 | LP-PTT | 2/ 6 ≈ 0.333 <-- upper bound
4 | LP-P-TT | 2/ 7 ≈ 0.286
5 | LP-P--TT | 2/ 8 = 0.250
6 | LP-P---TT | 2/ 9 ≈ 0.222
7 | LP-P---PTT | 3/10 = 0.300
8 | LP-P---P-TT | 3/11 ≈ 0.273
9 | LP-P---P--TT | 3/12 = 0.250
10 | LP-P---P---TT | 3/13 ≈ 0.231
11 | LP-P---P---PTT | 4/14 ≈ 0.286
12 | LP-P---P---P-TT | 4/15 ≈ 0.267
13 | LP-P---P---P--TT | 4/16 = 0.250
14 | LP-P---P---P---TT | 4/17 ≈ 0.235
15 | LP-P---P---P---PTT | 5/18 ≈ 0.278
.. | ... | 1/5 < r < 1/3
05AB1E , 77 74 54 byte
Ç₁+₁šb퀨C¥(₁%€‘‚µ,1<-#1€·,1—¨#1<-#ÿ€·‚Ø€Ä,1‘J‘ÿ€·†¿€¾
-20 byte bằng cách chuyển câu trả lời Jelly của @ UninityString , vì vậy hãy đảm bảo ủng hộ anh ấy !!
Kết quả đầu ra với không gian tại #1 DO,1 SUB#, DO READ OUTvà DO GIVE UP.
Hãy thử trực tuyến hoặc xác minh một vài trường hợp thử nghiệm khác .
Hãy thử đầu ra bằng INTERCAL.
Giải trình:
Ç # Convert the (implicit) input-string to a list of codepoint integers
₁+ # Add 256 to each value
₁š # Prepend 256 at the front of the list
b # Convert each value to a binary string
í # Reverse each
۬ # Remove the last digit of each
C # Convert each from binary back to a base-10 integer
¥ # Take the forward differences (deltas) of this list
( # Negate each difference
₁% # Take modulo-256 on each
€ # Map over each integer:
‘‚µ,1<-#1€·,1—¨#1<-#ÿ€·‚Ø€Ä,1‘
# Push dictionary string "PLEASE,1<-#1 DO,1 SUB#1<-#ÿ DO READ OUT",
# where the `ÿ` is automatically filled with the integer
J # Join this list of strings together
‘ÿ€·†¿€¾ # Push string "ÿ DO GIVE UP", where the `y` is filled with the string
# (after which the result is output implicitly)
Xem mẹo 05AB1E này của tôi (phần Làm thế nào để sử dụng từ điển? ) Để hiểu tại sao ‘‚µ,1<-#1€·,1—¨#1<-#ÿ€·‚Ø€Ä,1‘là "PLEASE,1<-#1 DO,1 SUB#1<-#ÿ DO READ OUT"và ‘ÿ€·†¿€¾là "ÿ DO GIVE UP".
Than củi , 90 89 85 byte
DO,1<-#ILθ⊞υ⁰⭆θ⪫⟦×PLEASE⊖﹪κ³DO,1SUB#⊕κ<-#﹪⁻⊟υΣ⊞Oυ⍘⮌◧⍘℅ι !⁸ !²⁵⁶⟧ω”Z1∨?AE₂-πK↷Y:γüD0←✂
Hãy thử nó trực tuyến! Liên kết là phiên bản dài của mã. Giải trình:
DO,1<-#ILθ
In hướng dẫn để đặt độ dài của đầu ra.
⊞υ⁰
Bắt đầu với phần đầu ở vị trí 0. Giá trị thực sự được lưu trữ trong danh sách trống được xác định trước vì chúng ta có thể sửa đổi giá trị của danh sách sau này bằng cách sử dụng các chức năng Pop và PushOperator thay vì phải dùng đến lệnh.
⭆θ⪫⟦...⟧ω
Lặp lại các ký tự và in phần nối của 5 biểu thức cho mỗi ký tự. (Điều này hơi lóng lánh vì phép nối tự động xâu chuỗi hai giá trị số trong danh sách).
×PLEASE⊖﹪κ³
Lịch sự mọi ký tự thứ ba. Ngoài ra còn có một PLEASEở cuối, để tỷ lệ lịch sự là ¹⁄₄, ¹⁄₅, ²⁄₆, ²⁄₇, ²⁄₈, ³⁄₉, ³⁄₁₀, ³⁄₁₁ ... sau đó tỷ lệ lịch sự có xu hướng hướng tới ¹⁄₃.
DO,1SUB#⊕κ<-#
In chỉ mục được đánh số 1 ở đầu lệnh để xuất ra ký tự.
﹪⁻⊟υΣ⊞Oυ⍘⮌◧⍘℅ι !⁸ !²⁵⁶
Tính toán nhị phân đảo ngược của ký tự hiện tại, xuất ra sự khác biệt từ phần đầu và cập nhật phần đầu với nhị phân đảo ngược mới, tất cả trong một biểu thức. Hệ nhị phân được mã hóa bằng cách sử dụng không gian để 0nó có thể dễ dàng được đệm thành 8 bit, cộng với việc sử dụng chuỗi sẽ tránh được các dấu phân cách nếu không sẽ cần thiết.
”Z1∨?AE₂-πK↷Y:γüD0←✂
In hướng dẫn theo sau đã nén để xuất chuỗi và thoát. Việc nén chuỗi có nghĩa là tôi không phải lo lắng về việc tối ưu hóa số lần xuất ra PLEASEnữa.
Python 3 , 128 byte
t=0
for c in input():n=int(f'{ord(c):08b}'[::-1],2);print(f'PLEASE,1<-#1DO,1SUB#1<-#{t-n&255}DOREADOUT,1');t=n
print('DOGIVEUP')
Hãy thử nó trực tuyến!
Tạo ra kết quả tương tự như giải pháp Jelly của tôi, nhưng chỉ là một sửa đổi của giải pháp Python của Lynn.
Ban đầu được sử dụng toán tử "hải mã" của Python 3.8 , nhưng hóa ra nó ngắn hơn không đến 2 byte.
Thạch , 62 59 byte
OŻ+⁹BUṖ€Ḅ_Ɲ%⁹“!![ẓ,ȮFẈẋ⁹⁾V!ĖÐĊnß6ṛ»;;“Œ°þ[ṪȦṄ»Ʋ€;“©⁴Œ½OлŒu
Hãy thử nó trực tuyến!
Sử dụng độ dài mảng là 1 và in nhiều lần để tiết kiệm khi lập chỉ mục, và đặt độ dài thành một dãy lặp đi lặp lại để tiết kiệm theo logic lịch sự: length-element-print tạo thành một đơn vị rất thuận tiện là 3.
Không có nén chuỗi:
OŻ+⁹BUṖ€Ḅ_Ɲ%⁹“please,1<-#1do,1sub#1<-#”;;“doreadout,1”Ʋ€;“dogiveup”Œu
Hãy thử một kết quả trực tuyến!
O Codepoints of input.
Ż Prepend zero,
+⁹ add 256 to each,
B convert each to binary.
U Reverse each,
Ṗ€ remove last element from each,
Ḅ convert from binary.
_Ɲ Subtract all adjacent pairs,
%⁹ and modulo 256.
Ʋ€ Map:
; prepend to the number
“...» "please,1<-#1do,1sub#1<-#",
; append to that
“...» "doreadout,1".
;“...» Append "dogiveup" to the whole result
Œu and uppercase.