Saya seorang palindrome. Apakah kamu?

103

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

Klarifikasi

  • Meskipun truedan falsemerupakan 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 . 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).

FantaC
sumber
12
Apakah seseorang tolong jelaskan mengapa () () tidak menjadi palindrom ??
Emilio M Bumachar
58
@EmilioMBumachar Coba ganti (dengan adan )dengan b. Apakah ababpalindrome? Tidak, itu harus terjadi abba. Maka ()()bukan palindrome juga; itu harus ())(.
DLosc
7
Solusi-solusi itu sepenuhnya menggunakan komentar untuk membuat program palindromic tampak seperti celah bagi saya :(
kennytm
15
@kennytm Menolak mereka akan lebih buruk, karena tidak ada cara yang memuaskan untuk melakukan itu secara obyektif dengan cara agnostik bahasa. (Apa komentarnya? Bagaimana dengan meletakkan separuh yang tidak terpakai dalam string literal yang dibuang? Bagaimana dengan bahasa 2D di mana Anda dapat memiliki kode yang dapat dieksekusi dengan sempurna yang tidak pernah dijangkau?)
Martin Ender
9
()() is not a palindrome, but ())( is. Selamat, Anda berhasil masuk ke reddit!
numbermaniac

Jawaban:

137

Brachylog (2), 3 byte dalam codepage Brachylog

I↔I

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, dan false.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, atau true.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
49
Dan simetri rotasi 180 derajat, Sangat indah.
ATaco
7
... dan simetri di sepanjang sumbu vertikal dan horizontal :-)
Luis Mendo
13
@SteakOverflow Brachylog menggunakan halaman kode khusus , sehingga karakter-karakter itu tidak dikodekan dalam UTF-8
DJMcMayhem
4
Saya bergabung dengan komunitas ini hanya untuk memilih program ini. Wow.
Bill Michell
4
@ATaco Kombinasi simetri kiri / kanan dan atas / bawah menyiratkan simetri rotasi 180 derajat. ;)
Eric Duminil
55

Pyth , 3 byte

_I_

Pengembalian Benar atau Salah .

Cobalah online!

Bagaimana itu bekerja

  _  Reverse the input.
_I   Invariant-reverse; test if the reversed input is equal to its reverse.
Dennis
sumber
1
Mengapa Anda membutuhkan final _?
busukxuan
34
@busukxuan Dari pertanyaan, "Selain itu, program atau fungsi yang Anda tulis haruslah palindrom itu sendiri"
isaacg
1
Mengapa begitu banyak upvotes ... Jawaban ini sepertinya tidak sulit untuk diajukan ...?
ghosts_in_the_code
1
Saya rasa begitu. Masih sepertinya agak tidak adil. Pada beberapa pertanyaan, seseorang harus berusaha keras untuk menjawab, dan yang lainnya jauh lebih mudah. Tetap saja bayarannya sama. Btw, saya juga
ter
4
@ ghosts_in_the_code Hanya satu dari jawaban saya dengan 100+ yang benar-benar menantang untuk ditulis, namun ada jawaban yang saya habiskan berhari-hari yang hanya mendapat sedikit upvote. Pada akhirnya, semuanya keluar ...
Dennis
47

Python , 39 byte

lambda s:s[::-1]==s#s==]1-::[s:s adbmal

Cobalah online!

Membosankan, tetapi jika ada lebih pendek di Python itu akan mengesankan.

Jonathan Allan
sumber
Wow, thos (, )beberapa baik (dan membingungkan) input :)
ABcDexter
33

Jelly , 5 byte

ḂŒ
ŒḂ

Mengembalikan 1 atau 0 . Baris pertama adalah tautan pembantu yang tidak dieksekusi, baris kedua memanggil tes palindrome.

Cobalah online!

Dennis
sumber
wow, tambahan terbaru.
Jonathan Allan
6
Yap, baru berumur 18 jam.
Dennis
Anda tidak menentukan pengkodean. Saya menebak UTF-8?
Brian Minton
1
@BrianMinton Tidak, ini akan menjadi 11 byte di UTF-8. Jelly menggunakan halaman kode ini .
Dennis
@ Dennis, terima kasih atas informasinya.
Brian Minton
23

Jelly , 5 byte

⁼ṚaṚ⁼

Cobalah online!

Sama dengan terbalik dan mundur sama dengan.

Atau yang lebih efisien namun kurang menyenangkan secara estetika:

⁼Ṛ
Ṛ⁼

atau

Ṛ⁼
⁼Ṛ
Jonathan Allan
sumber
23

Mathematica, 23 byte

QemordnilaP;PalindromeQ

Tidak terlalu menarik, tetapi demi kelengkapan ...

Di atas adalah CompoundExpressionyang mengevaluasi PalindromeQ, built-in yang memecahkan tantangan. QemordnilaPhanya pengidentifikasi tidak terdefinisi, yang diabaikan karena ;.

Martin Ender
sumber
21

Haskell, 87 85 44 34 byte

p=(==)<*>reverse--esrever>*<)==(=p

Penjelasan: ((->) a)adalah sebuah instance dari Applicative (terima kasih @faubiguy), dengan <*>didefinisikan sebagai

(<*>) f g x = f x (g x)

Jadi dengan menggantinya dengan argumen, kita dapat melihat mengapa ini berhasil.

Program man
sumber
1
Bisakah Anda menjelaskan kodenya?
bli
1
@bli semuanya setelah --komentar.
theonlygusti
3
@theonlygusti Haskell cukup asing sehingga hanya bisa membantu.
Yakk
@Yakk Ini semacam kombinasi dari (==), reverse, dan idfungsi ( idfungsi identitas).
tbodt
Anda dapat menyimpan 10 byte dengan menggunakan <*>alih-alih <$>dan menghapus<*>id
faubi
20

05AB1E , 3 byte

Kode:

ÂQÂ

Penjelasan:

     # Bifurcate (duplicate and reverse the duplicate) implicit input
 Q    # Check if equal
  Â   # Bifurcate the result

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
Mengapa tidak adilÂQ
Neil A.
1
@NeilA. Kode itu sendiri harus berupa palindrom juga.
Adnan
17

PHP, 55 byte

<?=strrev($s=$_GET[s])==$s;#;s$==)]s[TEG_$=s$(verrts=?<

Plus, nama bahasanya adalah palindrom jadi ... poin bonus!

Kodos Johnson
sumber
Solusi licik.
Martijn
16

MATL , 7 byte

tPX=XPt

Cobalah online!

Pengembalian [1; 1] untuk input palindrom dan [0; 0] sebaliknya.

t       % duplicate the input
P       % reverse the second string
X=      % check the two strings are exactly equal (returns 0 or 1)
XP      % flip array (does nothing)
t       % duplicate the answer, giving either [1;1] or [0;0]
        % (implicit) convert to string and display
B. Mehta
sumber
15

Pip , 12 11 byte

Sekarang bebas komentar!

x:RVaQaVR:x

Mengambil input sebagai argumen baris perintah; output 1untuk palindrome, 0untuk non-palindrome. Cobalah online!

Inti dari apa yang ingin kita lakukan adalah RVaQa: reverse(a) string-equals a. Kode x:RVaQamenghitung hasil ini dan menugaskannya untuk x. Kemudian VR:xberikan nilai xke variabel VR. 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.

DLosc
sumber
12

Perl 6 , 25 byte / karakter utf8

{.flip eq$_}#}_$qe pilf.{

Cobalah

Brad Gilbert b2gills
sumber
9

R, 111 103 byte

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))#))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

Bukan jawaban yang paling orisinal. #adalah karakter komentar dalam R

Tidak Disatukan:

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))
#
))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

String karakter dari scandikonversi menjadi byte mentah berkat charToRawfungsinya. Byte mentah ini dibandingkan satu-per-satu dengan rekan-rekan mereka dari rev()fungsi, yang membalik urutan argumennya. Output dari bagian ini adalah vektor dari TRUEdan / atau FALSE.
The allFungsi kemudian output TRUEjika semua elemen tersebut adalahTRUE

Di sini, "\n"dalam scanfungsi diperlukan untuk input dengan lebih dari satu kata.

Jawaban sebelumnya (byte-wise), 81 byte

function(s)all((s=charToRaw(s))==rev(s))#))s(ver==))s(waRoTr‌​ahc=s((lla)s(noitcnu‌​f

dengan - 24 byte, terima kasih kepada @rturnbull .

Frédéric
sumber
Anda dapat menyimpan beberapa byte yang baik dengan melakukan charToRawkonversi sebelum penugasan s, dan mengubah cara Anda mengatur separgumen ke scan:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
rturnbull
(Juga, pendekatan ini tidak bekerja untuk input misalnya di éébawah pengkodean UTF-8, tapi saya tidak berpikir itu melanggar aturan tantangan.)
rturnbull
@rturnbull: terima kasih atas masukannya! Saya memang diuji éédengan latin1encoding.
Frédéric
Karena tes harus dilakukan berdasarkan karakter, saya pikir program saat ini melanggar aturan.
Frédéric
Saya tidak begitu yakin versi sebelumnya tidak melanggar aturan. OP menyatakan: "Di antara hal-hal lain, ini berarti bahwa jika Anda memperlakukan input sebagai urutan byte daripada urutan karakter, program Anda kemungkinan masih akan mematuhi spesifikasi (kecuali jika pengkodean I / O bahasa Anda sangat aneh). "
rturnbull
8

RProgN , 11 byte

~]S.E E.S]~

Paruh pertama ini melakukan semua pekerjaan berat, dan dengan kenyamanan RProgN, babak kedua adalah No-op.

~]S.E E.S]~
~           # Treat the word as a Zero Space Segment
 ]          # Duplicate the top of the stack
  S.        # Reverse the top of the stack
    E       # Compare if these values are equal
      E.S]~ # A no-op, because the ~ is at the end of the word, not the start.

Cobalah online!

ATaco
sumber
8

Retina , 53 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

$
¶$`
O$^`\G.
»
D`
M$`^.+$
$+.^`$M
`D
»
.G\`^$O
`$¶
$

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.

Martin Ender
sumber
8

GNU sed , 64 59 +1 (r flag) = 60 byte UTF-8

Butuh waktu beberapa saat untuk menemukan jawaban sed yang tidak menggunakan bagian komentar untuk membuat kode palindrome. Sebagai gantinya, saya menggunakan cperintah yang akan mencetak bagian pertama dari kode dalam urutan terbalik, hanya saya memastikan instruksi ini tidak tercapai.

:;s:^(.)(.*)\1$:\2:;t;/../c1
d
1c/../;t;:2\:$1\)*.().(^:s;:

Script akan mencetak 1jika 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!

me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "level"
me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "game"
1

Penjelasan:

:                              # start loop
s:^(.)(.*)\1$:\2:              # delete first and last char, if they are the same
t                              # repeat if 's' was successful
/../c1                         # if at least 2 chars are left, print 1. 'c' reads
                               #till EOL, so next command must be on a new line.
d                              # delete pattern space. This line must be a
                               #palindrome itself, and must end the script.
1c/../;t;:2\:$1\)*.().(^:s;:   # (skipped) print first half of code in reverse
                               #order. Everything after 'c' is treated as string.
seshoumara
sumber
1
TIO memiliki dukungan untuk sed sekarang. -rtidak berfungsi, tetapi Anda bisa membungkus semuanya dalam BASH. Cobalah secara Online!
Riley
@Riley Penggunaan header dan footer yang bagus di TIO, terima kasih. Solusi sebelumnya adalah memindahkan kode ke daftar argumen dengan -e, tetapi cara Anda jauh lebih baik. Saya sedang menunggu itu diperbaiki, tetapi dengan cara ini saya tidak perlu.
seshoumara
7

Alice , 19 byte

/@.nzRoi\
\ioRzn.@/

Cobalah online!

Cetakan Jabberwockyuntuk 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:

/ . z o
 i R n @

Yang dieksekusi dalam zigzag dari kiri ke kanan.

/   Reflect the IP southeast, enter Ordinal mode.
i   Read all input as a single string.
.   Duplicate the input.
R   Reverse the copy.
z   Pop the reverse Y and the original X. If X contains Y, drop everything
    up to its first occurrence. Since we know that X and Y are the same length,
    Y can only be contained in X if X=Y, which means that X is a palindrome.
    So this will result in an empty string for palindromes and in the non-empty
    input for non-palindromes.
n   Logical NOT. Replaces non-empty strings with "", and empty strings with
    "Jabberwocky", the "default" truthy string.
o   Output the result.
@   Terminate the program.
Martin Ender
sumber
6

Haskell , 34 byte

f=(==)=<<reverse--esrever<<=)==(=f

Cobalah online! Panggil dengan f "some string", kembali Trueatau False.

The =<<operator pada fungsi bekerja seperti f=<<g = \s -> f (g s) s, sehingga kode setara dengan f s=s==reverse s, yang, seperti saya hanya melihat, akan menghasilkan jumlah byte yang sama.


Versi tanpa komentar: (49 byte)

e x y=x/=y
p=e=<<reverse
esrever<<=e=p
y=/x=y x e

Cobalah online!

Panggil dengan p "some string". Ini menghasilkan Falsejika string yang diberikan adalah palindrome, dan Truejika bukan palindrom.

Penjelasan:

Saya menemukan palindrome bebas komentar ini dengan memulai dengan versi komentar dan mengganti komentar dengan baris baru:

p=(==)=<<reverse
esrever<<=)==(=p

Baris kedua gagal karena tanda kurung tidak cocok, jadi kita harus menyingkirkannya. Jika kita memiliki fungsi eyang memeriksa kesetaraan, maka

p=e=<<reverse
esrever<<=e=p

akan baik mengkompilasi dengan baris kedua mendefinisikan infiks operator <<=yang membutuhkan dua argumen esreverdan edan mengembalikan fungsi p.

Untuk didefinisikan esebagai fungsi kesetaraan, orang biasanya menulis e=(==), tetapi tidak )==(=eakan dikompilasi lagi. Sebaliknya kita secara eksplisit bisa mengambil dua argumen dan meneruskannya ke ==: e x y=x==y. Sekarang kode terbalik y==x=y x emengkompilasi tetapi mendefinisikan kembali ==operator, yang menyebabkan definisi e x y=x==ygagal. Namun jika kita beralih ke operator ketidaksetaraan /=, definisi terbalik menjadi y=/x=y x edan mendefinisikan =/operator yang tidak mengganggu /=operator asli .

Laikoni
sumber
5

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 40jika string bukan palindrome, 0jika itu.

5
0
12
0
40
1
40
2
1
40
34
10
2
3
22
16
9
2
8
35
6
11
6
37

3
4
4
27
26
0
1
10
1

40
13
2
31
04

1
01
1
0
62
72
4
4
3

73
6
11
6
53
8
2
9
61
22
3
2
01
43
04
1
2
04
1
04
0
21
0
5
L3viathan
sumber
2
Bahasa yang rapi! :)
DLosc
5

Javascript, 64 byte

f=s=>s==[...s].reverse().join``//``nioj.)(esrever.]s...[==s>=s=f

Fungsi panggilan fdengan string

f("abba") // returns true
f("abab") // returns false
Prasanth Bendra
sumber
Kode sumber Anda bukan palindrome!
seshoumara
@seshoumara Memperbarui kode
Prasanth Bendra
Sekarang tidak apa-apa. Mungkin menyebutkan nilai kembali jika string bukan palindrome, hanya demi penyelesaian.
seshoumara
@apsillers terima kasih saya telah mengedit jawabannya.
Prasanth Bendra
Tidak ada fungsi f, kode Anda tidak menetapkan fungsi panah ke variabel sehingga tidak dapat dipanggil
spex
5

Japt , 7 2 byte

êê

Menjalankannya

Solusi lama:

U¥UwU¥U

Cobalah online!

Penjelasan

U¥UwU¥U
U¥        U is the input, ¥ is a shortcut for == 
  Uw      w is a reverse function.
    U¥U   This calculates U == U (always true), but the result is ignored
          because w does not look at its arguments.

Japt tidak lepas fungsi kecuali tanda kurung tutup (atau spasi) tercapai.

Ini dapat ditulis ulang: U¥Uw(U¥U)U¥UwU==Uw. Dalam Japt, tanda kurung yang ditinggalkan pada awal dan akhir suatu fungsi dimasukkan secara otomatis.

Oliver
sumber
Semua itu masuk akal, kecuali jika wsuatu fungsi tidak memerlukan argumen, bagaimana fungsinya U? Seperti apa U.reverse()?
DLosc
@Dosc tepat. Itu membalik Udengan cara yang sama seperti U.reverse().
Oliver
4

Utilitas Bash + Unix, 49 byte

[ "$1" = "`rev<<<$1`" ] # ] "`1$<<<ver`" = "1$" [

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!

Mitchell Spector
sumber
[[ $1 = `rev<<<$1` ]]lebih pendek. ( [[Sintaks Bash , tidak perlu penawaran)
Arthur2e5
2
@ Arthur2e5 Saya mencoba saran Anda, tapi saya pikir tanda kutip rev<<<$1diperlukan bahkan dalam [[...]]solusi. Uji dengan string input '[$]]$['(yang merupakan palindrome). Dengan kutipan yang ditambahkan untuk membuatnya berfungsi, solusi Anda sama panjangnya dengan solusi saya.
Mitchell Spector
Tangkapan hebat! Saya lupa bahwa RHS dari ==dalam [[akan ditafsirkan sebagai casepola -seperti.
Arthur2e5
@ Arthur2e5 Saya masih berpikir mungkin ada beberapa cara pintar untuk membuat ini lebih pendek.
Mitchell Spector
Apakah ini masih berfungsi jika ada baris baru di input? Saya pikir Anda perlu rev ​​| tac bukan hanya rev.
b_jonas
4

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

redstarcoder
sumber
Meminta input sudah ada di stack menjadikan ini snippet. Tantangan ini membutuhkan program atau fungsi, bukan cuplikan.
pppery
4

Java - 171 169 160 byte

int q(String s){return s.equals(new StringBuffer(s).reverse().toString())?1:2;}//};2:1?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

Komentar di bagian akhir adalah menjadikannya palindrome. Kembali P(alindrome)ketika input adalah palindrome dan N(ot)saat tidak.

Versi tidak disatukan:

int q(String s) {
    return s.equals(new StringBuffer(s).reverse().toString()) ? 'P' : 'N';
}//};'N':'P'?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

2 byte disimpan berkat @DLosc

Terima kasih kepada @Olivier Grégoire karena menunjukkan jumlah byte yang salah! Diperbaiki sekarang

Kue kering
sumber
Saya percaya Anda dapat menyimpan beberapa byte dengan mengembalikan ints, bukan chars.
DLosc
Saya tidak tahu bagaimana memeriksa jumlah byte Anda, tetapi Anda memiliki 160 byte, bukan 161.
Olivier Grégoire
Anda dapat menyimpan 2 byte dengan mengembalikan 80 untuk 'P'dan 78 untuk 'N'atau menggunakan karakter yang berbeda untuk menyimpan lebih banyak byte.
Selim
1
Anda dapat menyimpan lebih banyak byte dengan melakukan new StringBuffer(s).reverse()+""alih - alihnew StringBuffer(s).reverse().toString()
Selim
1
alasan Anda mengembalikan intbukan bool?
CodesInChaos
4

Java 8, 92 90 byte

Ini adalah versi komentar. Jika sebuah string berisi kebalikannya, maka itu adalah palindrome ( true) kalau tidak, bukan ( false).

s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s

Cobalah online!

Memperbarui

  • -2 [18-04-05] Beralih ke berisi. Terima kasih kepada @Kevin Cruijssen !
  • -2 [17-02-20] Dihapus ;'s
  • -16 [17-02-22] Konversi otomatis
Buah Nonlinier
sumber
Kode ini bukan ekspresi lambda.
Jakob
@ Jakob saya pikir itu. Jika Anda menggunakan lambda, Anda mungkin ingin baris baru yang memimpin dan tertinggal. (Saya menambahkan tautan tio)
NonlinearFruit
Ya, keluhan saya adalah bahwa komentar baris membuat pengajuan lebih dari sekedar ekspresi lambda, dan dengan demikian tidak valid sebagai solusi lambda. Jangan khawatir tentang hal itu untuk saat ini; Saya mungkin akhirnya akan membuat meta post untuk mengumpulkan konsensus.
Jakob
Solusi @Jakob Lambda kadang-kadang dapat memiliki kode asing , itulah sebabnya saya pikir itu valid. Tetapi jika Anda tidak dijual, sebuah pos meta tidak akan sakit.
NonlinearFruit
1
Saya tahu ini sudah lama, tetapi Anda bisa bermain golf 2 byte dengan mengubahnya s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s. Cobalah online 90 byte .
Kevin Cruijssen
3

Sebenarnya , 5 byte

;R=R;

Cobalah online!

Output yang sebenarnya adalah [1]\n[1], dan output falsey adalah []\n[](di kedua output, \nmewakili baris baru literal).

Penjelasan:

;R=R;
;R=    duplicate input, reverse one copy, test equality (the main palindrome-testing part)
   R   range(1, x+1) - if palindrome, this pushes [1], else it pushes []
    ;  duplicate
Mego
sumber
Mengapa kamu tidak melakukan ini saja ?
Leaky Nun
1
@ LeakyNun itu harus menjadi palindrome
caird coinheringaahing
3

C ++, 154 Bytes

int m(){std::string g,p="";g=p;std::reverse(p.begin(),p.end());return g==p;}//};p==g nruter;))(dne.p,)(nigeb.p(esrever::dts;p=g;""=p,g gnirts::dts{)(m tni

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.

Monkah VII
sumber
3

Prolog, 44 byte

p-->[]|[_]|[E],p,[E].%.]E[,p,]E[|]_[|][>--p

Ini menggunakan tata bahasa klausa yang pasti. Ini sebenarnya adalah tata bahasa gratis konteks penuh:

p -->
      []            % the empty string
   |                % or
      [_]           % a one character string
   |                % or
      [E],          % one character, followed by
      p,            % a palindrome, followed by
      [E].          % that same character

Pemakaian:

?- phrase(p,"reliefpfeiler").
true 

?- phrase(p,"re").
false.
Salah
sumber
2

CJam, 13 byte

l_W%=e#e=%W_l

Penjelasan:

l_W%=e#e=%W_l
l_            e#Read input twice
  W%          e#Reverse one input
    =         e#Test for equality
     e#e=%W_l e#Comment to be a palindrome

Contoh:

> l_W%=e#e=%W_l
l_W%=e#e=%W_l
1

> l_W%=e#e=%W_l
Hi
0

> l_W%=e#e=%W_l
hh
1
Roman Gräf
sumber
Coba ini:l_W%#e#%W_l
aditsu
2

J, 15 byte, 15 karakter

-:|.NB. .BN.|:-

Mengembalikan 1 jika palindrome, 0 jika tidak.

Keluaran:

   f '())('
1
   f 'nope'
0

Penjelasan:

-:    NB. "Match" verb, checks for equality
|.    NB. Reverses the string
Blok
sumber