Interquine - Hai chương trình xuất ra một vòng lặp


29

Chương trình A xuất mã của chương trình B khi chạy và B xuất nguồn của A.

Yêu cầu:

  • Chỉ có một ngôn ngữ trên cả hai chương trình
  • Các chương trình là khác nhau. Một chương trình đầu ra không đủ điều kiện.
  • Cả hai chương trình đều không trống hoặc có độ dài ít nhất 1 byte. Trailing newlines trong cả nguồn và đầu ra bị bỏ qua
  • stdin đã đóng cửa. Không đọc bất cứ điều gì (vì vậy bạn không thể đọc nguồn và thao tác với nó). Đầu ra đi đến thiết bị xuất chuẩn.
    Chỉnh sửa: stdin được kết nối với /dev/null. Bạn có thể đặt nó được đóng lại nếu được làm rõ.
  • Không sử dụng randomchức năng.

Bổ sung:

  • Đưa ra lời giải thích nếu có thể

Điểm là tổng chiều dài . Trailing newline không được tính nếu nó không ảnh hưởng đến chương trình.



5
"Không sử dụng các chức năng ngẫu nhiên."? Ý anh là gì? Hàm tạo ra một số ngẫu nhiên?
Ông Xcoder


Tôi khá chắc chắn rằng bạn không thực sự có nghĩa là stdin đã bị đóng cửa. Điều này làm nổ tung một số môi trường khi stdin trở thành một bản sao của tệp được mở đầu tiên. Dù sao, nếu bạn không sửa nó, tôi sẽ lạm dụng nó.
Joshua

Câu trả lời:


18

CJam , 13 + 13 = 26 byte

{sYZe\"_~"}_~

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

Đầu ra

{sZYe\"_~"}_~

Giải trình

{       e# Standard quine framework, leaves a copy of the block on the stack
        e# for the block itself to process.
  s     e# Stringify the block.
  YZe\  e# Swap the characters at indices 2 and 3, which are Y and Z themselves.
  "_~"  e# Push the "_~" to complete the quine.
}_~

e\là giao hoán trong toán hạng thứ hai và thứ ba của nó, chương trình khác thực hiện chính xác như nhau, hoán đổi ZYtrở lại thứ tự ban đầu của chúng.


17

CJam ,11 + 13 = 24 11 + 12 = 23 byte

"N^_p"
N^_p

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

Đầu ra:

"N^_p
"
N^_p

Đầu ra có 13 byte, nhưng:

Trailing newline không được tính nếu nó không ảnh hưởng đến chương trình.

Vì vậy, tôi đã thay đổi không gian sang một dòng mới để tận dụng lợi thế đó.

Nó được dựa trên câu hỏi ngắn gọn nhất của CJam:

"_p"
_p

N^là xor chuỗi với một dòng mới, thêm một dòng mới nếu không có một dòng mới và loại bỏ nó nếu có, cho một chuỗi mà mỗi ký tự là duy nhất.

Tôi nghĩ rằng tôi đã thấy câu hỏi đó trong câu hỏi về câu hỏi, nhưng tôi không thể tìm thấy nó.


+1 vì có hai chương trình có kích thước khác nhau, không giống như tất cả các câu trả lời khác cho đến nay. Chỉnh sửa: ngay khi tôi có thể bỏ phiếu lại .. đã đạt đến giới hạn phiếu bầu cuối cùng>.>
Kevin Cruijssen

Tốt cho sự khác biệt về chiều dài.
iBug

"Tôi nghĩ rằng tôi đã thấy câu hỏi đó trong câu hỏi về câu hỏi, nhưng tôi không thể tìm thấy nó." Nó chỉ được đề cập trong câu trả lời GolfScript.
Martin Ender

12

RProgN 2 , 3 + 3 = 6 byte

Chương trình đầu tiên:

0
1

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

Chương trình thứ hai:

1
0

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

-2 cảm ơn Martin Ender .


7
Bạn có thể lưu hai byte bằng cách chuyển đổi ngôn ngữ: tio.run/##Kyooyk/P0zX6/9@Ay/D/fwA
Martin Ender

@MartinEnder Ooh đúng Tôi đã quên RProgN 2 thể hiện hành vi như vậy ... btw Tôi không biết nếu nó vẫn còn lỗi.
Erik the Outgolfer

11
Tôi không biết gì về RProgN ngoại trừ hành vi này tồn tại.
Martin Ender

@MartinEnder Tác giả của RProgN tại đây, chỉ cần hỏi nếu bạn cần bất cứ điều gì làm rõ!
ATaco

@ATaco Chà, tôi đã yêu cầu bạn làm rõ downvote nhưng tôi không nghĩ bạn có thể ...
Erik the Outgolfer

6

C, 95 + 95 = 190 byte

Cảm ơn @immibis vì đã lưu 16 * 2 byte!

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

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

Đầu ra:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=0^1;printf(s,34,s,34,i);}

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

Đầu ra nào:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

1
Tại sao không chỉ gọi nó là C luôn, và dựa vào tôi thay đổi để làm cho chương trình khác đi? C ngắn hơn% c
user253751

@immibis Vâng, bạn nói đúng, điều đó đủ hoàn hảo.
Steadybox

5

Javascript, 67 + 67 = 134 byte

Chương trình 1:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=0))

Chương trình thứ 2:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=1))

Điều này dựa trên câu trả lời của Herman Lauenstein cho Tri-interquine

Javascript (Mã nguồn đọc không hợp lệ), 75 + 75 = 150 61 + 61 = 122 58 + 58 = 116 50 + 50 = 100 byte

đã lưu 20 byte nhờ Tushar, 6 byte nhờ Craig Ayre và lưu 16 byte nhờ kamoroso94

Chương trình 1:

f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f()

Chương trình thứ 2:

f=_=>alert(("f="+f).replace(1,a=>+!+a)+";f()");f()

Hoán đổi 1s bằng 0 và ngược lại. Cả hai đều làm điều tương tự, chỉ tạo ra đầu ra khác nhau vì mã nguồn của họ.


1
Hãy lưu vài byte. f.toString()=> (''+f), (0|1)=> 0|1, (a,b)=> akết quả làf=()=>("f="+(''+f).replace(/0|1/g,a=>a==0?1:0)+";f()");f()
Tushar

Bạn có thể sử dụng một tham số không sử dụng để lưu một vài byte f=_=>và xóa parens khỏi cuộc gọi lại thay thế như @Tushar đề xuất:a=>+!+a
Craig Ayre

Thay thế "f="+(f+"")bằng ("f="+f)-3 byte.
kamoroso94

Thay thế /0|1/g/1|0/gbằng 01tương ứng cho -5 byte.
kamoroso94

Bạn đã chạy nó? Nó hoạt động như thế này f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f().
kamoroso94

4

Python 2, 63 + 63 = 126 byte

Dùng thử trực tuyến

Chương trình đầu tiên:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]

đầu ra:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

Chương trình thứ hai:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

Đầu ra:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]

4

JavaScript ( JsShell ), 35 + 34 = 69 byte

1:

(f=x=>print(`(f=${f})(${-x})`))(-1)

2:

(f=x=>print(`(f=${f})(${-x})`))(1)

3

Toán học, 43 + 44 = 87 byte

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -1 1]

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -(-1)]

Đã thử nó trên máy tính của tôi và đầu ra của cái thứ hai chỉ có -1ở cuối, không -1 1.
numbermaniac

@numbermaniac Tôi đã viết các mã này trong giao diện dựa trên văn bản. Có vẻ như họ không làm việc trong máy tính xách tay.
alephalpha

3

asmutils sh, 16 + 16 byte, lạm dụng quy tắc "stdin bị đóng".

#!/bin/sh
tr x y

Vì stdin đã bị đóng và sh sẽ mở tập lệnh của nó sang tay cầm có sẵn đầu tiên (thay vì chuyển nó sang tay cầm có số lượng cao như shell hiện đại), tr kết thúc việc đọc từ một bản sao của tập lệnh mà chưa bao giờ mở nó.

Câu hỏi này có khả năng tải trọng nhưng việc chèn một tải trọng là khó khăn.

Ngoài ra, phiên bản gốc này lạm dụng một số lỗi điên rồ trong kernel cổ mà tôi đã sử dụng trong những ngày đó. (Tôi không biết hạt nhân đó là gì - tôi đã phát hiện ra sau đó nó cũng có các số chính và số phụ khác nhau cho các thiết bị.) Nếu bạn khắc phục các thay đổi ABI đã phá vỡ asmutils thì phần truy vấn vẫn không hoạt động. Tôi quên nếu asmutils sh có thực thi hay không, nhưng nếu có, đây là phiên bản hiện đại:

exec dd skip=0 | tr x y

Điều này lạm dụng một lỗi cố ý trong asmutils dd; nó có một tối ưu hóa hiệu suất, nó gọi llseek để bỏ qua nếu có thể, nhưng để lưu một byte, nó vượt qua SEEK_SET chứ không phải là SEEK_CUR. Điều này dẫn đến rác trên thiết bị xuất chuẩn nhưng lại xuất hiện trên thiết bị xuất chuẩn. Asmutils dd không có tùy chọn để chặn spam stderr.


Điều này sẽ làm việc nếu stdin trong kết nối với /dev/nullthay thế? Dù sao, công việc tốt!
iBug

@iBug: Không. Hoàn toàn phụ thuộc vào stdin đã đóng và thực tế là asmutils sh không liên kết với libc và do đó không kế thừa mã sửa chữa tự động trong libc.
Joshua

Bạn có cần #!/bin/sh?
Máy

@CalculatorFeline: điều đó phụ thuộc vào tính chính xác của định nghĩa của bạn về một cái gì đó khác.
Joshua

Nói chung, shebang không được tính, vì vậy đây sẽ là 6 byte.
Máy


1

Lisp thông thường, 58 ký tự

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

... hoặc 24 ký tự nếu bạn không cho rằng giả định *print-circle*được đặt toàn cầu thành T:

#1=(print '(write '#1#))

Biểu diễn in của mã được đọc dưới dạng cấu trúc tuần hoàn, trong đó #1#trỏ trở lại ô khuyết theo sau #1=. Chúng tôi trích dẫn các chương trình để chúng không được thực thi. Vì *print-circle*là T, REPL rất quan tâm để phát ra các biến đọc như vậy trong khi in; đây là những gì đoạn mã trên in ra và trả về:

#1=(write '(print '#1#)) 

Khi chúng tôi đánh giá mã trên, nó sẽ in:

#1=(print '(write '#1#))

Nếu bạn muốn gắn bó với giá trị mặc định cho *print-circle*, đó là NIL trong triển khai tuân thủ, thì bạn sẽ phải tạm thời biến lại biến:

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

Bên trong cơ thể của LET, chúng tôi in những thứ có chữ *print-circle*T. Vì vậy, chúng tôi có được:

#1=(write
    '(let ((*print-circle* t))
       (print '#1#))
    :circle t) 

Như bạn có thể thấy, chương trình mới không khởi động lại *print-circle*, nhưng vì chúng ta đang sử dụng write, đó là hàm cấp thấp được gọi bởi print, chúng ta có thể truyền các đối số bổ sung như :circle. Mã sau đó hoạt động như mong đợi:

#1=(let ((*print-circle* t))
     (print '(write '#1# :circle t)))

Tuy nhiên, bạn cần thực thi các chương trình trên dưới dạng tập lệnh, không phải trong REPL, bởi vì mặc dù bạn in mọi thứ trong khi chăm sóc các cấu trúc vòng tròn, cả hai writeprintcũng trả về giá trị được in; và trong REPL mặc định, giá trị cũng đang được in, nhưng bên ngoài bối cảnh động *print-circle*là T.


1

> <> , 16 + 16 = 32 byte

":1-}80.r   !#o#

#o#!   r.08}-1:"

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

Điều này hoạt động bằng cách sử dụng một bước nhảy trong chương trình, bước nhảy chương trình đầu tiên sẽ bỏ qua sự đảo ngược của ngăn xếp (nếu nó đảo ngược ngăn xếp thì đó sẽ là một quine). Chương trình thứ hai không bỏ qua điều ngược lại nhưng nó đã bị đảo ngược bởi dòng chảy của chương trình, sau đó nó sẽ tạo ra bản gốc.

Mã này sẽ kết thúc trong một lỗi.


1

RProgN 2 , 7 + 7 = 14 byte

Tôi muốn thử thể hiện cách sử dụng RProgN tốt hơn, thay vì chỉ lạm dụng các đơn đặt hàng in ...

1
«\1\-

và ...

0
«\1\-

Giải thích

1   # Push the constant, 1. (Or 0, depending on the program)

«\1\-
«       # Define a function from this to the matching », in this case there isn't any, so define it from this to the end of the program, then continue processing.
 \      # Flip the defined function under the constant.
  1\-   # Get 1 - Constant.

Bởi vì điều này in chồng lên nhau, hằng số mới được in trước, sau đó phiên bản chuỗi của chức năng được in.

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


1

LOGO , 65 + 66 = 131 byte

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] 1]

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] -1]

1

Python 3, 74 + 74 = 148 byte

a='a=%r;b=%r;print(b%%(b,a))';b='b=%r;a=%r;print(a%%(a,b))';print(b%(b,a))

b='b=%r;a=%r;print(a%%(a,b))';a='a=%r;b=%r;print(b%%(b,a))';print(a%(a,b))

tôi cũng không hiểu


1

> <> , 12 + 12 = 24 byte

'3d*!|o|!-c:

':c-!|o|!*d3

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

Cả hai chương trình đều sử dụng một chuỗi ký tự bằng chữ để thêm mã vào ngăn xếp, sau đó tạo 'lệnh thông qua các phương thức khác nhau. Khi in ngăn xếp, nó sẽ đẩy mã về phía sau, tuy nhiên phần còn 'lại ở phía trước. Có một số biến thể tạo ra '; 3d*, d3*, 00g, :c-Khi kết hợp với 3d*:9-khi kết hợp với 00g.

Một giải pháp quá giống với bài đăng, trong Befunge-98 cho 13 * 2 byte

"2+ck, @,kc+2


0

Javascript (ES6), 36 + 36 = 72 byte

Chương trình 1:

f=n=>('f='+f).replace(/4|5/g,n=>n^1)

Chương trình 2:

f=n=>('f='+f).replace(/5|4/g,n=>n^1)

Các chương trình này hoạt động bằng cách nhân bản chính chúng và thay thế 5bằng 44với5

console.log((
    f=n=>('f='+f).replace(/4|5/g,n=>n^1)
)())
console.log((
    f=n=>('f='+f).replace(/5|4/g,n=>n^1)
)())


2
Vì đây được gắn thẻ quine , đây là những gì thường được coi là "quine gian lận", vì nó đọc nguồn của chính nó. Không chắc chắn quyết định của OP về điều đó là gì, nhưng chúng thường không được phép.
Stephen

0

Klein , 26 24 byte

<:3+@+3<:"

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

Giải trình

Cái này hoạt động giống như Klein Quine của tôi , nơi nó in nguồn ngược theo sau ", cái cuối cùng thoát khỏi điều này bằng cách palindromic, vì vậy tất cả những gì chúng ta cần làm là làm cho nó không bị sờn mà không làm hỏng chức năng của nó. Bằng cách chuyển đổi <:chúng tôi đã có thể làm điều này mà không can thiệp vào chức năng.


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.