L'ennesimo carattere equivale all'ennesimo dall'ultimo carattere?


22

Ispirato da L'inizio equivale alla fine

Dato una stringa se un numero intero n, genera un valore di verità / falsità sul fatto che il ncarattere th in sia suguale al valore nth dal carattere finale in s.

Ingresso

Una stringa non vuota e un numero intero. È possibile utilizzare l'indicizzazione basata su 0 o l'indicizzazione basata su 1. È garantito che l'intero sia valido in base alla stringa. Ad esempio, se la stringa è "supercalifragalistic123", l'intero può essere compreso tra 1 e 23 per l'indicizzazione basata su 1 e tra 0 e 22 per l'indicizzazione basata su 0. Si prega di notare che npuò essere maggiore della metà della lunghezza di s.

L'input è limitato all'ASCII stampabile.

Produzione

Un valore di verità / falsità basato sul fatto che il nvalore th sia suguale al nth dall'ultimo valore in s.

Si noti che l'ultimo carattere è nella posizione 0 per l'indicizzazione basata su 0 e nella posizione 1 per l'indicizzazione basata su 1. Pensalo come un confronto tra la stringa e il suo contrario.

Casi test

0-indicizzato

"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-indicizzato

"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


Sarebbe accettabile prendere ncome codice-punto? (per linguaggi esoterici come il cervello-flak)
DJMcMayhem

@DJMcMayhem certo.
Stephen,

Risposte:


11

Gelatina , 5 4 byte

=UƓị

Provalo online!

Non ci dovrebbero essere risposte più brevi in ​​Jelly. Un programma avrebbe bisogno di confronto, inversione / negazione, una chiamata di indice e un byte per il flusso di controllo ( Ɠin questo caso), che aggiunge fino a quattro byte.

Come funziona

 =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 grazie a @ ais523, usando Ɠ


Soluzione a 4 byte non riuscita dalla versione originale della posta:ịµU=
CalculatorFeline

Puoi migliorarlo a quattro byte rendendolo monadico anziché diadico (e prendendo n dall'input standard piuttosto che un argomento): provalo online! Questa tecnica è spesso utile quando si spreca un byte sul flusso di controllo e un byte aggiuntivo su ³, poiché Ɠcosta un byte ma rende ³implicito e spesso offre maggiore flessibilità del flusso di controllo.

@ais512 Buona idea, in realtà non ho mai usato l'input prima in una risposta perché gli argomenti impliciti tendono ad essere più efficienti.
fireflame241

14

JavaScript (ES6), 26 byte

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

In alternativa:

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

Questo funziona quasi, ma fallisce quando n == 0(perché s.slice(-1,0) == ""):

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

Un'altra soluzione a 26 byte che @RickHitchcock ha sottolineato:

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

3
Un buon uso di ~, non ci avrei mai pensato per questo.
Stephen,

10

MATL , 5 byte

tP=w)

Provalo online!

Spiegazione:

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
Approccio molto intelligente!
Luis Mendo,

3
@LuisMendo Grazie! Questo è tranquillo il complemento che viene da te :)
DJMcMayhem

Ora vediamo se Jelly può battere questo xD
Stephen

5

Ottava , 22 byte

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

Provalo online!

O lo stesso conteggio:

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

Provalo online!

Spiegazione:

È abbastanza semplice. Il primo prende una stringa se un numero intero ncome input e controlla l'ennesimo elemento s(n)rispetto all'elemento "last-n + 1" per l'uguaglianza.

Il secondo controlla l'ennesimo elemento s(n)rispetto all'ennesimo elemento di sinvertito.


5

05AB1E , 7 5 byte

-2 byte grazie ad Adnan

ÂøsèË

Provalo online! oppure prova tutti i test

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

Provalo online!


ÂøsèËsalva due byte
Adnan

@Adnan Grazie! Sapevo che c'era un modo di 1 byte per aggiungere una copia invertita, non riuscivo a ricordare come fosse etichettata.
Riley,

@ComradeSparklePony Ho dimenticato di aggiornarlo per includere il suggerimento di Adnan.
Riley,


5

Alice , 24 byte

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

Provalo online!

L'input è costituito dalla stringa su una riga e dal numero sulla seconda riga. L'output è Jabberwockyse i caratteri sono uguali e nient'altro.

Spiegazione

Questo programma è principalmente in modalità ordinale, con un comando in modalità cardinale. Linearizzato, il programma è il seguente:

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 A proposito, non ricevo notifiche se mi menzioni solo su post casuali. Il ping funziona solo se il post è mio o se ho commentato me stesso (e penso che se ho modificato il post). Di solito è meglio che mi chiami in chat.
Martin Ender,

@MartinEnder lo sapevo, ma non era abbastanza importante per farti un rumore metallico. Grazie per la conferma e il link :)
Stephen


4

Cubix , 22 byte

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

1-indicizzato, prende come ingresso index, stringseparati da uno spazio.

Provalo online

Cubified

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

Spiegazione

Questo è per lo più lineare. La logica principale è

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.

Ci ramifichiamo quindi con ?l' Output 1se il risultato è 0 e in caso 0contrario.



3

C #, 28 27 byte

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

Salvataggio di un byte grazie a @KevinCruijssen.

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


È possibile salvare un byte cambiando s.Length-n-1in s.Length+~n.
Kevin Cruijssen,

@KevinCruijssen Grazie, un bel trucco non ci avrebbe mai pensato.
TheLethalCoder

1
Sarò completamente onesto, l'ho preso dal commento della risposta JS me stesso. :) Le operazioni sui byte non sono in realtà le mie competenze.
Kevin Cruijssen,


3

R 51 byte

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

Funzione anonima, utilizza l'indicizzazione basata su 1


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


3

Clojure, 27 byte

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

Wow, questo è stato più breve di quanto mi aspettassi.


3

APL (Dyalog) , 10 5 byte

⊃=⊃∘⌽

Questa è una funzione tacita, a cui deve essere assegnato un nome come f←⊃=⊃∘⌽, e quindi chiamato come int f string.

Grazie a @ Adám per ben 5 byte.

Come funziona:

⊃=⊃∘⌽  ⍝ 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)⍵'

Provalo online!

La risposta a 22 byte è stata modificata. Se vuoi vederlo, controlla la cronologia delle revisioni.


"prende l'input in un modo non convenzionale" - prendere l'input di 2 elementi come l'argu sinistro e destro in APL è completamente standard e sempre accettabile a meno che l'OP lo proibisca specificamente per qualche bizzarro motivo.
Giona,

@Jonah sì, le persone in chat mi hanno illuminato di questo. L'ho lasciato com'è perché OP non specifica chiaramente se va bene o no. Lo modificherò quando torno sul mio PC in modo che appaia per prima la risposta più breve.
J. Sallé,

Per quanto riguarda "presuppone implicitamente": in realtà, questa funzione funzionerà anche quando viene chiamata monadicamente e sembrerà quindi utilizzare 1come argomento sinistro predefinito. Provalo online! Le funzioni non assumono nulla; vengono applicati diadicamente perché ricevono un argomento sia a destra che a sinistra.
Adám,

@Adám Ho pensato che fosse successo perché, quando chiamato monadicamente, prende il primo elemento dell'argomento? Ad ogni modo, lo modificherò per chiarire.
J. Sallé,

3

V , 26, 16 , 13 byte

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

Provalo online!

hexdump:

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

1 indicizzato.

Spiegazione:

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

Per riferimento, la mia risposta originale era:

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

Provalo online! (0 indicizzato)

hexdump:

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

Provalo online! Questo è un po 'più breve. L'uomo Àñx$x|ñsembra troppi personaggi. Ho provato solo una regex, ma alla fine è stata lunga 24!
nmjcman101

1
@ nmjcman101 Si scopre che può essere molto più breve di quello che utilizza le funzionalità più recenti.
DJMcMayhem

Oh wow, sono fuori allenamento, riesco a malapena a leggere la V
nmjcman101

@nmjcman101 Ho pubblicato una spiegazione (e ho giocato ancora un po ')
DJMcMayhem

2

Mathematica, 34 byte

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

StringTake[#, #2]prende i primi #2 personaggi di #. StringPartfunzionerebbe bene in questo caso. #~(s=StringPart)~-#2==s@##&
JungHwan Min

il mio torto. fisso!
J42161217

#~s~{#2}==#~s~{#2}&True
cederebbe

final risolto! ....
J42161217

1
In realtà, si può prendere una Listdelle Strings come input, quindi #[[#2]]==#[[-#2]]&sarebbe sufficiente
JungHwan Min

2

Perl 6 , 27 byte

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

Provalo

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

q@zQ@_z

Con l'input invertito: prima l'indice, quindi la stringa. È indicizzato 0.

spiegazioni:

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

Provalo online!



2

J, 6 byte

-4 byte grazie a FrownyFrog

{(=|.)

Vedi la spiegazione della risposta originale - l'idea è abbastanza simile, ma questo viene realizzato con un gancio diadico il cui verbo destro è esso stesso un gancio monadico.

Provalo online!

risposta originale (10 byte)

{=/@(,:|.)

,:|. arg destro sopra arg rovescio destro

=/ sono elementally uguali?

{ prendere da quell'elenco booleano l'indice indicato dall'arg sinistro

Provalo online!




1

QBIC , 18 byte

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

Spiegazione

?        =     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 questo interprete), 25 byte

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

Non funziona in TIO: l'interprete TIO non inverte il nuovo stack quando esegue le [istruzioni, ma il parco giochi per pesci funziona - confronta la "abcde"5[ooooo;corsa qui e qui , ad esempio.

L'input della stringa è preso da STDIN e supponiamo che n sia già nello stack. Utilizza 1-indicizzazione.

Il pesce ottiene il n ° personaggio con [:}]&, che sifoni via il primo n cose sulla pila in un nuovo, pila invertita, manipola che un po ', poi mette le cose a posto e salva il n ° carattere nel registro. Quindi inverte l'intero stack e fa di nuovo lo stesso, e restituisce 1 se i due caratteri sono uguali e 0 altrimenti.

Questo sembra funzionare in TIO , per 26 byte:

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

1

C, 73 byte

Compila così com'è con GCC 6.3.1 (senza flag). Sono stati inclusi alcuni offuscamenti inutili.

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

uso

$./a.out abcdcba 6

Verità = niente, falsità = immondizia.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.