¿El enésimo carácter es igual al enésimo del último carácter?


22

Inspirado por ¿El comienzo es igual al final?

Dada una cadena sy un número entero n, genera una verdad / falsa en cuanto a si el nth char en ses igual al nth desde el final char en s.

Entrada

Una cadena no vacía y un entero. Puede usar la indexación basada en 0 o la indexación basada en 1. Se garantiza que el entero sea válido según la cadena. Por ejemplo, si la cadena es "supercalifragalistic123", el número entero puede ser del 1 al 23 para la indexación basada en 1, y del 0 al 22 para la indexación basada en 0. Tenga en cuenta que npuede ser mayor que la mitad de la longitud de s.

La entrada está limitada a ASCII imprimible.

Salida

Un valor verdadero / falso basado en si el nvalor th en ses igual al nvalor th desde el último valor en s.

Tenga en cuenta que el último carácter está en la posición 0 para la indexación basada en 0 y en la posición 1 para la indexación basada en 1. Piense en ello como comparar la cadena con su reverso.

Casos de prueba

0 indexado

"1", 0         Truthy 1 == 1
"abc", 1       Truthy b == b
"aaaaaaa", 3   Truthy a == a
"[][]", 1      Falsey ] != [
"[][]", 0      Falsey [ != ]
"ppqqpq", 2    Truthy q == q
"ababab", 5    Falsey a != b
"12345", 0     Falsey 1 != 5
"letter", 1    Truthy e == e
"zxywv", 3     Falsey w != x

1 indexado

"1", 1         Truthy 1 == 1
"abc", 2       Truthy b == b
"aaaaaaa", 4   Truthy a == a
"[][]", 2      Falsey ] != [
"[][]", 1      Falsey [ != ]
"ppqqpq", 3    Truthy q == q
"ababab", 6    Falsey a != b
"12345", 1     Falsey 1 != 5
"letter", 2    Truthy e == e
"zxywv", 4     Falsey w != x


¿Sería aceptable tomarlo ncomo un punto de código? (para idiomas esotéricos como brain-flak)
DJMcMayhem

@DJMcMayhem seguro.
Stephen

Respuestas:


11

Jalea , 5 4 bytes

=UƓị

Pruébalo en línea!

No debería haber respuestas más cortas en Jelly. Un programa necesitaría comparación, inversión / negación, una llamada de índice y un byte para el flujo de control ( Ɠen este caso), que agrega hasta cuatro bytes.

Cómo funciona

 =UƓị 
       - (implicit) input string
 =     - equals (vectorizing by characters because a string is a charlist)
  U    - the reversed string
    ị  - get the element at the index of:
   Ɠ   - the input index

-1 byte gracias a @ ais523, usando Ɠ


Solución de 4 bytes fallida de la versión original de la publicación:ịµU=
CalculatorFeline

Puede mejorarlo a cuatro bytes haciéndolo monádico en lugar de diádico (y tomando n de la entrada estándar en lugar de un argumento): ¡ Pruébelo en línea! Esta técnica a menudo es útil cuando está desperdiciando un byte en el flujo de control y un byte adicional ³, ya que Ɠcuesta un byte pero lo hace ³implícito y, a menudo, le brinda más flexibilidad de flujo de control.

@ ais512 Buena idea, en realidad nunca he usado la entrada antes en una respuesta porque los argumentos implícitos tienden a ser más eficientes.
fireflame241

14

JavaScript (ES6), 26 bytes

s=>n=>s[n]==s.substr(~n,1)

Alternativamente:

s=>n=>s[n]==s.slice(~n)[0]

Este casi funciona, pero falla cuando n == 0(porque s.slice(-1,0) == ""):

s=>n=>s[n]==s.slice(~n,-n)

Otra solución de 26 bytes que @RickHitchcock señaló:

s=>n=>s[n]==s[s.length+~n]

3
Buen uso de ~, nunca habría pensado en eso para esto.
Stephen

10

MATL , 5 bytes

tP=w)

Pruébalo en línea!

Explicación:

t   % Duplicate the input

Stack:
    ['ppqqpq' 'ppqqpq']

P   % Reverse the top element of the stack

Stack:
    ['ppqqpq' 'qpqqpp']

=   % Equals. Push an array of the indices that are equal

Stack:
    [[0 1 1 1 1 0]]

w   % Swap the top two elements

Stack:
    [[0 1 1 1 1 0], 3]

)   % Grab the a'th element of b 

1
Enfoque muy inteligente!
Luis Mendo

3
@LuisMendo Gracias! Eso es tranquilo, el complemento que viene de ti :)
DJMcMayhem

Ahora vemos si Jelly puede vencer a este xD
Stephen

5

Octava , 22 bytes

@(s,n)s(n)==s(end-n+1)

Pruébalo en línea!

O el mismo bytecount:

@(s,n)s(n)==flip(s)(n)

Pruébalo en línea!

Explicación:

Es bastante sencillo. El primero toma una cadena sy un entero ncomo entradas y comprueba el elemento s(n)n- ésimo contra el elemento "last-n + 1" para la igualdad.

El segundo verifica el enésimo elemento s(n)contra el enésimo elemento de sinvertido.


5

05AB1E , 7 5 bytes

-2 bytes gracias a Adnan

ÂøsèË

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

     # Add a reversed copy on top of the original string
 ø    # Zip
  sè  # Extract the nth element
    Ë # Check if they are equal

Pruébalo en línea!


ÂøsèËahorra dos bytes
Adnan

@Adnan Gracias! Sabía que había una forma de 1 byte para agregar una copia invertida, pero no podía recordar cómo estaba etiquetada.
Riley

@ComradeSparklePony Olvidé actualizarlo para incluir la sugerencia de Adnan.
Riley


5

Alice , 24 bytes

/t.~e?/-mom
\I!RtI&1n;@/

Pruébalo en línea!

La entrada consiste en la cadena en una línea y el número en la segunda línea. La salida es Jabberwockysi los caracteres son iguales, y nada de lo contrario.

Explicación

Este programa está principalmente en modo ordinal, con un comando en modo cardinal. Linealizado, el programa es el siguiente:

I.ReI&1m;mt!~t?&-no

I  % Input first line
   % STACK: ["ppqqpq"]
.  % Duplicate top of stack
   % STACK: ["ppqqpq", "ppqqpq"]
R  % Reverse top of stack
   % STACK: ["ppqqpq", "qpqqpp"]
e  % Push empty string
   % STACK: ["ppqqpq", "qpqqpp", ""]
I  % Input next line
   % STACK: ["ppqqpq", "qpqqpp", "", "3"]
&  % (cardinal mode) Pop stack and repeat next command that many times
   % STACK: ["ppqqpq", "qpqqpp", ""], ITERATOR: [3]
1  % Append "1" to top of stack
   % STACK: ["ppqqpq", "qpqqpp", "111"]
m  % Truncate so the top two strings on the stack have the same length
   % STACK: ["ppqqpq", "qpq", "111"]
;  % Discard top of stack
   % STACK: ["ppqqpq", "qpq"]
m  % Truncate again
   % STACK: ["ppq", "qpq"]
t  % Extract last character
   % STACK: ["ppq", "qp", "q"]
!  % Move top of stack to tape
   % STACK: ["ppq", "qp"]
~  % Swap
   % STACK: ["qp", "ppq"]
t  % Extract last character
   % STACK: ["qp", "pp", "q"]
?  % Copy data from tape onto top of stack
   % STACK: ["qp', "pp", "q", "q"]
&  % Iterator: effectively a no-op in ordinal mode when the top of the stack is a 1-character string
   % STACK: ["qp", "pp", "q"], ITERATOR: ["q"]
-  % Remove occurrences: here, result is "" iff the characters are equal
   % STACK: ["qp", "pp", ""]
n  % Logical Not (for a consistent truthy value)
   % STACK: ["qp", "pp", "Jabberwocky"]
o  % Output top of stack

@MartinEnder Jabberwocky?
Stephen


@StephenS Por cierto, no recibo notificaciones si solo me mencionas en publicaciones aleatorias. Los pings solo funcionan si la publicación es mía o si yo mismo he comentado (y creo que si edité la publicación). Usualmente es mejor que me hagas ping en el chat.
Martin Ender

@ MartinEnder Lo sabía, pero no era lo suficientemente importante como para hacerte un ping. Gracias por la confirmación y el enlace :)
Stephen


4

Cubix , 22 bytes

..@.IAp):tBvpptc?1.\O0

1 indexados, toma la entrada como index, string, separadas por un espacio.

Pruébalo en línea

Cubified

    . .
    @ .
I A p ) : t B v
p p t c ? 1 . \
    O 0
    . .

Explicación

Esto es principalmente lineal. La lógica principal es

IAp):tBpptc

IA           Get the first input as an int and the rest as a string.
  p):        Move the index to the top of the stack, increment it, and copy it.
     t       Look up the appropriate character in the string.
      Bpp    Reverse the stack and put the index and character back on top.
         t   Look up the appropriate character in the reversed string.
          c  XOR the two characters.

A continuación, rama con ?al Output 1si el resultado es 0 y 0lo contrario.



3

C #, 28 27 bytes

s=>n=>s[n]==s[s.Length+~n];

Salvó un byte gracias a @KevinCruijssen.

Compila a a Func<string, Func<int, bool>>.


Puede guardar un byte cambiando s.Length-n-1a s.Length+~n.
Kevin Cruijssen

@KevinCruijssen Gracias, buen truco nunca habría pensado en eso.
TheLethalCoder

1
Seré completamente honesto, lo obtuve del comentario de la respuesta de JS. :) Las operaciones de bytes no son realmente mi experiencia.
Kevin Cruijssen


3

R 51 bytes

function(s,n){s=el(strsplit(s,''));s[n]==rev(s)[n]}

Función anónima, utiliza indexación basada en 1


1
43 bytes:function(s,n)(s=utf8ToInt(s))[n]==rev(s)[n]
Giuseppe el


3

Clojure, 27 bytes

#(nth(map =(reverse %)%)%2)

Wow, esto fue más corto de lo que esperaba.


3

APL (Dyalog) , 10 5 bytes

⊃=⊃∘⌽

Esta es una función tácita, a la que se le debe asignar un nombre como f←⊃=⊃∘⌽, y luego llamar como int f string.

Gracias a @ Adám por la friolera de 5 bytes.

Cómo funciona:

⊃=⊃∘⌽  ⍝ Main function; tacit. 
       ⍝ Inputs are ⍺ = 1 (left) and ⍵ = 'abca' (right).
⊃      ⍝ ⍺⊃⍵, meaning 'pick the ⍺-th element of ⍵'
 =     ⍝ Compare to
    ⌽  ⍝ ⌽⍵, meaning 'invert ⍵'
  ⊃    ⍝ Again, ⍺⊃⍵, but:
   ∘   ⍝ Compose. This turns ⌽ into the right argument for ⊃,
       ⍝ which becomes 'pick the ⍺-th element from ⌽(the inverse of)⍵'

Pruébalo en línea!

La respuesta de 22 bytes fue editada. Si quieres verlo, revisa el historial de revisiones.


"toma la entrada de una manera no convencional": tomar la entrada de 2 elementos como los argumentos izquierdo y derecho en APL es completamente estándar y siempre aceptable a menos que el OP lo prohíba específicamente por alguna extraña razón.
Jonás

@ Jonás, sí, la gente en el chat me iluminó sobre eso. Lo dejé como está porque OP no especifica claramente si está bien o no. Lo editaré cuando regrese a mi PC para que la respuesta más corta aparezca primero.
J. Sallé

Con respecto a "asume implícitamente": En realidad, esta función funcionará incluso cuando se llame de forma monádica, y luego parecerá que se usa 1como argumento izquierdo predeterminado. Pruébalo en línea! Las funciones no asumen nada; se aplican de forma diádica porque se les da un argumento a la izquierda y a la derecha.
Adám

@ Adám, pensé que sucedió porque, cuando se llama monádicamente, toma el primer elemento del argumento. De todos modos, editaré para aclarar.
J. Sallé

3

V , 26, 16 , 13 bytes

ä$Àñã2xñVpøˆ±

Pruébalo en línea!

Hexdump:

00000000: e424 c0f1 e332 78f1 5670 f888 b1         .$...2x.Vp...

1 indexado.

Explicación:

ä$                  " Duplicate this line horizontally
  Àñ   ñ            " Arg1 times...
    ã               "   Move to the center of this line
     2x             "   And delete two characters
        V           " Select this whole line
         p          " And replace it with the last pair of characters we deleted
          ø         " Count the number of matches of the following regex...
           <0x88>   "   Any character
                 ±  "   Followed by itself

Como referencia, mi respuesta original fue:

Àñx$x|ñxv$hhpÓ¨.©±/1
ñllS0

Pruébalo en línea! (0 indexado)

Hexdump:

00000000: c0f1 7824 787c f178 7624 6868 70d3 a82e  ..x$x|.xv$hhp...
00000010: a9b1 2f31 0af1 6c6c 5330                 ../1..llS0

Pruébalo en línea! Esto es un poco más corto. El hombre se Àñx$x|ñsiente como demasiados personajes. Intenté una expresión regular solamente, ¡pero terminó siendo como 24 de largo!
nmjcman101 01 de

1
@ nmjcman101 Resulta que puede ser mucho más corto que eso usando nuevas características.
DJMcMayhem

Oh wow, estoy fuera de práctica, apenas puedo leer V nunca más
nmjcman101

@ nmjcman101 He publicado una explicación (y jugué un poco más)
DJMcMayhem

2

Mathematica, 34 Bytes

s=StringTake;s[#,{#2}]==s[#,{-#2}]&

StringTake[#, #2]toma los primeros #2 caracteres de #. StringPartfuncionaría bien en este caso. #~(s=StringPart)~-#2==s@##&
JungHwan Min

mi mal. ¡fijo!
J42161217

#~s~{#2}==#~s~{#2}&siempre cedería True...
JungHwan Min

final arreglado! ....
J42161217

1
En realidad, se puede tomar un Listde Strings como entrada, por lo que #[[#2]]==#[[-#2]]&bastaría
JungHwan Min

2

Perl 6 , 27 bytes

{[eq] $^a.comb[$^b,*-1-$b]}

Pruébalo

{ # bare block lambda with two placeholder parameters 「$a」 and 「$b」

  [eq]        # reduce using string equality operator

    $^a       # declare first positional parameter

    .comb\    # split that into individual characters

    [         # index into that sequence

      $^b,    # declare and use second parameter

      *-1-$b  # closure that subtracts one and the 
              # second parameter of the outer block
              # (「*」 is the parameter of this closure)

    ]
}


2

Pyth , 8 7 bytes

q@zQ@_z

Con la entrada invertida: primero el índice, luego la cadena. Está indexado a 0.

Explicaciones:

q@zQ@_z
 @zQ        Get the nth (Qth) character
     _z     Reverse the string
    @       Get the nth character of the reversed string. Implicit input of the index
q           Test equality

Pruébalo en línea!



2

J, 6 bytes

-4 bytes gracias a FrownyFrog

{(=|.)

Vea la explicación de la respuesta original: la idea es lo suficientemente similar, pero esto se logra con un gancho diádico cuyo verbo derecho es en sí mismo un gancho monádico.

Pruébalo en línea!

respuesta original (10 bytes)

{=/@(,:|.)

,:|. argumento derecho encima de argumento inverso derecho

=/ ¿son iguales por elementos?

{ tomar de esa lista booleana el índice indicado por el argumento izquierdo

Pruébalo en línea!




1

QBIC , 18 bytes

?_s;,:,1|=_sA,-a,1

Explicación

?        =     PRINT -1 if equal, 0 otherwise, between
 _s     |      A substring of
   ;,:,1          A$ string (read from cmd line), from the n'th pos, length 1
 _sA,-a,1      And a substring of A$, n'th pos from the right, also 1 length
               The second Substring is auto-terminated because EOF.


1

> <> (con este intérprete), 25 bytes

i:0(?v
]&=n;>~{:}[:}]&r[}

No funciona en TIO: el intérprete de TIO no invierte la nueva pila al hacer el [ instrucción, pero el área de juegos para peces sí lo hace: compare "abcde"5[ooooo;correr aquí y aquí , por ejemplo.

La entrada de cadena se toma de STDIN, y suponemos que n ya está en la pila. Utiliza 1-indexación.

El pescado se pone el n º con carácter [:}]&, que desvía la primera n cosas en la pila en una nueva pila invertida, manipula eso un poco, a continuación, pone las cosas atrás y guarda el n º carácter en el registro. Luego invierte toda la pila y vuelve a hacer lo mismo, y devuelve 1 si los dos caracteres son iguales, y 0 en caso contrario.

Esto parece funcionar en TIO , para 26 bytes:

i:0(?v
]&=n;>~{:}[{:}]&r[{

1

C, 73 bytes

Compila tal cual con GCC 6.3.1 (sin banderas). Algunas ofuscaciones innecesarias incluidas.

main(c,v)char**v;{c=atoi(v[2]);putchar((*++v)[c]-(*v)[strlen(*v+1)-c]);}

Uso

$./a.out abcdcba 6

Verdad = nada, falsey = basura.


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.