Czy n-ty znak jest równy n-temu od ostatniego znaku?

22

Inspirowane przez Czy początek oznacza koniec

Biorąc pod uwagę ciąg si liczbę całkowitą n, wypisz prawdę / falsey, czy nth char in sjest równy nth od końca char s.

Wkład

Niepusty ciąg i liczba całkowita. Możesz użyć indeksowania opartego na 0 lub indeksowania opartego na 1. Liczba całkowita jest gwarantowana na podstawie ciągu. Na przykład, jeśli ciąg znaków to „supercalifragalistic123”, liczba całkowita może wynosić od 1 do 23 dla indeksowania opartego na 1, i od 0 do 22 dla indeksowania opartego na 0. Uwaga: nmoże być większa niż połowa długości s.

Dane wejściowe są ograniczone do drukowalnego ASCII.

Wydajność

Wartość true / falsey na podstawie tego, czy nwartość th sjest równa nth od ostatniej wartości w s.

Należy pamiętać, że ostatni znak znajduje się w pozycji 0 dla indeksowania opartego na 0 i pozycji 1 dla indeksowania opartego na 0. Pomyśl o tym jako o porównaniu łańcucha do jego odwrotności.

Przypadki testowe

0-indeksowane

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

"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
Stephen
źródło
Czy można przyjąć njako punkt kodowy? (dla ezoterycznych języków, takich jak uderzenie mózgu)
DJMcMayhem
@DJMcMayhem na pewno.
Stephen

Odpowiedzi:

11

Galaretka , 5 4 bajtów

=UƓị

Wypróbuj online!

W Jelly nie powinno być krótszych odpowiedzi. Program potrzebowałby porównania, odwrócenia / negacji, wywołania indeksu i bajtu dla przepływu sterowania ( Ɠw tym przypadku), który sumuje się do czterech bajtów.

Jak to działa

 =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 bajt dzięki @ ais523, przy użyciu Ɠ

fireflame241
źródło
Nieudane 4 bajtowe rozwiązanie z oryginalnej wersji posta:ịµU=
CalculatorFeline
Możesz go ulepszyć do czterech bajtów, czyniąc go monadycznym zamiast dyadycznym (i biorąc n ze standardowego wejścia zamiast argumentu): Wypróbuj online! Ta technika jest często przydatna, gdy marnujesz bajt na przepływ sterowania i dodatkowy bajt ³, ponieważ Ɠkosztuje jeden bajt, ale ³niejawnie i często daje większą elastyczność przepływu sterowania.
@ ais512 Dobry pomysł, właściwie nigdy wcześniej nie użyłem danych wejściowych w odpowiedzi, ponieważ niejawne argumenty wydają się być bardziej wydajne.
fireflame241
14

JavaScript (ES6), 26 bajtów

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

Alternatywnie:

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

Ten prawie działa, ale kończy się niepowodzeniem, gdy n == 0(ponieważ s.slice(-1,0) == ""):

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

Kolejne 26-bajtowe rozwiązanie wskazane przez @RickHitchcock :

s=>n=>s[n]==s[s.length+~n]
ETHprodukcje
źródło
3
Dobre wykorzystanie ~, nigdy by tego nie pomyślało.
Stephen
10

MATL , 5 bajtów

tP=w)

Wypróbuj online!

Wyjaśnienie:

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 
DJMcMayhem
źródło
1
Bardzo sprytne podejście!
Luis Mendo
3
@LuisMendo Thankyou! To jest ciche uzupełnienie pochodzące od ciebie :)
DJMcMayhem
Teraz widzimy, czy Jelly może pokonać ten xD
Stephen
5

Oktawa , 22 bajty

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

Wypróbuj online!

Lub ta sama liczba bajtów:

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

Wypróbuj online!

Wyjaśnienie:

To całkiem proste. Pierwszy pobiera ciąg znaków si liczbę całkowitą njako dane wejściowe i sprawdza n-ty elements(n) n- z „last-n + 1”.

Drugi sprawdza n-ty element s(n)względem n-tego elementu sodwróconego.

Stewie Griffin
źródło
5

05AB1E , 7 5 bajtów

-2 bajty dzięki Adnan

ÂøsèË

Wypróbuj online! lub Wypróbuj wszystkie testy

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

Wypróbuj online!

Riley
źródło
ÂøsèËoszczędza dwa bajty
Adnan
@Adnan Thanks! Wiedziałem, że istnieje 1-bajtowy sposób na dodanie odwróconej kopii, po prostu nie pamiętałem, jak ją oznaczono.
Riley
@ComradeSparklePony Zapomniałem go zaktualizować, aby uwzględnić sugestię Adnana.
Riley
5

Haskell, 22 bajty

s#n=s!!n==reverse s!!n

0-basd. Przykład użycia: "letter" # 1-> True.

Wypróbuj online!

nimi
źródło
5

Alice , 24 bajty

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

Wypróbuj online!

Dane wejściowe składają się z ciągu w jednym wierszu i liczby w drugim wierszu. Dane wyjściowe toJabberwocky jeśli znaki są takie same i nic innego.

Wyjaśnienie

Ten program jest głównie w trybie porządkowym, z jednym poleceniem w trybie kardynalnym. Zlinearyzowany program jest następujący:

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
Nitrodon
źródło
@MartinEnder Jabberwocky?
Stephen
3
@StephenS Jabberwocky.
Martin Ender
@StephenS Przy okazji, nie otrzymuję powiadomień, jeśli tylko wspominasz o mnie na losowych postach. Pingi działają tylko wtedy, gdy post jest mój lub sam się skomentowałem (i myślę, że edytowałem post). Zwykle lepiej jest pingować mnie na czacie.
Martin Ender
@MartinEnder W pewnym sensie wiedziałem o tym, ale nie było wystarczająco ważne, aby cię pingować. Dzięki za potwierdzenie i link :)
Stephen
5

Python , 24 22 bajty

-2 bajty dzięki Adnan.

lambda s,n:s[n]==s[~n]

Wypróbuj online!

całkowicie ludzki
źródło
3
Myślę, że można zastąpić -n-1przez ~n.
Adnan
Dlaczego tylko Python2? Wygląda na to, że dobrze działa na Python3, powinieneś zmienić go na „Python”.
sagiksp
@sagiksp to domyślny szablon wyjściowy w TIO
Felipe Nardi Batista
Och, to ma sens.
sagiksp
@sagiksp Tak, to szablon z TIO, ale zaktualizowany. :)
totallyhuman
4

Cubix , 22 bajty

[email protected]):tBvpptc?1.\O0

1 indeksowane bierze wejście jako index, stringoddzielone odstępem.

Wypróbuj online

Cubified

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

Wyjaśnienie

Jest to głównie liniowe. Główną logiką jest

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.

Następnie rozgałęziamy się ?na Output, 1jeśli wynik wynosi 0 i 0inaczej.


źródło
3

Java 8, 43 42 bajty

s->n->s.charAt(n)==s.charAt(s.length()+~n)

Wypróbuj tutaj.

Kevin Cruijssen
źródło
3

C #, 28 27 bajtów

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

Zapisano bajt dzięki @KevinCruijssen.

Kompiluje do Func<string, Func<int, bool>>.

TheLethalCoder
źródło
Możesz zapisać bajt, zmieniając s.Length-n-1na s.Length+~n.
Kevin Cruijssen
@KevinCruijssen Dzięki, fajna sztuczka nigdy by o tym nie pomyślała.
TheLethalCoder
1
Będę całkowicie szczery, sam to otrzymałem z komentarza odpowiedzi JS. :) Operacje na bajtach nie są tak naprawdę moją wiedzą.
Kevin Cruijssen
3

CJam , 8 bajtów

l~_W%.==

Wypróbuj online!

Indeks z indeksowaniem 0 jest na pierwszym miejscu.

Erik the Outgolfer
źródło
3

R 51 bajtów

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

Funkcja anonimowa, wykorzystuje indeksowanie 1

Odbijająca się piłka
źródło
1
43 bajty:function(s,n)(s=utf8ToInt(s))[n]==rev(s)[n]
Giuseppe,
3

Rubin, 22 20 18 bajtów

->s,n{s[n]==s[~n]}
reitermarkus
źródło
3
Chyba ->s,n{s[n]==s[~n]}powinienem pracować? (Nie mam pojęcia o ruby)
Christoph
Miło! Dzięki!
reitermarkus
3

Clojure, 27 bajtów

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

Wow, to było krótsze niż się spodziewałem.

NikoNyrh
źródło
3

APL (Dyalog) , 10 5 bajtów

⊃=⊃∘⌽

Jest to funkcja ukryta, której należy przypisać nazwę taką jak f←⊃=⊃∘⌽, a następnie wywołać jakoint f string .

Dzięki @ Adám za 5 bajtów.

Jak to działa:

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

Wypróbuj online!

22 bajtowa odpowiedź została zredagowana. Jeśli chcesz to zobaczyć, sprawdź historię zmian.

J. Sallé
źródło
„pobiera dane wejściowe w niekonwencjonalny sposób” - przyjmowanie danych wejściowych z 2 elementów, gdy lewy i prawy argument w APL jest całkowicie standardowy i zawsze akceptowalny, chyba że OP zabrania go z jakiegoś dziwnego powodu.
Jonasz
@Jonah tak, ludzie na czacie oświecili mnie na ten temat. Zostawiłem tak, jak jest, ponieważ OP nie określa jasno, czy jest w porządku, czy nie. Zedytuję to, gdy wrócę do komputera, więc najpierw pojawia się krótsza odpowiedź.
J. Sallé
W odniesieniu do „domyślnie zakłada”: W rzeczywistości ta funkcja będzie działać, nawet gdy zostanie wywołana monadycznie, a następnie będzie wyglądać 1jak domyślny lewy argument. Wypróbuj online! Funkcje niczego nie zakładają; stosuje się je dynastycznie, ponieważ podano im zarówno lewy, jak i prawy argument.
Adám
@ Adám Myślałem, że tak się stało, ponieważ wywoływany monadycznie bierze pierwszy element argumentu? W każdym razie dokonam edycji w celu wyjaśnienia.
J. Sallé
3

V , 26, 16 , 13 bajtów

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

Wypróbuj online!

Hexdump:

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

1 indeksowany.

Wyjaśnienie:

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

Dla porównania moja pierwotna odpowiedź brzmiała:

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

Wypróbuj online! (0 indeksowane)

Hexdump:

00000000: c0f1 7824 787c f178 7624 6868 70d3 a82e  ..x$x|.xv$hhp...
00000010: a9b1 2f31 0af1 6c6c 5330                 ../1..llS0
DJMcMayhem
źródło
Wypróbuj online! To jest nieco krótsze. Człowiek Àñx$x|ñczuje się jak zbyt wiele postaci. Próbowałem tylko wyrażenia regularnego, ale skończyło się na 24 długich!
nmjcman101
1
@ nmjcman101 Okazuje się, że może być znacznie krótszy niż przy użyciu nowszych funkcji.
DJMcMayhem
Och, wow, jestem poza treningiem, ledwo mogę nawet czytać V
nmjcman101
@ nmjcman101 Zamieściłem wyjaśnienie (i trochę więcej
grałem w
2

Mathematica, 34 bajtów

s=StringTake;s[#,{#2}]==s[#,{-#2}]&
J42161217
źródło
StringTake[#, #2]bierze pierwsze #2 postacie #. StringPartdziałałoby dobrze w tym przypadku. #~(s=StringPart)~-#2==s@##&
JungHwan Min
mój błąd. naprawiony!
J42161217
#~s~{#2}==#~s~{#2}&zawsze True
ustępuje
ostatecznie naprawione! ....
J42161217
1
Faktycznie, można wziąć Listz StringS jako wejście, więc #[[#2]]==#[[-#2]]&wystarczy
JungHwan min
2

Perl 6 , 27 bajtów

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

Sprawdź to

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

    ]
}
Brad Gilbert b2gills
źródło
2

PHP> = 7,1, 36 bajtów

[,$t,$p]=$argv;echo$t[$p]==$t[~+$p];

Wersja online

Jörg Hülsermann
źródło
1
~+$poszczędza jeden bajt.
user63956
2

Pyth , 8 7 bajtów

q@zQ@_z

Przy odwróconym wejściu: najpierw indeks, a następnie ciąg. Jest indeksowany na 0.

Objaśnienia:

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

Wypróbuj online!

Jim
źródło
2

Lua, 46 bajtów

function f(s,n)return s:byte(n)==s:byte(-n)end

Wypróbuj online!

MCAdventure10
źródło
you can't assume the input is already in s, and you need to output it as well
Felipe Nardi Batista
2

J, 6 bytes

-4 bytes thanks to FrownyFrog

{(=|.)

See original answer explanation -- idea is similar enough, but this is accomplished with a dyadic hook whose right verb is itself a monadic hook.

Try it online!

original answer (10 bytes)

{=/@(,:|.)

,:|. right arg on top of reverse right arg

=/ are they elementwise equal?

{ take from that boolean list the index indicated by the left arg

Try it online!

Jonah
źródło
2

C, 36 35 bytes

#define f(s,n)s[n]==s[strlen(s)+~n]

Uses 0-based indexing, naturally.

Try it online!

MD XF
źródło
I think -1-n can be +~n.
Jonathan Frech
1

QBIC, 18 bytes

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

Explanation

?        =     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.
steenbergh
źródło
1

CJam, 11 bytes

q~_2$=@@~==

Bad. Too much stack manipulation.

Esolanging Fruit
źródło
1

><> (with this interpreter), 25 bytes

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

It doesn't work in TIO: the TIO interpreter doesn't reverse the new stack when doing the [ instruction, but the fish playground does — compare "abcde"5[ooooo; run here and here, for example.

The string input is taken from STDIN, and we assume n is already on the stack. Uses 1-indexing.

The fish gets the nth character with [:}]&, which siphons off the first n things on the stack into a new, reversed stack, manipulates that a bit, then puts the things back and saves the nth character in the register. It then reverses the whole stack and does the same again, and returns 1 if the two characters are equal, and 0 otherwise.

This seems to work at TIO, for 26 bytes:

i:0(?v
]&=n;>~{:}[{:}]&r[{
Not a tree
źródło
1

C, 73 bytes

Compiles as-is with GCC 6.3.1 (no flags). Some unnecessary obfuscation included.

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

Usage

$./a.out abcdcba 6

Truthy = nothing, falsey = garbage.

sigvaldm
źródło