Chuỗi Quine hai chiều


9

PPCG đã không có đủ số lượng hạn chế ...

Thử thách:

Nhiệm vụ của bạn là tạo một chương trình "A0". Khi chương trình này được chạy mà không có đầu vào, nó sẽ không có kết quả. Khi chương trình này được chạy với đầu vào, nó xuất ra "A1". Khi "A1" được chạy mà không có đầu vào, nó sẽ xuất ra "A0". Khi "A1" được chạy với đầu vào, nó sẽ xuất ra "A2". Khá nhiều, "A (k)" sẽ xuất ra "A (k-1)" khi chạy không có đầu vào và sẽ xuất "A (k + 1)" khi chạy với đầu vào.

Chi tiết

Tôi tin rằng thử thách này là đủ đơn giản; không có quy tắc khác thực sự. Mỗi chương trình phải chứa ít nhất 1 byte. Bạn có thể cho rằng đầu vào sẽ chỉ bao gồm các ký tự ASCII và bạn có thể bỏ qua khoảng trắng nếu muốn, nhưng bạn không thể chỉ định một đầu vào cụ thể. Đầu ra có thể là STDOUT hoặc STDERR, nhưng tất cả các chương trình của bạn phải xuất ra cùng một. Một cái khác cũng có thể chứa văn bản (vì vậy bạn có thể xuất ra STDOUT và sau đó thoát với một lỗi). Cảm ơn @Dennis đã chỉ ra điều đó.

Tất cả các chương trình phải ở cùng một ngôn ngữ và mỗi chương trình phải là duy nhất so với các chương trình còn lại.

Điểm số bằng với độ dài của chương trình "A0". Vì đây là một thử thách golf-code, điểm thấp nhất sẽ thắng!


Tôi rất buồn khi dự đoán rằng hầu hết các bài nộp sẽ có A (k) và A (k + 1) khác nhau bởi một ký tự duy nhất được thêm vào chuỗi đang phát triển :(
Sparr

@Sparr Thật không may, đó có lẽ sẽ là những gì xảy ra. :( Ồ tốt, tôi không thể tìm ra cách đưa ra quy tắc rõ ràng chống lại điều đó.
HyperNeutrino

bạn chỉ có thể xuất ra một trong hai điều tôi không chắc chắn nếu tôi diễn giải điều này một cách chính xác. Nếu chúng ta in đầu ra mong muốn sang STDOUT, STDERR có phải trống không? Bởi vì nó thường được phép thoát ra với một lỗi.
Dennis

Tất cả các chương trình phải khác nhau? Câu hỏi không nói lên điều đó.

4
Ngoài ra, tôi có thể đề xuất một tiêu đề có phần biểu cảm hơn như "Chuỗi Quine hai chiều" không? "Super meta quine" không nói lên nhiều điều ngoài các chương trình in các chương trình khác và sẽ khiến việc tìm kiếm thử thách này trong tương lai khó khăn hơn.
Martin Ender

Câu trả lời:


1

Pip , 28 byte

V Y"I#qSti0+i?`V Y`.RPyRtiu"

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

Giải trình

Đây là phiên bản sửa đổi của quine Pip được biết đến ngắn nhất V Y"`V Y`.RPy". Quine đó hoạt động bằng cách xác định một chuỗi, kéo nó vào ybiến và sau đó đánh giá nó. Khi được đánh giá, chuỗi lấy repr của y(do đó bao bọc giá trị của ydấu ngoặc kép) và nối mẫu chữ theo nghĩa đen `V Y`ở phía trước của nó.

Chiến lược của chúng tôi là đưa một 0chương trình vào, sau đó thay thế 0bằng 10nếu có đầu vào hoặc thay thế 10bằng 0nếu không có đầu vào. (Do đó, A ( k ) sẽ chứa một số bao gồm k 1 theo sau là 0.) 010thuận tiện vì có các biến tích hợp ( it, tương ứng) với các giá trị đó, vì vậy chúng ta có thể tham chiếu đến chúng mà không cần sử dụng các chữ số thực .

Vì vậy, thay vì RPy, chúng tôi muốn RP yRitnếu có đầu vào và RP yRtinếu không. Chúng ta có thể kết hợp hai trường hợp bằng cách hoán đổi các giá trị của tinếu có đầu vào ( I#q Sti), thì thực hiện RP yRti. (Chúng tôi phải kiểm tra #q, độ dài của đầu vào, vì các đầu vào giống như 0falsey.)

Bây giờ chúng ta chỉ cần lấy một chữ 0trong mã và xử lý trường hợp đặc biệt của A0 không tạo ra đầu ra. Cả hai có thể được giải quyết bằng cách thử nghiệm 0+ivà quay lại unếu đó là falsey:

  • Với bất kỳ k > 0, số trong A ( k ) sẽ là số khác và do đó là trung thực (ví dụ 110+i).
  • Với k = 0, số trong A ( k ) sẽ bằng 0:
    • Nếu có đầu vào, itđược hoán đổi và ilà 10. 0+ivẫn còn đúng.
    • Nếu không có đầu vào, ivẫn là 0 và 0+ilà falsey. Thay vì lõi quine, chúng tôi xuất ra u, đó là một biến tích hợp cho nil. In nil không tạo ra đầu ra.

Làm tốt lắm! Hoạt động như một lá bùa.
HyperNeutrino

1

Python 2, 93 byte

Có một linefeed trailing.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

Hãy thử nó với đầu vào | Dùng thử mà không cần nhập liệu

Điều này được sửa đổi từ câu trả lời của tôi cho một câu hỏi tương tự.

Nếu có đầu vào, thì nó sẽ tăng lên p. Vì vậy, chương trình kết quả sẽ là p=2+..., p=3+...vv


Điều này không nhận ra 0 là đầu vào
fəˈnɛtɪk

@LliwTelracs Đầu vào phải được đặt trong dấu ngoặc kép (nó phải là một sting). Xem các siêu liên kết trong câu trả lời.
mbomb007

Như vậy, chương trình của bạn hoạt động với các chuỗi và tất cả các số khác 0.
fəˈnɛtɪk

1
@LliwTelracs Đừng thử sử dụng số. Theo sự đồng thuận, tôi có thể sử dụng input()và yêu cầu đầu vào được bao quanh bởi dấu ngoặc kép, thay vì sử dụng raw_input(). Nếu bạn muốn nhập số không, sử dụng "0".
mbomb007

Giải pháp tốt đẹp! Tôi đã mong đợi hầu hết các câu trả lời sẽ tăng vô hạn về chiều dài (về mặt kỹ thuật thì câu này không nhưng không có nghĩa tương tự). Làm tốt lắm!
HyperNeutrino
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.