Gian lận Cyclic Quine


19

Khái niệm

Viết chương trình xuất mã bằng ngôn ngữ lập trình của nó. Mã đó, khi được thực thi, phải xuất chương trình gốc.

Quy tắc

  • Vì đây là một mánh khóe gian lận, bạn có thể đọc mã nguồn gốc.
  • Chương trình đầu ra đầu tiên phải cùng ngôn ngữ với chương trình gốc.
  • Bạn không thể xuất ra một quine thông thường. Hai chương trình phải khác nhau.
  • Tiêu chuẩn áp dụng.
  • Đây là nên câu trả lời ngắn nhất sẽ thắng, tuy nhiên nó sẽ không được chọn.

Tôi vẫn không hoàn toàn chắc chắn cái gì tạo thành một nửa bán.
Conor O'Brien

@ ConorO'Brien Nó tạo ra một chương trình xuất ra chương trình gốc
dkudriavtsev

1
Tôi hiểu rồi. Các từ ngữ khá mơ hồ.
Conor O'Brien

2
Tại sao câu trả lời ngắn nhất sẽ không được chọn? Đây có phải là một danh mục?
ATaco

1
Chỉ để ghi lại, tôi sẽ gọi nó là một câu hỏi chung (thách thức đó đòi hỏi các ngôn ngữ khác nhau ).
Martin Ender

Câu trả lời:


28

Bash + coreutils, 11 byte

tr xy yx<$0

Bản in này

tr yx xy<$0

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

Đổi lại, bản in đó

tr xy yx<$0

1
Không phải là một mánh gian lận và trong một ngôn ngữ chung.
denson

8
Tôi nghĩ rằng trlệnh được chuyển hướng đến $0đó là mã nguồn riêng của nó. Vì vậy, nó là "gian lận".
Roman Gräf

21

Ốc, 0 byte



Chương trình thứ hai là

1

Chương trình đầu tiên đếm số lượng khớp của mẫu trống trên đầu vào trống (thực sự có vùng 0, nhưng mẫu luôn được chạy ít nhất một lần dưới dạng hack để cho phép các chương trình quyết định những gì chúng muốn in trên đầu vào trống). Chương trình thứ hai bắt đầu với một bộ định lượng (như {1}trong regex), gây ra lỗi phân tích cú pháp. Vì chương trình không phân tích thành công, STDOUT là chuỗi rỗng.


Tôi nghĩ rằng có lẽ có một ngôn ngữ đã làm điều này (tức là chương trình null thành công với kết quả không trống, nhưng kết quả đó không làm gì như một chương trình). Tôi đã thử HOMESPRING nhưng không thể làm cho trình thông dịch làm việc. Có vẻ như bạn đã tìm thấy một ngôn ngữ khác, nơi nó hoạt động, mặc dù. (Bạn có liên kết đến một thông dịch viên không?)


20

7 , 2 byte

7 sử dụng bộ ký tự 3 bit, nhưng lấy đầu vào được đóng gói thành byte (và theo meta, các ngôn ngữ có bộ ký tự byte phụ được tính bằng byte cho tệp trên đĩa ). Đây là một xxdbãi chứa chương trình:

00000000: 4cf4                                     L.

Khi đưa tệp này cho 7 trình thông dịch, nó sẽ xuất chương trình sau:

00000000: 4fa6 7f                                  O..

mà sau đó sẽ lần lượt xuất chương trình gốc một lần nữa.

Vậy chuyện gì đang xảy ra ở đây? Không có việc đọc nguồn liên quan (thực ra, tôi không nghĩ có thể đọc nguồn trong 7), mặc dù có thể cho rằng chương trình này gian lận theo một cách khác; cho tôi biết bạn nghĩ gì. Đây là cách chương trình hoạt động. (Lưu ý rằng mỗi lệnh 7 có hai biến thể, một số biến thể không có tên và không thể xuất hiện trong chương trình gốc. Có tổng cộng mười hai lệnh, trong sáu cặp. Tôi đang sử dụng đậm cho các lệnh đang hoạt động, không được gọi là bị động các lệnh và trong trường hợp lệnh hoạt động không có tên, tôi đặt cho nó cùng tên với lệnh thụ động tương ứng và dựa vào chữ in đậm để phân biệt. Trong trường hợp cả hai được đặt tên, ví dụ: 7đó là biến thể hoạt động của 1, mỗi lệnh có tên riêng và đậm chỉ là tô sáng cú pháp.)

231 7 23 Chương trình gốc, giải nén thành bát phân
Đẩy đẩy 237 lên ngăn xếp
    23 Đẩy 23 lên ngăn xếp
             (ngầm) nối một bản sao của đỉnh ngăn xếp vào chương trình
      2       Sao chép đỉnh của ngăn xếp (hiện tại là 23 )
        3      Đầu ra của ngăn xếp, phần tử ngăn xếp thứ hai pop

Tại thời điểm này, 7 trình thông dịch thấy rằng đỉnh ngăn xếp chứa các lệnh ( 23) không thể biểu thị được, vì vậy nó thoát khỏi đỉnh ngăn xếp, tạo ra 723(đó là). Đầu ra lệnh đầu tiên chọn định dạng đầu ra; trong trường hợp này, nó là định dạng 7, "định dạng đầu ra giống như chương trình". Vì vậy, các lệnh được đầu ra đóng gói thành byte. Sau đó, chương trình tiếp tục:

231 7 23 23
             (ngầm) nối một bản sao của đỉnh ngăn xếp vào chương trình
        2     Sao chép đỉnh của ngăn xếp (hiện tại là 237 )
          3    Đầu ra của ngăn xếp, bật phần tử ngăn xếp thứ hai
           7   Đẩy một phần tử trống lên ngăn xếp

Tại thời điểm này, không có gì ngoài các phần tử ngăn xếp trống trên ngăn xếp, vì vậy chương trình sẽ thoát. Chúng tôi đầu ra 23sớm hơn. Nếu chúng ta thoát 237(và chúng ta phải, bởi vì nó chứa các lệnh không thể diễn tả được), chúng ta sẽ nhận được 7231. Điều đó nhận đầu ra trực tiếp, làm cho đầu ra cuối cùng của chương trình 237231(được định dạng giống như chương trình, nghĩa là được đóng gói thành byte). Đó là 4fa67f. (Có thể lưu ý rằng điều 1này hoàn toàn vô nghĩa về mặt ảnh hưởng đến đầu ra; lý do duy nhất là nó làm cho hai chương trình khác nhau.)

Chạy 237231tiến hành gần như chính xác cùng một cách; sự khác biệt là phần vô dụng 1chạy ngay sau lần in đầu tiên (và phần tử trống sẽ bị xóa hoàn toàn lần thứ hai khi kết thúc chương trình hiện tại đạt được). Một lần nữa, 231kết thúc xuất ra chính nó, 23kết thúc xuất ra trước một 7, và chúng tôi nhận được 231723, chương trình ban đầu.

Người quan sát có thể lưu ý rằng hai chương trình, mặc dù có cùng độ dài trong bát phân "bản địa" của ngôn ngữ, có độ dài khác nhau trên đĩa. Đó là bởi vì một chương trình 7 có thể được đệm với số lượng 1 bit tùy ý và định dạng được đóng gói sẽ loại bỏ phần đệm. Đây là cách mã hóa xảy ra:

2  3  1  7  2  3
010011001111010011(1...)
4   c   f   4   padding

Nói cách khác, hai byte, 4C F4là đủ để đại diện cho chương trình, vì vậy đó là tất cả những gì tôi sử dụng.


11

Python 3, 297 279 251 243 225 218 208 180 126 111 byte

Không gian lận:

A=''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))

Bản in này:

B=''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))

trong đó, khi được thực thi, in chương trình gốc.


Ồ Mát mẻ! Tôi chưa bao giờ nghĩ về điều đó.
dkudriavtsev

8

Mẻ, 14 byte

@echo @type %0

Mà khi chạy như cyclicquine.batđầu ra

@type cyclicquine.bat

Mà khi chạy đầu ra tập tin lô gốc.


8

RProgN , 4 byte.

Cộng đồng dường như coi loại chuyện này là một trò lừa bịp , do đó đáp ứng các tiêu chí.

1
2

Với một dòng mới.

Bản in này

2
1

Với một dòng mới, trong đó in mã đầu tiên.

RProgN in ngăn xếp popping, do đó từ trên xuống dưới.

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


Có một cuộc thảo luận trò chuyện một thời gian trước ngụ ý rằng 1\n1\ntrong RProgN sẽ là một câu hỏi không gian lận, bởi vì mỗi số 1 in lẫn nhau (và nó chỉ được coi là gian lận nếu mỗi 1 bản in). Tất cả điều này thực sự ngụ ý là đôi khi gian lận trong quines có thể khó xác định. (Tuy nhiên, câu trả lời này cũng đúng, bởi vì câu hỏi không thực sự yêu cầu câu hỏi gian lận, chỉ cho phép nó.)

Ngoài ra, mặc dù tôi không muốn nói, trong RProgN 1\nvề mặt kỹ thuật là một câu hỏi hợp lệ, 1không phải là một hằng số, mà là một cuộc gọi đến một chức năng đẩy 1đến ngăn xếp.
ATaco

Có nhiều định nghĩa về một quine thích hợp được sử dụng. Điều đó không hợp lệ bởi ít nhất một, nhưng có thể hợp lệ bởi một số người khác.

@ ais523 Bạn đã khơi dậy sự tò mò của tôi, Bạn đã chỉ định RProgN, nhưng tôi không nghĩ rằng ngôn ngữ nhỏ của tôi có được sự chú ý (hoặc bất kỳ) nào. Là cuộc trò chuyện về RProgN nói riêng, hoặc một ngôn ngữ có cú pháp tương tự?
ATaco

Đó là khoảng 7 , cũng có xu hướng in các phân đoạn của chương trình "ngược". Tôi đã ngoại suy từ các ý kiến ​​được đưa ra ở đó.

6

Jolf, 6 byte

1q_a_q

Khi chạy, kết quả này xuất ra:

q_a_q1

Mà lần lượt đầu ra 1q_a_q.

Hãy thử nó ở đây!

Giải trình

1q_a_q
1       the digit one (ignored)
 q      the source code (ignored)
     q  the source code
    _   reversed
   a    and outputted
 _      and reversed (ignored)

q_a_q1
q       the source code (ignored)
     1  the digit one (ignored)
    q   the source code
   _    reversed
  a     and outputted
 _      and reversed (ignored)

5

JavaScript (ES6), 69 60 59 byte

(_0=_=>console.log(`(_0=${_0})()`.replace(/0/g,n=>+!+n)))()

Đầu ra:

(_1=_=>console.log(`(_1=${_1})()`.replace(/1/g,n=>+!+n)))()

-1 byte (@ETH sản phẩm): sử dụng 0 trong regex thay vì \ d


Hãy thử n=>1-nthay vì n=>+!+n.
Conor O'Brien

@Conner O'Brien Thật không may, 1cuối cùng sẽ được thay thế bằng regex.
darrylyeo

@ETHproductions Heh, tôi nên nghĩ về điều đó.
darrylyeo


3

Bash, Cat và Rev, 19 16 byte

rev $0 # 0$  ver

-3 cảm ơn @izabera


Điều này sẽ không được Bash, Tac, và `Rev?
Conor O'Brien

rev $0 # 0$<space><space>vervì một số lý do tôi không thể đặt hai khoảng trắng trong một nhận xét
izabera

Ồ, thật tuyệt @izabera
NoOneIsHere

@ ConorO'Brien Không, tac rev-ed là cat.
NoOneIsHãy

@SeeOneRhino Oh .... Tôi hiểu rồi
Conor O'Brien

1

> <>, 16 byte

"$r00gol?!;50.01

Hãy thử nó ở đây!

Đầu ra

"$r00gol?!;50.10

Đây là một sửa đổi của một trong những cung cấp ở đây . Tôi không chắc nếu nó gian lận, nó đọc codebox và xuất ra nó.


1
bạn có thể thay đổi 00g thành: 2- và nó sẽ giữ nguyên số byte mà không cần đọc mã.
Teal pelican

@Tealpelican, cảm ơn! Mục tiêu là để nó được coi là "gian lận" mặc dù: p. (Và tôi không hoàn toàn hiểu quy tắc đó)
redstarcoder
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.