Codegolf: Quine và Antiquine


13

Thử thách này tương tự như bạn có thể Meta Quine không?

Một quine là một chương trình tự sản xuất trên STDOUT. Thử thách này là tạo ra một chương trình A mà khi chạy sẽ tạo ra một chương trình B trên STDOUT. Chương trình B khi chạy tạo chương trình A trên STDOUT. Chương trình A và B phải được viết bằng (và chạy) cùng một ngôn ngữ. Câu hỏi được liên kết ràng buộc A! = B. Điều đó có vẻ quá dễ dàng. Vì vậy, đối với câu hỏi này, chúng tôi khẳng định A và B là các cổ vật, sử dụng các quy tắc sau:

  1. Chương trình A và B không được sử dụng bất kỳ ký tự nào giống nhau, lưu cho khoảng trắng và dấu phân cách câu lệnh và ký tự dấu chấm câu.
  2. Mỗi chương trình A và B phải chứa ít nhất một ký tự không phải là khoảng trắng cũng như dấu phân cách câu lệnh, cũng không phải là ký tự dấu chấm câu.
  3. Đối với mục đích của quy tắc 1 và 2, thuật ngữ 'khoảng trắng' không bao gồm bất kỳ ký hiệu hoặc chuỗi ký hiệu nào mà chính nó là một câu lệnh, toán tử hoặc ký hiệu được giải thích (trái ngược với dấu phân cách). Do đó, trong ngôn ngữ Whitespace, không có khoảng trắng.
  4. Dấu phân cách câu lệnh là một thành phần cú pháp thường được sử dụng trong ngôn ngữ để phân tách các câu lệnh. Điều này sẽ bao gồm dòng mới trong python hoặc dấu chấm phẩy trong Java, perl hoặc C.
  5. Ký tự dấu chấm câu là ký tự ASCII không phải là khoảng trắng cũng như trong lớp ký tự từ POSIX (nghĩa là dấu gạch dưới không phải là dấu chấm câu cho mục đích này) - tức là ispunct()sẽ trả về đúng, và không phải vậy _.
  6. Chương trình A khi chạy phải tạo chương trình (Chương trình B) trên STDOUT của nó, khi chạy lần lượt sẽ tạo Chương trình A.
  7. Chương trình A và B phải cùng ngôn ngữ lập trình.
  8. Ngôn ngữ lập trình được sử dụng phải thực sự là ngôn ngữ lập trình. Trừ khi bạn làm một trường hợp tốt nếu không, tôi sẽ đề nghị nó phải hoàn thành Turing.
  9. Ít nhất một trong số A và B phải thực hiện ít nhất một câu trong ngôn ngữ.

Đây là mã golf, vì vậy câu trả lời ngắn nhất sẽ thắng, điểm số là độ dài của chương trình A tính bằng byte (tức là độ dài của chương trình B không liên quan).


Bạn có thể vui lòng thêm "dấu câu" vào danh sách các trường hợp ngoại lệ trong mệnh đề đầu tiên không? Không thể giải quyết nhiệm vụ này bằng nhiều ngôn ngữ (đặc biệt là những ngôn ngữ yêu cầu bạn phải niềng răng trong chức năng chính).
FUZxxl

liên quan nhưng có lẽ đủ khác nhau.
Martin Ender

@FUZxxl Tôi đã cho phép dấu chấm câu nhưng loại trừ dấu gạch dưới.
abligh

1
Đối với các mục đích ở đây, được Aađược coi là "nhân vật" khác nhau?
HostileFork nói không tin tưởng SE

1
Sẽ tốt hơn nếu bạn cung cấp một danh sách đầy đủ các ký tự ASCII khớp với quy tắc 5.
aditsu bỏ vì SE là EVIL

Câu trả lời:


5

GolfScript, 13 byte

1{\~\".~"}.~

Đầu ra là

-2{\~\".~"}.~

tạo ra chương trình ban đầu.

Số lượng byte bao gồm các đường dẫn LF, vì đầu ra của đầu ra sẽ chứa nó.

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

Làm thế nào nó hoạt động

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript in nội dung của ngăn xếp khi chấm dứt.


Vui lòng đọc lại báo cáo vấn đề -Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg

1
Tất cả mọi thứ nhưng 12là dấu chấm câu.
Dennis

OK, các quy tắc đã được thay đổi kể từ lần cuối tôi đọc chúng.
isaacg

Yup, hoạt động. Tôi đã áp dụng các quy tắc để ngăn khoảng trắng được sử dụng làm câu lệnh, nhưng quên lỗ hổng tương tự sẽ xuất hiện để chấm câu. Vì vậy, kẽ hở khai thác hợp pháp.
abligh

14

Pascal (731 ký tự)

Chương trình A:

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

Chương trình đầu ra B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

Chương trình đầu ra A.


3
Tôi đang tận hưởng (mis) sử dụng dịch trường hợp.
abligh

11

ROT13 ( không cạnh tranh nữa sau khi cập nhật quy tắc )

Không chắc đây có phải là ngôn ngữ không, nhưng tôi chắc chắn đã không vượt qua được thử thách. Thông thường câu trả lời cho các tiện ích nhất định như sedđược chấp nhận là tốt. Tuy nhiên, đó là một cuộc gọi phán xét, vì vậy nếu nó không được tính thì tôi sẽ xóa nó (có một cuộc thảo luận meta nào đó được coi là ngôn ngữ không? Chỉnh sửa: Hiện tại )

A

Chu kỳ giữa AN:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A

Tôi nghĩ rằng điều này không hoạt động, vì rot13 chỉ đơn giản là nhập liệu STDIN, không thực hiện chương trình. Nếu bạn cho rằng đó là chương trình có độ dài bằng 0, thì không thỏa mãn quy tắc 2. Chương trình (với sed) là những gì được thông qua sed -e. Nếu điều này được chấp nhận, thì đó catsẽ là một quine, và tacsẽ là một quine và antiquine. Tuy nhiên, không có gì là sản xuất nguồn cat, tachoặc cho vấn đề đó rot13.
abligh

@abligh Nếu rot13 là ngôn ngữ được sử dụng, tại sao tôi phải in mã nguồn cho rot13? Ngoài ra, nếu tôi chạy Golfscript, Python hoặc bất cứ thứ gì khác, tôi có thể sẽ chuyển mã nguồn cho nó thông qua stdin hoặc tệp, vì vậy thực sự không có sự khác biệt nào. Trong trường hợp này rot13 thông dịch viên.
Ingo Bürk

rot13vì ngôn ngữ lập trình dường như không thỏa mãn bất kỳ định nghĩa hợp lý nào về 'ngôn ngữ lập trình' và nó không diễn giải bất cứ điều gì. Tôi sẽ sửa đổi câu hỏi để làm cho rõ ràng hơn.
abligh

Tốt với tôi. Tôi sẽ để lại câu trả lời này vì không thi đấu nữa và bắt đầu một cuộc thảo luận meta. Bằng cách này, thử thách tốt đẹp. Không thể chờ đợi để xem giải pháp "thực sự"!
Ingo Bürk
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.