N-й символ равен n-му от последнего символа?


22

Вдохновлен ли начало равно концу

Если задана строка sи целое число n, выведите truey / falsey, чтобы узнать, равен ли nth char из sчисла nth из конца char в s.

вход

Непустая строка и целое число. Вы можете использовать индексирование на основе 0 или индексирование на основе 1. Целое число гарантированно будет действительным на основе строки. Например, если строка "supercalifragalistic123", целое число может быть от 1 до 23 для индексации на основе 1 и от 0 до 22 для индексации на основе 0. Обратите внимание, что nможет быть больше, чем половина длины s.

Ввод ограничен для печати ASCII.

Выход

Значение true / falsey, основанное на том, равно ли nзначение th в значении th из последнего значения в .sns

Обратите внимание, что последний символ находится в позиции 0 для индексации на основе 0 и позиции 1 для индексации на основе 1. Думайте об этом как о сравнении строки с ее обратной стороной.

Тестовые случаи

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

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


Было бы приемлемо принять nв качестве кодовой точки? (для эзотерических языков, таких как мозговые
шутки

@DJMcMayhem уверен.
Стивен

Ответы:


11

Желе , 5 4 байта

=UƓị

Попробуйте онлайн!

В Желе не должно быть более коротких ответов. Программе потребовалось бы сравнение, обращение / отрицание, индексный вызов и байт для потока управления ( Ɠв данном случае), который добавляет до четырех байтов.

Как это работает

 =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 байт благодаря @ ais523, используя Ɠ


Не удалось 4-байтовое решение из оригинальной версии поста:ịµU=
CalculatorFeline

Вы можете улучшить его до четырех байтов, сделав его монадическим, а не двоичным (и взяв n из стандартного ввода, а не аргумента): попробуйте онлайн! Этот метод часто полезен, когда вы тратите один байт на поток управления и дополнительный байт ³, поскольку он Ɠстоит один байт, но делает его ³неявным и часто дает вам большую гибкость потока управления.

@ ais512 Хорошая идея, на самом деле я никогда раньше не использовал ввод в ответе, потому что неявные аргументы имеют тенденцию быть более эффективными.
fireflame241

14

JavaScript (ES6), 26 байт

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

В качестве альтернативы:

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

Этот почти работает, но терпит неудачу, когда n == 0(потому что s.slice(-1,0) == ""):

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

Еще одно 26-байтовое решение, на которое указал @RickHitchcock :

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

3
Хорошее использование ~, никогда бы не подумал об этом.
Стивен

10

MATL , 5 байтов

tP=w)

Попробуйте онлайн!

Объяснение:

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
Очень умный подход!
Луис Мендо

3
@LuisMendo Спасибо! Это тихий комплимент, исходящий от вас :)
DJMcMayhem

Теперь мы видим, сможет ли Jelly победить этот xD
Стивен,

5

Октава , 22 байта

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

Попробуйте онлайн!

Или тот же bytecount:

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

Попробуйте онлайн!

Объяснение:

Это довольно просто. Первый принимает строку sи целое число в nкачестве входных данных и проверяет n-й элемент s(n)на соответствие элементу «last-n + 1» на равенство.

Второй проверяет n-й элемент s(n)против n-го элемента в sобратном порядке.


5

05AB1E , 7 5 байтов

-2 байта благодаря Аднану

ÂøsèË

Попробуйте онлайн! или попробуйте все тесты

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

Попробуйте онлайн!


ÂøsèËсохраняет два байта
Аднан

@ Adnan Спасибо! Я знал, что есть 1-байтовый способ добавить обратную копию, я просто не мог вспомнить, как она была помечена.
Райли

@ComradeSparklePony Я забыл обновить его, чтобы включить предложение Аднана.
Райли


5

Алиса , 24 байта

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

Попробуйте онлайн!

Входные данные состоят из строки в одной строке и числа во второй строке. Вывод, Jabberwockyесли символы одинаковые, и ничего другого.

объяснение

Эта программа в основном в порядковом режиме, с одной командой в кардинальном режиме. Линеаризованная программа выглядит следующим образом:

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 Джаббервоки?
Стивен


@ StefhenS Кстати, я не получаю уведомления, если вы просто упоминаете меня в случайных сообщениях. Пингс работает, только если сообщение мое или я прокомментировал сам (и я думаю, что если я редактировал сообщение). Тебе обычно лучше пинговать меня в чате.
Мартин Эндер

@MartinEnder Я вроде знал это, но это было недостаточно важно, чтобы пинговать вас. Спасибо за подтверждение и ссылку :)
Стивен

5

Python , 24 22 байта

-2 байта благодаря Аднану.

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

Попробуйте онлайн!


3
Я думаю, что вы можете заменить -n-1на ~n.
Аднан

Почему только Python2? Кажется, что работает на Python3 просто отлично, вы должны изменить его на «Python».
sagiksp

@sagiksp - это стандартный шаблон вывода в TIO
Фелипе Нарди Батиста

О, имеет смысл.
sagiksp

@sagiksp Да, это шаблон от TIO, но обновленный. :)
полностью человек

4

Cubix , 22 байта

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

1-индексированный, принимает входной сигнал , как index, string, разделенный пробел.

Попробуйте онлайн

Cubified

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

объяснение

Это в основном линейно. Основная логика

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.

Затем мы переходим ?к Output, 1если результат равен 0, и в 0противном случае.



3

C #, 28 27 байт

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

Сохраненный байт благодаря @KevinCruijssen.

Компилирует в Func<string, Func<int, bool>>.


Вы можете сохранить байт, изменив s.Length-n-1на s.Length+~n.
Кевин Круйссен

@KevinCruijssen Спасибо, хороший трюк никогда бы не подумал об этом.
TheLethalCoder

1
Я буду полностью честен, я получил это от комментария JS, отвечающего самостоятельно. :) Байт-операции на самом деле не моя экспертиза.
Кевин Круйссен


3

R 51 байт

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

Анонимная функция, использует индексирование на основе 1


1
43 байта:function(s,n)(s=utf8ToInt(s))[n]==rev(s)[n]
Джузеппе


3

Clojure, 27 байт

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

Вау, это было короче, чем я ожидал.


3

APL (Dyalog) , 10 5 байтов

⊃=⊃∘⌽

Это неявная функция, которой необходимо присвоить имя, например f←⊃=⊃∘⌽, и затем вызвать как int f string.

Спасибо @ Adám за колоссальные 5 байтов.

Как это работает:

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

Попробуйте онлайн!

22-байтовый ответ был отредактирован. Если вы хотите увидеть его, проверьте историю изменений.


«он принимает входные данные нетрадиционным способом» - взятие двухэлементного ввода в качестве левого и правого аргументов в APL является полностью стандартным и всегда приемлемым, если OP не запрещает это по какой-то странной причине.
Иона

@ Джона, да, люди в чате рассказали мне об этом. Я оставил все как есть, потому что OP не указывает четко, нормально это или нет. Я отредактирую это, когда вернусь к своему ПК, чтобы сначала появился более короткий ответ.
Ж. Салле

Относительно «неявно предполагает»: На самом деле, эта функция будет работать даже при монадическом вызове, а затем будет использоваться в 1качестве левого аргумента по умолчанию. Попробуйте онлайн! Функции ничего не предполагают; их применяют двоично, потому что им дают как левый, так и правый аргумент.
Адам

@ Adám Я думал, что это произошло, потому что, когда вызывается монадически, принимает первый элемент аргумента? Во всяком случае, я буду редактировать, чтобы уточнить.
Ж. Салле

3

V , 26, 16 , 13 байтов

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

Попробуйте онлайн!

HexDump:

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

1 проиндексировано.

Объяснение:

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

Для справки, мой оригинальный ответ был:

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

Попробуйте онлайн! (0 проиндексировано)

HexDump:

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

Попробуйте онлайн! Это немного короче. Человек Àñx$x|ñчувствует себя как слишком много персонажей. Я пробовал только регулярное выражение, но в итоге получилось около 24!
nmjcman101

1
@ nmjcman101 Оказывается, он может быть намного короче, чем при использовании новых функций.
DJMcMayhem

Ух ты, я вне практики, я едва могу даже читать V
nmjcman101

@ nmjcman101 Я опубликовал объяснение (и немного поиграл в гольф)
DJMcMayhem

2

Mathematica, 34 байта

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

StringTake[#, #2]занимает первые #2 символы #. StringPartбудет хорошо работать в этом случае. #~(s=StringPart)~-#2==s@##&
JungHwan Мин

моя ошибка исправлено!
J42161217

#~s~{#2}==#~s~{#2}&всегда будет уступать True...
JungHwan Мин

финал исправлен! ....
J42161217

1
На самом деле, вы можете взять Listиз Stringс в качестве входных данных, поэтому #[[#2]]==#[[-#2]]&будет достаточно
JungHwan Min

2

Perl 6 , 27 байт

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

Попробуй это

{ # 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 байтов

q@zQ@_z

При обратном вводе: сначала индекс, затем строка. Это 0-проиндексировано.

Пояснения:

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

Попробуйте онлайн!



2

J, 6 байт

-4 байта благодаря FrownyFrog

{(=|.)

См. Оригинальное объяснение ответа - идея достаточно похожа, но это достигается с помощью диадического хука, правый глагол которого сам по себе является монадическим.

Попробуйте онлайн!

оригинальный ответ (10 байт)

{=/@(,:|.)

,:|. правый аргумент сверху правого обратного аргумента

=/ они поэлементно равны?

{ взять из этого логического списка индекс, указанный левым аргументом

Попробуйте онлайн!




1

QBIC , 18 байт

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

объяснение

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

> <>этим интерпретатором), 25 байтов

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

Это не работает в TIO: интерпретатор TIO не переворачивает новый стек при выполнении [инструкции, но игровая площадка работает - сравните "abcde"5[ooooo;бег здесь и здесь , например, .

Ввод строки берется из STDIN, и мы предполагаем, что n уже находится в стеке. Использует 1-индексацию.

Рыба получает n- й символ [:}]&, который откачивает первые n вещей в стеке в новый, перевернутый стек, немного манипулирует этим, затем возвращает вещи обратно и сохраняет n й символ в регистре. Затем он переворачивает весь стек и делает то же самое снова, и возвращает 1, если два символа равны, и 0 в противном случае.

Это похоже на работу в TIO , для 26 байтов:

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

1

C 73 байта

Компилируется как есть с GCC 6.3.1 (без флагов). Некоторая ненужная запутанность включена.

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

использование

$./a.out abcdcba 6

Правда = ничего, фальси = мусор.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.