Başlangıç ​​sona eşit mi?


36

Görev

Bu zorlu görevde, bir Dize alan ve Dize girişinin ilk karakterinin ve son karakterinin eşit olup olmadığına bağlı olarak bir truthy veya falsey değeri veren bir program veya işlev yazmaktır.

Giriş

Herhangi bir şekilde makul bir şekilde girdi alabilirsiniz. Ancak, girişin önceden tanımlanmış bir değişkende bulunduğunu varsayarak buna izin verilmez. Bir dosyadan, konsoldan, komut satırından, giriş alanından vb. Okumak veya bir fonksiyon argümanı olarak giriş almak mümkündür.

Çıktı

Sonucu değişkene atamak dışında herhangi bir makul formatta çıktı alabilirsiniz. Bir dosyaya, konsola, komut satırına, mod kutusuna, işlev returnifadelerine vb. Yazma izni verilir.

Ek Kurallar

  • Giriş boş bir String olabilir, bunun için bir falsey değeri döndürmeniz gerekir.

  • Tek Karakterli Giriş Dizeleri gerçek bir sonuç vermelidir.

  • Programınız büyük / küçük harf duyarlı olmalıdır. helloHbir falsey değeri vermelidir.

  • Yalnızca tek bir Truthy değerine ve tek bir Falsey değerine sahip olabilirsiniz. Örneğin, falsebir Giriş Dizesi ve 0Falsey değerleri olarak başka bir girdi Dizesi için çıktı alınmasına izin verilmez.

  • Standart boşluklara izin verilmez.

Test Kılıfları

Input    ->    Output

"10h01"        Truthy
"Nothing"      Falsey
"Acccca"       Falsey
"wow!"         Falsey
"wow"          Truthy
"H"            Truthy
""             Falsey

Bu , yani bayttaki en kısa kod kazanır!


Girişte hangi karakterler görünebilir? Yazdırılabilir ASCII?
Martin Ender

@MartinEnder Yazdırılabilir ASCII. Yine de çok önemli olduğunu sanmıyorum.
Arjun

Tabii ki önemli. Bazı diller ASCII olmayan karakterleri veya boş baytları işleyemez ve regex'te yazdırılabilir ASCII karakterleriyle eşleştirebilirim ., ancak satır beslemelerine uymaz. Genel olarak, kendinizi string etiketini kullanarak bulursanız , girişte hangi karakterlerin görünebileceğini tam olarak belirtin.
Martin Ender

@MartinEnder Tamam. Gelecekte ilgilenecek.
Arjun

Önerilen test davası:AbAb => false
caird coinheringaahing

Yanıtlar:



17

Python 3 , 23 bayt

s=input()
s[0]!=s[-1]<e

Çıkış, çıkış koduyla yapılır, bu nedenle 0 (başarı) gerçek ve 1 (başarısızlık) sahtedir. Eğer bu kabul edilebilir, bir bayt kaydedilebilir.

Çevrimiçi deneyin!

Nasıl çalışır

Öncelikle, s boş bir dize ise, programın çalışmamasına neden olan s[0]bir IndexError oluşturacaktır.

Boş olmayan için s ilk ve son karakterler eşitse, s[0]!=s[-1]değerlendirecek Yanlış Program çıkar böylece temiz ve hemen.

Son olarak, eğer karakterler farklıysa, arkadaşın gerçekleştirilmesine neden s[0]!=s[-1]olarak Gerçek olarak değerlendirilir s[-1]<e. Yana e tanımsız, yani bir yükseltir NameError .

Python 2 ile geriye dönük uyumluluk istenmiyorsa,

s[0]!=s[-1]<3

bir dize ile bir tamsayı karşılaştırmak bir TypeError'ı da artırdığı için de çalışır .


Lambda ile 1 bayt kazanın
OldBunny2800

1
Evet, normal bir fonksiyon da bir bayttan tasarruf sağlar. Çıkış kodu üzerinden çıkış bir fikir birliği olsa da, bir işlev için hata / hata olmasa da. Cevabımdaki teklifle bağlantı kurdum.
Dennis,

Python REPL'i kullanmaya ne dersiniz?
OldBunny2800

Bunun yardımcı olacağını sanmıyorum. Hala bir çıkış kodu değil.
Dennis,

9

JavaScript, 19 bayt

a=>a.endsWith(a[0])

Vay. endsWithString nesnesinin bir metodu olduğunu bile bilmiyordum . Güzel! :)
Arjun

Nasıl unuttum endsWith()? Kullanmak için bir fırsat bekliyorum.
Shaggy

7

Mathematica, 15 bayt

#&@@#===Last@#&

Bir dizi karakter alır. Giriş boş olduğunda hataları atar ancak göz ardı edilebilir.


4
===Boş davayı idare eden gerçeği tespit etmek güzel bir iş :)
Greg Martin,



7

C ++, 39 bayt

[](auto s){return s[0]&&s[0]==s.back();}

Tam programlar:

#include <string>
#include <iostream>

using namespace std;

int main()
{
    string t = "";
    auto f = [](auto s){return s[0]&&s[0]==s.back();};
    cout << f(t);
}

Çevrimiçi deneyin


1
(Ben genellikle C kullanın) C ++ iyi değilim, ama sen örneklerini değişebilir s[0]için *siki bayt her kurtarmak için?
MD XF,

1
@ MDXF, sadece C tipi dizilerle çalışacaktır.
Johan du Toit

6

Brachylog , 4 bayt

h~t?

Çevrimiçi deneyin!

açıklama

h       The head of the Input...
 ~t?    ...is the tail of the Input

1
Girdi için bu kısıtlayıcı değişkenleri uygulamak için gerçekten uğraşmaya ihtiyacım var; bu ikide yapabileceğimiz anlamına gelirdi.

6

Java, 81 77 bayt

  • -4 bayt, teşekkürler @KevinCruijssen

Çevrimiçi dene

boolean f(String s){int l=s.length();return l>0&&s.charAt(l-1)==s.charAt(0);}
  • İade trueaksi takdirde, eşitse false, falseboş dize

Dizi Sürümü, 60 bayt

boolean f(char[]s){int l=s.length;return l>0&&s[0]==s[l-1];}

İnt yerine neden?
corvus_192

@ corvus_192 bir unicode karakter 1-6 bayt olabilir.
Khaled.K

İki karakter arasındaki fark en fazla olabilir Charcter.MAX_VALUE - Character.MIN_VALUEki bu 65535
corvus_192

@ corvus_192 Anladım, şimdi düzelttim
Khaled.K

1
@KevinCruijssen Sonuncusu, s.charAt(l-1)==s.charAt(0)iki bayt kurtarırdı.
JollyJoker


5

brainfuck , 43 bayt

+>,[<,[>[->+<<->],]]<[[-]-<]-[----->+<]>--.

Çevrimiçi deneyin!

açıklama

Ana döngü olup [>[->+<<->],]. Her yinelemeden sonra, geçerli konumun sağındaki hücre, dizenin ilk baytıdır ve soldaki hücre, en son işlenen karakter ile ilk arasındaki farktır. <[[-]-<]sıfır olmadığında nihai sonucu -1, geri kalanı sırasıyla -1 ve 0 - 48 ve 49 ("0" ve "1") değerlerine dönüştürür.


5

Haskell , 21 bayt

ca alır Stringve a döndürür Bool.

c s=take 1s==[last s]

Çevrimiçi deneyin!

  • Boş dizeler için değilse, bu 16 bayt olabilirdi c s=s!!0==last s.
  • take 1sboş solmadığı sürece ilk öğe olan bir liste verir s, bu durumda da boş.
  • last s boş bir dizgide hata yapardı ama Haskell'in tembelliği onu kurtarıyor: Tek bir öğeye sahip bir dize, öğesini değerlendirmeden her zaman boş dizeden farklıdır.

5

MATL, 5 bayt

&=PO)

MATL Online'da deneyin !

açıklama

       % Implicitly grab input as a string (of length N)
&=     % Perform an element-wise equality check yielding an N x N matrix
P      % Flip this matrix up-down
O)     % Get the last value in the matrix (column-major ordering)
       % Implicitly display the result

Boş bir giriş dizgisinin işlenmesi gerektiği durumda, aşağıdaki gibi bir şey (8 bayt) işe yarayacaktı.

&=POwhO)

Bu çözüm basit bir 0şekilde N x N matrisinin önüne, boş bir giriş için, matris olduğunda 0 x 0, yine de 0tarafından yakalanan bir değer olacak şekilde hazırlar.0)

MATL Online'da deneyin


Çok akıllıca bir yaklaşım!
Luis Mendo

Ayrıca 5 bayt: 5L)d~.
15'te Sanchises

2
Sadece bir destek: ne yorumum ne de cevabınız boş girdi. Bu, (benim görüşüme göre) yorumlarda aleyhine tartışıldı, bu yüzden bu gereksinimin değişmesini bekliyorum. Ancak, bu haliyle, bu giriş geçersiz.
15'te Sanchises

1
(tabii ki, tn?&=PO)}Fboş girdiyle uğraşmak için yapabilirsin ; daha verimli bir yol olup olmadığından emin değilsin)
Sanchises


4

APL (Dyalog) , 4 bayt

⊃⌽=⊃

Çevrimiçi deneyin!

açıklama

  =                     Compare
                       The first element of the right argument with
                       The right argument reversed
                        This will return an array of the length of the reversed argument. Each element in the resulting array will be either 0 or 1 depending on whether the element at that position of the reversed argument equals the first element of the original right argument
                        So with argument 'abcda', we compare 'a' with each character in 'adcba' which results in the array 1 0 0 0 1
                       From this result, pick the first element.

İşte bunun boş stringler üzerinde çalışmasının sebebi. Boş bir dizeye başvurmak bir boşluk döndürür . Ancak boş bir dizgiyi tersine çevirmek yine de boş bir dizge döndürür, bu nedenle boş bir dizgiyi boş olmayan bir dizeyle karşılaştırmak (bu durumda ) boş bir sayısal vektör verir. Ve boş bir sayısal vektöre başvurmak döndürür 0. Dolayısıyla boş bir dize geçirerek döner 0.


Bu aslında çok güzel bir cevap, ancak açıklamanız doğru değil. Bu doğru olurdu (⊃⌽)=⊃veya ⊢/=⊃, ama hiçbiri olanların doğru sonucu verir. Bunun yerine ⌽=⊃, tersine çevrilmiş dizgiyi ilk karakteriyle karşılaştırır ve sonra bunun ilk öğesini seçer. Dize boşsa, o (zorla) birinci elemanı olan boş bir Boole listesini verir boş bir dize, bir boşluk karşılaştıran biter olduğu 0boş dizeleri doğru cevap -. İfadeniz eşdeğerdir ⊃⊃=⌽çünkü =değişmelidir.
Adám

@ Adám Açıklamamdaki hatayı görmeme yardım ettiğiniz için teşekkür ederiz.
Kritixi Lithos

Rica ederim. Şimdi notunuz doğru değil. ⊃⌽=⊃aynı değil (⊃⌽)=⊃. Sadece ilk ve son yerine tüm elemanları karşılaştırdığı için daha pahalıdır. Ayrıca OP yerine stringler kullanılmış sayılar da işe yaramazdı.
Adám

The first argument reversedThe right argument reversed
Adám

Bunun neden boş dizelerde çalıştığını da açıklamak isteyebilirsiniz.
Adám

4

Java, 52 43 bayt

s->!s.isEmpty()&&s.endsWith(""+s.charAt(0))

Çalışmasını sağlamak için, bunu bir lambda "go" yapan aşağıdaki gibi bir fonksiyonla besleyin:

private static boolean f(Function<String, Boolean> func, String value) {
  return func.apply(value);
}

1
Bunun s.endsWith(""+s.charAt(0))yerine 9 karakter tıraş edebilirsinizs.charAt(0)==s.charAt(s.length()-1)
SpaceBison

s->""!=s&&s.endsWith(""+s.charAt(0))
JollyJoker

1
Çalışmayan @JollyJoker: new String()lambda ile beslenmeyi deneyin . Bir istisna atar. Referans anlambilimi burada çalışmaz.

2
@KevinCruijssen Boş bir dize için charAt (0) üzerindeki sınır dışı istisna endeksinin endekslenmemesi için && nin kısa devre etkisi gereklidir
PunPun1000

4

Ruby, 26 24 bayt

@Philomory sayesinde iki bayt kaydedildi !

->e{!!e[0]>0&&e[0]==e[-1]}

Codegolf üzerine ilk gönderi -))


1
PPCG'ye Hoşgeldiniz!
Martin Ender

1
PPCG'ye Hoşgeldiniz! Güzel ilk golf. Gelecek için iyi şanslar!
Arjun

1
4 bayt'ı sadece yaparak boşaltabilirsiniz, e[0]&&e[0]==e[-1]çünkü eğer eboşsa e[0]sıfır olacaktır. Aslında, düşünmeye gel, nilfalsey olduğu için iyi değil, karşılaştırmanın getirdiği falsey değil; Yine de ekledikten sonra !!hala 2 karakter kaydediyorsunuz.
Philomory

3

PHP> = 7.1, 23 Bayt

karakter farklıysa 1'i eşit, hiçbir şey için yazdırır

<?=$argn[0]==$argn[-1];

3

Swift, 57 bayt

var s=readLine()!,a=Array(s.characters);a[0]==a.last ?1:0

Kod düzenlendi.
Leena,

PPCG'ye Hoşgeldiniz! Sonra a.lastgerekli alan mı ?
HyperNeutrino,

Son olarak etrafına parantez ekleyebilirim veya son dakikadan sonra boşluk ekleyebilirim
Leena

3

C #, 38 30 bayt

s=>s!=""&&s[0]==s[s.Length-1];

@Raznagul sayesinde 8 bayt kaydedildi.


1
Uzunluğunu kontrol etmek yerine ssadece karşılaştırın "". Ayrıca ?:-Operatör gerekmez . Kullanarak &&aynı sonucu vardır.
raznagul

@raznagul Teşekkürler, şu anda çalışıp çalışmadığını kontrol edemiyorum, umarım öyle yapar! Ayrıca &aynı etkiye sahip olmaz mıydı?
TheLethalCoder

@TheLeathalCoder: Hayır, sadece &çalışmıyor. İle &&ikinci ifadesi doğrulanmaz ilk ifadesi yanlış ise. İle &saniyeler ifadesi her zaman doğrulanır ve başarısız olur IndexOutOfRangeExceptionboş dize testi durumda.
raznagul

@raznagul Oh evet ... beyin osuruğu.
TheLethalCoder

Belki de biraz geç ama s.Last()yerine kullanırsanız 5 bayt tasarruf edebilirsinizs[s.Length-1]
Bojan B

3

R, 40 bayt

function(x)x>""&&rev(y<-charToRaw(x))==y

-2 baytlık Nitrodon'a teşekkürler.

-8 bayt için MickyT'e teşekkürler.

Ölçek:

f=function(x)x>""&&rev(y<-charToRaw(x))==y
test <- c("10h01", "Nothing", "Acccca", "wow!", "wow", "H", "")
sapply(test, f)
all(sapply(test, f) == c(T, F, F, F, T, T, F))

Çıktı:

> f=function(x)x>""&&rev(y<-charToRaw(x))==y
> test <- c("10h01", "Nothing", "Acccca", "wow!", "wow", "H", "")
> sapply(test, f)
  10h01 Nothing  Acccca    wow!     wow       H         
   TRUE   FALSE   FALSE   FALSE    TRUE    TRUE   FALSE 
> all(sapply(test, f) == c(T, F, F, F, T, T, F))
[1] TRUE

2
Bir parantez kümesini ile kaldırabilirsiniz rev(y<-el(strsplit(x,"")))==y.
Nitrodon

1
Kaldırmak böylece de isimsiz fonksiyonlar, kabul edilebilirf=
MickyT

1
ve charToRaw karşılaştırma için dizeyi bölmek için kullanılabilirfunction(x)x>""&&rev(y<-charToRaw(x))==y
MickyT

3

> <> , 39 33 bayt

 2i&01. >~&-?v1v
  i:1+?!^01. >0>n;

Bu benim ilk kez> <> kullanıp kod golf oynamaktan ibaretti, bu nedenle yararlı önerileriniz memnuniyetle karşılanacaktır.

Kod üç temel bölümden oluşmaktadır.

2i&01. Pushes an arbitrary number (2 in this case, this causes an empty string to print 0) onto the stack and puts the input's first character in the register.

>i:1+?!^01. Main loop. Pushes the next character onto the stack. If the string has been read completely, then go to the last section

>~&-?v1v
     >0>n;  Compare the first and last characters. Print 1 if they're the same, 0 if not

Merhaba! PPCG'ye Hoşgeldiniz! Güzel ilk golf! Gelecek için iyi şanslar! :)
Arjun

3

Google Sayfaları, 33 Bayt

Hücreden giriş alır [A1]ve çıkışları 1truthy girişi ve 0Falsey girişi için.

=(A1<>"")*Exact(Left(A1),Right(A1

Google Sayfaları, kullanıcının formül metnini girdikten ve bu hücreyi terk etmek için enter tuşuna basar girmez otomatik olarak düzelttiği için parantez içinde olduğu Exact(ve Right(açık bırakıldığı belirtilmektedir .

Çıktı

GS Sürümü


Excel sürümü önemli mi? 2013 kopyamda bu başarısız, çünkü böyle kullanamazsınız &. Ayrıca, A=agerçek sayılır . Alabileceğim en kısa 38 bayttır: =AND(EXACT(LEFT(A1),RIGHT(A1)),A1<>"")veya alternatif =IFERROR(CODE(A1)=CODE(RIGHT(A1)),1=0).
Mühendis Toast

Excel Online'da (16.0.9222.5051) denedim ve herhangi bir hata olmayan girdi TRUEiçin geri döndüm . ( ekran görüntüsü ) Tüm test vakalarında kopyanızda çalışıyor mu? ExcelGuy, aynı nedenlerle yukarıda benimki gibi biten bir cevaba sahiptir .
Mühendis Toast,

1
@EngineerToast tamamen haklısınız, ben ikili ve deyim *yerine kullanmalıydım &, ama bu yine "A"="a"de tamamen göz ardı ettiğim sorunu bırakır . Tüm bunlar ve bir miktar sözdizimi düzeltmesi beni =EXACT(LEFT(A1),RIGHT(A1))*(A1<>"")35 yaşına çıkardı , ancak dili Google Sayfaları'na geçirdim, bu da Exactifadede çift ​​parantezli terminali bırakmama izin verdi , =(A1<>"")*Exact(Left(A1),Right(A133 byte,
Taylor Scott

3

R ', 50 43 41 40 64

Çalınabilir bir işlev için 41 baytlık ikinci çözüm - @ niczky12 & @Giuseppe sayesinde - x = "" için değiştirildi

r=function(x,y=utf8ToInt(x))ifelse(x=="","FALSE",(y==rev(y))[1])

İlk önce 50 bayt ile fakat meydan okuma için değil

function(x){charToRaw(x)[1]==rev(charToRaw(x))[1]}

Dize boş olduğunda s üretmek için charToRawile değiştirebilirsiniz . utf8ToIntNA
niczky12

{}İşlev gövdesinin etrafındaki kıvrımlı ayraçları da kaldırabilirsiniz .
Giuseppe

Sanırım (y==rev(y))[1]bir bayt tarafından daha kısa
Giuseppe

Bu zorluk sadece bir Truthy ve bir Falsey değeri kullanmayı gerektirir, ancak bu NAboş dize için üretilir, ancak FALSEiçin "ab". Çevrimiçi deneyin! .
Ørjan Johansen

@ ØrjanJohansen yorumunuz için teşekkürler, bu yüzden "ab" YANLIŞ vermemeli mi?
Riccardo Camon

2

Octave, 16 bayt

@(s)s(1)==s(end)

sGirdi olarak bir dize alır ve ilk s(1)elemanı son ile karşılaştırır s(end).

Bu @(s)s(1)-s(end)takas true/falseiçin Tamam olsaydı olabilir false/true.


2

GNU grep , 12 bayt

^(.)(.*\1)?$

Genişletilmiş veya PCRE modunda çalıştırın.

Bunun aldatma olarak kabul edilip edilmediğini bilmiyorum.


Bu boş dize harfini ele alıyor mu?
alkış

@ConfusedMr_C Evet, boş dize ⇒ kodu 1.
eush77

2

JavaScript, 20 bayt

f=Başlangıçta ekleyin ve benzeri çağırır f(arg).

_=>_[0]==_.slice(-1)

f=_=>_[0]==_.slice(-1)

i.oninput = e => o.innerHTML = f(i.value);
<input id=i><pre id=o></pre>

açıklama

Bu işlev bir argüman alır _. İşlev gövdesinde, _[0]==_.slice(-1)ilk öğenin _( 0dizininde) son öğeye eşit olup olmadığını denetler ve uygun trueveya falseboole değerini döndürür .



2

Ortak Lisp, 83 74 61 58 bayt

Orijinal: 83 bayt

Common Lisp'i daha yeni öğrenmeye başladım, bu yüzden sürüş mesafesine bir atıcı getirdiğimi hissediyorum. Burada göremediğim bir tür özyinelemeli makro sihirbazı veya dizi manipülasyonu olmalı.

Bu, bir dizgeyi girişi olarak kabul eden adsız bir işlevdir:

(lambda (s) (let ((n (- (length s) 1))) (when (> n 0) (eq (char s 0) (char s n)))))

Prettified:

(lambda (s)
  (let ((n (- (length s) 1)))
    (when (> n 0)
      (eq (char s 0)
          (char s n)))))

Daha kaygan bir çözüm görmek isterdim!

Revizyon 1: 74 bayt

Bu standart kütüphane işlevlerini sevmelisin!

Çirkin:

(lambda (s) (when (> (length s) 0) (eq (elt s 0) (elt (reverse s) 0))))

Güzel:

(lambda (s)
  (when (> (length s) 0)
    (eq (elt s 0)
        (elt (reverse s) 0))))

Revizyon 1.5: 61 bayt

Beyaz boşluk!

(lambda(s)(when(>(length s)0)(eq(elt s 0)(elt(reverse s)0))))

2. revizyon: 58 bayt

Çirkin:

(lambda(s)(and(>(length s)0)(not(mismatch s(reverse s)))))

Güzel:

(lambda (s)
  (and (> (length s) 0)
       (not (mismatch s (reverse s)))))

Şimdilik bu kadar! Sanırım zaten daha zekiyim.


1
Öner ifyerine andve (mismatch(reverse s)s)yerine(mismatch s(reverse s))
ceilingcat

2

AWK, 29 34 bayt

Bu, biraz hile yapıyor olabilir, çünkü AWK seçeneğiyle çağrılmasını gerektirir:

`-F ''`

GNU Awk'ta uzun formlu eşanlamlıları kullanabilirsiniz:

`--field-separator=''`

Ben de bunun için hesaba toplam 5 bayt ekledim.

Çirkin:

NR==1{a=$1}END{print(a==$NF)}

Güzel:

NR == 1
{
    a = $1
}

END
{
    print(a == $NF)
}

1
Kuralın bayrakları / seçenekleri kullanabileceğinize inanıyorum, ancak bunları bayt sayısına dahil etmeniz gerekiyor.
Ørjan Johansen
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.