Anda harus membuat program yang dapat memeriksa sintaks program dengan bahasa yang sama. Misalnya, jika Anda melakukannya dengan python, ia memeriksa sintaks python. Program Anda akan menerima program pada input standar, dan memverifikasi apakah sintaksinya benar atau tidak. Jika benar, output hanya "benar" pada output standar. Jika tidak, output hanya "false" pada output standar.
Program Anda harus salah dalam satu contoh. Jika diberi kode sumbernya sendiri, itu hanya akan menampilkan "false" pada output standar. Ini kode golf, jadi program tersingkat menang!
Catatan: Meskipun ini secara teknis bukan quine, Anda harus mengikuti aturan quine, artinya Anda tidak dapat mengakses kode sumber Anda melalui sistem file atau apa pun.
Catatan: Anda tidak dapat mengklaim program yang tidak dapat dijalankan karena kesalahan sintaksis memecahkan tantangan ini, karena itu harus dapat dijalankan.
try:exec(raw_input())...
diperbolehkan?Jawaban:
Ruby 2.0, 65
76 164karakterIni menggunakan checker sintaks bawaan Ruby (
ruby -c
) untuk memeriksa sintaks input, yang berarti kode tidak akan dievaluasi.Contoh penggunaan dasar:
Penjelasan
Solusi ini didasarkan pada standar Ruby quine:
%p
adalah penentu format untukarg.inspect
, yang dapat dibandingkan denganuneval
: ketikaeval
string dikembalikan oleharg.inspect
, Anda (biasanya) mendapatkan nilai asli lagi. Jadi, ketika memformatq
string dengan dirinya sendiri sebagai argumen, bagian%p
dalam string akan diganti dengan string yang dikutip itu sendiri (yaitu kita mendapatkan sesuatu seperti"q=\"q=%p;puts q%%q\";puts q%q"
).Generalisasi jenis quine ini mengarah ke sesuatu seperti berikut:
Pendekatan ini memiliki satu kelemahan besar (setidaknya dalam kode-golf ): Semua kode harus diduplikasi. Untungnya,
eval
bisa digunakan untuk menyiasati ini:Apa yang terjadi di sini adalah bahwa kode yang dikirimkan ke eval disimpan di dalam
r
sebelumeval
dipanggil. Akibatnya, kode sumber lengkap darieval
pernyataan tersebut dapat diperoleh dengan'eval r=%p'%r
. Jika kita melakukan ini di dalameval
kode d dan memastikan bahwa level teratas dari kita hanya terdiri dari satueval
pernyataan, ekspresi itu benar-benar memberi kita kode sumber penuh dari program kita, karena kode tambahan yang diteruskan keeval
sudah tersimpan di dalamnyar
.Catatan: Pendekatan ini sebenarnya memungkinkan kita untuk menulis Ruby quine dalam 26 karakter:
eval r="puts'eval r=%p'%r"
Sekarang, dalam solusi ini kode tambahan yang dijalankan di dalam
eval
terdiri dari empat pernyataan:Pertama, kami membaca semua input dari STDIN dan secara implisit menyimpannya
$_
.Kemudian, kami memundurkan STDIN sehingga input tersedia lagi untuk subproses yang kami mulai pada langkah berikutnya.
Ini memulai Ruby dalam mode pemeriksaan sintaks bawaannya, membaca kode sumber dari stdin. Jika sintaks skrip yang disediakan (nama file atau stdin) ok, ia mencetak
Syntax OK
ke stdout (yang ditangkap oleh proses induk), tetapi dalam kasus kesalahan sintaks, deskripsi kesalahan dicetak ke stderr - yang akan menjadi terlihat, jadi kami mengarahkan itu ke nirwana (2>&0
) sebagai gantinya.Setelah itu, kami memeriksa kode keluar subproses
$?
, yaitu 0 jika sintaksnya ok. Terakhir, input yang kita baca sebelumnya ($_
) dibandingkan dengan kode sumber kita sendiri (yang, seperti yang saya jelaskan sebelumnya, dapat diperoleh dengan'eval r=%p'%r
).Sunting: Disimpan 14 karakter berkat @ histokrat!
sumber
.write
dengan<<
, dan>>1<1
dengan==0
.==
dalamProcess::Status
dokumen. Terima kasih banyak!Rebol - 69 atau 74
75sepenuhnya mematuhi semua aturanVersi kerja baru berkat @rgchris! Tidak yakin jika yang pertama gagal persyaratan "jangan mengakses sumber" karena penerjemah memegang kode yang dimuat dan diuraikan itu telah diteruskan sebagai parameter garis cmd dalam objek sistem (
system/options/do-arg
) yang digunakan untuk mengenali dirinya sendiri.Ini mengikuti semua aturan:
Contoh penggunaan:
Pertama mencetak bilangan bulat yang valid, yang kedua mencetak bilangan bulat tidak valid.
Versi yang sepenuhnya sesuai:
Penjelasan:
Versi pertama
Ini menggunakan fungsi bawaan Rebols
load
untuk mengurai dan memuat kode dari stdin tetapi tidak menjalankannya.The
try
blok menangkap kesalahan sintaks danerror?
fungsi mengkonversi kesalahan ke boolean sederhana.The
i = system/options/do-arg
membandingkan masukan dari stdin (ditugaskan untuki
) dengan kode lulus padado-arg
argumen (licik tapi sangat golf :).any
adalah fungsi hebat yang mengembalikantrue
jikaany
-hal di blok dievaluasitrue
(misalnya,any [ false false true ]
akan kembalitrue
).not
lalu balikkan boolean untuk memberi kita jawaban yang benar danprobe
menampilkan konten nilai yang dikembalikan.Versi yang sepenuhnya sesuai
Mari kita lalui ini dalam rangka ...
Tetapkan kata
b
ke blok [] yang mengikuti.Gunakan
do
fungsi ini untuk menafsirkando
dialek dib
blok.Di dalam
b
blok ...Atur kata
i
untuk merujuk ke isi stdin (input
).Sekarang,
if
kitajoin
string "do b:" kemold
blok 'edb
dan itu tidak sama (<>
) ke input stdini
kemudian kita coba keload
inputi
.Jika hasilnya adalah
block
maka kami telahload
mengirimkan data yang dikirimkan dengan benar jika tidak kami akan menerimanone
dari yang gagalif
.Gunakan
prin
untuk menampilkan hasilblock?
yang mengembalikan true jika hasilnya adalah blok. Menggunakanprin
sebagai lawanprint
tidak menampilkan carriage return setelah output (dan itu menyimpan kita char lain).sumber
print not error? try[load/all input]
c:[c: compose/only [c: (c)]print not error? try[if c = load/all input[1 / 0]]]
(prin none? attempt[load/all input] halt) 1a
Integer yang tidak valid akan gagal evaluasi sintaksis, tetapi penghentian akan menghentikan kesalahan dalam operasi normalchecksum/secure
program Anda, dan memasukkan hash ke dalam sumber itu sendiri untuk tujuan perbandingan, maka saya ingin mendaftarkan layanan Anda di sindikat kejahatan dunia maya saya. Kecuali itu, mulai dari kode saya, yang berfungsi. :-)do B[pb bl? iu a jn "do B" ml b [try [ld/all a]]]
Javascript -
8682Rekatkan ke konsol Javascript browser Anda untuk menguji.
Penjelasan:
Catatan: @ m.buettner mengemukakan poin bahwa program kembali
true
untuk pernyataan pengembalian telanjang, sepertireturn 0;
. Karena Javascript tidak melempar kesalahan sintaksis untuk pernyataan pengembalian ilegal sampai benar-benar berjalan (artinya kode sepertiif (0) { return 0; }
tidak melempar kesalahan sintaksis), saya tidak berpikir ada cara untuk memperbaiki ini singkat menulis parser Javascript di Javascript . Misalnya, perhatikan kodenya:Jika kode dieksekusi, itu akan hang karena loop. Jika kode tidak dieksekusi, tidak ada kesalahan akan dilemparkan untuk pernyataan pengembalian ilegal. Oleh karena itu, ini sama baiknya dengan Javascript untuk tantangan ini. Jangan ragu untuk mendiskualifikasi Javascript jika Anda merasa ini tidak cukup memenuhi tantangan.
sumber
return 0
.Haskell - 222 byte
Perhatikan bahwa ini menggunakan parser sejati. Itu tidak tergantung pada
eval
fungsi seperti bahasa dinamis.Solusi ini tidak terlalu cantik tetapi tidak berfungsi.
sumber
if take ...
instruksi cek untuk melihat apakah input cocok dengan literal string yang yang merupakan bagian pertama dari program ini.Saya pikir ini mengikuti aturan:
JS (✖╭╮✖)
function f(s){if(s==f.toString())return false;try{eval(s)}catch(e){return false}return true}
Kode akan dievaluasi jika benar.
Perlu melihat notasi panah untuk melihat apakah itu tidak dapat dipersingkat lagi.!function f(){try{s=prompt();return"!"+f+"()"!=s?eval(s):1}catch(e){return 0}}()
Setelah beberapa upaya gagal dan kembali - versi baru!!function f(){try{s=prompt();"!"+f+"()"!=s?eval(s):o}catch(e){return 1}}()
Dan saya kembali!!function f(){try{s=prompt();"!"+f+"()"!=s?eval(s):o}catch(e){return !(e instanceof SyntaxError)}}()
Dan aku pergi! Sayangnya karena sifat eval dan terima kasih kepada @scragar (sialan Anda @scragar!) Pendekatan ini tidak akan berfungsi (melihat seperti
throw new SyntaxError
kode JS yang valid, yang menandai metode ini) - karena itu, saya akan mengatakan tidak mungkin untuk membuat pemeriksa sintaks (paling tidak menggunakan eval atau variasi lainnya)(* lihat komentar!)
sumber
eval("x=function(){"+t+"}");
}//
atau};{
.Error
, bukanException
.throw new Error('')
menyebabkan perilaku yang salah.Python (95)
sumber
c=u'#\u1e91'
karenaord('#') + ord(u'\u1e91') == 7860
PHP - 140
Komentar diperlukan untuk menyimpan 'hash' (salinan s, ɐɔıʇǝɥʇuʎs yang tidak tahu malu). Menggunakan php-l / lint untuk memeriksa kesalahan.
sumber
C 174
Penjelasan -Dinding diperlukan untuk menghasilkan kesalahan sistem sementara masih dapat dikompilasi. Kesalahan sintaksnya adalah no
return 0;
To enter via stdin di konsol Windows ketik Ctrl-Z setelah menempelkan dan tekan enter.Golf
Tidak Disatukan:
sumber
T-SQL - 110
Cukup sederhana, saya sudah lama ingin mencoba tantangan di sini, akhirnya bisa melakukannya. Ini bukan kode yang paling bagus, tapi aku bersenang-senang nontheless.
Versi 'golf'.
Versi yang diformat lebih baik.
Ini cukup jelas, menggunakan SET NOEXEC yang membuatnya hanya mengurai kueri alih-alih mengembalikan hasil apa pun. sisanya sebagian besar adalah try / catch yang saya gunakan untuk menentukan apa yang perlu saya cetak.
EDIT: Saya seharusnya menambahkan bahwa ini secara teknis akan gagal untuk dirinya sendiri. karena menggunakan SQL dinamis setiap kutipan tunggal dalam input harus digandakan '->' '
sumber