Là bắt đầu bằng kết thúc?


36

Nhiệm vụ

Trong thử thách này, nhiệm vụ của bạn là viết một chương trình hoặc hàm có trong Chuỗi và đưa ra giá trị trung thực hoặc falsey dựa trên việc ký tự đầu tiên và ký tự cuối cùng của Chuỗi đầu vào có bằng nhau hay không.

Đầu vào

Bạn có thể lấy đầu vào theo bất kỳ cách hợp lý. Tuy nhiên, giả sử rằng đầu vào có mặt trong một biến được xác định trước là không được phép. Đọc từ tệp, bàn điều khiển, dòng lệnh, trường đầu vào, v.v. hoặc lấy đầu vào làm đối số chức năng được cho phép.

Đầu ra

Bạn có thể xuất ra ở bất kỳ định dạng hợp lý nào, ngoại trừ việc gán kết quả cho một biến. Viết vào một tập tin, bàn điều khiển, dòng lệnh, hộp phương thức, returncâu lệnh hàm, vv được cho phép.

Quy tắc bổ sung

  • Đầu vào cũng có thể là Chuỗi rỗng, do đó bạn sẽ trả về giá trị falsey.

  • Chuỗi đầu vào Char đơn nên có kết quả trung thực.

  • Chương trình của bạn nên phân biệt chữ hoa chữ thường. helloHnên xuất ra một giá trị falsey.

  • Bạn chỉ có thể có một giá trị Truthy duy nhất và một giá trị Falsey duy nhất. Ví dụ: đầu ra falsecho Chuỗi đầu vào và 0cho Chuỗi đầu vào khác vì giá trị Falsey không được phép.

  • Sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

Input    ->    Output

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

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


Những ký tự nào có thể xuất hiện trong đầu vào? ASCII có thể in được?
Martin Ender

@MartinEnder Có thể in ASCII. Mặc dù, tôi không nghĩ nó quan trọng lắm.
Arjun

Tất nhiên nó quan trọng. Một số ngôn ngữ không thể xử lý các ký tự không phải ASCII hoặc byte rỗng và trong regex tôi có thể khớp với bất kỳ ký tự ASCII có thể in nào ., nhưng nó không khớp với các nguồn cấp dữ liệu. Nói chung, nếu bạn thấy mình sử dụng thẻ chuỗi , hãy xác định chính xác những ký tự nào có thể xuất hiện trong đầu vào.
Martin Ender

@MartinEnder Được rồi. Sẽ chăm sóc trong tương lai.
Arjun

Trường hợp thử nghiệm được đề xuất:AbAb => false
caird coinheringaahing

Câu trả lời:



17

Python 3 , 23 byte

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

Đầu ra là thông qua mã thoát, vì vậy 0 (thành công) là trung thực và 1 (thất bại) là sai. Nếu điều này được chấp nhận, một byte có thể được lưu.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Trước hết, nếu s là một chuỗi rỗng, s[0]sẽ tăng IndexError , khiến chương trình bị lỗi.

Đối với s không trống , nếu các ký tự đầu tiên và cuối cùng bằng nhau, s[0]!=s[-1]sẽ đánh giá thành Sai , vì vậy chương trình sẽ thoát một cách sạch sẽ và ngay lập tức.

Cuối cùng, nếu các ký tự khác nhau, s[0]!=s[-1]sẽ đánh giá thành True , khiến cho phần kết s[-1]<ehợp được thực hiện. Vì e không được xác định, điều đó làm tăng NameError .

Nếu không mong muốn tương thích ngược với Python 2,

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

cũng hoạt động, vì so sánh một chuỗi với một số nguyên làm tăng TypeError .


Tiết kiệm 1 byte với lambda
OldBunny2800

1
Có, một chức năng thông thường cũng sẽ tiết kiệm một byte. Mặc dù đầu ra thông qua mã thoát là một sự đồng thuận đã được thiết lập, mặc dù không có lỗi / lỗi cho một chức năng. Tôi đã liên kết với đề xuất trong câu trả lời của tôi.
Dennis

Còn việc sử dụng Python REPL thì sao?
OldBunny2800

Tôi không nghĩ rằng nó giúp. Nó vẫn không phải là một mã thoát.
Dennis

9

JavaScript, 19 byte

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

Ồ Tôi thậm chí còn không biết rằng có tồn tại một endsWithphương thức của đối tượng String. Tốt đẹp! :)
Arjun

Làm sao tôi quên được endsWith()?! Tôi đã chờ đợi một cơ hội để sử dụng nó.
Xù xì

7

Toán học, 15 byte

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

Có một mảng các ký tự. Ném lỗi khi đầu vào trống nhưng có thể bỏ qua.


4
Rất vui khi nhận ra sự thật là ===xử lý vụ việc trống rỗng :)
Greg Martin



7

C ++, 39 byte

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

Chương trình đầy đủ:

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

Dùng thử trực tuyến


1
Tôi không phải là tốt nhất trong C ++ (Tôi thường sử dụng C), nhưng bạn có thể thay đổi các trường hợp s[0]để *stiết kiệm hai byte mỗi?
MD XF

1
@MDXF, sẽ chỉ hoạt động với mảng loại C.
Johan du Toit

6

Brachylog , 4 byte

h~t?

Hãy thử trực tuyến!

Giải trình

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

1
Tôi thực sự cần phải làm tròn để thực hiện các biến ràng buộc đó cho đầu vào; điều đó có nghĩa là chúng tôi sẽ có thể làm điều này trong hai.

6

Java, 81 77 byte

  • -4 byte, cảm ơn @KevinCruijssen

Thử trực tuyến

boolean f(String s){int l=s.length();return l>0&&s.charAt(l-1)==s.charAt(0);}
  • Trả về truenếu chúng bằng nhau, nếu không false, falsecho chuỗi rỗng

Phiên bản mảng, 60 byte

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

Tại sao dài thay vì int?
corvus_192

@ corvus_192 một ký tự unicode có thể là 1-6 byte.
Khaled.K

Sự khác biệt giữa hai ký tự có thể nhiều nhất Charcter.MAX_VALUE - Character.MIN_VALUElà 65535
corvus_192

@ corvus_192 Tôi hiểu rồi, tôi đã sửa nó ngay bây giờ
Khaled.K

1
@KevinCruijssen Cuối cùng, s.charAt(l-1)==s.charAt(0)sẽ tiết kiệm được hai byte.
JollyJoker


5

brainfuck, 43 bytes

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

Try it online!

Explanation

The main loop is [>[->+<<->],]. After each iteration, the cell to the right of the current position is the first byte of the string, and the cell to the left is the difference between the most recently handled character and the first. <[[-]-<] converts the final result to -1 if nonzero, and the rest converts -1 and 0 to 48 and 49 ("0" and "1") respectively.


5

Haskell , 21 byte

cmất a Stringvà trả về a Bool.

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

Hãy thử trực tuyến!

  • Nếu không có chuỗi rỗng, thì đây có thể là 16 byte với c s=s!!0==last s.
  • take 1sđưa ra một danh sách chỉ là phần tử đầu tiên strừ khi strống, trong trường hợp đó nó cũng trống.
  • last s sẽ báo lỗi trên một chuỗi trống, nhưng sự lười biếng của Haskell đã lưu nó: Một chuỗi có một phần tử duy nhất luôn khác với chuỗi trống, mà không đánh giá phần tử của nó.

5

MATL, 5 byte

&=PO)

Hãy thử nó tại MATL Online!

Giải trình

       % 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

In the case, that an empty input string must be handled, then something like the following (8 bytes) would work

&=POwhO)

This solution simply prepends a 0 to the front of the N x N matrix such that for an empty input, when the matrix is 0 x 0, there's still a 0 value that is then grabbed by 0)

Try it at MATL Online


Very clever approach!
Luis Mendo

Also 5 bytes: 5L)d~.
Sanchises

2
Just a heads-up: neither my comment nor your answer handle empty input. This has (in my opinion convincincly) been argued against in the comments, so I expect this requirement to change. However, as it stands, this entry is invalid.
Sanchises

1
(of course, you could do tn?&=PO)}F to deal with empty input; not sure if there is a more efficient way)
Sanchises


4

APL (Dyalog), 4 bytes

⊃⌽=⊃

Try it online!

Explanation

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

Here is the reason this works on empty strings. Applying to an empty string returns a space . But reversing an empty string still returns an empty string, so comparing an empty string with a non-empty string (in this case ) gives an empty numerical vector. And applying to an empty numerical vector returns 0. Hence passing an empty string returns 0.


This is actually really cool answer, but your explanation is not right. It would be right for (⊃⌽)=⊃ or ⊢/=⊃, but neither of those give the right result. Instead ⌽=⊃ compares the reversed string to its first character, and then picks the first element of that. If the string is empty, it ends up comparing a space to an empty string, which gives an empty Boolean list, of which the (coerced) first element is 0 – the correct answer for empty strings. Your expression is equivalent to ⊃⊃=⌽ because = is commutative.
Adám

@Adám Thank you for helping me see the mistake in my explanation.
Kritixi Lithos

You're welcome. Now your note is not correct. ⊃⌽=⊃ is not the same as (⊃⌽)=⊃. It is more expensive, as it compares all the elements instead of just the first and last. Also it wouldn't work had the OP used numbers instead of strings.
Adám

The first argument reversedThe right argument reversed
Adám

You may also want to explain why this works on empty strings.
Adám

4

Java, 52 43 bytes

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

To make it work, feed this into a function such as the following that makes a lambda "go":

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


Phiên bản Excel có quan trọng không? Trong bản sao năm 2013 của tôi, điều này thất bại vì bạn không thể sử dụng &như thế. Ngoài ra, nó được coi A=alà đúng. Ngắn nhất tôi có thể nhận được là 38 byte: =AND(EXACT(LEFT(A1),RIGHT(A1)),A1<>"")hoặc thay thế =IFERROR(CODE(A1)=CODE(RIGHT(A1)),1=0).
Kỹ sư Toast

Tôi đã thử nó trong Excel Online (16.0.9222.5051) và nó sẽ trả về TRUEcho bất kỳ đầu vào không lỗi. ( ảnh chụp màn hình ) Nó có hoạt động trong bản sao của bạn cho tất cả các trường hợp thử nghiệm không? ExcelGuy có một câu trả lời giống như của tôi ở trên vì những lý do tương tự.
Kỹ sư 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))))

Bản sửa đổi 1.5: 61 byte

Khoảng trắng!

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

Bản sửa đổi 2: 58 byte

Xấu xí:

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

Đẹp:

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

Đó là tất cả cho bây giờ! Tôi nghĩ rằng tôi đã thông minh hơn rồi.


1
Đề xuất ifthay vì and(mismatch(reverse s)s)thay vì(mismatch s(reverse s))
trần mèo

2

AWK, 29 34 byte

Điều này có thể là gian lận một chút, bởi vì nó yêu cầu gọi AWK với tùy chọn:

`-F ''`

Trong GNU Awk, bạn có thể sử dụng các từ đồng nghĩa dạng dài:

`--field-separator=''`

Vì vậy, tôi đã thêm 5 byte vào tổng số để giải thích cho việc này.

Xấu xí:

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

Đẹp:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.