O começo é igual ao fim?

36

A tarefa

Nesse desafio, sua tarefa é escrever um programa ou função que recebe uma String e gera um valor de verdade ou falsey com base em se o primeiro caractere e o último caractere da String de entrada são iguais.

Entrada

Você pode receber sugestões de qualquer maneira razoável. No entanto, supondo que a entrada esteja presente em uma variável predefinida não é permitido. É permitida a leitura de um arquivo, console, linha de comando, campo de entrada etc. ou a entrada como argumento de função.

Saída

Você pode produzir em qualquer formato razoável, exceto para atribuir o resultado a uma variável. A gravação em um arquivo, console, linha de comando, caixa modal, returninstruções de função etc. é permitida.

Regras adicionais

  • A entrada também pode ser String vazia, para a qual você deve retornar um valor falsey.

  • As seqüências de entrada de caractere único devem ter um resultado verdadeiro.

  • Seu programa deve fazer distinção entre maiúsculas e minúsculas. helloHdeve gerar um valor de falsey.

  • Você pode ter apenas um único valor Truthy e um único valor Falsey. Por exemplo, a saída falsepara uma String de entrada e 0para outra String de entrada como valores Falsey não é permitida.

  • As brechas padrão não são permitidas.

Casos de teste

Input    ->    Output

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

Isso é , então o código mais curto em bytes vence!

Arjun
fonte
Quais caracteres podem aparecer na entrada? ASCII imprimível?
Martin Ender
@MartinEnder ASCII imprimível. Embora eu não ache que isso importe muito.
Arjun #
Claro que isso importa. Alguns idiomas não podem processar caracteres não ASCII ou bytes nulos, e em um regex eu posso combinar qualquer caractere ASCII imprimível ., mas não corresponderia a feeds de linha. Em geral, se você estiver usando a tag string , especifique exatamente quais caracteres podem aparecer na entrada.
Martin Ender
@MartinEnder Okay. Cuidará no futuro.
Arjun #
Caso de teste sugerido:AbAb => false
caird coinheringaahing

Respostas:

17

Python 3 , 23 bytes

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

A saída é via código de saída, então 0 (sucesso) é verdadeiro e 1 (falha) é falso. Se isso for aceitável, um byte pode ser salvo.

Experimente online!

Como funciona

Primeiro, se s for uma string vazia, s[0]irá gerar um IndexError , causando falha no programa.

Para s não vazios , se o primeiro e o último caracteres forem iguais, s[0]!=s[-1]serão avaliados como Falso , para que o programa saia limpa e imediatamente.

Por fim, se os caracteres forem diferentes, ele s[0]!=s[-1]será avaliado como True , fazendo com que o compairson s[-1]<eseja executado. Como e é indefinido, isso gera uma NameError .

Se a compatibilidade com o Python 2 não for desejada,

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

também funciona, pois comparar uma string com um número inteiro gera um TypeError .

Dennis
fonte
Guardar 1 byte com lambda
OldBunny2800
1
Sim, uma função regular também salvaria um byte. Embora a saída via código de saída seja um consenso estabelecido, não há erro / erro para uma função. Eu vinculei à proposta na minha resposta.
Dennis
Que tal usar o Python REPL?
OldBunny2800
Eu não acho que isso ajude. Ainda não é um código de saída.
Dennis #
9

JavaScript, 19 bytes

a=>a.endsWith(a[0])
Bald Bantha
fonte
Uau. Eu nem sabia que existe um endsWithmétodo de objeto String. Agradável! :)
Arjun
Como eu esqueci endsWith()?! Eu estava esperando por uma oportunidade de usá-lo.
Shaggy
7

Mathematica, 15 bytes

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

Toma uma matriz de caracteres. Lança erros quando a entrada está vazia, mas pode ser ignorada.

JungHwan Min
fonte
4
Bom trabalho manchar o fato de que ===trata o caso vazio :)
Greg Martin
7

05AB1E , 4 bytes

S¬Q¤

Experimente online! ou Experimente todos os testes

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
Riley
fonte
1
ÂâćüQpara ser mais confuso e ganhar um byte!
Magic Octopus Urn
ćsθQé outro 4-byter.
Magic Octopus Urn
7

Retina , 13 12 bytes

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

Experimente online! Inclui suíte de teste. Editar: salvou 1 byte graças a @Kobi.

Neil
fonte
7

C ++, 39 bytes

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

Programas completos:

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

Experimente online

Johan du Toit
fonte
1
Eu não sou o melhor em C ++ (eu normalmente usar C), mas você pode mudar as instâncias de s[0]que *spara salvar dois bytes cada um?
MD XF
1
@MDXF, que funcionará apenas com matrizes do tipo C.
Johan du Toit
6

Braquilog , 4 bytes

h~t?

Experimente online!

Explicação

h       The head of the Input...
 ~t?    ...is the tail of the Input
Fatalizar
fonte
1
Eu realmente preciso começar a implementar essas variáveis ​​de restrição para a entrada; isso significaria que poderíamos fazer isso em dois.
6

Java, 81 77 bytes

  • -4 bytes, obrigado @KevinCruijssen

Experimente on-line

boolean f(String s){int l=s.length();return l>0&&s.charAt(l-1)==s.charAt(0);}
  • Retorna truese eles são iguais, caso contrário false, falsepara cadeia vazia

Versão da matriz, 60 bytes

boolean f(char[]s){int l=s.length;return l>0&&s[0]==s[l-1];}
Khaled.K
fonte
Por que tempo em vez de int?
Corvus_192 14/05
@ corvus_192 um caractere unicode pode ter de 1 a 6 bytes.
Khaled.K
A diferença entre os dois caracteres pode ser, no máximo Charcter.MAX_VALUE - Character.MIN_VALUE, o que é 65535
corvus_192
@ corvus_192 eu vejo, eu fixa-lo agora
Khaled.K
1
@KevinCruijssen Por último, s.charAt(l-1)==s.charAt(0)salvaria dois bytes.
JollyJoker #
6

Python 2 , 26 25 24 bytes

Obrigado a @Dennis por salvar um byte!

lambda x:""<x[:1]==x[-1]

Experimente online!

Adnan
fonte
5

brainfuck , 43 bytes

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

Experimente online!

Explicação

O loop principal é [>[->+<<->],]. Após cada iteração, a célula à direita da posição atual é o primeiro byte da string e a célula à esquerda é a diferença entre o caractere manipulado mais recentemente e o primeiro. <[[-]-<]converte o resultado final em -1 se diferente de zero e o restante converte -1 e 0 em 48 e 49 ("0" e "1"), respectivamente.

Nitrodon
fonte
5

Haskell , 21 bytes

cpega a Stringe retorna a Bool.

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

Experimente online!

  • Se não fosse por cadeias vazias, isso poderia ter sido 16 bytes com c s=s!!0==last s.
  • take 1sfornece uma lista que é apenas o primeiro elemento de, a smenos que sesteja vazio; nesse caso, também está vazio.
  • last s iria errar uma string vazia, mas a preguiça de Haskell a salvaria: uma string com um único elemento é sempre diferente da string vazia, sem avaliar seu elemento.
Ørjan Johansen
fonte
5

MATL, 5 bytes

&=PO)

Experimente no MATL Online!

Explicação

       % 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

No caso, que uma string de entrada vazia deve ser manipulada, algo como o seguinte (8 bytes) funcionaria

&=POwhO)

Essa solução simplesmente anexa 0a à frente da matriz N x N, de modo que, para uma entrada vazia, quando a matriz está 0 x 0, ainda existe uma0 valor que é então capturado por0)

Experimente no MATL Online

Suever
fonte
Abordagem muito inteligente!
Luis Mendo
Também cinco bytes: 5L)d~.
Sanchises
2
Apenas um alerta: nem meu comentário nem sua resposta lidam com entradas vazias. Isso (na minha opinião, de forma convincente) foi discutido nos comentários, por isso espero que esse requisito mude. No entanto, como está, esta entrada é inválida.
Sanchises
1
(claro, você poderia fazer tn?&=PO)}Fpara lidar com entrada vazia; não tenho certeza se existe uma maneira mais eficiente)
Sanchises
4

Japonês , 6 bytes

tJ ¥Ug

Experimente online!

Luke
fonte
Hmm, não funciona para a string vazia (deve dar false). Eu acho que você pode consertar isso comtJ ¥Ug
ETHproductions
4

APL (Dyalog) , 4 bytes

⊃⌽=⊃

Experimente online!

Explicação

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

Aqui está a razão pela qual isso funciona em cadeias vazias. A aplicação a uma sequência vazia retorna um espaço . Mas a reversão de uma string vazia ainda retorna uma string vazia, portanto, comparar uma string vazia com uma string não vazia (nesse caso ) fornece um vetor numérico vazio. E a aplicação a um vetor numérico vazio retorna 0. Portanto, a passagem de uma string vazia retorna 0.

Kritixi Lithos
fonte
Esta é realmente uma resposta muito legal, mas sua explicação não está certa. Seria certo para (⊃⌽)=⊃ou ⊢/=⊃, mas nenhum deles dá o resultado certo. Em vez disso, ⌽=⊃compara a sequência invertida com seu primeiro caractere e, em seguida, escolhe o primeiro elemento disso. Se a string estiver vazia, ela acaba comparando um espaço com uma string vazia, o que fornece uma lista booleana vazia, da qual o primeiro elemento (coagido) é 0- a resposta correta para as strings vazias. Sua expressão é equivalente a ⊃⊃=⌽porque =é comutativa.
Adám 15/05/19
@ Adám Obrigado por me ajudar a ver o erro na minha explicação.
Kritixi Lithos
De nada. Agora sua nota não está correta. ⊃⌽=⊃não é o mesmo que (⊃⌽)=⊃. É mais caro, pois compara todos os elementos em vez de apenas o primeiro e o último. Também não funcionaria se o OP tivesse usado números em vez de strings.
Adám 15/05/19
The first argument reversedThe right argument reversed
Adám
Você também pode explicar por que isso funciona em cadeias vazias.
Adám 15/05/19
4

Java, 52 43 bytes

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

Para fazê-lo funcionar, alimente isso em uma função como a seguinte que faz um lambda "ir":

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

fonte
1
Você pode raspar 9 caracteres usando s.endsWith(""+s.charAt(0))em vez des.charAt(0)==s.charAt(s.length()-1)
SpaceBison
s->""!=s&&s.endsWith(""+s.charAt(0))
JollyJoker #
1
@ JollyJoker que não funciona: tente alimentar new String()o lambda. Isso lançará uma exceção. A semântica de referência não funciona aqui.
2
@KevinCruijssen O efeito de curto-circuito do && é necessário para evitar um índice fora dos limites excepção no charAt (0) para uma cadeia vazia
PunPun1000
4

Ruby, 26 24 bytes

Guardado dois bytes graças a @philomory !

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

Primeiro post no codegolf -))

marmeladze
fonte
1
Bem-vindo ao PPCG!
Martin Ender
1
Bem-vindo ao PPCG! Bom primeiro golfe. Boa sorte para o futuro!
Arjun 15/05
1
Você pode salvar 4 bytes apenas fazendo e[0]&&e[0]==e[-1], pois se eestiver vazio, e[0]será nulo. Na verdade, pense bem, nilnão é bom, pois é falsey, mas não é o mesmo falsey que a comparação retorna; Ainda assim, depois de adicionar, !!você ainda está salvando 2 caracteres.
Philomory # 16/17
3

PHP> = 7.1, 23 bytes

imprime 1 para igual e nada se o caractere for diferente

<?=$argn[0]==$argn[-1];
Jörg Hülsermann
fonte
3

Rápido, 57 bytes

var s=readLine()!,a=Array(s.characters);a[0]==a.last ?1:0
Leena
fonte
Editou o código.
Leena 14/05
Bem-vindo ao PPCG! É o espaço depoisa.last necessário ?
HyperNeutrino
Ou posso adicionar suportes em torno a.last ou posso adicionar espaço após a.last
Leena
3

C #, 38 bytes 30

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

Guardado 8 bytes graças a @raznagul.

TheLethalCoder
fonte
1
Em vez de verificar o tamanho, sbasta compará-lo com "". Além disso, você não precisa do ?:operador. Usar &&tem o mesmo resultado.
raznagul
@raznagul Bons pontos, obrigado, não posso verificar se funciona no momento, então espero que funcione! Também não &teria o mesmo efeito também?
TheLethalCoder
@TheLeathalCoder: Não, simplesmente &não funciona. Com &&a segunda expressão, não é validado se a primeira expressão for falsa. Com &os segundos, a expressão é sempre validada e falha com um IndexOutOfRangeExceptioncaso de teste de cadeia vazia.
raznagul
@raznagul Oh sim ... peido cerebral.
TheLethalCoder
Talvez seja um pouco tarde, mas você pode salvar 5 bytes se usar s.Last() em vez des[s.Length-1]
Bojan B
3

R, 40 bytes

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

Obrigado ao Nitrodon por -2 bytes.

Graças ao MickyT por -8 bytes.

Teste:

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

Saída:

> 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
djhurio
fonte
2
Você pode remover um conjunto de parênteses com rev(y<-el(strsplit(x,"")))==y.
Nitrodon
1
também funciona sem nome são aceitáveis, para que possa remover of=
MickyT
1
e charToRaw podem ser usados ​​para dividir a cadeia de caracteres de comparaçãofunction(x)x>""&&rev(y<-charToRaw(x))==y
MickyT 15/17
3

> <> , 39 33 bytes

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

Esta é a minha primeira vez, usando> <> e jogando código-golfe, portanto, sugestões úteis serão apreciadas.

O código está em três seções básicas.

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
AGourd
fonte
Olá! Bem-vindo ao PPCG! Bom primeiro golfe! Boa sorte para o futuro! :)
Arjun
3

Planilhas Google, 33 bytes

Recebe entrada da célula [A1]e saídas 1para entrada 0de verdade e para entrada de falsey.

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

Note-se que os parênteses em Exact(eRight( são deixados unclosed como Google Sheets corrige automaticamente este assim que o usuário insere o texto da fórmula e pressionou entrar para deixar essa célula.

Saída

Versão GS

Taylor Scott
fonte
A versão do Excel importa? Na minha cópia de 2013, isso falha porque você não pode usar &assim. Além disso, considera A=aser verdade. O menor que consigo é 38 bytes: =AND(EXACT(LEFT(A1),RIGHT(A1)),A1<>"")ou a alternativa =IFERROR(CODE(A1)=CODE(RIGHT(A1)),1=0).
Engenheiro Toast
Eu tentei no Excel Online (16.0.9222.5051) e ele retorna TRUEpara qualquer entrada sem erro. ( captura de tela ) Ele funciona na sua cópia para todos os casos de teste? O ExcelGuy tem uma resposta que acaba como a minha pelas mesmas razões.
Engenheiro Toast
1
@EngineerToast você está completamente correto, eu deveria estar usando * em vez &do binário e afirmação, mas isso ainda deixa a "A"="a"questão, que eu tinha completamente esquecido. Tudo isso e um pouco de correções de sintaxe me leva a =EXACT(LEFT(A1),RIGHT(A1))*(A1<>"")35, mas eu mudei a linguagem de planilhas do Google, o que me permitiu soltar o parenthetical dupla terminal na Exactdeclaração, tornando =(A1<>"")*Exact(Left(A1),Right(A1por 33 bytes
Taylor Scott
3

R, 50. 43 41 40. 64

Segunda solução com 41 bytes para uma função que pode ser chamada - graças a @ niczky12 e @Giuseppe - alterada para x = ""

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

Primeiro com 50 bytes, mas não para o desafio

function(x){charToRaw(x)[1]==rev(charToRaw(x))[1]}
Riccardo Camon
fonte
Você pode substituir charToRawpor utf8ToIntpara produzir NAs quando a sequência estiver vazia.
niczky12
Você também pode remover as chaves {}ao redor do corpo da função.
Giuseppe
Eu acho que (y==rev(y))[1]é mais curto por um byte
Giuseppe
Este desafio requer o uso de apenas um Truthy e um valor Falsey, mas esta produz NApara cadeia vazia, mas FALSEpara "ab". Experimente online! .
Ørjan Johansen
@ ØrjanJohansen obrigado pelo seu comentário, então "ab" não deve dar FALSO?
Riccardo Camon 28/03
2

Oitava, 16 bytes

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

Ele pega uma string scomo entrada e compara o primeiro s(1)elemento com o último s(end).

Esta poderia ser @(s)s(1)-s(end)se era OK para trocar true/falsea false/true.

Stewie Griffin
fonte
2

GNU grep , 12 bytes

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

Execute no modo estendido ou PCRE.

Não sei se isso é considerado trapaça ou não.

eush77
fonte
Isso lida com o caso de cadeia vazia?
clap
@ConfusedMr_C Yep, string vazia ⇒ código 1.
eush77
2

JavaScript, 20 bytes

Adicione f=no início e chame 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>

Explicação

Esta função recebe um argumento _. No corpo da função, _[0]==_.slice(-1)verifica se o primeiro elemento de _(no 0índice th) é igual ao último elemento e retorna o apropriado trueou falsebooleano.

Arjun
fonte
2

Lisp comum, 83 74 61 58 bytes

Original: 83 bytes

Eu comecei a aprender Common Lisp, então sinto que estou trazendo um taco para um driving range. Deve haver algum tipo de magia de macro recursiva ou manipulação de matriz possível aqui que não estou vendo.

Esta é uma função anônima que aceita uma string como entrada:

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

Pré-especificado:

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

Gostaria de ver uma solução mais lisa!

Revisão 1: 74 bytes

Conseguiu amar essas funções padrão da biblioteca!

Feio:

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

Bonita:

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

Revisão 1.5: 61 bytes

Espaço em branco!

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

Revisão 2: 58 bytes

Feio:

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

Bonita:

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

É tudo por agora! Eu acho que já sou mais inteligente.

shadowtalker
fonte
1
Sugerir em ifvez de ande em (mismatch(reverse s)s)vez de(mismatch s(reverse s))
tetocat 27/03
2

AWK, 29 34 bytes

Este pode estar trapaceando um pouco, porque requer chamar o AWK com a opção:

`-F ''`

No GNU Awk, você pode usar os sinônimos de formato longo:

`--field-separator=''`

Então eu adicionei 5 bytes ao total para explicar isso.

Feio:

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

Bonita:

NR == 1
{
    a = $1
}

END
{
    print(a == $NF)
}
shadowtalker
fonte
1
Acredito que a regra é que você pode usar sinalizadores / opções, mas precisa incluí-los na contagem de bytes.
Ørjan Johansen