Jika Anda pernah mencoba untuk menulis kode palindromic sebelumnya, Anda akan tahu berapa banyak kurung cenderung menghalangi Anda. ()()
bukanlah palindrom, meskipun sepertinya sudah seharusnya, sementara ())(
dan ()(
keduanya palindrom dan keduanya terlihat sangat bodoh. Bukankah lebih nyaman jika sebaliknya?
Sebuah string adalah palindromic jika itu sama dengan string yang diturunkan ketika kebalikannya memiliki semua tanda kurung ( ()
), tanda kurung ( []
), dan kurung kurawal ( {}
) dibalik. Tidak ada karakter lain yang spesial dan memerlukan pembalikan. ( <>
Kadang-kadang berpasangan tetapi seringkali tidak begitu mereka ditinggalkan.)
Tugas Anda adalah menulis, dalam bahasa Anda, sebuah program (mengambil input pada STDIN) atau fungsi (mengambil argumen string tunggal) yang (a) memberikan nilai true yang konsisten * ketika argumennya dengan mudah palindromik dan berbeda, false konsisten nilai sebaliknya, dan (b) itu sendiri mudah palindromik.
Misalnya, input berikut mudah palindromik:
racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov
Dan yang berikut ini bukan:
non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni
Anda tidak boleh bergantung pada status eksternal apa pun (nama file tertentu, struktur direktori, input pengguna lain, akses web, dll) kecuali flag juru bahasa / penyusun.
Selain itu, Anda tidak boleh menggunakan "trik komentar" di mana Anda berkomentar atau membuat sebagian kode yang tidak digunakan dengan memanfaatkan fasilitas komentar bahasa Anda. Misalnya, semua hal berikut ini tidak diperbolehkan, karena mengandung bagian-bagian yang tidak berfungsi yang dapat dengan aman dihilangkan atau dihancurkan (dengan mengorbankan kehilangan kemudahan palindromik):
{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"
Jelas ini mungkin tidak mencakup setiap kasus seperti itu, tetapi semangat tantangan di sini adalah tidak menggunakan komentar dan kode ** yang tidak diuraikan untuk mencapai palindrominess, alih-alih memanfaatkan paren dan kurung yang dikoreksi. Saya melihat Anda, LISP, Brainfuck.
Ini adalah kode-golf , sehingga kode terpendek menang, tetapi semua panjang kode diterima.
* Dengan nilai-nilai benar dan salah yang konsisten, maksud saya bahwa Anda dapat mengembalikan salah satu dari sepasang nilai, seperti 1
untuk true dan 0
false, atau False
untuk true dan "no"
false, selama nilai-nilai ini berbeda satu sama lain, dan tidak berubah dari menjalankan ke menjalankan program Anda. Gunakan apa pun yang menyelamatkan Anda karakter.
** Tidak perlu bingung dengan tidak dieksekusi : kode yang valid dan mungkin melakukan hal-hal aneh tetapi tidak pernah dipanggil baik-baik saja.
sumber
if(false){some code}
atau variabel yang tidak digunakan? Apakah mereka diizinkan?(eslaf)fi
, Anda bisa menggunakannyaif(false)
.()()
itu bukan palindromJawaban:
J (60)
Ini adalah fungsi yang mengambil argumen:
Penjelasan:
f :: g
menjalankan fungsi dif
atas input, dan mengembalikan hasilnya jika kembali tanpa kesalahan. Jikaf
gagal, itu berjalang
sebagai gantinya.Di
f
sini adalah(|.-:'())([]][{}}{'&charsub)
, yang melakukan pekerjaan sebenarnya:|.
: membalikkan-:
: adalah sama dengan'())([]][{}}{'&charsub
: mengganti setiap braket dengan braket yang berlawanang
fungsi(busrahc&'}{{}][[])(()':-.|)
, yang adalah omong kosong tapi sintaksis valid.busrahc
tidak didefinisikan, tetapi itu tidak masalah karena hanya diselesaikan ketika dijalankan (dan tidak akan berjalan).sumber
f :: g
menjadig@-@f
.g
setara dengan kait(-.|)
karena:
begitu output menjadi -1 dan daftar kosong untuk palindromik nyaman dan tidak masing-masing.GolfScript,
10791Baris baru artistik.
fi
,c43
danc
noops, tetapi seluruh kode dieksekusi.Mencetak
-3-1-1
untuk palindrom yang nyaman,-4-1-1
jika tidak. Cobalah online!Versi alternatif, 155 byte
Dengan biaya 64 byte, ini dapat ditingkatkan setelah:
Seperti sebelumnya, seluruh kode dieksekusi dan setiap byte tunggal mempengaruhi output.
Mencetak
010
untuk palindrom yang nyaman,-100
jika tidak. Cobalah online!Tes dan contoh
Bagaimana itu bekerja
sumber
Ruby, 110
Mencetak
true
jika inputnya adalah palindrome yang nyaman danfalse
jika tidak. Perhatikan bahwa solusi ini mengasumsikan bahwa input tidak diakhiri oleh baris baru, jadi ujilah denganecho -n
:Ini adalah port yang agak langsung dari jawaban saya untuk Palindromic Palindrome Checker (dan tidak benar-benar bermain golf sejauh ini). Trik utama yang digunakan adalah bahwa ekspresi kurung pertama selalu kembali
1
, sehingga bagian kedua dari ekspresi boolean tidak pernah dievaluasi (tetapi diuraikan).Satu-satunya kesulitan dalam mengadaptasi ini adalah mencari tahu bagaimana cara menambahkan panggilan
z.tr
sehingga "reverse nyaman" juga akan valid secara sintaksis - tetapi saya hanya bisa menggunakan trik yang sama saya sudah menggunakan put:,*
yang pada paruh pertama diuraikan sebagai operator percikan (gunakan konten array sebagai parameter fungsi) dan sebagai operator perkalian array (atau repitisi) di babak kedua.Ruby, 157
297, semua kode dieksekusiVersi ini (sedikit lebih lama) mengeksekusi semua kode, dan semua kecuali dua baris mempengaruhi output, yang dicetak pada baris terakhir - tetapi semua baris diurai dan dieksekusi tanpa kesalahan. Versi ini menginterpretasikan baris baru yang tertinggal sebagai bagian dari input, jadi gunakan
echo -n
untuk mengujinya, atau tambahkan input Anda dengan baris baru. Ia mencetaktrue
jika inputnya adalah palindrome yang nyaman, danfalse
sebaliknya.Penjelasan
sumber
GolfScript, 61 karakter
OK, inilah solusi dasar dalam GolfScript. Saya yakin ini bisa lebih ditingkatkan:
Seperti biasa untuk GolfScript, program ini membaca inputnya dari stdin. Ini menghasilkan:
jika inputnya adalah palindrome yang nyaman, seperti yang didefinisikan dalam tantangan di atas, dan:
Jika tidak.
Penjelasan: Program ini sangat bergantung pada aturan bahwa kode yang tidak dieksekusi adalah OK, selama kode tersebut diuraikan. Ini terdiri dari dua blok kode, dibatasi oleh kurung kurawal (
{ }
), yang merupakan gambar cermin satu sama lain.Blok kode pertama dijalankan dengan
~
mengikutinya, dan memeriksa apakah inputnya adalah palindrome yang nyaman, mengeluarkannya1
jika ada dan0
tidak. Blok kode kedua tidak dieksekusi, dan dengan demikian tetap berada di stack sampai program berakhir dan semua yang ada di stack secara otomatis dikompilasi dan dicetak oleh penerjemah GolfScript.Perlu dicatat bahwa interpreter GolfScript melakukan sangat sedikit pemeriksaan sintaks pada waktu parse (atau pernah, dalam hal ini); blok kode GolfScript literal dapat berisi hampir semua hal, bahkan jika mungkin macet ketika dijalankan. Namun, beberapa kesalahan sintaksis, seperti literal string yang tidak dikalahkan, meningkatkan kesalahan bahkan dalam kode yang tidak dieksekusi, jadi saya percaya solusi ini (nyaris) berada dalam aturan.
Ps. Melihat kode yang sebenarnya dieksekusi, itu berisi beberapa elemen palindrom nyaman seperti
@[.]@
, string literal"([{}])"
, dan bahkan loop%{ ... }%
. Ini menawarkan saran yang menggiurkan bahwa solusi GolfScript "secara intrinsik palindromik", di mana program palindromik penuh akan dieksekusi dan fungsional, mungkin sebenarnya dimungkinkan. Karena saya belum berhasil memproduksinya sendiri, saya dengan ini menawarkan hadiah +100 perwakilan kepada orang pertama yang berhasil membuat satu!sumber
"n\";X;";X;"\n"
jenis komentar, tapi saya akan memberi Anda manfaat dari keraguan. Saya benar-benar mencari solusi "intrinsik palindrom" seperti itu untuk memulai, bagaimanapun, atau setidaknya yang mana non-eksekusi blok sedikit lebih curang.1;
). Apakah itu masih dianggap berfungsi penuh?JavaScript (ES6), 245 byte
Saya ingin jawaban JS yang dapat dijalankan di browser, jadi ini dia.
Menghapus semua kode yang tidak pernah benar-benar dijalankan, kami mendapatkan ini:
Yang dapat disederhanakan ini:
sumber
n1=>n1==(('',n1))['nioj','split']``['esrever','map'](c=>`()[]{}`[`()[]{}`['indexOf'](c)^1]||c||[1^(c)['fOxedni']`{}[]()`]`{}[]()`>=c)['pam','reverse']``['tilps','join']((1n,''))==1n>=1n
(185 byte)Javascript (ES6) 288
Berjalan di shell baris perintah Spidermonkey . Membaca satu baris dari STDIN dan output
true
ataufalse
tergantung pada apakah input adalah palindrome yang nyaman.Kode ini valid secara sintaksis, tetapi semua yang terjadi setelahnya
&&
tidak dieksekusi, karenaprint
fungsinya mengembalikan nilai falsey.Anda dapat menjalankan kode ini di konsol Firefox dengan menjalankan shim ini terlebih dahulu untuk meniru
readline
danprint
fungsinya. Edit input di dalamreadline
sesuai kebutuhan:Dan inilah contoh cepat dari hasilnya:
sumber
&&
itu benar-benar pintar, saya memuji Anda (tetapi tampaknya sedikit curang)05AB1E, 35 byte
Cobalah online!
Penjelasan:
sumber
"()[]{}"
Anda tidak dapat melakukannyažu„<>-
q
setidaknya diuraikan untuk validitas sintaksis? Jika tidak, saya akan menganggap ini sama dengan mengomentari bagian kedua dari kode.CJam, 38 byte
Mencetak
"=re%W_@%W_q"1
jika inputnya sesuai dengan palindromic dan"=re%W_@%W_q"0
sebaliknya.Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
Setelah menjalankan program, CJam secara otomatis mencetak ketiga item pada stack: string yang diperiksa, Boolean dari perbandingan string dan string kosong.
sumber
Perl, 83 + 2 = 85 byte
Jalankan dengan
-nl
Kode keluar setelah mencetak kebenaran input. Segala sesuatu setelah tanda titik koma ditafsirkan (dan akan crash ketika skrip mencapai titik itu kalau bukan karena
exit
pertemuan itu), tetapi tidak dieksekusi. Jika saya meninggalkanexit;tixe;
kode, masih akan mencetak hasilnya dengan benar sebelum crash.sumber