Ada beberapa upaya sebelumnya untuk mengajukan pertanyaan ini, tetapi tidak ada yang sesuai dengan standar modern di situs ini. Per diskusi tentang Meta , saya memposting ulang dengan cara yang memungkinkan untuk kompetisi yang adil di bawah aturan modern kita.
Latar Belakang
Sebuah palindrom adalah string yang "membaca depan yang sama dan mundur", yaitu kebalikan dari string adalah sama dengan string itu sendiri. Kita tidak berbicara tentang "palindrom yang nyaman" di sini, tetapi pembalikan karakter demi karakter yang ketat; misalnya, ()()
bukan palindrom, tetapi ())(
.
Tugas
Tulis program atau fungsi yang menggunakan string S (atau padanan yang sesuai dalam bahasa Anda) sebagai input, dan memiliki satu output Q (dari jenis pilihan Anda). Anda dapat menggunakan segala cara yang masuk akal untuk mengambil input dan memberikan output.
- Ketika input S adalah palindrom, output Q harus memiliki nilai A (yang sama untuk setiap palindromic S ).
- Ketika input S bukan palindrom, output Q harus memiliki nilai B (yaitu sama untuk S non-palindromik ).
- A dan B harus berbeda satu sama lain.
Atau dengan kata lain: memetakan semua palindrom ke satu nilai, dan semua non-palindrom ke yang lain.
Selain itu, program atau fungsi yang Anda tulis harus berupa palindrom itu sendiri (yaitu kode sumbernya harus palindromik), menjadikannya sebagai tantangan sumber terbatas .
Klarifikasi
- Meskipun
true
danfalse
merupakan pilihan yang jelas untuk A dan B , Anda dapat menggunakan dua nilai berbeda untuk output "is a palindrome" dan "bukan a palindrome", yang tidak harus berupa boolean. - Kami mendefinisikan pembalikan string pada level karakter di sini;
éé
adalah palindromik terlepas dari apakah program dikodekan dalam UTF-8 atau Latin-1, meskipun itu bukan urutan palindromik oktet setelah pengkodean UTF-8. - Namun, bahkan jika program Anda mengandung karakter non-ASCII, ia hanya perlu bekerja untuk input ASCII. Secara khusus, input S hanya akan berisi karakter ASCII yang dapat dicetak (termasuk spasi, tetapi tidak termasuk baris baru). Antara lain, ini berarti bahwa jika Anda memperlakukan input sebagai urutan byte dan bukan urutan karakter, program Anda mungkin masih akan memenuhi spesifikasi (kecuali jika pengkodean I / O bahasa Anda sangat aneh). Dengan demikian, definisi palindrome pada peluru sebelumnya hanya sangat penting ketika memeriksa bahwa program memiliki bentuk yang benar.
- Menyembunyikan setengah dari program dalam komentar atau string literal, sementara tidak kreatif, adalah legal; Anda dinilai panjang lebar, bukan kreativitas, jadi silakan menggunakan metode "membosankan" untuk memastikan program Anda adalah palindrom. Tentu saja, karena Anda dinilai panjang lebar, bagian dari program Anda yang tidak melakukan apa pun akan memperburuk skor Anda, sehingga dapat menggunakan kedua bagian dari program Anda akan sangat membantu jika Anda dapat mengelolanya .
- Karena kriteria kemenangan diukur dalam byte, Anda harus menentukan pengkodean di mana program Anda ditulis untuk dapat skor itu (meskipun dalam banyak kasus akan jelas pengkodean yang Anda gunakan).
Kriteria kemenangan
Meskipun program harus berupa palindrom pada level karakter, kami menggunakan byte untuk melihat siapa yang menang. Secara khusus, semakin pendek program Anda, diukur dalam byte, semakin baik; ini adalah tantangan kode-golf . Untuk memungkinkan pengiriman (terutama pengiriman dalam bahasa yang sama) untuk dibandingkan, tempatkan jumlah byte untuk program Anda di header pengiriman Anda (ditambah jumlah karakter, jika berbeda dari jumlah byte).
(
dengana
dan)
denganb
. Apakahabab
palindrome? Tidak, itu harus terjadiabba
. Maka()()
bukan palindrome juga; itu harus())(
.()() is not a palindrome, but ())( is.
Selamat, Anda berhasil masuk ke reddit!Jawaban:
Brachylog (2), 3 byte dalam codepage Brachylog
Cobalah online!
Ini adalah program lengkap yang mengambil input melalui input standar (menggunakan sintaks Brachylog untuk konstanta, yaitu string diapit dengan tanda kutip ganda), dan output melalui output standar. Keluarannya adalah
true.
untuk input palindromik, danfalse.
untuk input non-palindromik.Tidak hanya program ini palindromic, ia juga memiliki simetri cermin kiri / kanan (dan mungkin dalam beberapa font).
Penjelasan
Di Brachylog, huruf kapital menandai poin dalam program yang memiliki nilai identik; ini digunakan hampir seperti sirkuit listrik untuk membawa informasi dari satu bagian program ke yang lain. Salah satu konsekuensi dari ini adalah bahwa jika Anda menyertakan perintah di antara pasangan huruf kapital yang identik, Anda secara efektif menyatakan bahwa input dan output perintah adalah sama. Brachylog secara implisit mengambil input, jadi dalam hal ini kami juga menegaskan bahwa input ke perintah sama dengan input ke program. Dalam program ini, kami menggunakan perintah
↔
, yang membalikkan banyak hal (dalam hal ini, string); sehingga program secara efektif menyatakan bahwa inputnya sama maju dan mundur.Program lengkap (sebagai lawan dari fungsi) di Brachylog mengembalikan boolean,
false.
jika tidak ada cara untuk membuat semua pernyataan dalam program tersebut benar sekaligus, atautrue.
jika pernyataan dalam program semuanya kompatibel satu sama lain. Kami hanya memiliki satu pernyataan di sini - bahwa membalikkan input tidak mengubahnya - sehingga program bertindak sebagai pemeriksa palindrom.sumber
Pyth , 3 byte
Pengembalian Benar atau Salah .
Cobalah online!
Bagaimana itu bekerja
sumber
_
?Python , 39 byte
Cobalah online!
Membosankan, tetapi jika ada lebih pendek di Python itu akan mengesankan.
sumber
(
,)
beberapa baik (dan membingungkan) input :)Jelly , 5 byte
Mengembalikan 1 atau 0 . Baris pertama adalah tautan pembantu yang tidak dieksekusi, baris kedua memanggil tes palindrome.
Cobalah online!
sumber
Jelly , 5 byte
Cobalah online!
Sama dengan terbalik dan mundur sama dengan.
Atau yang lebih efisien namun kurang menyenangkan secara estetika:
atau
sumber
Mathematica, 23 byte
Tidak terlalu menarik, tetapi demi kelengkapan ...
Di atas adalah
CompoundExpression
yang mengevaluasiPalindromeQ
, built-in yang memecahkan tantangan.QemordnilaP
hanya pengidentifikasi tidak terdefinisi, yang diabaikan karena;
.sumber
Haskell,
87854434 bytePenjelasan:
((->) a)
adalah sebuah instance dari Applicative (terima kasih @faubiguy), dengan<*>
didefinisikan sebagaiJadi dengan menggantinya dengan argumen, kita dapat melihat mengapa ini berhasil.
sumber
--
komentar.(==)
,reverse
, danid
fungsi (id
fungsi identitas).<*>
alih-alih<$>
dan menghapus<*>id
05AB1E , 3 byte
Kode:
Penjelasan:
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
ÂQ
PHP, 55 byte
Plus, nama bahasanya adalah palindrom jadi ... poin bonus!
sumber
MATL , 7 byte
Cobalah online!
Pengembalian [1; 1] untuk input palindrom dan [0; 0] sebaliknya.
sumber
Pip ,
1211 byteSekarang bebas komentar!
Mengambil input sebagai argumen baris perintah; output
1
untuk palindrome,0
untuk non-palindrome. Cobalah online!Inti dari apa yang ingin kita lakukan adalah
RVaQa
:reverse(a) string-equals a
. Kodex:RVaQa
menghitung hasil ini dan menugaskannya untukx
. KemudianVR:x
berikan nilaix
ke variabelVR
. Karena tugas ini adalah pernyataan terakhir dalam program, nilainya juga dicetak secara otomatis. Voila!Untuk versi menarik sebelumnya menggunakan beberapa perilaku yang tidak terdefinisi, lihat riwayat revisi.
sumber
Perl 6 , 25 byte / karakter utf8
Cobalah
sumber
R,
111103 byteBukan jawaban yang paling orisinal.
#
adalah karakter komentar dalam RTidak Disatukan:
String karakter dari
scan
dikonversi menjadi byte mentah berkatcharToRaw
fungsinya. Byte mentah ini dibandingkan satu-per-satu dengan rekan-rekan mereka darirev()
fungsi, yang membalik urutan argumennya. Output dari bagian ini adalah vektor dariTRUE
dan / atauFALSE
.The
all
Fungsi kemudian outputTRUE
jika semua elemen tersebut adalahTRUE
Di sini,
"\n"
dalamscan
fungsi diperlukan untuk input dengan lebih dari satu kata.Jawaban sebelumnya (byte-wise), 81 byte
dengan - 24 byte, terima kasih kepada @rturnbull .
sumber
charToRaw
konversi sebelum penugasans
, dan mengubah cara Anda mengatursep
argumen kescan
:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
éé
bawah pengkodean UTF-8, tapi saya tidak berpikir itu melanggar aturan tantangan.)éé
denganlatin1
encoding.RProgN , 11 byte
Paruh pertama ini melakukan semua pekerjaan berat, dan dengan kenyamanan RProgN, babak kedua adalah No-op.
Cobalah online!
sumber
Retina , 53 byte
Hitungan byte mengasumsikan penyandian ISO 8859-1.
Cobalah online!
Saya cukup yakin ini belum optimal (
»
garis tampaknya sangat boros, dan saya punya solusi 45-byte yang palindromik kecuali untuk satu karakter), tapi saya kira ini awal.sumber
GNU sed ,
6459 +1 (r flag) = 60 byte UTF-8Butuh waktu beberapa saat untuk menemukan jawaban sed yang tidak menggunakan bagian komentar untuk membuat kode palindrome. Sebagai gantinya, saya menggunakan
c
perintah yang akan mencetak bagian pertama dari kode dalam urutan terbalik, hanya saya memastikan instruksi ini tidak tercapai.Script akan mencetak
1
jika string input bukan palindrome (anggap itu memberikan kesalahan). Jika string adalah palindrome, maka tidak ada output yang diberikan (anggap itu keluar dengan sukses).Jalankan contoh: atau Coba online!
Penjelasan:
sumber
-r
tidak berfungsi, tetapi Anda bisa membungkus semuanya dalam BASH. Cobalah secara Online!Alice , 19 byte
Cobalah online!
Cetakan
Jabberwocky
untuk palindrom dan tidak ada untuk non-palindrom. Bekerja untuk input UTF-8 yang berubah-ubah.Penjelasan
Karena ini adalah tugas pemrosesan string, Alice harus beroperasi dalam mode Ordinal untuk menyelesaikannya. Yang pada gilirannya berarti bahwa penunjuk instruksi harus bergerak secara diagonal, dan oleh karena itu kita memerlukan setidaknya dua baris sehingga IP dapat memantul ke atas dan ke bawah. Linefeed dalam program semacam itu membuat posisi yang baik untuk menempatkan karakter tengah palindrome. Itu berarti baris kedua harus kebalikan dari yang pertama. Tetapi karena kita hanya mengeksekusi setiap karakter lain pada setiap baris, jika kita memastikan bahwa panjang garisnya aneh, kebalikan dari kode akan masuk ke celahnya sendiri. Satu-satunya karakter yang tidak digunakan sama sekali adalah backslash, tetapi karena itu sewenang-wenang saya memilihnya untuk membuat program terlihat bagus dan simetris.
Jadi, kode relevan yang sebenarnya adalah ini:
Yang dieksekusi dalam zigzag dari kiri ke kanan.
sumber
Haskell , 34 byte
Cobalah online! Panggil dengan
f "some string"
, kembaliTrue
atauFalse
.The
=<<
operator pada fungsi bekerja sepertif=<<g = \s -> f (g s) s
, sehingga kode setara denganf s=s==reverse s
, yang, seperti saya hanya melihat, akan menghasilkan jumlah byte yang sama.Versi tanpa komentar: (49 byte)
Cobalah online!
Panggil dengan
p "some string"
. Ini menghasilkanFalse
jika string yang diberikan adalah palindrome, danTrue
jika bukan palindrom.Penjelasan:
Saya menemukan palindrome bebas komentar ini dengan memulai dengan versi komentar dan mengganti komentar dengan baris baru:
Baris kedua gagal karena tanda kurung tidak cocok, jadi kita harus menyingkirkannya. Jika kita memiliki fungsi
e
yang memeriksa kesetaraan, makaakan baik mengkompilasi dengan baris kedua mendefinisikan infiks operator
<<=
yang membutuhkan dua argumenesrever
dane
dan mengembalikan fungsip
.Untuk didefinisikan
e
sebagai fungsi kesetaraan, orang biasanya menulise=(==)
, tetapi tidak)==(=e
akan dikompilasi lagi. Sebaliknya kita secara eksplisit bisa mengambil dua argumen dan meneruskannya ke==
:e x y=x==y
. Sekarang kode terbaliky==x=y x e
mengkompilasi tetapi mendefinisikan kembali==
operator, yang menyebabkan definisie x y=x==y
gagal. Namun jika kita beralih ke operator ketidaksetaraan/=
, definisi terbalik menjadiy=/x=y x e
dan mendefinisikan=/
operator yang tidak mengganggu/=
operator asli .sumber
MINYAK , 178 byte
Membaca input, meledakkannya, perlahan-lahan menambahkan panjangnya (melalui penambahan dan penurunan) ke alamat untuk mengetahui alamat setelah string, melompat ke bagian kode yang berbeda (di tengah), membalikkan arah pita, memundurkan string lagi, dan periksa apakah itu sama dengan string asli. TL; DR: Ini menyebalkan, seperti biasa.
Output
40
jika string bukan palindrome,0
jika itu.sumber
Javascript, 64 byte
Fungsi panggilan
f
dengan stringsumber
f
, kode Anda tidak menetapkan fungsi panah ke variabel sehingga tidak dapat dipanggilJapt ,
72 byteMenjalankannya
Solusi lama:
Cobalah online!
Penjelasan
Japt tidak lepas fungsi kecuali tanda kurung tutup (atau spasi) tercapai.
Ini dapat ditulis ulang:
U¥Uw(U¥U)
→U¥Uw
→U==Uw
. Dalam Japt, tanda kurung yang ditinggalkan pada awal dan akhir suatu fungsi dimasukkan secara otomatis.sumber
w
suatu fungsi tidak memerlukan argumen, bagaimana fungsinyaU
? Seperti apaU.reverse()
?U
dengan cara yang sama sepertiU.reverse()
.Utilitas Bash + Unix, 49 byte
Input diberikan sebagai argumen.
Output dikembalikan dalam kode hasil - 0 untuk palindrome, 1 untuk non-palindrome.
Mungkin seseorang bisa berbuat lebih baik dan tidak hanya mengandalkan komentar untuk membuat kode itu sendiri palindromic.
Cobalah online!
sumber
[[ $1 = `rev<<<$1` ]]
lebih pendek. ([[
Sintaks Bash , tidak perlu penawaran)rev<<<$1
diperlukan bahkan dalam[[...]]
solusi. Uji dengan string input'[$]]$['
(yang merupakan palindrome). Dengan kutipan yang ditambahkan untuk membuatnya berfungsi, solusi Anda sama panjangnya dengan solusi saya.==
dalam[[
akan ditafsirkan sebagaicase
pola -seperti.> <>, 11 byte
Coba di sini!
Mengembalikan "\ n sesuatu yang berbau amis ..." pada palindrom yang valid, tidak ada output pada palindrom yang tidak valid. Tempatkan palindrome di tumpukan.
sumber
Java -
171169160 byteKomentar di bagian akhir adalah menjadikannya palindrome. Kembali
P(alindrome)
ketika input adalah palindrome danN(ot)
saat tidak.Versi tidak disatukan:
2 byte disimpan berkat @DLosc
Terima kasih kepada @Olivier Grégoire karena menunjukkan jumlah byte yang salah! Diperbaiki sekarang
sumber
int
s, bukanchar
s.'P'
dan 78 untuk'N'
atau menggunakan karakter yang berbeda untuk menyimpan lebih banyak byte.new StringBuffer(s).reverse()+""
alih - alihnew StringBuffer(s).reverse().toString()
int
bukanbool
?Java 8,
9290 byteIni adalah versi komentar. Jika sebuah string berisi kebalikannya, maka itu adalah palindrome (
true
) kalau tidak, bukan (false
).Cobalah online!
Memperbarui
;
'ssumber
s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s
. Cobalah online 90 byte .Sebenarnya , 5 byte
Cobalah online!
Output yang sebenarnya adalah
[1]\n[1]
, dan output falsey adalah[]\n[]
(di kedua output,\n
mewakili baris baru literal).Penjelasan:
sumber
C ++, 154 Bytes
Saya harus mengatakan, pernyataan sebaliknya itu mahal, tapi saya tidak bisa membayangkan banyak yang bisa saya lakukan untuk mengubahnya. Mampu memotong std :: simbol akan menyelamatkan saya sekitar 10 karakter, tetapi "menggunakan namespace std;" beberapa lagi.
Saya kira C ++ tidak benar-benar dimaksudkan untuk singkatnya.
sumber
Prolog, 44 byte
Ini menggunakan tata bahasa klausa yang pasti. Ini sebenarnya adalah tata bahasa gratis konteks penuh:
Pemakaian:
sumber
CJam, 13 byte
Penjelasan:
Contoh:
sumber
l_W%#e#%W_l
J, 15 byte, 15 karakter
Mengembalikan 1 jika palindrome, 0 jika tidak.
Keluaran:
Penjelasan:
sumber