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!


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 .


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

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.


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



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


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

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];}

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 #


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.


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.

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


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

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.


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

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


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];

3

Rápido, 57 bytes

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

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.


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

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

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


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

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.


2

GNU grep , 12 bytes

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

Execute no modo estendido ou PCRE.

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


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.



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.


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

1
Acredito que a regra é que você pode usar sinalizadores / opções, mas precisa incluí-los na contagem de bytes.
Ørjan Johansen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.