7 , 31 ký tự, điểm 30, an toàn nhưng có thể bị hỏng?
Một chương trình 7 thường chỉ là một số, nhưng nó có thể chứa khoảng trắng, chia nó thành nhiều số. Do đó, đệ trình này bao gồm hai số (được kết nối ngầm bởi 7 trình thông dịch) và chương trình cũng lấy hai số làm đầu vào, thông qua đầu vào tiêu chuẩn. ("31 ký tự" trong tiêu đề là tổng độ dài của hai số, cộng với một ký tự khoảng trắng phân tách; các chữ số tạo thành các số được hiểu là bát phân khi được sử dụng làm chương trình, nhưng thập phân khi được sử dụng làm đầu vào và Đó là các chữ số giống nhau trong hai trường hợp, không phải là số thực. Lưu ý rằng nó không liên quan khi được coi là chương trình hoặc khi được coi là đầu vào, cho dù bạn tách chúng bằng dấu cách hoặc dòng mới; Tôi hy vọng điều đó không 'không hợp lệ trình.)
Đầu ra dự kiến là số sau (được biểu thị ở đây bằng số thập phân, vì đó là định dạng đầu ra mà 7 trình thông dịch sử dụng):
238363505302130098723162537059
Lưu ý rằng 7 trình thông dịch được liên kết từ wiki Esolang lưu trữ các số một cách đơn nhất, có nghĩa là bạn không có đủ bộ nhớ để thực sự chạy chương trình trên chính nó để xem những gì nó làm. Tôi đã xác minh chương trình thông qua việc xử lý hành vi của nó một cách thủ công và thử nghiệm nó trên các đầu vào nhỏ để xác minh rằng nó đã làm những gì tôi mong đợi. Một cách tiếp cận khác là viết một trình thông dịch sử dụng phương pháp lưu trữ số hiệu quả hơn.
Tránh các vết nứt ở đây là một điều khó khăn, nhưng cuối cùng tôi cũng hài lòng rằng không có hai số nào ngoài số đó trong chính chương trình có khả năng tạo ra 238363505302130098723162537059 làm đầu ra. ( EDIT 1 tuần sau: Tôi có thể đã sai, tùy thuộc vào cách bạn diễn giải câu hỏi; xem bên dưới. )
Giải pháp
Chương trình ban đầu là:
71170237403706
111723603700633
Chương trình này lấy hai số x và y và tính kết quả của biểu thức 3 x y- y- 2 (tức là y( 3 x - 1 ) - 2 ). Nếu chúng tôi thực hiện phép tính này tại x = 711170237403706 và y= 111723603700633 , chúng tôi nhận được kết quả 238363505302130098723162537059 theo yêu cầu .
Dự định rằng không có đầu vào nào khác sẽ cho kết quả mong muốn vì:
Đầu vào phải được chọn sao cho y( 3 x - 1 ) - 2 = 238363505302130098723162537059 , tức là y( 3 x - 1 ) = 238363505302130098723162537061 (thêm 2 vào cả hai bên). Con số này là một nửa năm, chỉ có hai yếu tố: 111723603700633 và 2133510712211117 . Chỉ một trong những số này, 2133510712211117 , có thể được biểu thị dưới dạng 3 x - 1 (cho ( 3 × 711170237403706 ) - 1 = 2133510712211117 ). Vì vậy, chúng ta có thể xác định duy nhất số nào làx và số nào lày , nghĩa là chỉ có một đầu vào hoạt động.
Tuy nhiên, tùy thuộc vào cách bạn diễn giải câu hỏi, có thể có đầu vào thứ hai tạo ra đầu ra mong muốn (do đó làm mất hiệu lực giải pháp này):
Thật không may, có hai phân vùng nhân của một nửa số thành hai yếu tố: một là chia nó thành hai yếu tố chính, nhưng hai là phân vùng tầm thường bao gồm 1 và chính số đó. 1 không thể được viết dưới dạng 3 x - 1 với số nguyên x , nhưng đầu ra mong muốn có thể là; do đó, một meta-crack tiềm năng liên quan đến việc cung cấp đầu vào là 79454501767376699574387512354 và 1 . Tuy nhiên, số đầu tiên ở đây liên quan đến các ký tự ( số 8 và 9) không có trong bộ ký tự cho 7 chương trình. Vì vậy, nếu đầu vào bị hạn chế ở cùng một bộ ký tự với chương trình, giải pháp này là hợp lệ; nhưng nếu đầu vào chứa các ký tự từ bên ngoài bộ ký tự của chương trình được cho phép, giải pháp này không hợp lệ.
Giải trình
Đây là cách các chức năng giải pháp dự định:
711170237403706 111723603700633
7 7 7 Ngăn cách phần tử ngăn xếp
111 023 403706 111723603700633 Các phần tử ngăn xếp ban đầu
111 Số 3, đơn phương
023 DSL I / O cho "nhập số"
403706 111723603700633 Chương trình chính
(Ngụ ý: thực hiện một bản sao của phần tử chương trình chính, giữ nguyên bản gốc)
40 Hoán đổi {023} trên {chương trình}, thoát khỏi nó
3 Làm I / O bằng {023}; pop {chương trình}
0 I / O: số
23 Nhập một số, sao chép {111} nhiều lần
706 Nối "6" vào số (giảm dần)
11 Đẩy hai phần tử ngăn xếp trống
17236 Đẩy phần tử ngăn xếp "23" (không thoát)
0 Escape {23}, tiêu thụ một phần tử trống
3 Làm I / O bằng {23}; pop {phần tử bên dưới}
23 Sao chép đỉnh đầu vào ngăn xếp nhiều lần
7006 Nối "66" (tức là trừ 2)
3 Kết quả {dưới dạng số}
3 Thoát khỏi chương trình (do ngăn xếp thấp)
1
7
0
6
66
12345
3123451234512345