Ben bir palindromum. Sen?


103

Bu soruyu sormak için önceki birkaç girişimde bulunuldu , ancak hiçbiri bu sitedeki modern standartlara uymuyor. Başına Meta üzerinde tartışma , bizim çağdaş rulesets altında adil rekabet için izin verecek şekilde yineden ediyorum.

Arka fon

Bir "aynı ileri ve geri okuyan" bir dizedir, yani dizginin tersi dizgenin kendisiyle aynıdır. Burada "uygun palindromlar" dan bahsediyoruz, ancak karakter karakterleri kesin bir şekilde değişiyor; örneğin, ()()bir palindrom değil ())(, öyle.

Görev

Girdi olarak S dizesini (veya kendi dilinizde uygun eşdeğeri) alan ve tercih ettiğiniz bir tür Q çıkışına sahip bir program veya işlev yazın . Girdiyi almak ve çıktıyı sağlamak için herhangi bir makul yolu kullanabilirsiniz .

  • S girişi bir palindrom olduğunda, Q çıkışı A değerine sahip olmalıdır (herhangi bir palindromik S için aynıdır ).
  • S girişi bir palindrom değilse, Q çıkışı B değerine sahip olmalıdır (bu herhangi bir palindromik olmayan S için aynıdır ).
  • A ve B birbirlerinden farklı olmalıdır.

Veya başka bir deyişle: tüm palindromları bir değerle ve tüm palindromları bir başka ile eşleyin.

Ek olarak, yazdığınız program veya işlev bir palindromun kendisi olmalı (yani kaynak kodunun palindromik olması gerekir), bu da onu zorluğu haline getirir .

Açıklamalar

  • Her ne kadar trueve falseiçin bariz seçimler A ve B , sizin "bir palindrom olup" için herhangi iki farklı değerleri kullanabilirsiniz ve mantıksal olması gerekmez çıkışları, "bir palindrom değil".
  • Buradaki karakter düzeyinde string tersini tanımlıyoruz ; ééUTF-8 kodlamasından sonra paltromik bir oktet dizisi olmasa da, programın UTF-8 veya Latin-1'de kodlanıp kodlanmadığına bakılmaksızın palindromiktir.
  • Ancak, programınız ASCII olmayan karakterler içeriyor olsa bile, yalnızca ASCII girişi için çalışması gerekir. Spesifik olarak, S girişi yalnızca yazdırılabilir ASCII karakterleri içerecektir (boşluk dahil ancak yeni satır dahil değil). Bu, diğer şeylerin yanı sıra, girdiyi bir karakter dizisi yerine bir bayt dizisi olarak kabul ederseniz, programınızın muhtemelen belirtime uygun olacağı anlamına gelir (dilinizin G / Ç kodlaması çok garip değilse ). Bu nedenle, önceki madde imlerindeki bir palindromun tanımı yalnızca programın doğru bir formda olup olmadığını kontrol ederken gerçekten önemlidir.
  • Programın yarısını bir yorumda ya da dizgede yazmak, yaratıcı olmamakla birlikte yasaldır; yaratıcılığa değil, uzunluğa göre puan alıyorsanız, programınızın bir palindrom olmasını sağlamak için "sıkıcı" yöntemleri kullanmaktan çekinmeyin. Elbette, uzunluğa göre puan aldığınız için, programınızın hiçbir şey yapmayan kısımları puanınızı daha da kötüleştirecektir, bu nedenle programınızın her iki yarısını da kullanabilmeniz büyük olasılıkla size yardımcı olacaktır. .
  • Zafer kriteri bayt cinsinden ölçüldüğü için, programınızın puan alabilmesi için yazıldığı kodlamayı belirtmeniz gerekir (birçok durumda hangi şifreyi kullandığınız açık olsa da).

Zafer kriteri

Programın karakter seviyesinde bir palindrome olması gerekmesine rağmen, kimin kazandığını görmek için bayt kullanıyoruz. Spesifik olarak, programınız ne kadar kısaysa bayt cinsinden ölçülürse o kadar iyidir; Bu bir mücadelesidir. Gönderilerin (özellikle aynı dilde gönderilerin) karşılaştırılmasına izin vermek için, gönderiminizin başlığına programınız için bir bayt sayısı yerleştirin (bayt sayısından farklıysa karakter sayısı).


12
Birisi lütfen neden () () 'in bir palindrom olmadığını açıklar mı?
Emilio M Bumachar

58
@EmilioMBumachar (ile ave )ile değiştirmeyi deneyin b. Mı ababbir palindrom? Hayır, olması gerekirdi abba. O zaman ()()bir palindrom da değil; olması gerekiyordu ())(.
DLosc

7
Programı tamamen palindromic yapmak için yorum kullanan bu çözümler bana bir kaçamak gibi görünüyor :(
kennytm

15
@ kennytm Bunlara izin vermemek daha kötü olurdu çünkü nesnel olarak dille agnostik bir şekilde yapmanın tatmin edici bir yolu yoktu. (Yorum nedir? Kullanılmayan yarısını atılan bir dize değişmezine koymaktan ne haber? Peki ya hiç erişilemeyen mükemmel bir çalıştırılabilir koda sahip olabileceğiniz 2B dilleri ne olacak?)
Martin Ender

9
()() is not a palindrome, but ())( is. Tebrikler, reddit ettin!
numbermaniac

Yanıtlar:


137

Brachylog (2), Brachylog kod sayfasındaki 3 bayt

I↔I

Çevrimiçi deneyin!

Bu, standart girdi üzerinden girdi alan (sabitler için Brachylog'un sözdizimini kullanan, yani dizgiler çift tırnak içine alınır) ve standart çıktı ile çıkan tam bir programdır. Çıkışlar true.bir palindromik giriş ve false.palindromik olmayan bir giriş içindir.

Bu program sadece palindromik değil, aynı zamanda sol / sağ (ve bazı yazı tiplerinde yukarı / aşağı) ayna simetrisine sahiptir.

açıklama

Brachylog'da, büyük harfler programda aynı değerlere sahip noktaları işaret eder; bu, programın bir bölümünden diğerine bilgi taşımak için neredeyse bir elektrik devresi gibi kullanılır. Bunun bir sonucu, aynı büyük harf çifti arasına bir komut eklerseniz, komutun girişinin ve çıktısının aynı olduğunu etkili bir şekilde iddia ettiğinizdir. Brachylog dolaylı olarak girdi alır; bu durumda, komutun girişinin programın girişi ile aynı olduğunu iddia ediyoruz. Bu programda, bazı şeyleri tersine çeviren komutu kullanıyoruz (bu durumda, dizeler); Böylece program etkin bir şekilde girdinin ileri ve geri aynı olduğunu iddia eder.

Brachylog'daki (bir fonksiyonun aksine) tam bir program false., programdaki tüm iddiaları bir kerede doğru yapmanın bir yolu true.yoksa veya programdaki iddiaların birbirleriyle uyumlu olması halinde bir boolean döndürür . Burada sadece bir iddiaya sahibiz - girişin tersine çevrilmesi onu değiştirmez - bu nedenle program bir palindrome denetleyicisi olarak işlev görür.


49
Ve 180 derece dönme simetrisi, Çok güzel.
ATaco

7
... ve dikey ve yatay eksenler boyunca simetri :-)
Luis Mendo

13
@SteakOverflow Brachylog özel bir kod sayfası kullanır , bu yüzden bu karakterler UTF-8 ile kodlanmamış
DJMcMayhem

4
Ben sadece bu programa oy vermek için bu topluluğa katıldım. Vay.
Bill Michell

4
@ATaco Sol / sağ ve yukarı / aşağı simetrilerin kombinasyonu, 180 derece dönme simetrisini ifade eder. ;)
Eric Duminil

55

Pyth , 3 bayt

_I_

Doğru veya Yanlış döndürür .

Çevrimiçi deneyin!

Nasıl çalışır

  _  Reverse the input.
_I   Invariant-reverse; test if the reversed input is equal to its reverse.

1
Finale neden ihtiyacınız var _?
busukxuan

34
@busukxuan "Ek olarak, yazdığınız program veya işlev bir palindromun kendisi olmalı"
sorusundan

1
Neden bu kadar çok fazla oy ... Bu cevap, o kadar da zor görünmüyor mu ...?
ghosts_in_the_code

1
Sanırım öyle. Yine de haksızlık gibi görünüyor. Bazı sorularda, bir kişinin cevaplaması için çok uğraşılması gerekir, diğerleri ise daha kolaydır. Yine de ödeme aynıdır. BTW ayrıca upvoted: P
ghosts_in_the_code

4
@ghosts_in_the_code 100+ ile olan cevaplarımdan sadece bir tanesi aslında yazmakta zorlandı, ancak günlerce harcadığım cevaplar sadece bir avuç dolusu artıyordu. Sonunda, hepsi dağıldı ...
Dennis




23

Mathematica, 23 bayt

QemordnilaP;PalindromeQ

Çok ilginç değil, ama tamamlık uğruna ...

Yukarıdaki, zorluğu çözen bir yerleşik olarak CompoundExpressiondeğerlendiren bir durumdur PalindromeQ. QemordnilaPbasitçe tanımlanmamış bir tanımlayıcıdır, çünkü ;.


21

Haskell, 87 85 44 34 bayt

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

Açıklama: ((->) a)olarak <*>tanımlanmış olan , bir Uygulayıcı örneğidir (teşekkürler @faubiguy) .

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

Yani argümanların yerine geçerek bunun neden işe yaradığını görebilirsiniz.


1
Kodu açıklayabilir misin?
bli

1
@bli'den sonra her şey --bir yorumdur.
theonlygusti

3
@ theonlygusti Haskell, sadece yarısının yardımcı olacağı kadar yabancı.
Yakk

@Yakk Bu kombinasyonu çeşit (==), reverseve idfonksiyonları ( idkimlik fonksiyonudur).
tbodt

Sen kullanarak 10 bayt kaydedebilirsiniz <*>yerine <$>ve çıkarma<*>id
faubi

20

05AB1E , 3 bayt

Kod:

ÂQÂ

Açıklama:

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

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!


Neden sadeceÂQ
Neil A.

1
@NeilA. Kodun kendisinin de bir palindrom olması gerekiyor.
Adnan,

17

PHP, 55 bayt

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

Artı, dilin adı bir palindrom yani ... bonus puan!


Sinsi çözüm.
Martijn

16

MATL , 7 bayt

tPX=XPt

Çevrimiçi deneyin!

Döndürür [1; 1] palindromik giriş için ve [0; 0] aksi takdirde.

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

15

Pip , 12 11 bayt

Şimdi yorumsuz!

x:RVaQaVR:x

Bir komut satırı argümanı olarak girdi alır; 1palindrom 0için çıktılar , palindrom olmayan çıktılar için . Çevrimiçi deneyin!

Yapmak istediğimiz şeyin temeli RVaQa: reverse(a) string-equals a. Kod x:RVaQabu sonucu hesaplar ve atar x. Sonra değişkene VR:xdeğerini atar . Bu ödev programdaki son ifade olduğundan, değeri de otomatik olarak yazdırılır. İşte bu kadar!xVR

Bazı tanımsız davranışları kullanan önceki ilginç sürüm için, revizyon geçmişine bakın.



9

R, 111 103 bayt

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

En orijinal cevap değil. R'deki# yorum karakteri

Ungolfed:

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

Buradaki karakter dizgisi scan, charToRawişlev sayesinde ham baytlara dönüştürülür . Bu işlenmemiş baytlar rev(), argüman sırasını tersine çeviren işlevdeki eşdeğerleriyle birer birer karşılaştırılır . Bu parçanın çıktısı TRUEve / veya bir vektörüdür FALSE. Fonksiyonu daha sonra çıkarmaktadır tüm bu elemanlar ise
allTRUETRUE

Burada, "\n"içinde scanişlevi birden fazla kelime ile girişler için gereklidir.

Önceki cevap (bayt), 81 bayt

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

@rturnbull sayesinde - 24 bayt ile .


charToRawAtama öncesi dönüşüm yaparak sve separgümanı şu şekilde belirleyerek değiştirerek iyi bir kaç bayt kurtarabilirsiniz scan:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
rturnbull

(Ayrıca, bu yaklaşım örneğin éébir UTF-8 kodlaması altında giriş için de işe yaramaz , ancak bunun zorluğun kurallarını ihlal ettiğini sanmıyorum.)
rturnbull

@ rturnbull: girişler için teşekkürler! Gerçekten éébir latin1kodlamayla test ettim .
Frederic

Test karakteristik yapılmak zorunda olduğundan, mevcut programın kuralları ihlal ettiğini düşünüyorum.
Frederic

Önceki sürümün kuralları ihlal ettiğinden emin değilim. OP: “Başka şeylerin yanı sıra, girdiyi bir karakter dizisi yerine bir bayt dizisi olarak kabul ederseniz, programınızın muhtemelen belirtime uygun olacağı anlamına gelir (dilinizin G / Ç kodlaması çok garip değilse). "
rturnbull

8

RProgN , 11 bayt

~]S.E E.S]~

Bunun ilk yarısı tüm ağır kaldırma işlemlerini gerçekleştirir ve RProgN'nin rahatlığıyla ikinci yarısı No-op'tur.

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

Çevrimiçi deneyin!


8

Retina , 53 bayt

Bayt sayısı, ISO 8859-1 kodlamasını varsayar.

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

Çevrimiçi deneyin!

Bunun henüz optimal olmadığından eminim ( »çizgi özellikle boş görünüyor, ve bir karakter hariç palindromik olan 45 baytlık bir çözüme sahibim), ama sanırım bir başlangıç.


8

GNU sed , 64 59 + 1 (r bayrağı) = 60 bayt UTF-8

Kodu bir palindrome yapmak için yorum bölümü kullanmayan baştan sona bir cevap bulmam biraz zaman aldı. Bunun yerine, ckodun ilk yarısını ters sırayla basacak komutu kullanırım , ancak bu talimata ulaşılmadığından emin olurum.

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

1Girdi dizgisi bir palindrom değilse, komut dosyası yazdırır (hata veriyormuş gibi düşünün). Dize bir palindrom ise, hiçbir çıktı verilmez (başarılı bir şekilde çıkmakta olduğunu düşünün).

Örnekleri çalıştırın: veya çevrimiçi deneyin!

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

Açıklama:

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

1
TIO artık sed'i destekliyor. -rişe yaramıyor ama her şeyi BASH'a sığdırabilirsiniz. Çevrimiçi Deneyin!
Riley,

@Riley TIO'da üst bilgi ve alt bilgi kullanımı, teşekkürler. Önceki geçici çözüm, kodu -e ile argüman listesine taşımaktı, ancak yönteminiz çok daha iyi. Bunun düzeltilmesini bekliyordum ama bu şekilde ihtiyacım yok.
seshoumara

7

Alice , 19 bayt

/@.nzRoi\
\ioRzn.@/

Çevrimiçi deneyin!

JabberwockyPalindromlar için yazdırır ve palindrom olmayanlar için hiçbir şey. Keyfi UTF-8 girişi için çalışıyor.

açıklama

Bu bir dize işleme görevi olduğundan, Alice'in bunu çözmek için Ordinal modda çalışması gerekir. Bu, komut göstergesinin çapraz olarak hareket etmesi gerektiği ve dolayısıyla IP'nin yukarı ve aşağı sıçraması için en az iki satıra ihtiyacımız olduğu anlamına gelir. Böyle bir programdaki satır besleme, palindromun orta karakterini yerleştirmek için iyi bir pozisyon sağlar. Bu, ikinci satırın ilk satırın tersi olması gerektiği anlamına gelir. Fakat sadece her satırdaki diğer karakterleri yerine getirdiğimiz için, satır uzunluğunun garip olduğundan emin olursak, kodun tersi düzgünce kendi boşluklarına sığacaktır. Hiç kullanılmayan tek karakter ters eğik çizgidir, ancak keyfi olduğu için programı güzel ve simetrik görünmesi için seçtim.

Her neyse, gerçek ilgili kod şudur:

/ . z o
 i R n @

Zikzak halinde soldan sağa doğru yürütülür.

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

6

Haskell , 34 bayt

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

Çevrimiçi deneyin! İle arayın f "some string", döner Trueveya False.

=<<Fonksiyonlarına operatör gibi çalışır f=<<g = \s -> f (g s) s, bu nedenle kod eşdeğerdir f s=s==reverse sSadece fark olarak, aynı bayt sayısı neden olacaktır ki,.


Yorumsuz sürüm: (49 bayt)

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

Çevrimiçi deneyin!

İle ara p "some string". Bunun çıktısı Falseverilen dize eğer olduğunu bir palindrom ve Trueo eğer değil bir palindrom.

Açıklama:

Bu yorum ücretsiz palindromu yorum sürümünden başlayarak ve yorumu yeni bir satırla değiştirerek buldum:

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

İkinci satır başarısız olur çünkü parantez uyuşmaz, onlardan kurtulmamız gerekir. eEşitliği kontrol eden bir fonksiyonumuz olsaydı , o zaman

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

ikisi de <<=iki argüman alan esreverve eişlevi döndüren bir infix-operatörünü tanımlayan ikinci satırla derleyecektir p.

eEşitlik fonksiyonu olarak tanımlanmak için normalde bir yazı yazılır e=(==), fakat )==(=etekrar derlenmez. Bunun yerine açıkça iki argüman alabilir ve bunları ==: 'e iletebiliriz e x y=x==y. Artık tersine çevrilmiş kod y==x=y x ederleniyor, ancak ==işleci yeniden tanımlıyor , bu tanımın e x y=x==ybaşarısız olmasına neden oluyor. Bununla birlikte, eşitsizlik operatörüne geçersek /=, tersine verilen tanım orijinal operatöre müdahale etmeyen y=/x=y x ebir =/operatör haline gelir ve tanımlar /=.


5

PETROL , 178 bayt

Bir girdiyi okur, patlatır, yavaşça uzunluğunu ekler (artan ve azalan), adresin ardından dizgiyi bilmek için adrese ekler, kodun farklı bir bölümüne atlar (ortada), şerit yönünü ters çevirir, dizgiyi yerleştirir tekrar ve orijinal dizeyle aynı olup olmadığını kontrol eder. TL; DR: Her zamanki gibi bir acı.

Çıkışlar 40dize, bir palindrom değilse 0o ise.

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

2
Güzel dil! :)
DLosc

5

Javascript, 64 bayt

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

fString ile çağrı fonksiyonu

f("abba") // returns true
f("abab") // returns false

Kaynak kodunuz bir palindrome değil!
seshoumara

@seshoumara Kodu güncelle
Prasanth

Şimdi iyi. Dize bir palindrome değilse, sadece tamamlama uğruna belki de dönüş değerinden bahsedin.
seshoumara

@ apsillers teşekkür ederim cevabı düzenledi.
Prasanth Bendra

İşlev yok f, kodunuz ok işlevinizi bir değişkene atamaz, bu yüzden
çağrılamaz

5

Japt , 7 2 bayt

êê

Koş

Eski çözüm:

U¥UwU¥U

Çevrimiçi deneyin!

açıklama

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, kapatma parantezine (veya boşluğa) ulaşılmadıkça işlevlerden kaçmaz.

Bu yeniden yazılabilir: U¥Uw(U¥U)U¥UwU==Uw. Japt'te, parantez, fonksiyonun başlangıcında ve sonunda bırakılmış ve otomatik olarak yerleştirilmiştir.


Her şey anlam ifade ediyor, wargüman almayan bir işlev olmadıkça , nasıl uygulanır U? Gibi bir şey U.reverse()mi?
DLosc

@DLosc Doğru. UAynı şekilde tersine döner U.reverse().
Oliver

4

Bash + Unix yardımcı programları, 49 bayt

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

Giriş bir argüman olarak iletilir.

Çıktı, sonuç kodunda - palindrom için 0, palindrom olmayan için 1 olarak döndürülür.

Belki birileri daha iyisini yapabilir ve yalnızca kodu palindromik yapmak için bir yoruma güvenmez.

Çevrimiçi deneyin!


[[ $1 = `rev<<<$1` ]]daha kısa. (Bash [[sözdizimi, alıntı gerekmez)
Arthur2e5

2
@ Arthur2e5 Önerinizi denedim, ancak çözümde rev<<<$1bile tekliflerin gerekli olduğunu düşünüyorum [[...]]. Giriş dizesiyle '[$]]$['(bir palindrome olan) test edin . Çalışması için eklenen alıntılarla, çözümünüz benim çözümümle aynı uzunlukta.
Mitchell Spector

Büyük yakalamak! Ben RHS unuttum ==in [[bir olarak yorumlanır casebenzeri desen.
Arthur2e5

@ Arthur2e5 Hala bunu kısaltmanın akıllıca bir yolu olduğunu düşünüyorum.
Mitchell Spector

Girdide yeni satırlar varsa bu hala işe yarar mı? Ben sadece rev yerine rev | tac'e ihtiyacınız olduğunu düşünüyorum.
b_jonas

4

> <>, 11 bayt

{=?!;
;!?={

Burada dene!

Geçerli bir palindromun üzerine "\ nsomething balık gibi kokuyor ..." döndürür, geçersiz bir palindromun çıktısı alınmaz. Palindromu yığına yerleştirin.


Girişin zaten yığında olmasını zorunlu kılmak, bunu bir snippet yapar. Bu meydan okuma, snippet'leri değil programları veya işlevleri gerektirir.
pppery

4

Java - 171 169 160 bayt

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

Sonunda yorum bir palindrom yapmaktır. İade P(alindrome)giriş palindrom ve zaman N(ot)zaman değil.

Ungolfed versiyonu:

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

@DLosc sayesinde 2 bayt kaydedildi

Yanlış bayt miktarını gösteren @Olivier Grégoire'a teşekkürler! Şimdi düzeltildi


Bazı baytları ints yerine s ile kaydedebileceğinizi düşünüyorum char.
DLosc

Bayt sayınızı nasıl kontrol edersiniz bilmiyorum ama 160 bayt var, 161 değil.
Olivier Grégoire

Daha fazla bayt kaydetmek 'P'için 80 bayt ve 78 döndürerek 2 bayt kaydedebilir 'N'veya farklı karakterler kullanabilirsiniz.
Selim,

1
Sen yaparak daha bayt kaydedebilirsiniz new StringBuffer(s).reverse()+""yerinenew StringBuffer(s).reverse().toString()
Selim

1
intBunun yerine iade etmek için herhangi bir sebep var mı bool?
CodesInChaos

4

Java 8, 92 90 bayt

Bu bir yorum sürümüdür. Bir dize tersini içeriyorsa, bir palindrome ( true), aksi halde ( false) değildir .

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

Çevrimiçi deneyin!

Güncelleme

  • -2 [18-04-05] İçeriğe geçti. @Kevin Cruijssen'e teşekkürler !
  • -2 [17-02-20] kaldırıldı ;sitesindeki
  • -16 [17-02-22] Otomatik dönüştür

Bu kod bir lambda ifadesi değildir.
Jakob,

@ Jakob Öyle olduğunu düşündüm. Eğer lambda kullanacak olsaydınız, muhtemelen öncü ve takip eden bir yeni hat istersiniz. (Bir tio bağlantısı ekledim)
NonlinearFruit

Evet, benim şikayetim, çizgi yorumunun gönderimi bir lambda ifadesinden daha fazla kıldığı ve bu nedenle bir lambda çözümü olarak geçerli olmadığı yönündeydi. Şimdilik endişelenme; Muhtemelen sonunda bir fikir birliği toplamak için meta bir yazı yapacağım.
Jakob

@ Jakob Lambda çözümlerinde bazen dış kod olabilir , bu yüzden geçerli olduğunu düşünüyorum. Fakat eğer satılmazsanız, meta gönderim zarar görmez.
NonlinearFruit

1
Bir süre geçtiğini biliyorum, ancak değiştirerek 2 byte golf oynayabilirsiniz s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s. Çevrimiçi olarak 90 bayt deneyin .
Kevin Cruijssen

3

Aslında , 5 bayt

;R=R;

Çevrimiçi deneyin!

Gerçeğin çıktısı [1]\n[1]ve falsey çıktısı []\n[](her iki çıktının da \ntam anlamıyla yeni bir çizgiyi temsil ettiği).

Açıklama:

;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

Neden sadece yapmıyoruz bu ?
Sızdıran Rahibe

1
@LeakyNun bir palindrome olmalı
caird coinheringaahing

3

C ++, 154 Bayt

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

Söylemeliyim ki, tersine ifade çok pahalıydı ama bunu değiştirmek için yapabileceğim bir şey hayal edemiyorum. Std :: sembolleri kesmek beni 10 karaktere kadar kurtarabilirdi, ancak "namespace std;" biraz daha fazla.

Sanırım C ++ gerçekten kısalık demek değildi.


3

Prolog, 44 bayt

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

Bu, kesin cümlecik gramerlerini kullanır. Aslında tam bir bağlam ücretsiz dilbilgisidir:

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

Kullanımı:

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

?- phrase(p,"re").
false.

2

CJam, 13 bayt

l_W%=e#e=%W_l

Açıklama:

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

Örnek:

> 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

Bunu dene:l_W%#e#%W_l
aditsu

2

J, 15 bayt, 15 karakter

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

Palindrom ise 1, değilse 0 döndürür.

Çıktı:

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

Açıklama:

-:    NB. "Match" verb, checks for equality
|.    NB. Reverses the string
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.