Чи відповідає n-й знак n-му від останнього char?


22

Натхненний Чи відповідає старт кінці

Отримавши рядок sі ціле число n, вихід A truthy / falsey, чи повинні nй символ в sдорівнює n-го від кінцевого напівкоксу в s.

Вхідні дані

Непорожній рядок і ціле число. Можна використовувати індексацію на основі 0 або індексацію на основі 1. Ціле число гарантовано є дійсним на основі рядка. Наприклад, якщо рядок "supercalifragalistic123", ціле число може бути від 1 до 23 для індексації на основі 1, і 0 до 22 для індексації на основі 0. Зверніть увагу, що nдовжина може перевищувати половину довжини s.

Вхід обмежений для друку ASCII.

Вихідні дані

Коефіцієнт truthy / falsey, заснований на тому, чи nзначення th у sрівне t- nму від останнього значення в s.

Зверніть увагу, що останній знак знаходиться в позиції 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за кодову точку? (для езотеричних мов, таких як brain-flak)
DJMcMayhem

@DJMcMayhem впевнений.
Стівен

Відповіді:


11

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

=UƓị

Спробуйте в Інтернеті!

У Jelly не повинно бути коротших відповідей. Програмі знадобиться порівняння, повернення / заперечення, виклик індексу та байт для потоку управління ( Ɠу цьому випадку), що додає до чотирьох байтів.

Як це працює

 =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 Thankyou! Це тихе доповнення, яке йде від вас :)
DJMcMayhem

Тепер ми бачимо, чи може Джеллі обіграти цей xD
Стівен

5

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

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

Спробуйте в Інтернеті!

Або той самий обліковий запис:

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

Спробуйте в Інтернеті!

Пояснення:

Це досить прямо вперед. Перший приймає рядок sі ціле число nв якості вхідних даних і перевіряє n-й елемент s(n)на предмет рівності "last-n + 1".

Другий перевіряє n-й елемент s(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 Jabberwocky?
Стівен


@StephenS Btw, я не отримую сповіщень, якщо ви просто згадуєте мене у випадкових дописах. Пінг працює лише в тому випадку, якщо публікація моя, або я прокоментував себе (і я думаю, якщо я змінив публікацію). Зазвичай вам краще пінгувати мене в чаті.
Мартін Ендер

@MartinEnder Я якось це знав, але це було недостатньо важливо, щоб вас пінг. Дякуємо за підтвердження та посилання :)
Стівен

5

Пітон , 24 22 байти

-2 байти завдяки Аднану.

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

Спробуйте в Інтернеті!


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

Чому тільки Python2? Здається, що на Python3 працює чудово, слід змінити його на просто "Python".
sagiksp

@sagiksp - це шаблон виводу за замовчуванням у TIO
Феліпе Нарді Батіста

О, має сенс.
sagiksp

@sagiksp Так, це шаблон із TIO, але оновлений. :)
totalhuman

4

Cubix , 22 байти

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

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

Спробуйте в Інтернеті

Кубіфікований

    . .
    @ .
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-байтну відповідь було відредаговано. Якщо ви хочете його переглянути, перевірте історію редагування.


"він приймає введення нетрадиційним способом" - прийняття 2-х елементів в якості лівого та правого аргументів у APL є цілком стандартним та завжди прийнятним, якщо ОП спеціально не забороняє це з якихось химерних причин.
Іона

@Jonah так, люди в чаті мене просвітили про це. Я залишив це так, оскільки ОП не чітко визначає, добре це чи ні. Я відредагую це, коли повернусь до свого ПК, щоб спочатку з’явилася коротша відповідь.
J. Sallé

Щодо "неявно припускає": Насправді ця функція буде працювати навіть при виклику монадично, а потім, здається, використовуватиме 1як аргумент лівий за замовчуванням. Спробуйте в Інтернеті! Функції нічого не передбачають; вони застосовуються діадично, оскільки їм дають аргумент як зліва, так і справа.
Adám

@ Adám Я думав, що це сталося тому, що, коли його називають монадично, бере перший елемент аргументу? У будь-якому випадку я редагую, щоб уточнити.
J. Sallé

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

Математика, 34 байти

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

StringTake[#, #2]займає перші #2 символи #. StringPartдобре працював би в цьому випадку. #~(s=StringPart)~-#2==s@##&
JungHwan Min

моя помилка. виправлено!
J42161217

#~s~{#2}==#~s~{#2}&завжди буде поступатися True...
JungHwan Min

остаточне виправлення! ....
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

Truthy = нічого, falsey = сміття.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.