Codegolf: Quine and Antiquine

13

Tantangan ini mirip dengan Can You Meta Quine?

Quine adalah program yang menghasilkan dirinya sendiri di STDOUT. Tantangan ini adalah untuk menghasilkan program A yang ketika dijalankan menghasilkan program B pada STDOUT. Program B saat dijalankan menghasilkan program A pada STDOUT. Program A dan B harus ditulis dalam (dan dijalankan dalam) bahasa yang sama. Pertanyaan terkait membatasi A! = B. Itu terlihat terlalu mudah. Jadi untuk pertanyaan ini, kami bersikeras bahwa A dan B adalah barang antik, menggunakan aturan berikut:

  1. Program A dan B tidak boleh menggunakan karakter yang sama, simpan untuk spasi putih dan pemisah pernyataan, dan karakter tanda baca.
  2. Program A dan B masing-masing harus mengandung setidaknya satu karakter yang bukan spasi putih atau pemisah pernyataan, atau karakter tanda baca.
  3. Untuk keperluan aturan 1 dan 2, istilah 'spasi putih' tidak termasuk simbol atau urutan simbol yang dengan sendirinya merupakan pernyataan, operator atau simbol yang ditafsirkan (sebagai lawan dari pemisah). Oleh karena itu dalam bahasa Whitespace, tidak ada spasi putih.
  4. Pemisah pernyataan adalah elemen sintaksis yang secara konvensional digunakan dalam bahasa untuk memisahkan pernyataan. Ini akan termasuk baris baru dalam python, atau titik koma di Jawa, perl atau C.
  5. Karakter tanda baca adalah karakter ASCII yang bukan spasi putih atau dalam kelas karakter kata POSIX (yaitu garis bawah bukan tanda baca untuk tujuan ini) - yaitu ispunct()akan mengembalikan true, dan bukan _.
  6. Program A ketika dijalankan harus menghasilkan program (Program B) pada STDOUT-nya, yang ketika dijalankan pada gilirannya menghasilkan Program A.
  7. Program A dan B harus dalam bahasa pemrograman yang sama.
  8. Bahasa pemrograman yang digunakan harus benar-benar bahasa pemrograman. Kecuali Anda membuat kasus yang baik sebaliknya, saya akan menyarankan itu harus Turing lengkap.
  9. Setidaknya satu dari A dan B harus menjalankan setidaknya satu pernyataan dalam bahasa tersebut.

Ini adalah kode golf, jadi jawaban tersingkat menang, skor menjadi panjang program A dalam byte (yaitu panjang program B tidak relevan).

abligh
sumber
Bisakah Anda menambahkan "tanda baca" ke daftar pengecualian pada klausa pertama? Tidak mungkin untuk menyelesaikan tugas ini dalam banyak bahasa (terutama bahasa yang mengharuskan Anda membuat kurung kurawal di fungsi utama) jika tidak.
FUZxxl
terkait tetapi mungkin cukup berbeda.
Martin Ender
@FUZxxl Saya telah mengizinkan tanda baca tetapi mengecualikan garis bawah.
Abligh
1
Untuk keperluan di sini, apakah Adan adianggap sebagai "karakter" yang berbeda?
HostileFork bilang jangan percaya SE
1
Akan lebih baik jika Anda memberikan daftar lengkap karakter ASCII yang cocok dengan aturan 5.
aditsu berhenti karena SE adalah EVIL

Jawaban:

5

GolfScript, 13 byte

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

Outputnya adalah

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

yang menghasilkan program awal.

Hitungan byte menyertakan LF yang tertinggal, karena output dari output akan mengandungnya.

Cobalah online.

Bagaimana itu bekerja

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 mencetak konten stack setelah penghentian.

Dennis
sumber
Silakan baca pernyataan masalah lagi -Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg
1
Semuanya kecuali 1dan 2merupakan tanda baca.
Dennis
Oke, aturannya sudah diubah sejak saya terakhir membacanya.
isaacg
Ya, itu berhasil. Saya telah mengutarakan aturan untuk mencegah spasi putih digunakan sebagai pernyataan, tetapi lupa celah yang sama akan hadir untuk tanda baca. Jadi celah dieksploitasi secara hukum.
abligh
14

Pascal (731 karakter)

Program 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.

Output program 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.

Program keluaran A.

Mika Lammi
sumber
3
Saya menikmati penggunaan terjemahan kasus (salah).
abligh
11

ROT13 ( tidak bersaing lagi setelah pembaruan aturan )

Tidak yakin apakah ini dianggap sebagai bahasa, tapi saya jelas tidak menebusnya. Biasanya jawaban untuk utilitas tertentu seperti sedditerima juga. Namun, ini panggilan penilaian, jadi jika tidak masuk hitungan saya akan menghapusnya (adakah diskusi meta di suatu tempat tentang apa yang dianggap sebagai bahasa? Edit: Ada sekarang )

A

Siklus antara Adan N:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A
Ingo Bürk
sumber
Saya pikir ini tidak berhasil, karena rot13 hanya mengambil input STDIN, tidak menjalankan program. Jika Anda berdebat bahwa ini adalah program panjang nol, yang gagal untuk memenuhi aturan 2. Program (dengan sed) adalah apa yang berlalu di sed -e. Jika ini dapat diterima, maka catakan menjadi quine, dan tacakan menjadi quine dan kuno. Namun, tidak ada yang menghasilkan sumber untuk cat, tacatau dalam hal ini rot13.
Abligh
@abligh Jika rot13 adalah bahasa yang digunakan, mengapa saya harus mencetak kode sumber untuk rot13? Juga, jika saya menjalankan Golfscript, Python atau yang lainnya, saya mungkin akan meneruskan kode sumbernya melalui stdin atau file, jadi sebenarnya tidak ada perbedaan. Dalam hal ini rot13 adalah juru bahasa.
Ingo Bürk
rot13sebagai bahasa pemrograman tampaknya tidak memenuhi definisi wajar 'bahasa pemrograman', dan tidak menafsirkan apa pun. Saya akan mengubah pertanyaan untuk membuatnya lebih jelas.
abligh
Baik dengan saya. Saya akan meninggalkan jawaban ini karena tidak bersaing lagi dan memulai diskusi meta. Tantangan yang bagus. Tidak sabar untuk melihat solusi "nyata"!
Ingo Bürk