Quine / Error Quine Polyglot

14

Tugas Anda sederhana: Tulis program yang dapat dijalankan dalam dua bahasa. Itu harus quine normal (mencetak kode sumbernya sendiri) dalam bahasa 1, dan harus menjadi quine kesalahan (menghasilkan pesan kesalahan yang identik dengan kode sumbernya sendiri) dalam bahasa 2.

Ini adalah , sehingga pengiriman terpendek yang valid (dalam byte) menang.

Aturan:

  • Bahasa mungkin serupa secara sewenang-wenang. Superset / versi serupa / dialek serupa tidak dianulir.
  • Aturan kueri kesalahan sama dengan yang ada di Buat Kueri Kesalahan! .
Buah Esolanging
sumber
Terkait , dan Terkait .
Buah Esolanging
Apakah dua dialek berbeda dari BASIC diperbolehkan?
MD XF
@ MDXF Jika mereka memiliki perilaku yang sama persis kecuali bahwa satu output ke STDERR sebagai gantinya, maka tidak ada. Kalau tidak, ya.
Buah Esolanging
Jadi jawaban saya valid.
MD XF
@ MDXF Itu valid.
Buah Esolanging

Jawaban:

2

Befunge-93 (FBBI) / C (tcc) , 93 + 62 = 155 byte

^"
>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p:1: error: declaration expected

Cobalah online !: Befunge-93 , C

Terima kasih kepada randomdude999 untuk mencatat bahwa nama file memerlukan kutipan yang cocok untuk bekerja.

Harus disimpan di bawah nama file ^"\n>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p, di mana \nbaris baru. Karena itu, TIO untuk C tidak berjalan persis seperti yang dimaksudkan. Diuji untuk bekerja di Lubuntu.

Penjelasan (C):

Program gagal dikompilasi, dan tcc dengan senang hati mengeluarkan nama file sebagai bagian dari pesan kesalahannya. Ada beberapa kesalahan kompilasi yang bisa Anda dapatkan, berdasarkan pada awal kode. ^pada awalnya memberi kita declaration expected, yang pendek dan tidak mengandung karakter bermasalah seperti ". Di sisi lain, pengembang gcc dan dentang sangat pesimis dan mereka memilih untuk menghasilkan beberapa kesalahan sekaligus, yang tidak terlalu baik, jadi kami tidak menggunakan kompiler mereka.

Penjelasan (Befunge-93):

Befunge nyaman untuk quines karena kodenya juga dapat digunakan sebagai data karakter, berkat "perintah, yang mengubah mode string. Pada awalnya, kami melakukan beberapa operasi stack yang tidak berguna, kemudian mengeluarkan a p(menempatkan perintah) yang menempatkan karakter NUL di (0, 1). Kemudian kami merefleksikan penunjuk instruksi ke kiri dan mulai membaca semuanya sebagai string. Ini harus dilakukan ke kiri, karena sifat LIFO stack. Setelah membungkus dan mencapai "karakter lagi, string berakhir. Perhatikan bahwa karakter NUL menggantikan$karakter, membuat pembatas di tengah-tengah string. Kami kemudian mendorong 3 angka ke stack dan melompati NUL (karena sayangnya hang interpreter ketika dijalankan sebagai instruksi). Bagian statis dari pesan kesalahan harus dieksekusi di sini. Sebagian besar karakternya adalah no-ops, tetapi pperintah tersebut menggunakan tiga argumen (maka dari itu kami mendorong 3 angka, jika tidak, bagian dari string akan dimakan di sini), dan :& 1karakter mendorong total 4 nilai ke stack, yang kami lawan dengan instruksi a pdan $(pop and discard). Kemudian, beberapa aritmatika dilakukan untuk mendorong kode ASCII ^"\n>#001p#"dan akhirnya sebuah loop mencetak semua nilai pada stack sebagai karakter hingga menemukan karakter NUL dan berakhir.

negatif tujuh
sumber
Anda perlu menemukan OS yang mendukung nama file seperti itu dan mendaftar. Saya tahu Windows tidak mendukung itu.
mbomb007
@ mbomb007 Seharusnya, Linux biasanya akan menerima karakter yang dapat dicetak dalam nama file kecuali untuk /. Saya tidak bisa mengujinya sendiri sekarang.
negatif tujuh
1
Versi tcc apa yang Anda gunakan? Saya menggunakan 0.9.27-3 langsung dari Arch repos, dan kesalahan yang saya dapatkan adalah <define>:1: error: missing terminating " character.
randomdude999
1
Baiklah, saya menemukan versi persis tcc yang digunakan pada TIO, dan saya mendapat pesan kesalahan yang sama, tetapi hanya jika kutipan dari nama file cocok. Memiliki tanda kutip yang tak tertandingi tampaknya cukup diperlukan agar fungsi ini berfungsi. Berikut ini sesuatu yang dapat membantu Anda: Linux juga memungkinkan baris baru dalam nama file. Ini adalah output tcc saat menambahkan baris baru dan kutipan di akhir nama file: (tautan panjang) . Ini berarti Anda harus menemukan cara untuk mencetak baris baru dan hal-hal lain pada baris kedua.
randomdude999
@ randomdude999 Terima kasih. Saya telah memperbarui solusi untuk akun ini. Cukup menarik memang bahwa kutipan yang tak tertandingi menyebabkan masalah seperti itu ...
negatif tujuh
0

Applesoft BASIC / Commodore LCD BASIC , 13 byte

?SYNTAX ERROR

Di Apple] [emulator, tekan RESETtombol untuk masuk ke mode BASIC.
Dalam emulator LCD Commodore, tekan RightArrowEnteruntuk masuk ke aplikasi BASIC.
Di keduanya, jangan mengetikkan ?SYNTAX ERRORsemua huruf besar, karena huruf besar secara otomatis.

MD XF
sumber
2
status yang tidak bersaing diperuntukkan bagi pengiriman dalam bahasa yang dibuat setelah tantangan. Jika tidak valid sesuai aturan, hapus saja. Tunggu konfirmasi OP dulu karena saya pikir ini harus valid (dengan asumsi itu berfungsi).
HyperNeutrino
@HyperNeutrino Terima kasih, diedit.
MD XF
1
Akan curiga yang ini juga, kalau begitu. Pertanyaan ini agak lebih brutal daripada yang terlihat ...
Ørjan Johansen
1
@ ØrjanJohansen Yah, saya tidak begitu yakin tentang yang satu ini. Secara teknis, Commore LCD tidak memiliki stream byte error standar, jadi apakah ini benar-benar quine kesalahan?
MD XF
1
@ ØrjanJohansen ini ? Saya kira itu bisa berarti tidak mungkin untuk mengatakan apakah ini valid atau tidak. Kita bisa menunggu konfirmasi dari OP?
MD XF