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


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


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

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.


44
Buen trabajo al detectar el hecho de que ===maneja el caso vacío :)
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);
}

Pruébalo en línea


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

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

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


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.

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


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

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.


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

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


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

3

Rápido, 57 bytes

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

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.


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

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

¡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


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

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.


2

GNU grep , 12 bytes

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

Ejecutar en modo extendido o PCRE.

No sé si esto se considera trampa o no.


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



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.


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

1
Creo que la regla es que puede usar indicadores / opciones, pero debe incluirlos en el recuento de bytes.
Ørjan Johansen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.