Apakah awal sama dengan akhir?

36

Tugas

Dalam tantangan ini, tugas Anda adalah menulis program atau fungsi yang menggunakan sebuah String dan menghasilkan nilai true atau falsey berdasarkan pada apakah karakter pertama dan karakter terakhir dari String input sama.

Memasukkan

Anda dapat mengambil input dengan cara apa pun yang masuk akal. Namun, dengan asumsi bahwa input hadir dalam variabel yang telah ditentukan tidak diperbolehkan. Membaca dari file, konsol, baris perintah, bidang input dll., Atau mengambil input sebagai argumen fungsi diperbolehkan.

Keluaran

Anda dapat menampilkan dalam format apa pun yang masuk akal, kecuali untuk menetapkan hasil ke variabel. Menulis ke file, konsol, baris perintah, kotak modal, returnpernyataan fungsi dll. Diperbolehkan.

Aturan tambahan

  • Input dapat berupa String kosong juga, yang mana Anda harus mengembalikan nilai falsey.

  • String Input Single-Char harus memiliki hasil yang benar.

  • Program Anda harus peka terhadap huruf besar-kecil. helloHharus menampilkan nilai falsey.

  • Anda hanya dapat memiliki nilai Kebenaran tunggal dan nilai Falsey tunggal. Misalnya, mengeluarkan falseuntuk String Input dan 0untuk String input lain karena nilai Falsey tidak diperbolehkan.

  • Tidak ada celah standar .

Uji Kasus

Input    ->    Output

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

Ini adalah , jadi kode terpendek dalam byte menang!

Arjun
sumber
Karakter apa yang dapat muncul di input? Cetak ASCII?
Martin Ender
@MartinEnder Printable ASCII. Meskipun, saya pikir itu tidak terlalu penting.
Arjun
Tentu saja itu penting. Beberapa bahasa tidak dapat memproses karakter non-ASCII atau byte nol, dan dalam regex saya dapat mencocokkan dengan karakter ASCII yang dapat dicetak dengannya ., tetapi tidak akan cocok dengan umpan baris. Secara umum, jika Anda menemukan diri Anda menggunakan tag string , tentukan dengan tepat karakter apa yang dapat muncul dalam input.
Martin Ender
@ MartinEnder Oke. Akan berhati-hati di masa depan.
Arjun
AbAb => false
Case

Jawaban:

17

Python 3 , 23 byte

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

Output adalah melalui kode keluar, jadi 0 (sukses) benar dan 1 (gagal) salah. Jika ini dapat diterima, satu byte dapat disimpan.

Cobalah online!

Bagaimana itu bekerja

Pertama-tama, jika s adalah string kosong, s[0]akan menaikkan IndexError , menyebabkan program gagal.

Untuk non-kosong s , jika karakter pertama dan terakhir adalah sama, s[0]!=s[-1]akan mengevaluasi ke False , sehingga keluar program bersih dan segera.

Akhirnya, jika karakternya berbeda, s[0]!=s[-1]akan dievaluasi menjadi True , menyebabkan kompasson s[-1]<edijalankan. Karena e tidak terdefinisi, itu memunculkan NameError .

Jika kompatibilitas dengan Python 2 tidak diinginkan,

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

berfungsi juga, karena membandingkan string dengan integer menimbulkan TypeError .

Dennis
sumber
Hemat 1 byte dengan lambda
OldBunny2800
1
Ya, fungsi biasa juga akan menghemat satu byte. Meskipun output melalui kode keluar adalah konsensus yang ditetapkan, non-error / error untuk suatu fungsi tidak demikian. Saya telah menautkan ke proposal dalam jawaban saya.
Dennis
Bagaimana dengan menggunakan Python REPL?
OldBunny2800
Saya pikir itu tidak membantu. Itu masih bukan kode keluar.
Dennis
9

JavaScript, 19 byte

a=>a.endsWith(a[0])
Botak Bantha
sumber
Wow. Saya bahkan tidak tahu bahwa ada endsWithmetode objek String. Bagus! :)
Arjun
Bagaimana saya bisa melupakan endsWith()?! Saya sudah menunggu kesempatan untuk menggunakannya.
Shaggy
7

Mathematica, 15 byte

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

Mengambil array karakter. Melempar kesalahan saat input kosong tetapi bisa diabaikan.

JungHwan Min
sumber
4
Pekerjaan bagus melihat fakta yang ===menangani kasing kosong :)
Greg Martin
7

05AB1E , 4 byte

S¬Q¤

Cobalah online! atau Coba Semua Tes

S    # Split the input into individual characters
 ¬   # Get the first character
  Q  # Check all characters for equality to the first
   ¤ # Get the last value i.e. head == tail
Riley
sumber
1
ÂâćüQmenjadi lebih membingungkan dan mendapatkan satu byte!
Magic Octopus Mm
ćsθQadalah byter 4-lain.
Magic Octopus Urn
7

Retina , 13 12 byte

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

Cobalah online! Termasuk kamar uji. Sunting: Disimpan 1 byte berkat @Kobi.

Neil
sumber
7

C ++, 39 byte

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

Program lengkap:

#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);
}

Cobalah online

Johan du Toit
sumber
1
Saya bukan yang terbaik di C ++ (Saya biasanya menggunakan C), tetapi bisa Anda mengubah contoh s[0]untuk *smenyelamatkan dua byte masing-masing?
MD XF
1
@ MDXF, itu hanya akan bekerja dengan array tipe C.
Johan du Toit
6

Brachylog , 4 byte

h~t?

Cobalah online!

Penjelasan

h       The head of the Input...
 ~t?    ...is the tail of the Input
Fatalisasi
sumber
1
Saya benar-benar perlu untuk menerapkan variabel kendala tersebut untuk input; itu berarti kita akan dapat melakukan ini dalam dua.
6

Java, 81 77 byte

  • -4 byte, terima kasih @KevinCruijssen

Coba Online

boolean f(String s){int l=s.length();return l>0&&s.charAt(l-1)==s.charAt(0);}
  • Mengembalikan truejika mereka sama, jika tidak false, falseuntuk string kosong

Versi Array, 60 byte

boolean f(char[]s){int l=s.length;return l>0&&s[0]==s[l-1];}
Khaled.K
sumber
Kenapa lama bukannya int?
corvus_192
@ corvus_192 karakter unicode bisa 1-6 byte.
Khaled.K
Perbedaan antara dua karakter paling banyak Charcter.MAX_VALUE - Character.MIN_VALUE, yaitu 65535
corvus_192
@ corvus_192 Begitu, saya sudah memperbaikinya sekarang
Khaled.K
1
@KevinCruijssen Untuk yang terakhir, s.charAt(l-1)==s.charAt(0)akan menghemat dua byte.
JollyJoker
6

Python 2 , 26 25 24 byte

Terimakasih untuk @Dennis karena telah menghemat satu byte!

lambda x:""<x[:1]==x[-1]

Cobalah online!

Adnan
sumber
5

brainfuck , 43 byte

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

Cobalah online!

Penjelasan

Loop utama adalah [>[->+<<->],]. Setelah setiap iterasi, sel di sebelah kanan posisi saat ini adalah byte pertama dari string, dan sel di sebelah kiri adalah perbedaan antara karakter yang paling baru ditangani dan yang pertama. <[[-]-<]mengkonversi hasil akhir menjadi -1 jika bukan nol, dan sisanya mengkonversi -1 dan 0 menjadi 48 dan 49 ("0" dan "1").

Nitrodon
sumber
5

Haskell , 21 byte

cmengambil Stringdan mengembalikan a Bool.

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

Cobalah online!

  • Jika tidak untuk string kosong, ini bisa jadi 16 byte c s=s!!0==last s.
  • take 1smemberikan daftar yang hanya elemen pertama skecualis kosong, dalam hal ini kosong juga.
  • last s akan kesalahan pada string kosong, tetapi kemalasan Haskell menyimpannya: Sebuah string dengan elemen tunggal selalu berbeda dari string kosong, tanpa mengevaluasi elemennya.
Ørjan Johansen
sumber
5

MATL, 5 byte

&=PO)

Cobalah di MATL Online!

Penjelasan

       % 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

Dalam hal ini, bahwa string input kosong harus ditangani, maka sesuatu seperti berikut (8 byte) akan berfungsi

&=POwhO)

Solusi ini hanya menambahkan 0ke depan matriks N x N sehingga untuk input kosong, ketika matriks tersebut 0 x 0, masih ada0 nilai yang kemudian diambil oleh0)

Cobalah di MATL Online

Suever
sumber
Pendekatan yang sangat pintar!
Luis Mendo
Juga 5 byte: 5L)d~.
Sanchises
2
Hanya kepala: komentar saya atau jawaban Anda tidak menangani input kosong. Ini (menurut pendapat saya secara meyakinkan) telah diperdebatkan dalam komentar, jadi saya berharap persyaratan ini berubah. Namun, sebagaimana adanya, entri ini tidak valid.
Sanchises
1
(tentu saja, Anda bisa lakukan tn?&=PO)}Funtuk menangani input kosong; tidak yakin apakah ada cara yang lebih efisien)
Sanchises
4

Japt , 6 byte

tJ ¥Ug

Cobalah online!

Luke
sumber
Hmm, tidak berfungsi untuk string kosong (harus memberi false). Saya pikir Anda dapat memperbaikinya dengantJ ¥Ug
ETHproduksi
4

APL (Dyalog) , 4 byte

⊃⌽=⊃

Cobalah online!

Penjelasan

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

Inilah alasan mengapa ini berfungsi pada string kosong. Menerapkan string kosong mengembalikan spasi . Tetapi membalikkan string kosong masih mengembalikan string kosong, jadi membandingkan string kosong dengan string non-kosong (dalam hal ini ) memberikan vektor numerik kosong. Dan menerapkan kembali vektor numerik kosong 0. Oleh karena itu melewatkan string kosong kembali 0.

Kritixi Lithos
sumber
Ini sebenarnya jawaban yang sangat keren, tetapi penjelasan Anda tidak benar. Itu akan tepat untuk (⊃⌽)=⊃atau ⊢/=⊃, tetapi tidak satu pun dari mereka memberikan hasil yang tepat. Alih-alih ⌽=⊃membandingkan string yang dibalik dengan karakter pertama, lalu mengambil elemen pertama dari itu. Jika string kosong, akhirnya membandingkan ruang ke string kosong, yang memberikan daftar Boolean kosong, di mana elemen pertama (dipaksakan) adalah 0- jawaban yang benar untuk string kosong. Ekspresi Anda setara dengan ⊃⊃=⌽karena =komutatif.
Adám
@ Adám Terima kasih telah membantu saya melihat kesalahan dalam penjelasan saya.
Kritixi Lithos
Sama-sama. Sekarang catatan Anda tidak benar. ⊃⌽=⊃tidak sama dengan (⊃⌽)=⊃. Ini lebih mahal, karena membandingkan semua elemen bukan hanya yang pertama dan terakhir. Juga tidak akan berhasil jika nomor OP digunakan daripada string.
Adám
The first argument reversedThe right argument reversed
Adám
Anda mungkin juga ingin menjelaskan mengapa ini bekerja pada string kosong.
Adám
4

Java, 52 43 byte

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

Untuk membuatnya berfungsi, masukkan ini ke dalam fungsi seperti berikut ini yang membuat lambda "pergi":

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

sumber
1
You can shave off 9 chars using s.endsWith(""+s.charAt(0)) instead of s.charAt(0)==s.charAt(s.length()-1)
SpaceBison
s->""!=s&&s.endsWith(""+s.charAt(0))
JollyJoker
1
@JollyJoker that does not work: try feeding new String() into the lambda. It will throw an exception. Reference semantics do not work here.
2
@KevinCruijssen The short circuiting effect of && is necessary to avoid an index out of bounds exception on the charAt(0) for an empty string
PunPun1000
4

Ruby, 26 24 bytes

Saved two bytes thanks to @philomory!

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

First post on codegolf -))

marmeladze
sumber
1
Welcome to PPCG!
Martin Ender
1
Welcome to PPCG! Nice first golf. Good luck for future!
Arjun
1
You could save 4 bytes by just doing e[0]&&e[0]==e[-1], since if e is empty, e[0] will be nil. Actually, come to think of it, nil is no good since it's falsey but not the same falsey that the comparison returns; still, after adding !! you're still saving 2 characters.
philomory
3

PHP>=7.1, 23 Bytes

prints 1 for equal and nothing if the character is different

<?=$argn[0]==$argn[-1];
Jörg Hülsermann
sumber
3

Swift, 57 bytes

var s=readLine()!,a=Array(s.characters);a[0]==a.last ?1:0
Leena
sumber
Edited the code.
Leena
Welcome to PPCG! Is the space after a.last necessary?
HyperNeutrino
Either I can add brackets around a.last or I can add space after a.last
Leena
3

C#, 38 30 bytes

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

Saved 8 bytes thanks to @raznagul.

TheLethalCoder
sumber
1
Instead of checking the length of s just compare it with "". Also you don't need the ?:-Operator. Using && has the same result.
raznagul
@raznagul Good spots thanks, I can't check if it works at the moment so hopefully it does! Also wouldn't & have the same effect too?
TheLethalCoder
@TheLeathalCoder: No just & doesn't work. With && the second expression is not validated if the first expression is false. With & the seconds expression is always validated and fails with a IndexOutOfRangeException on the empty string test case.
raznagul
@raznagul Oh yeah... brain fart.
TheLethalCoder
Perhaps its a bit late but you can save 5 bytes if you use s.Last() instead of s[s.Length-1]
Bojan B
3

R, 40 bytes

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

Thanks to Nitrodon for -2 bytes.

Thanks to MickyT for -8 bytes.

Test:

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

Output:

> 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
djhurio
sumber
2
You can remove one set of parentheses with rev(y<-el(strsplit(x,"")))==y.
Nitrodon
1
also unnamed functions are acceptable, so you can remove the f=
MickyT
1
and charToRaw can be used to split the string for comparison function(x)x>""&&rev(y<-charToRaw(x))==y
MickyT
3

><>, 39 33 bytes

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

This is my first time both using ><> and playing code golf, so helpful suggestions would be appreciated.

The code is in three basic sections.

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
AGourd
sumber
Hello! Welcome to PPCG! Nice first golf! Good luck for future! :)
Arjun
3

Google Sheets, 33 Bytes

Takes input from cell [A1] and outputs 1 for truthy input and 0 for falsey input.

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

It is noted that the parentheticals in Exact( and Right( are left unclosed as Google Sheets automatically corrects this as soon as the user has input the formula text and pressed enter to leave that cell.

Output

GS Version

Taylor Scott
sumber
Does the version of Excel matter? In my copy of 2013, this fails because you can't use & like that. Also, it considers A=a to be true. The shortest I can get is 38 bytes: =AND(EXACT(LEFT(A1),RIGHT(A1)),A1<>"") or the alternative =IFERROR(CODE(A1)=CODE(RIGHT(A1)),1=0).
Engineer Toast
I tried it in Excel Online (16.0.9222.5051) and it returns TRUE for any non-error input. (screenshot) Does it work in your copy for all test cases? ExcelGuy has an answer that ends up like mine above for the same reasons.
Engineer Toast
1
@EngineerToast you are completely correct, I should have been using * instead & for the binary and statement, but that still leaves the "A"="a" issue, which I had completely overlooked. All of that and a bit of syntax corrections leads me to =EXACT(LEFT(A1),RIGHT(A1))*(A1<>"") for 35, but I have switched the language to Google Sheets, which allowed me to drop the terminal double parenthetical in the Exact statement, rendering =(A1<>"")*Exact(Left(A1),Right(A1 for 33 bytes
Taylor Scott
3

R, 50 43 41 40 64

Second solution with 41 bytes for a callable function - thanks to @niczky12 & @Giuseppe - amended for x=""

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

First with 50 bytes but not for the challenge

function(x){charToRaw(x)[1]==rev(charToRaw(x))[1]}
Riccardo Camon
sumber
You can replace charToRaw with utf8ToInt to produce NAs when the string is empty.
niczky12
You can also remove the curly braces {} around the function body.
Giuseppe
I think (y==rev(y))[1] is shorter by a byte
Giuseppe
This challenge requires using only one Truthy and one Falsey value, but this produces NA for empty string but FALSE for "ab". Try it online!.
Ørjan Johansen
@ØrjanJohansen thanks for your comment, so "ab" should not give FALSE?
Riccardo Camon
2

Octave, 16 bytes

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

It takes a string s as input, and compares the first s(1) element with the last s(end).

This could be @(s)s(1)-s(end) if it was OK to swap true/false to false/true.

Stewie Griffin
sumber
2

GNU grep, 12 bytes

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

Run in extended or PCRE mode.

I don't know if this is considered cheating or not.

eush77
sumber
Does this handle the empty string case?
clap
@ConfusedMr_C Yep, empty string ⇒ code 1.
eush77
2

JavaScript, 20 bytes

Add f= at the beginning and invoke like f(arg).

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

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

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

Explanation

This function takes in an argument _. In the function body, _[0]==_.slice(-1) checks whether the first element of _ (at 0th index) equals the last element of it, and returns the appropriate true or false boolean.

Arjun
sumber
2

Common Lisp, 83 74 61 58 bytes

Original: 83 bytes

I've just started learning Common Lisp, so I feel like I'm bringing a putter to a driving range. There must be some kind of recursive macro wizardry or array manipulation possible here that I'm not seeing.

This is an anonymous function that accepts a string as its input:

(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)))))

Would love to see a slicker solution!

Revision 1: 74 bytes

Gotta love those standard library functions!

Ugly:

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

Pretty:

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

Revision 1.5: 61 bytes

Whitespace!

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

Revision 2: 58 bytes

Ugly:

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

Pretty:

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

That's all for now! I think I'm smarter already.

shadowtalker
sumber
1
Suggest if instead of and and (mismatch(reverse s)s) instead of (mismatch s(reverse s))
ceilingcat
2

AWK, 29 34 bytes

This one might be cheating slightly, because it requires invoking AWK with the option:

`-F ''`

In GNU Awk you can use the long-form synonyms:

`--field-separator=''`

So I added 5 bytes to the total to account for this.

Ugly:

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

Pretty:

NR == 1
{
    a = $1
}

END
{
    print(a == $NF)
}
shadowtalker
sumber
1
I believe the rule is that you can use flags/options, but you need to include them in the byte count.
Ørjan Johansen