Старт равен концу?


36

Задание

В этой задаче ваша задача состоит в том, чтобы написать программу или функцию, которая принимает строку и выводит истинное или ошибочное значение в зависимости от того, равны ли первый символ и последний символ входной строки.

вход

Вы можете принять участие любым разумным способом. Однако предполагать, что входные данные присутствуют в предопределенной переменной, не разрешено. Допускается чтение из файла, консоли, командной строки, поля ввода и т. Д. Или использование ввода в качестве аргумента функции.

Выход

Вы можете выводить данные в любом приемлемом формате, кроме присвоения результата переменной. Запись в файл, консоль, командную строку, модальное поле, returnоператоры функций и т. Д. Разрешена.

Дополнительные правила

  • Ввод также может быть пустой строкой, для которой вы должны вернуть значение Falsey.

  • Строки ввода с одним символом должны иметь достоверный результат.

  • Ваша программа должна быть чувствительной к регистру. helloHдолжен вывести значение фальси.

  • Вы можете иметь только одно значение 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
Caird Coneheringaahing

Ответы:



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 .


Сохранить 1 байт с лямбда
OldBunny2800

1
Да, обычная функция также сохранит байт. Хотя вывод через код завершения является установленным консенсусом, отсутствие ошибок / ошибок для функции не является, хотя. Я связался с предложением в моем ответе.
Деннис

Как насчет использования Python REPL?
OldBunny2800

Я не думаю, что это помогает. Это все еще не код выхода.
Деннис

9

JavaScript, 19 байт

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

Вау. Я даже не знал, что существует endsWithметод объекта String. Ницца! :)
Арджун

Как я забыл про endsWith()?! Я ждал возможности использовать его.
Лохматый

7

Mathematica, 15 байт

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

Принимает массив символов. Выдает ошибки, когда ввод пуст, но может быть проигнорирован.


4
Хорошая работа, обнаружив тот факт, что ===обрабатывает пустой случай :)
Грег Мартин

7

05AB1E , 4 байта

S¬Q¤

Попробуйте онлайн! или попробуйте все тесты

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

1
ÂâćüQбыть более запутанным и получить байт!
Волшебная Урна Осьминога

ćsθQэто еще 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

Брахилог , 4 байта

h~t?

Попробуйте онлайн!

объяснение

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

1
Мне действительно нужно вернуться к реализации этих переменных ограничения для ввода; это означало бы, что мы сможем сделать это в два раза.

6

Ява, 81 77 байт

  • -4 байта, спасибо @KevinCruijssen

Попробуйте онлайн

boolean f(String s){int l=s.length();return l>0&&s.charAt(l-1)==s.charAt(0);}
  • Возвращает , trueесли они равны, в противном случае false, falseдля пустой строки

Версия массива, 60 байт

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

Почему долго вместо int?
corvus_192

@ corvus_192 символ Юникода может быть 1-6 байтов.
Халед

Разница между двумя символами может быть не более Charcter.MAX_VALUE - Character.MIN_VALUE65535
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 байт

cпринимает Stringи возвращает Bool.

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

Попробуйте онлайн!

  • Если бы не пустые строки, это могло бы быть 16 байтов с c s=s!!0==last s.
  • take 1sдает список, который является только первым элементом, sесли не sявляется пустым, в этом случае это также пустой.
  • last s выдает ошибку в пустой строке, но лень Хаскелла сохраняет ее: строка с одним элементом всегда отличается от пустой строки без оценки ее элемента.

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)

Это решение просто добавляет a 0к передней части матрицы N x N, так что для пустого ввода, когда матрица есть 0 x 0, все еще есть 0значение, которое затем захватывается0)

Попробуйте это на MATL Online


Очень умный подход!
Луис Мендо

Также 5 байт: 5L)d~.
Санчизес

2
Просто один на один: ни мой комментарий, ни ваш ответ не обрабатывают пустой ввод. Это (на мой взгляд, убедительно) оспаривалось в комментариях, поэтому я ожидаю, что это требование изменится. Однако, как она есть, эта запись недействительна.
Sanchises

1
(конечно, вы могли tn?&=PO)}Fбы справиться с пустым вводом; не уверен, есть ли более эффективный способ)
Санчизес


4

APL (Дьялог) , 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.

Вот причина, по которой это работает на пустых строках. Применение к пустой строке возвращает пробел . Но обращение пустой строки по-прежнему возвращает пустую строку, поэтому сравнение пустой строки с непустой строкой (в данном случае ) дает пустой числовой вектор. И применение к пустому числовому вектору возвращает 0. Следовательно, передача пустой строки возвращает 0.


На самом деле это действительно крутой ответ, но ваше объяснение неверно. Это было бы правильно для (⊃⌽)=⊃или ⊢/=⊃, но ни один из них не дает правильный результат. Вместо этого ⌽=⊃сравнивает обратную строку со своим первым символом, а затем выбирает первый элемент этого. Если строка пуста, она заканчивает тем , что сравнение пространства в пустую строку, которая дает пустой булеву список, из которого (принуждать) первый элемент является 0- правильным ответом для пустых строк. Ваше выражение эквивалентно, ⊃⊃=⌽потому что =является коммутативным.
Адам

@ Adám Спасибо, что помогли мне увидеть ошибку в моем объяснении.
Kritixi Lithos

Пожалуйста. Теперь ваша заметка не верна. ⊃⌽=⊃это не то же самое, что (⊃⌽)=⊃. Это дороже, так как сравнивает все элементы, а не только первый и последний. Также это не сработало бы, если бы в OP использовались числа вместо строк.
Адам

The first argument reversedThe right argument reversed
Адам

Вы также можете объяснить, почему это работает с пустыми строками.
Адам

4

Java, 52 43 байта

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

Чтобы заставить это работать, вставьте это в функцию, такую ​​как следующее, которая заставляет лямбду "идти":

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

1
Вы можете сбрить 9 символов, используя s.endsWith(""+s.charAt(0))вместоs.charAt(0)==s.charAt(s.length()-1)
SpaceBison

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

1
@JollyJoker, который не работает: попробуйте кормить new String()в лямбду. Это бросит исключение. Ссылочная семантика здесь не работает.

2
@KevinCruijssen Эффект короткого замыкания && необходим, чтобы исключить исключение индекса вне границ для charAt (0) для пустой строки
PunPun1000

4

Рубин, 26 24 байта

Сохранено два байта благодаря @philomory !

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

Первый пост на Codegolf -))


1
Добро пожаловать в PPCG!
Мартин Эндер

1
Добро пожаловать в PPCG! Хороший первый гольф. Удачи в будущем!
Арджун

1
Вы можете сохранить 4 байта, просто сделав e[0]&&e[0]==e[-1], так как если eпусто, e[0]будет ноль. На самом деле, если подумать, nilэто не хорошо, так как это ложь, но не та ложь, которую возвращает сравнение; Тем не менее, после добавления !!вы все еще сохраняете 2 символа.
филомория


3

Swift, 57 байт

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

Отредактировал код.
Лина

Добро пожаловать в PPCG! Место после a.lastнеобходимого?
HyperNeutrino

Либо я могу добавить скобки вокруг a.last, либо я могу добавить пробел после a.last
Leena

3

C #, 38 30 байт

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

Сохранено 8 байтов благодаря @raznagul.


1
Вместо проверки длины sпросто сравните это с "". Также вам не нужен ?:оператор. Использование &&имеет тот же результат.
Разнагул

@raznagul Хорошие места, спасибо, я не могу проверить, работает ли он в данный момент, так что, надеюсь, это работает! Также не будет &иметь такой же эффект тоже?
TheLethalCoder

@TheLeathalCoder: Нет, просто &не работает. Со &&вторым выражением не проверяется, если первое выражение ложно. С &секундами выражение всегда проверяется и завершается неудачно с IndexOutOfRangeExceptionпустой строкой теста.
Разнагул

@raznagul Ах да ... мозги пердеть.
TheLethalCoder

Возможно, уже немного поздно, но вы можете сэкономить 5 байт, если используете s.Last()вместо этогоs[s.Length-1]
Bojan B

3

R, 40 байт

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

Спасибо Нитродону за -2 байта.

Спасибо MickyT за -8 байт.

Тест:

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.
Нитродон

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! Хороший первый гольф! Удачи в будущем! :)
Арджун

3

Google Sheets, 33 байта

Принимает входные данные от ячейки [A1]и выходные данные 1для правдивого ввода и 0для фальсификации

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

Следует отметить, что круглые скобки в Exact(и Right(остаются незакрытыми, поскольку Google Sheets автоматически исправляет это, как только пользователь вводит текст формулы и нажимает клавишу ввода, чтобы покинуть эту ячейку.

Выход

GS версия


Имеет ли значение версия Excel? В моей копии 2013 года это терпит неудачу, потому что вы не можете так использовать &. Кроме того, он считает, A=aчто это правда. Самое короткое, что я могу получить - 38 байтов: =AND(EXACT(LEFT(A1),RIGHT(A1)),A1<>"")или альтернатива =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 Sheets, что позволило мне отбросить в Exactвыражении двойную скобку в терминале , отрисовывая =(A1<>"")*Exact(Left(A1),Right(A133 байта
Тейлор Скотт,

3

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

Вы можете заменить charToRawна, utf8ToIntчтобы произвести NAs, когда строка пуста.
niczky12

Вы также можете удалить фигурные скобки {}вокруг тела функции.
Джузеппе

Я думаю, что (y==rev(y))[1]короче на байт
Джузеппе

Эта задача требует использования только одного значения Truthy и одного значения Falsey, но это приводит NAк пустой строке, но FALSEдля "ab". Попробуйте онлайн! ,
Орджан Йохансен,

@ ØrjanJohansen спасибо за ваш комментарий, так что "ab" не должно давать FALSE?
Риккардо Камон

2

Октава, 16 байт

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

Он принимает строку в sкачестве входных данных и сравнивает первый s(1)элемент с последним s(end).

Это может быть , @(s)s(1)-s(end)если это было в порядке , чтобы поменять true/falseна false/true.


2

GNU grep , 12 байт

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

Запустите в расширенном или PCRE режиме.

Я не знаю, считается ли это обманом или нет.


Это обрабатывает случай пустой строки?
хлопните

@ConfusedMr_C Да, пустая строка ⇒ код 1.
eush77

2

JavaScript, 20 байт

Добавить f=в начале и вызвать как 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индексу th) его последнему элементу, и возвращает соответствующий trueили falseлогический.



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

Prettified:

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

Хотелось бы увидеть решение Slicker!

Редакция 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))
потолок кошка

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
Я считаю, что правило заключается в том, что вы можете использовать флаги / опции, но вам нужно включить их в число байтов.
Орджан Йохансен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.