¿El comienzo es igual al final?

36

La tarea

En este desafío, su tarea es escribir un programa o función que tome una Cadena y genere un valor verdadero o falso en función de si el primer carácter y el último carácter de la Cadena de entrada son iguales.

Entrada

Puede tomar aportes de cualquier manera razonable. Sin embargo, asumir que la entrada está presente en una variable predefinida no está permitido. Se permite leer desde un archivo, consola, línea de comando, campo de entrada, etc., o tomar información como argumento de función.

Salida

Puede imprimir en cualquier formato razonable, excepto para asignar el resultado a una variable. Se permite escribir en un archivo, consola, línea de comando, cuadro modal, returndeclaraciones de funciones , etc.

Reglas Adicionales

  • La entrada también puede ser una cadena vacía, para la cual debe devolver un valor falsey.

  • Las cadenas de entrada de un solo carácter deberían tener un resultado verdadero.

  • Su programa debe ser sensible a mayúsculas y minúsculas. helloHdebería generar un valor de falsey.

  • Solo puede tener un único valor de Verdad y un solo valor de Falsey. Por ejemplo, la salida falsepara una Cadena de entrada y 0para otra Cadena de entrada como valores de Falsey no está permitida.

  • Las lagunas estándar no están permitidas.

Casos de prueba

Input    ->    Output

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

Este es el , por lo que gana el código más corto en bytes.

Arjun
fuente
¿Qué caracteres pueden aparecer en la entrada? ASCII imprimible?
Martin Ender
@MartinEnder ASCII imprimible. Aunque, no creo que importe mucho.
Arjun
Por supuesto que importa. Algunos idiomas no pueden procesar caracteres no ASCII o bytes nulos, y en una expresión regular puedo hacer coincidir cualquier carácter ASCII imprimible ., pero no coincidiría con los avances de línea. En general, si se encuentra utilizando la etiqueta de cadena , especifique exactamente qué caracteres pueden aparecer en la entrada.
Martin Ender
@MartinEnder Está bien. Se encargará en el futuro.
Arjun
Caso de prueba sugerido:AbAb => false
caird coinheringaahing

Respuestas:

17

Python 3 , 23 bytes

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

La salida es a través del código de salida, por lo que 0 (éxito) es verdadero y 1 (fracaso) es falso. Si esto es aceptable, se puede guardar un byte.

Pruébalo en línea!

Cómo funciona

En primer lugar, si s es una cadena vacía, s[0]generará un IndexError , haciendo que el programa falle.

Para que no estén vacíos s , si los caracteres primero y último son iguales, s[0]!=s[-1]se evaluará como falso , por lo que el programa se cierra de forma limpia y de inmediato.

Finalmente, si los caracteres son diferentes, s[0]!=s[-1]se evaluará como Verdadero , haciendo que se realice la comparación s[-1]<e. Como e no está definido, eso genera un NameError .

Si no se desea compatibilidad con Python 2,

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

también funciona, ya que comparar una cadena con un número entero genera un TypeError .

Dennis
fuente
Ahorre 1 byte con lambda
OldBunny2800
1
Sí, una función regular también ahorraría un byte. Si bien la salida a través del código de salida es un consenso establecido, no existe un error / error para una función. He vinculado a la propuesta en mi respuesta.
Dennis
¿Qué pasa con el uso de Python REPL?
OldBunny2800
No creo que eso ayude. Todavía no es un código de salida.
Dennis
9

JavaScript, 19 bytes

a=>a.endsWith(a[0])
Bantha calvo
fuente
Guau. Ni siquiera sabía que existe un endsWithmétodo de objeto String. ¡Agradable! :)
Arjun
¿Cómo me olvidé endsWith()? He estado esperando una oportunidad para usarlo.
Shaggy
7

Mathematica, 15 bytes

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

Toma una gran variedad de caracteres. Lanza errores cuando la entrada está vacía pero puede ignorarse.

JungHwan Min
fuente
44
Buen trabajo al detectar el hecho de que ===maneja el caso vacío :)
Greg Martin
7

05AB1E , 4 bytes

S¬Q¤

Pruébalo en línea! o probar todas las pruebas

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
fuente
1
ÂâćüQpara ser más confuso y ganar un byte!
Urna de pulpo mágico
ćsθQEs otro 4 byter.
Magic Octopus Urn
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);
}

Pruébalo en línea

Johan du Toit
fuente
1
No soy el mejor en C ++ (normalmente uso C), pero ¿podría cambiar las instancias de s[0]a *spara guardar dos bytes cada una?
MD XF
1
@MDXF, eso solo funcionará con matrices de tipo C.
Johan du Toit
6

Brachylog , 4 bytes

h~t?

Pruébalo en línea!

Explicación

h       The head of the Input...
 ~t?    ...is the tail of the Input
Fatalizar
fuente
1
Realmente necesito comenzar a implementar esas variables de restricción para la entrada; eso significaría que podríamos hacer esto en dos.
6

Java, 81 77 bytes

  • -4 bytes, gracias @KevinCruijssen

Probar en línea

boolean f(String s){int l=s.length();return l>0&&s.charAt(l-1)==s.charAt(0);}
  • Devuelve truesi son iguales, de lo contrario false, falsepara una cadena vacía

Versión de matriz, 60 bytes

boolean f(char[]s){int l=s.length;return l>0&&s[0]==s[l-1];}
Khaled.K
fuente
¿Por qué tanto tiempo en lugar de int?
corvus_192
@ corvus_192 un carácter unicode puede tener 1-6 bytes.
Khaled.K
La diferencia entre dos caracteres puede ser como máximo Charcter.MAX_VALUE - Character.MIN_VALUE, que es 65535
corvus_192
@ corvus_192 Ya veo, ya lo arreglé
Khaled.K
1
@KevinCruijssen Para el último, s.charAt(l-1)==s.charAt(0)ahorraría dos bytes.
JollyJoker
5

brainfuck , 43 bytes

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

Pruébalo en línea!

Explicación

El bucle principal es [>[->+<<->],]. Después de cada iteración, la celda a la derecha de la posición actual es el primer byte de la cadena, y la celda a la izquierda es la diferencia entre el carácter manejado más recientemente y el primero. <[[-]-<]convierte el resultado final a -1 si no es cero, y el resto convierte -1 y 0 a 48 y 49 ("0" y "1") respectivamente.

Nitrodon
fuente
5

Haskell , 21 bytes

ctoma a Stringy devuelve a Bool.

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

Pruébalo en línea!

  • Si no fuera por cadenas vacías, esto podría haber sido de 16 bytes con c s=s!!0==last s.
  • take 1sda una lista que es solo el primer elemento de, a smenos que sesté vacío, en cuyo caso también está vacío.
  • last s error en una cadena vacía, pero la pereza de Haskell lo guarda: una cadena con un solo elemento siempre es diferente de la cadena vacía, sin evaluar su elemento.
Ørjan Johansen
fuente
5

MATL, 5 bytes

&=PO)

¡Pruébalo en MATL Online!

Explicación

       % 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

En el caso de que se deba manejar una cadena de entrada vacía, entonces algo como lo siguiente (8 bytes) funcionaría

&=POwhO)

Esta solución simplemente antepone 0a al frente de la matriz N x N de tal manera que para una entrada vacía, cuando la matriz está 0 x 0, todavía hay un 0valor que luego es agarrado por0)

Pruébalo en MATL Online

Suever
fuente
Enfoque muy inteligente!
Luis Mendo
También 5 bytes: 5L)d~.
Sanchises
2
Solo un aviso: ni mi comentario ni su respuesta manejan entradas vacías. Esto se ha argumentado (en mi opinión de manera convincente) en los comentarios, por lo que espero que este requisito cambie. Sin embargo, tal como está, esta entrada no es válida.
Sanchises
1
(por supuesto, podría hacer tn?&=PO)}Ffrente a la entrada vacía; no estoy seguro si hay una manera más eficiente)
Sanchises
4

Japt , 6 bytes

tJ ¥Ug

Pruébalo en línea!

Luke
fuente
Hmm, no funciona para la cadena vacía (debería dar false). Creo que se puede solucionar este problema contJ ¥Ug
ETHproductions
4

APL (Dyalog) , 4 bytes

⊃⌽=⊃

Pruébalo en línea!

Explicación

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

Aquí está la razón por la que esto funciona en cadenas vacías. Aplicar a una cadena vacía devuelve un espacio . Pero invertir una cadena vacía aún devuelve una cadena vacía, por lo que comparar una cadena vacía con una cadena no vacía (en este caso ) da un vector numérico vacío. Y aplicar a un vector numérico vacío devuelve 0. Por lo tanto, pasar una cadena vacía devuelve 0.

Kritixi Lithos
fuente
Esta es una respuesta realmente genial, pero su explicación no es correcta. Sería adecuado para (⊃⌽)=⊃o ⊢/=⊃, pero ninguno de los dos da el resultado correcto. En su lugar, ⌽=⊃compara la cadena invertida con su primer carácter y luego selecciona el primer elemento de ese. Si la cadena está vacía, termina comparando un espacio con una cadena vacía, lo que da una lista booleana vacía, de la cual el primer elemento (forzado) es 0la respuesta correcta para cadenas vacías. Su expresión es equivalente a ⊃⊃=⌽porque =es conmutativa.
Adám
@ Adám Gracias por ayudarme a ver el error en mi explicación.
Kritixi Lithos
De nada. Ahora su nota no es correcta. ⊃⌽=⊃No es lo mismo que (⊃⌽)=⊃. Es más costoso, ya que compara todos los elementos en lugar de solo el primero y el último. Además, no funcionaría si el OP utilizara números en lugar de cadenas.
Adám
The first argument reversedThe right argument reversed
Adám
También puede explicar por qué esto funciona en cadenas vacías.
Adám
4

Java, 52 43 bytes

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

Para que funcione, alimente esto en una función como la siguiente que hace que un lambda "vaya":

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

fuente
1
Puedes eliminar 9 caracteres usando en s.endsWith(""+s.charAt(0))lugar des.charAt(0)==s.charAt(s.length()-1)
SpaceBison
s->""!=s&&s.endsWith(""+s.charAt(0))
JollyJoker
1
@JollyJoker que no funciona: intente alimentar new String()a la lambda. Lanzará una excepción. La semántica de referencia no funciona aquí.
2
@KevinCruijssen El efecto de cortocircuito de && es necesario para evitar una excepción de índice fuera de límites en charAt (0) para una cadena vacía
PunPun1000
4

Ruby, 26 24 bytes

¡ Ahorré dos bytes gracias a @philomory !

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

Primera publicación en codegolf -))

marmeladze
fuente
1
Bienvenido a PPCG!
Martin Ender
1
Bienvenido a PPCG! Bonito primer golf. Buena suerte para el futuro!
Arjun
1
Puede guardar 4 bytes simplemente haciendo e[0]&&e[0]==e[-1], ya que si eestá vacío, e[0]será nulo. En realidad, ahora que lo pienso, nilno es bueno ya que es falsey pero no es el mismo falsey que la comparación regresa; Aún así, después de agregar !!aún está guardando 2 caracteres.
philomory
3

PHP> = 7.1, 23 bytes

imprime 1 para igual y nada si el personaje es diferente

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

Rápido, 57 bytes

var s=readLine()!,a=Array(s.characters);a[0]==a.last ?1:0
Leena
fuente
Editado el código.
Leena
Bienvenido a PPCG! ¿Es a.lastnecesario el espacio después ?
HyperNeutrino
O puedo agregar corchetes alrededor de a.last o puedo agregar espacio después de a.last
Leena
3

C #, 38 30 bytes

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

Guardado 8 bytes gracias a @raznagul.

TheLethalCoder
fuente
1
En lugar de verificar la longitud de ssimplemente compararlo con "". Además, no necesita el ?:operador. Usar &&tiene el mismo resultado.
raznagul
@raznagul Buenos puntos gracias, no puedo comprobar si funciona en este momento, ¡espero que sí! ¿Tampoco tendría &el mismo efecto también?
TheLethalCoder
@TheLeathalCoder: No, simplemente &no funciona. Con &&la segunda expresión no se valida si la primera expresión es falsa. Con &los segundos, la expresión siempre se valida y falla con un IndexOutOfRangeExceptioncaso de prueba de cadena vacía.
raznagul
@raznagul Oh sí ... pedo cerebral.
TheLethalCoder
Tal vez sea un poco tarde, pero puede guardar 5 bytes si lo usa en s.Last()lugar des[s.Length-1]
Bojan B
3

R, 40 bytes

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

Gracias a Nitrodon por -2 bytes.

Gracias a MickyT por -8 bytes.

Prueba:

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

Salida:

> 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
fuente
2
Puede eliminar un conjunto de paréntesis con rev(y<-el(strsplit(x,"")))==y.
Nitrodon
1
también son aceptables funciones sin nombre, por lo que puede eliminar elf=
MickyT
1
y charToRaw se puede usar para dividir la cadena para la comparaciónfunction(x)x>""&&rev(y<-charToRaw(x))==y
MickyT
3

> <> , 39 33 bytes

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

Esta es mi primera vez usando> <> y jugando al golf de código, por lo que agradecería sugerencias útiles.

El código está en tres secciones 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
fuente
¡Hola! Bienvenido a PPCG! Bonito primer golf! Buena suerte para el futuro! :)
Arjun
3

Hojas de cálculo de Google, 33 bytes

Toma la entrada de la celda [A1]y las salidas 1para la entrada veraz y 0para la entrada falsey.

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

Se observa que los paréntesis en Exact(yRight( se dejan sin cerrar ya que Google Sheets corrige esto automáticamente tan pronto como el usuario ingresa el texto de la fórmula y presiona Enter para salir de esa celda.

Salida

Versión GS

Taylor Scott
fuente
¿Importa la versión de Excel? En mi copia de 2013, esto falla porque no se puede usar &así. Además, se considera A=acierto. Lo más corto que puedo obtener es 38 bytes: =AND(EXACT(LEFT(A1),RIGHT(A1)),A1<>"")o la alternativa =IFERROR(CODE(A1)=CODE(RIGHT(A1)),1=0).
Engineer Toast
Lo he probado en Excel Online (16.0.9222.5051) y vuelve TRUEpara cualquier entrada no error. ( captura de pantalla ) ¿Funciona en su copia para todos los casos de prueba? ExcelGuy tiene una respuesta que termina como la mía anterior por las mismas razones.
Engineer Toast
1
@EngineerToast tiene toda la razón, debería haber estado usando en su *lugar &para el binario y la declaración, pero eso todavía deja el "A"="a"problema, que había pasado por alto por completo. Todo eso y un poco de correcciones de sintaxis me llevan a =EXACT(LEFT(A1),RIGHT(A1))*(A1<>"")35, pero he cambiado el idioma a Hojas de cálculo de Google, lo que me permitió colocar el terminal doble entre paréntesis en la Exactdeclaración, lo que representa =(A1<>"")*Exact(Left(A1),Right(A133 bytes
Taylor Scott
3

R 50 43 41 40 64

Segunda solución con 41 bytes para una función invocable, gracias a @ niczky12 y @Giuseppe, modificada para x = ""

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

Primero con 50 bytes pero no para el desafío

function(x){charToRaw(x)[1]==rev(charToRaw(x))[1]}
Riccardo Camon
fuente
Puede reemplazar charToRawcon utf8ToIntpara producir NAs cuando la cadena está vacía.
niczky12 27/0318
También puede eliminar las llaves {}alrededor del cuerpo de la función.
Giuseppe
Creo que (y==rev(y))[1]es más corto por un byte
Giuseppe
Este desafío requiere el uso de un solo valor de Verdad y uno de Falsey, pero esto produce NApara una cadena vacía, pero FALSEpara "ab". Pruébalo en línea! .
Ørjan Johansen
@ ØrjanJohansen gracias por tu comentario, así que "ab" no debería dar FALSO?
Riccardo Camon
2

Octava, 16 bytes

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

Toma una cadena scomo entrada y compara el primer s(1)elemento con el último s(end).

Esto podría ser @(s)s(1)-s(end)si estaba bien de intercambio true/falsea false/true.

Stewie Griffin
fuente
2

GNU grep , 12 bytes

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

Ejecutar en modo extendido o PCRE.

No sé si esto se considera trampa o no.

eush77
fuente
¿Esto maneja el caso de cadena vacía?
aplauso
@ConfusedMr_C Sí, cadena vacía ⇒ código 1.
eush77
2

JavaScript, 20 bytes

Agregue f=al principio e invoque como f(arg).

_=>_[0]==_.slice(-1)

f=_=>_[0]==_.slice(-1)

i.oninput = e => o.innerHTML = f(i.value);
<input id=i><pre id=o></pre>

Explicación

Esta función toma un argumento _. En el cuerpo de la función, _[0]==_.slice(-1)verifica si el primer elemento de _(en el 0índice th) es igual al último elemento del mismo y devuelve el apropiado trueo falsebooleano.

Arjun
fuente
2

Lisp común, 83 74 61 58 bytes

Original: 83 bytes

Acabo de comenzar a aprender Common Lisp, así que siento que estoy llevando un putter a un campo de prácticas. Debe haber algún tipo de macroasistencia recursiva o manipulación de matriz posible aquí que no estoy viendo.

Esta es una función anónima que acepta una cadena como entrada:

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

¡Me encantaría ver una solución más elegante!

Revisión 1: 74 bytes

¡Tengo que amar esas funciones de biblioteca estándar!

Feo:

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

Revisión 1.5: 61 bytes

Espacios en blanco!

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

Revisión 2: 58 bytes

Feo:

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

Bonita:

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

¡Eso es todo por ahora! Creo que ya soy más inteligente.

Shadowtalker
fuente
1
Sugerir en iflugar de andy en (mismatch(reverse s)s)lugar de(mismatch s(reverse s))
ceilingcat
2

AWK, 29 34 bytes

Este podría estar engañando un poco, porque requiere invocar AWK con la opción:

`-F ''`

En GNU Awk puedes usar los sinónimos de forma larga:

`--field-separator=''`

Así que agregué 5 bytes al total para dar cuenta de esto.

Feo:

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

Bonita:

NR == 1
{
    a = $1
}

END
{
    print(a == $NF)
}
Shadowtalker
fuente
1
Creo que la regla es que puede usar indicadores / opciones, pero debe incluirlos en el recuento de bytes.
Ørjan Johansen