開始は終了に等しいですか?


36

タスク

この課題では、タスクは、文字列を取り込んで、入力文字列の最初の文字と最後の文字が等しいかどうかに基づいて真偽値を出力するプログラムまたは関数を作成することです。

入力

何らかの方法で合理的な方法で入力を受け付けます。ただし、入力が事前定義された変数に存在すると仮定することは許可されていません。ファイル、コンソール、コマンドライン、入力フィールドなどからの読み取り、または入力を関数の引数として使用できます。

出力

結果を変数に割り当てる場合を除き、妥当な形式で出力できます。ファイル、コンソール、コマンドライン、モーダルボックス、関数returnステートメントなどへの書き込みが許可されています。

追加の規則

  • 入力は空の文字列にすることもできます。この場合、falsey値を返す必要があります。

  • 単一文字の入力文字列には、真実の結果が必要です。

  • プログラムでは大文字と小文字を区別する必要があります。helloHfalsey値を出力する必要があります。

  • 単一のTruthy値と単一のFalsey値のみを持つことができます。たとえばfalse、入力文字列および0別の入力文字列に対してFalsey値として出力することは許可されていません。

  • 標準の抜け穴は許可されていません。

テストケース

Input    ->    Output

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

これはなので、バイト単位の最短コードが勝ちです!


入力に表示できる文字は何ですか?印刷可能なASCII?
マーティンエンダー

@MartinEnder印刷可能なASCII。しかし、私はそれはそれほど重要ではないと思います。
アルジュン

もちろん重要です。一部の言語は非ASCII文字またはヌルバイトを処理できず、正規表現では、印刷可能なASCII文字をと一致させることができますが、.改行とは一致しません。一般に、文字列タグを使用していることがわかった場合は、入力に表示できる文字を正確に指定します。
マーティンエンダー

@MartinEnderわかりました。今後お世話になります。
アルジュン

推奨されるテストケース:AbAb => false

回答:



17

Python 3、23バイト

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

出力は終了コードを経由するため、0(成功)は真実であり、1(失敗)は偽です。これが許容できる場合、1バイトを保存できます。

オンラインでお試しください!

使い方

まず、sが空の文字列の場合s[0]IndexErrorが発生し、プログラムが失敗します。

空でないsの場合、最初の文字と最後の文字が等しい場合、Falses[0]!=s[-1]と評価されるため、プログラムはきれいにすぐに終了します。

最後に、文字が異なる場合、Trues[0]!=s[-1]と評価され、比較が実行されます。eは未定義なので、NameErrorが発生しますs[-1]<e

Python 2との後方互換性が望ましくない場合、

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

文字列を整数と比較するとTypeErrorが発生するため、同様に機能します。


ラムダで1バイトを節約
-OldBunny2800

1
はい、通常の関数もバイトを保存します。終了コードを介した出力は確立されたコンセンサスですが、関数の非エラー/エラーはそうではありません。私は答えで提案にリンクしました。
デニス

Python REPLの使用はどうですか?
OldBunny2800

私はそれが役立つとは思わない。まだ終了コードではありません。
デニス

9

JavaScript、19バイト

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

ワオ。endsWithStringオブジェクトのメソッドが存在することすら知りませんでした。いいね!:)
アルジュン

どうして忘れたのendsWith()?私はそれを使用する機会を待っていました。
シャギー




7

C ++、39バイト

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

完全なプログラム:

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

オンラインで試す


1
私は(私は一般的にCを使用)C ++での最高ではないんだけど、あなたはのインスタンス変更される可能性s[0]への*s2を節約するために、各バイト?
MD XF

1
@ MDXF、Cタイプの配列でのみ動作します。
ヨハンデュトワ


6

Java、81 77バイト

  • -4バイト、@ KevinCruijssenに感謝

オンラインで試す

boolean f(String s){int l=s.length();return l>0&&s.charAt(l-1)==s.charAt(0);}
  • trueそれらが等しい場合に戻ります、そうでない場合falsefalse空の文字列について

配列バージョン、60バイト

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

なぜintではなくlongなのですか?
corvus_192

@ corvus_192のUnicode文字は1〜6バイトです。
Khaled.K

2つの文字の違いは最大Charcter.MAX_VALUE - Character.MIN_VALUE65535
corvus_192

@ corvus_192なるほど、今すぐ修正しました
Khaled.K

1
@KevinCruijssen最後に、s.charAt(l-1)==s.charAt(0)2バイト節約します。
ジョリージョーカー


5

brainfuck、43バイト

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

オンラインでお試しください!

説明

メインループは[>[->+<<->],]です。各反復の後、現在の位置の右側のセルは文字列の最初のバイトであり、左側のセルは最後に処理された文字と最初の文字の差です。 <[[-]-<]ゼロ以外の場合、最終結果を-1に変換し、残りは-1と0をそれぞれ48と49( "0"と "1")に変換します。


5

Haskell、21バイト

cを受け取り、Stringを返しますBool

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

オンラインでお試しください!

  • 空の文字列でない場合、これはで16バイトになりc s=s!!0==last sます。
  • take 1sexcept が空のs場合の最初の要素であるリストを提供しsます。その場合も空です。
  • last s 空の文字列ではエラーになりますが、Haskellの怠inessさはそれを保存します。単一の要素を持つ文字列は、その要素を評価することなく、常に空の文字列とは異なります。

5

MATL、5バイト

&=PO)

MATL Online試しください

説明

       % 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

空の入力文字列を処理する必要がある場合、次のようなもの(8バイト)が機能します

&=POwhO)

この解決策は、単に付加し0N X Nの前部には、空の入力のために、行列である場合にこのようなマトリックス0 x 0、依然としてだ0次いでによってつかまれる値0)

MATL Online試しください


非常に賢いアプローチ!
ルイスメンドー

また、5バイト:5L)d~
-Sanchises

2
単なるヘッズアップ:私のコメントもあなたの回答も空の入力を処理しません。これは(納得のいくように)コメントで議論されているので、この要件が変わることを期待しています。ただし、現状では、このエントリは無効です。
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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.