起点等于终点吗?


36

任务

在此挑战中,您的任务是编写一个程序或函数,该程序或函数接受String,并根据输入String的第一个字符和最后一个字符是否相等,输出真值或伪值。

输入值

您可以以任何合理的方式接受输入。但是,不允许输入存在于预定义变量中。允许从文件,控制台,命令行,输入字段等进行读取,或将输入作为函数参数。

输出量

除了将结果分配给变量外,您可以以任何合理的格式输出。return允许写入文件,控制台,命令行,模式框,函数语句等。

附加规则

  • 输入也可以是空String,您应该为其返回falsey值。

  • 单字符输入字符串应得到真实的结果。

  • 您的程序应区分大小写。helloH应该输出一个falsey值。

  • 您只能有一个Truthy值和一个Falsey值。例如,不允许将false一个输入字符串和0另一个输入字符串输出为Falsey值。

  • 不允许出现标准漏洞

测试用例

Input    ->    Output

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

这是,因此以字节为单位的最短代码胜出!


输入中可以显示什么字符?可打印的ASCII吗?
马丁·恩德

@MartinEnder可打印的ASCII。虽然,我认为这并不重要。
Arjun

当然重要。某些语言不能处理非ASCII字符或空字节,在正则表达式中,我可以使用来匹配任何可打印的ASCII字符.,但不能匹配换行符。通常,如果您使用字符串标签发现自己,请确切指定可以在输入中出现的字符。
Martin Ender

@MartinEnder好吧。以后会照顾的。
Arjun 2015年

建议的测试用例:AbAb => false
Caird coinheringaahing

Answers:



17

Python 3,23个字节

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

输出是通过退出代码进行的,因此0(成功)为真,而1(失败)为假。如果是可以接受的,一个字节可以保存。

在线尝试!

怎么运行的

首先,如果s为空字符串,s[0]将引发IndexError,导致程序失败。

对于非空s,如果第一个和最后一个字符相等,s[0]!=s[-1]则将求值为False,因此程序将立即干净退出。

最后,如果字符不同,s[0]!=s[-1]将求值为True,导致s[-1]<e执行比较。由于e是未定义的,因此引发了NameError

如果不希望与Python 2向后兼容,

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

也可以正常工作,因为将字符串与整数进行比较会引发TypeError


用lambda保存1个字节
OldBunny2800'5

1
是的,常规函数也可以节省一个字节。虽然通过退出代码进行输出是公认的共识,但函数的非错误/非错误并非如此。我已将答案链接到该提案。
丹尼斯

使用Python REPL怎么样?
OldBunny2800 '17

我认为这没有帮助。它仍然不是退出代码。
丹尼斯,

9

JavaScript,19个字节

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

哇。我什至不知道存在endsWithString对象的方法。真好!:)
Arjun's

我怎么忘了endsWith()?我一直在等待使用它的机会。
毛茸茸的

7

Mathematica,15个字节

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

需要一个字符数组。当输入为空但可忽略时引发错误。


4
很好的发现了===处理空案件的事实:)
格雷格·马丁



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],以*s挽救两个字节每?
MD XF

1
@MDXF,仅适用于C类型数组。
约翰·杜托伊

6

Brachylog,4个字节

h~t?

在线尝试!

说明

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

1
我真的需要四处为输入实现那些约束变量。这意味着我们可以一分为二。

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?
corvus_192

@ corvus_192 Unicode字符可以为1-6个字节。
Khaled.K

两个字符之间的差异最大Charcter.MAX_VALUE - Character.MIN_VALUE为65535
corvus_192

@ corvus_192我知道了,我现在已解决它
Khaled.K

1
@KevinCruijssen最后,s.charAt(l-1)==s.charAt(0)将保存两个字节。
JollyJoker


5

疯子,43字节

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

在线尝试!

说明

主循环是[>[->+<<->],]。每次迭代之后,当前位置右边的单元格是字符串的第一个字节,而左边单元格是最近处理的字符与第一个字符之间的差。 <[[-]-<]如果非零,则将最终结果转换为-1,其余的将-1和0转换为48和49(分别为“ 0”和“ 1”)。


5

Haskell,21个字节

cString并返回Bool

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

在线尝试!

  • 如果不是空字符串,则可能是16个字节c s=s!!0==last s
  • take 1s给出一个列表,仅仅是第一要素s,除非s是空的,在这种情况下它是空的了。
  • last s 会在一个空字符串上出错,但是Haskell的懒惰将其保存:具有单个元素的字符串总是与空字符串不同,而不评估其元素。

5

MATL,5个字节

&=PO)

MATL在线上尝试一下

说明

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

此解决方案只是将a 0放在N x N矩阵的前面,这样对于空输入,当矩阵为时0 x 0,仍然有一个0值,然后由0)

MATL Online上尝试


很聪明的办法!
路易斯·门多

另外5个字节:5L)d~
桑契斯(Sanchises)'17

2
请注意:我的评论和您的答案都不会处理空的输入。评论中对此表示反对(我认为很明确),因此我希望这一要求会改变。但是,就目前情况而言,该条目无效。
桑契斯,

1
(当然,您可以tn?&=PO)}F处理空的输入;不确定是否有更有效的方法)
Sanchises


4

APL(Dyalog),4个字节

⊃⌽=⊃

在线尝试!

说明

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

这是对空字符串起作用的原因。应用于空字符串将返回一个空格。但是反转一个空字符串仍然会返回一个空字符串,因此将一个空字符串与一个非空字符串(在这种情况下)进行比较会得出一个空的数值向量。并应用于空数值向量return 0。因此,传递空字符串将返回0


这实际上是很酷的答案,但是您的解释不正确。(⊃⌽)=⊃或是正确的⊢/=⊃,但没有一个给出正确的结果。而是⌽=⊃将反向字符串与其第一个字符进行比较,然后选择该字符串的第一个元素。如果字符串为空,则最终将一个空格与一个空字符串进行比较,这将给出一个空的布尔值列表,其中的(强制)第一个元素0–正确的答案。您的表达式等同于,⊃⊃=⌽因为它=是可交换的。
阿达姆(Adám)'17

@Adám感谢您帮助我查看解释中的错误。
Kritixi Lithos

别客气。现在,您的注释不正确。⊃⌽=⊃(⊃⌽)=⊃。它比较昂贵,因为它比较所有元素,而不仅仅是第一个和最后一个。另外,如果OP使用数字而不是字符串,那将是行不通的。
阿达姆(Adám)'17

The first argument reversedThe right argument reversed
亚当

您可能还想解释一下为什么对空字符串有效。
阿达姆(Adám)'17

4

Java,52个 43字节

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

要使其工作,请将其输入到使lambda“运行”的函数中,例如以下代码:

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

1
您可以使用s.endsWith(""+s.charAt(0))代替9个字符,而不是s.charAt(0)==s.charAt(s.length()-1)
SpaceBison

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

1
@JollyJoker不起作用:尝试new String()输入lambda。它将引发异常。参考语义在这里不起作用。

2
@KevinCruijssen &&的短路效应对于避免空字符串的charAt(0)上的索引超出范围异常是必要的
PunPun1000

4

Ruby,26个 24字节

感谢@philomory,节省了两个字节!

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

Codegolf上的第一篇文章-))


1
欢迎来到PPCG!
马丁·恩德

1
欢迎来到PPCG!不错的第一场高尔夫球。祝未来好运!
Arjun

1
只需执行即可保存4个字节e[0]&&e[0]==e[-1],因为如果e为空,e[0]则将为nil。实际上,考虑一下,这nil是不好的,因为它是假的,但是比较返回的假不是同一个假。仍然,添加后,!!您仍然保存2个字符。
philomory '17


3

迅捷,57字节

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

编辑了代码。
Leena

欢迎来到PPCG!是否有a.last必要保留空间?
HyperNeutrino

我可以在a.last周围添加括号,也可以在a.last之后添加空格
Leena

3

C#,38 30字节

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

感谢@raznagul,节省了8个字节。


1
无需检查长度,s只需将其与进行比较即可""。另外,您不需要?:-Operator。使用&&具有相同的结果。
raznagul '17

@raznagul好地方,谢谢,我暂时无法检查它是否有效,因此希望它能起作用!也不&会有同样的效果吗?
TheLethalCoder

@TheLeathalCoder:不只是&行不通。与&&所述第二表达未通过验证,如果第一表达式为假。带有&秒的表达式始终被验证,并且IndexOutOfRangeException在空字符串测试用例上失败。
raznagul '17

@raznagul哦,是的...脑子放屁。
TheLethalCoder

也许有点晚了,但是如果您使用s.Last()代替s[s.Length-1]
Bojan B,

3

R,40个字节

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

感谢Nitrodon提供了-2个字节。

感谢-8字节的MickyT。

测试:

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

输出:

> 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
您可以使用删除一组括号rev(y<-el(strsplit(x,"")))==y
Nitrodon

1
也可以使用未命名的函数,因此您可以删除f=
MickyT

1
和charToRaw可用于拆分字符串以进行比较function(x)x>""&&rev(y<-charToRaw(x))==y
MickyT

3

> <>39 33字节

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

这是我第一次使用> <>和打高尔夫球代码,因此将为您提供有益的建议。

该代码分为三个基本部分。

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

你好!欢迎来到PPCG!不错的第一场高尔夫球!祝未来好运!:)
Arjun

3

Google表格,33字节

从单元格获取输入,[A1]并输出1真输入和0假输入。

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

请注意,用户输入公式文字并按Enter离开该单元格后,Google表格会自动更正此括号,Exact(并且Right(不会关闭这些括号。

输出量

GS版


Excel的版本重要吗?在我的2013年副本中,此操作失败,因为您不能那样使用&。同样,它也被认为A=a是正确的。我能得到的最短长度是38个字节:=AND(EXACT(LEFT(A1),RIGHT(A1)),A1<>"")或Alternative =IFERROR(CODE(A1)=CODE(RIGHT(A1)),1=0)
工程师敬酒

我在Excel Online(16.0.9222.5051)中对其TRUE进行了尝试,对于任何非错误输入,它都会返回。(屏幕截图)它适用于所有测试用例吗?由于相同的原因,ExcelGuy 的答案最终会像我上面的一样。
工程师敬酒

1
@EngineerToast你是完全正确的,我应该一直使用它*来代替&二进制和语句,但这仍然留下了"A"="a"我完全忽略的问题。所有这些以及一些语法上的更正使我得出=EXACT(LEFT(A1),RIGHT(A1))*(A1<>"")35,但是我将语言切换到了Google表格,这使我可以在Exact语句中删除终端双括号,并渲染=(A1<>"")*Exact(Left(A1),Right(A133字节
Taylor Scott

3

R, 50 43 41 40 64

第二个解决方案具有41个字节的可调用函数-感谢@ niczky12&@Giuseppe-修改了x =“”

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

首先是50个字节,但不是挑战

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

当字符串为空时,可以替换charToRawutf8ToInt以产生NA
niczky12

您也可以删除{}功能主体周围的花括号。
朱塞佩

我认为(y==rev(y))[1]短了一个字节
朱塞佩

这一挑战,需要只用一个Truthy和一个Falsey价值,但这样会产生NA空字符串,但FALSE"ab"在线尝试!
与Orjan约翰森

@ØrjanJohansen感谢您的评论,所以“ ab”不应该为FALSE吗?
Riccardo Camon '18

2

八度,16字节

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

它以字符串s作为输入,并将第一个s(1)元素与最后一个元素进行比较s(end)

可以@(s)s(1)-s(end)交换true/falsefalse/true


2

GNU grep,12个字节

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

在扩展或PCRE模式下运行。

我不知道这是否被认为是作弊行为。


这可以处理空字符串的情况吗?
拍手

@ConfusedMr_C是的,空字符串⇒代码
1。– eush77

2

JavaScript,20个字节

f=在开始处添加并调用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>

说明

该函数接受一个参数_。在函数体中,_[0]==_.slice(-1)检查_(在0索引处)的第一个元素是否等于其最后一个元素,并返回适当的值truefalse布尔值。



2

Common Lisp,83 74 61 58字节

原始:83个字节

我刚刚开始学习Common Lisp,所以我觉得我正在将推杆带到练习场。我可能没有看到某种可能的递归宏向导或数组操作。

这是一个匿名函数,它接受字符串作为输入:

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

美化:

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

希望看到一个更好的解决方案!

修订版1:74个字节

一定喜欢那些标准的库函数!

丑陋:

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

漂亮:

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

修订1.5:61个字节

空格!

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

修订版2:58个字节

丑陋:

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

漂亮:

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

目前为止就这样了!我想我已经更聪明了。


1
推荐if替代and(mismatch(reverse s)s)取代(mismatch s(reverse s))
ceilingcat

2

AWK,29 34字节

这可能有点作弊,因为它需要使用以下选项来调用AWK:

`-F ''`

在GNU Awk中,您可以使用长格式同义词:

`--field-separator=''`

因此,我在总数中增加了5个字节来解决这个问题。

丑陋:

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

漂亮:

NR == 1
{
    a = $1
}

END
{
    print(a == $NF)
}

1
我相信规则是可以使用标志/选项,但需要在字节数中包括它们。
与Orjan约翰森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.