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!


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 .


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

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.


4
Pekerjaan bagus melihat fakta yang ===menangani kasing kosong :)
Greg Martin



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


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

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];}

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


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


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.

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


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

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.


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

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


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];

3

Swift, 57 bytes

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

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.


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

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

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


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]}

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.


2

GNU grep, 12 bytes

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

Run in extended or PCRE mode.

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


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.



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.


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

1
I believe the rule is that you can use flags/options, but you need to include them in the byte count.
Ørjan Johansen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.