O enésimo caractere é igual ao enésimo do último caractere?


22

Inspirado por O começo é igual ao fim

Dada uma string se um número inteiro n, faça uma truthy / falsey sobre se o nth char in sé igual ao nth do end char in s.

Entrada

Uma sequência não vazia e um número inteiro. Você pode usar indexação com base em 0 ou indexação com base em 1. O número inteiro é garantido para ser válido com base na cadeia. Por exemplo, se a sequência for "supercalifragalistic123", o número inteiro poderá ser de 1 a 23 para indexação baseada em 1 e 0 a 22 para indexação baseada em 0. Observe que npode ser maior que a metade do comprimento de s.

A entrada é limitada ao ASCII imprimível.

Saída

Um valor de verdade / falsey baseado em se o nth valor em sé igual ao nth do último valor em s.

Observe que o último caractere está na posição 0 para indexação baseada em 0 e na posição 1 para indexação baseada em 1. Pense nisso como comparar a corda ao seu inverso.

Casos de teste

Indexado a 0

"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

Indexado 1

"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


Seria aceitável tomar ncomo ponto de código? (para idiomas esotéricos, como
quebra

@DJMcMayhem sure.
Stephen

Respostas:


11

Geléia , 5 4 bytes

=UƓị

Experimente online!

Não deve haver respostas mais curtas em Jelly. Um programa precisaria de comparação, reversão / negação, uma chamada de índice e um byte para o fluxo de controle ( Ɠneste caso), que adiciona até quatro bytes.

Como 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 graças a @ ais523, usando Ɠ


Falha na solução de 4 bytes da versão original do post:ịµU=
CalculatorFeline

Você pode aumentá-lo para quatro bytes, tornando-o monádico em vez de diádico (e retirando n da entrada padrão em vez de um argumento): Experimente online! Essa técnica geralmente é útil quando você está desperdiçando um byte no fluxo de controle e um byte adicional ³, pois Ɠcusta um byte, mas torna o ³implícito e muitas vezes oferece mais flexibilidade ao fluxo de controle.

@ ais512 Boa ideia, na verdade nunca usei a entrada antes em uma resposta porque argumentos implícitos tendem a ser mais 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 quase funciona, mas falha quando n == 0(porque s.slice(-1,0) == ""):

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

Outra solução de 26 bytes que @RickHitchcock apontou:

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

3
Bom uso de ~, nunca teria pensado nisso para isso.
Stephen

10

MATL , 5 bytes

tP=w)

Experimente online!

Explicação:

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
Abordagem muito inteligente!
Luis Mendo

3
@LuisMendo Thankyou! Isso é calma o complemento vindo de você :)
DJMcMayhem

Agora vamos ver se Jelly pode bater este xD
Stephen

5

Oitava , 22 bytes

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

Experimente online!

Ou o mesmo bytecount:

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

Experimente online!

Explicação:

É bem direto. O primeiro pega uma string se um número inteiro ncomo entradas e verifica o enésimo elemento em s(n)relação ao elemento "last-n + 1" em busca de igualdade.

O segundo verifica o n-ésimo elemento s(n)contra o n-ésimo elemento do sinvertido.


5

05AB1E , 7 5 bytes

-2 bytes graças a Adnan

ÂøsèË

Experimente online! ou Experimente todos os testes

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

Experimente online!


ÂøsèËsalva dois bytes
Adnan

@Adnan Thanks! Eu sabia que havia uma maneira de 1 byte para adicionar uma cópia invertida, mas não conseguia me lembrar de como ela estava rotulada.
Riley

@ComradeSparklePony Esqueci de atualizá-lo para incluir a sugestão de Adnan.
Riley


5

Alice , 24 bytes

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

Experimente online!

A entrada consiste na sequência em uma linha e no número na segunda linha. A saída é Jabberwockyse os caracteres forem iguais e nada for diferente.

Explicação

Este programa está principalmente no modo ordinal, com um comando no modo cardinal. Linearizado, o programa é o seguinte:

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 Btw, eu não recebo notificações se você me mencionar em postagens aleatórias. Pings só funcionam se a postagem for minha ou eu tiver comentado a mim mesmo (e acho que se eu editasse a postagem). Você geralmente é melhor me mandar mensagens no chat.
Martin Ender

@MartinEnder Eu meio que sabia disso, mas não era importante o suficiente para fazer ping em você. Obrigado pela confirmação e o link :)
Stephen


4

Cubix , 22 bytes

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

1-indexados, leva de entrada como index, string, separados por um espaço.

Experimente online

Cubificado

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

Explicação

Isso é principalmente linear. A lógica principal é

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.

Em seguida, ramificamos ?para Output 1se o resultado for 0 ou 0não.



3

C #, 28 27 bytes

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

Guardou um byte graças a @KevinCruijssen.

Compila para um Func<string, Func<int, bool>>.


Você pode salvar um byte, alterando s.Length-n-1para s.Length+~n.
Kevin Cruijssen

@KevinCruijssen Obrigado, bom truque nunca teria pensado nisso.
TheLethalCoder

1
Vou ser completamente honesto, eu entendi a partir do comentário do JS responder a mim mesmo. :) As operações de bytes não são realmente minha especialidade.
Kevin Cruijssen


3

R 51 bytes

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

Função anônima, usa indexação baseada em 1


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


3

Clojure, 27 bytes

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

Uau, isso foi mais curto do que eu esperava.


3

APL (Dyalog) , 10 5 bytes

⊃=⊃∘⌽

Essa é uma função tácita, que precisa receber um nome como f←⊃=⊃∘⌽, e depois chamar como int f string.

Agradecemos a @ Adám pelos 5 bytes impressionantes.

Como 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)⍵'

Experimente online!

A resposta de 22 bytes foi editada. Se você quiser vê-lo, verifique o histórico de revisões.


"aceita a entrada de uma maneira não convencional" - aceitar a entrada de 2 elementos, já que os argumentos esquerdo e direito no APL são completamente padrão e sempre aceitáveis, a menos que o OP o proíba especificamente por algum motivo bizarro.
Jonah

@ Jonah sim, as pessoas no chat me esclareceram sobre isso. Deixei como está porque o OP não especifica claramente se está tudo bem ou não. Vou editar isso quando voltar ao meu PC para que a resposta mais curta apareça primeiro.
J. Sallé

Em relação a "assume implicitamente": Na verdade, essa função funcionará mesmo quando chamada monadicamente e, em seguida, parecerá usar 1como argumento esquerdo padrão. Experimente online! As funções não assumem nada; eles estão sendo aplicados de forma diádica porque recebem um argumento à esquerda e à direita.
Adám

@ Adám Pensei que isso acontecesse porque, quando chamado monadicamente, leva o primeiro elemento do argumento? Enfim, vou editar para esclarecer.
J. Sallé 31/10

3

V , 26, 16 , 13 bytes

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

Experimente online!

Hexdump:

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

1 indexado.

Explicação:

ä$                  " 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

Para referência, minha resposta original foi:

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

Experimente online! (0 indexado)

Hexdump:

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

Experimente online! Isso é um pouco mais curto. Cara, Àñx$x|ñparece que há muitos personagens. Eu tentei apenas um regex, mas acabou tendo 24 anos!
nmjcman101

1
@ nmjcman101 Parece que pode ser muito mais curto que o uso de recursos mais recentes.
DJMcMayhem

Oh wow eu estou fora de prática, eu mal consigo mesmo ler V mais
nmjcman101

@ nmjcman101 Eu publiquei uma explicação (e golfed um pouco mais)
DJMcMayhem

2

Mathematica, 34 bytes

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

StringTake[#, #2]leva os primeiros #2 caracteres de #. StringPartfuncionaria bem neste caso. #~(s=StringPart)~-#2==s@##&
JungHwan Min

erro meu. fixo!
J42161217

#~s~{#2}==#~s~{#2}&sempre deu True...
JungHwan Min

limite fixada ....!
J42161217

1
Na verdade, você pode tirar um Listde Strings como entrada, portanto, #[[#2]]==#[[-#2]]&seria suficiente #
307 JungHwan Min

2

Perl 6 , 27 bytes

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

Teste-o

{ # 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

Pitão , 8 7 bytes

q@zQ@_z

Com a entrada invertida: primeiro o índice, depois a string. É 0 indexado.

Explicações:

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

Experimente online!



2

J, 6 bytes

-4 bytes graças ao FrownyFrog

{(=|.)

Veja a explicação original da resposta - a idéia é semelhante o suficiente, mas isso é realizado com um gancho diádico, cujo verbo certo é um gancho monádico.

Experimente online!

resposta original (10 bytes)

{=/@(,:|.)

,:|. arg direita no topo da arg direita reversa

=/ são elementares iguais?

{ retire dessa lista booleana o índice indicado pelo argumento esquerdo

Experimente online!




1

QBIC , 18 bytes

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

Explicação

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

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

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

Não funciona no TIO: o intérprete TIO não inverte a nova pilha ao executar as [instruções, mas o playground de peixes funciona - compare a "abcde"5[ooooo;corrida aqui e aqui , por exemplo.

A entrada da string é obtida de STDIN, e assumimos que n já está na pilha. Usa indexação 1.

O peixe recebe o n º personagem com [:}]&que desvia os primeiros n coisas na pilha em uma nova pilha, invertida, manipula que um pouco, em seguida, coloca as coisas de volta e salva o n º personagem no registo. Ele então inverte a pilha inteira e faz o mesmo novamente e retorna 1 se os dois caracteres forem iguais e 0 caso contrário.

Isso parece funcionar no TIO , por 26 bytes:

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

1

C, 73 bytes

Compila como está com o GCC 6.3.1 (sem sinalizadores). Alguma ofuscação desnecessária incluída.

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

Uso

$./a.out abcdcba 6

Verdade = nada, falsey = lixo.


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.