Перевірте, чи слова є ізоморфами


63

Два слова є ізоморфами, якщо вони мають однаковий зразок повторень літер. Наприклад, обидва ESTATEі DUELEDмають візерунокabcdca

ESTATE
DUELED

abcdca

оскільки букви 1 і 6 однакові, букви 3 і 5 однакові, і нічого далі. Це також означає, що слова пов'язані шифром заміни, тут зі збігом E <-> D, S <-> U, T <-> E, A <-> L.

Напишіть код, який містить два слова, і перевіряйте, чи вони є ізоморфами. Виграє найменше байт.

Введення: Два непусті рядки з великої літери A..Z. За бажанням ви можете взяти їх як збірку з двох рядків або як єдину струну з роздільником.

Вихід: Послідовне значення Truthy для пар, які є ізоморфами , і послідовне значення Фальсі, якщо їх немає. Рядки різної довжини є дійсними входами, які ніколи не є ізоморфами.

Тестові приклади:

Правда:

ESTATE DUELED
DUELED ESTATE
XXX YYY
CBAABC DEFFED
RAMBUNCTIOUSLY THERMODYNAMICS
DISCRIMINATIVE SIMPLIFICATION

Помилковий:

SEE SAW
ANTS PANTS
BANANA SERENE
BANANA SENSES
AB CC
XXY XYY
ABCBACCBA ABCBACCAB
ABAB CD

Не соромтеся додавати більше тестових справ, які вважаєте корисними.

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

# Ruby, <s>104</s> <s>101</s> 96 bytes


Чи гарантовано однакові довжини двох входів?
Оптимізатор

@Optimizer Ні, довжина може бути різною.
xnor

@Jakube Ні, ваш код теоретично повинен працювати з введеннями будь-якої довжини. Це нормально, якщо величезні входи виходять з ладу на апараті через такі проблеми, як переповнення пам'яті або глибина стека.
xnor

Ок, тоді я видалю свою відповідь.
Якубе

Важливий тестовий випадок: ABAB CD(для
ближнього

Відповіді:


95

J, 4 байти

-:&=

Використання

   'THERMODYNAMICS' (-:&=) 'RAMBUNCTIOUSLY'  NB. parens are optional
1 

Пояснення

  • = з 1 аргументом створює таблицю рівності, порівнюючи елементи вхідного даних та його нуль.

    ='ESTATE' gives the binary matrix
    
    = | E S T A T E    
    --+------------
    E | 1 0 0 0 0 1
    S | 0 1 0 0 0 0
    T | 0 0 1 0 1 0
    A | 0 0 0 1 0 0
    
  • -:з двома аргументами перевіряє їх рівність (як ==це робиться взагалі). Це також працює для матриць різного розміру (або навіть різних типів).

  • f&gзастосовує g до обох даних окремо, а потім застосовує f до двох результатів разом, так x f&g y == f(g(x), g(y)).

  • Тож у нашому випадку ми порівнюємо дві таблиці рівності.

Спробуйте його онлайн тут.


2
Цікавий та елегантний підхід. Без еквіваленту цьому &, напевно, було б найближче, що ви могли б зробити в K ~/{x=/:x}', а це трохи довше.
JohnE

17
Ісус. Це має бути претендентом на зал слави кодегольфа.
Брайан Гордон

Нічого собі, не очікував, що класифікація =матиме інше використання, ніж для підрахунку подій.
миль

37

К, 5 байт

Це чудово елегантне рішення в K!

~/=:'

Оператор "групи" (монадичний =) створює саме ту підпис, яку ми хочемо для слова ізоморфізм; збирання векторів індексів кожного елемента вектора з групами, упорядкованими за зовнішнім виглядом:

  ="ABBAC"
(0 3
 1 2
 ,4)

  ="DCCDF"
(0 3
 1 2
 ,4)

Беручи пару рядків як вектор, нам просто потрібно застосувати групу до кожного елемента ( =:'), а потім зменшити за допомогою "match" ( ~), оператор глибокої рівності:

  ~/=:'("RAMBUNCTIOUSLY";"THERMODYNAMICS")
1
  ~/=:'("BANANA";"SERENE")
0

15

Python 2, 41 байт

f=lambda a,b:map(a.find,a)==map(b.find,b)

4
Це рішення, яке надихнуло мене на створення цього виклику!
xnor

12

CJam, 9 байт

r_f#r_f#=

Друкує, 1якщо слова є ізоморфами, а 0якщо їх немає.

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

r    e# Read a whitespace separated token from STDIN.
_    e# Push a copy.
f#   e# Get the indexes of all characters from the first copy in the second.
r_f# e# Repeat for the second word.
=    e# Check for equality.

10

JavaScript, ES7, 62 55 54 52 51 байт

f=(x,y,g=z=>[for(i of z)z.search(i)]+0)=>g(x)==g(y)

Логіка проста. Я просто перетворюю обидва входи у відповідні їм значення індексу символів, конвертую цей масив у рядок та порівнюю.

f=(x, y,                  // Create a function named f which takes two arguments x and y
   g=                     // There is a third default argument to f which equals to
     z=>                  // and arrow function which takes argument z
     [                    // Return this array which is created using array comprehension
      for(i of z)         // For each character of z
      z.search(i)         // Use the index of that character in z in place of the character
     ]+0                  // And finally type cast that array to a string
                          // Here, the array elements are automatically joined by a ','
                          // and appended by a 0.
                          // Its funny how JS type casts Array + Number to a string
   )=>                    // Now the body of function f starts
      g(x)==g(y)          // It simply returns if index map of x equals index map of y

Спробуйте вказаний вище код, використовуючи фрагмент нижче.

2 байти збережено завдяки @ edc65


7
+1, пробував, працює добре. +0замість +""?
edc65

1
@ edc65 wow, набравши WTF
оптимізатор

1
Щойно я зрозумів, що рядки "A-Z", тому ви можете сміливо використовувати пошук замість indexOf і вирізати ще 1 байт.
edc65

розуміння масиву не вирізали зрештою es7? де працює цей код? Я думаю тільки в
мозіллі

8

Bash + coreutils, 38

[ `tr $@<<<$1``tr $2 $1<<<$2` = $2$1 ]

Зверніть увагу, що ми використовуємо тут звичайну ідею оболонки truthy / falesy - нуль означає УСПІХ або ПРАВИЛЬНУ, а ненульовий - означає помилку або ЛЖУ:

$ for t in "ESTATE DUELED" "DUELED ESTATE" "XXX YYY" "CBAABC DEFFED" "RAMBUNCTIOUSLY THERMODYNAMICS" "DISCRIMINATIVE SIMPLIFICATION" "SEE SAW" "ANTS PANTS" "BANANA SERENE" "BANANA SENSES" "AB CC" "XXY XYY" "ABCBACCBA ABCBACCAB"; do
> ./isomorph.sh $t
> echo $t $?
> done
ESTATE DUELED 0
DUELED ESTATE 0
XXX YYY 0
CBAABC DEFFED 0
RAMBUNCTIOUSLY THERMODYNAMICS 0
DISCRIMINATIVE SIMPLIFICATION 0
SEE SAW 1
ANTS PANTS 1
BANANA SERENE 1
BANANA SENSES 1
AB CC 1
XXY XYY 1
ABCBACCBA ABCBACCAB 1
$ 

8

Хаскелл, 33 29

Редагувати:

це занадто пізно, але я знайшов це покращення за допомогою додатків, які були додані до прелюдії лише в березні 2015 року.

s%k=g s==g k
g s=(==)<$>s<*>s

Стара версія:

s%k=g s==g k
g s=[a==b|a<-s,b<-s]

функція перевірки є (%)

це працює, генеруючи для кожного рядка свій "запис рівності": для кожного двох індексів ij він записує, чи мають вони рівні символи. запис впорядковується так, що запис для двох індексів i, j завжди знаходиться в одному місці *, і тому перевірка рівності записів повертає, чи мають рядки однаковий малюнок.

наприклад, запис рівності "ABC" є [1,0,0,0,1,0,0,0,1](1 для істинного, 0 для помилкового) - там, Trueде будь-який індекс порівнюється з самим собою. ніде більше неправда. (пропуск цих чеків може бути більш ефективним, але складніше з точки зору гольфу)

* якщо рядки однакової довжини. інакше він повертає помилкові лише тому, що записи мають різну довжину


6

Haskell, 45 41 байт

h l=map(`lookup`zip l[1..])l
x!y=h x==h y

Повертається Trueабо False, наприклад "ESTATE" ! "DUELED"-> True.

Використовується метод map-char-to-first-index, як видно з багатьох інших відповідей. Список асоціацій стане у нагоді, оскільки попередні записи козирять. "aba"стає [(a,1),(b,2),(a,3)]там, де lookupзавжди виходить a-> 1.

Редагувати: @Mauris знайшов 4 байти для збереження.


Ви можете замінити (flip lookup$zip l[1..])на (`lookup`zip l[1..]).
Лінн

6

Brainfuck, 169 168 162 144 140 131 130

Сумісність з Alex Панкратова BFF (Brainfuck інтерпретатора , що використовується на SPOJ і ideone) і Томаса Корта в BFI (використовується на Anarchy Golf).

Очікуваний вхід - це два рядки, розділені вкладкою, без нового рядка після другого рядка. Вихід призначений 1для ізоморфів і 0для неізоморфів, що зручно для візуальної перевірки результатів, хоча це не найкоротший варіант. ( Оновлення: скорочена версія з \x01і \x00як вихід та \x00як роздільник внизу відповіді.)

Демонстрація на ideone.

,+
[
  -
  ---------
  >+<
  [
    >>-<
    [
      <
      [
        >+<
        <<<<-<+>>>>>-
      ]
      ++[->+]
      ->+[+<-]
      >[<<<<]
      <
    ]
    <[>+<-]
    +[->+]
    <->
    >>>
  ]
  >
  [
    [[-]<<<<<]
    >>>>
  ]
  <,+
]
>>>+>+
[
  [<->-]
  <[>>>>>]
  <<<<
]
-<[>]
+++++++[<+++++++>-]
<.

Ця проблема виявляється дуже приємною для головного мозку.

Основна ідея з індексуванням - повернутися назад від кінця поточного рядкового префікса. Якщо символ раніше не виникав, ми можемо взяти довжину префікса рядка. Наприклад:

STATES
123255

Індексація в коді насправді дещо відрізняється, але використовує той же принцип.

Макет пам'яті складається з блоків 5:

0 0 0 0 0 0 c 0 i p 0 c 0 i p 0 c 0 i p 0 0 0 0

cозначає символ, iіндекс та pпопередній (індекс). Під час опрацювання першого рядка всі pслоти дорівнюють нулю. Комірка зліва від cвикористовується для зберігання копії поточного символу, для якого ми намагаємося знайти індекс. Комірка зліва від поточного iвикористовується для утримання -1легкої навігації вказівника.

Є багато умов, які потрібно уважно розглянути. Наприкінці ми перевіряємо наявність ізоморфів, порівнюючи (i,p)пари, і доходимо до скупчення нульових комірок зліва від крайньої лівої (i,p)пари тоді і лише тоді, коли рядки є ізоморфами. Ось коментована версія коду для полегшення дотримання:

,+
[                       while there is input
  -
  ---------
  >+<                   increment char (adjust later)
  [                     if not tab
    >>-<                set navigation flag
    [                   loop to find index
      <                 travel to copy
      [
        >+<             restore char
        <<<<-<+>>>>>-   compare chars and create copy
      ]
      ++[->+]           travel between navigation flags
      ->+[+<-]          increment index by 2 and go back
      >[<<<<]           proceed if not fallen off string
      <                 compare chars
    ]
    <[>+<-]             restore char (or no op)
    +[->+]              go back to navigation flag
    <->                 adjust char
    >>>                 alignment
  ]
  >
  [                     if tab
    [[-]<<<<<]          erase chars and go to beginning
    >>>>                alignment
  ]
  <,+
]
>>>+>+                  check string lengths and start loop
[
  [<->-]                compare indices
  <[>>>>>]              realign if not equal
  <<<<                  proceed
]
-<[>]                   cell to left is zero iff isomorphs
+++++++[<+++++++>-]
<.

Оновлення:

Ось версія, яка друкує \x01для ізоморфів та \x00для неізоморфів. Це, мабуть, більш точна інтерпретація Труті та Фальсі для глузду, через спосіб [і ]роботу. Єдина різниця - в самому кінці.

Додатково: Тепер використовується \x00як роздільник для збереження 10 байт.

+
[
  -
  >+<
  [
    >>-<
    [
      <
      [
        >+<
        <<<<-<+>>>>>-
      ]
      ++[->+]
      ->+[+<-]
      >[<<<<]
      <
    ]
    <[>+<-]
    +[->+]
    <->
    >>>
  ]
  >
  [
    [[-]<<<<<]
    >>>>
  ]
  <,+
]
>>>+>+
[
  [<->-]
  <[>>>>>]
  <<<<
]
-<[>]
<+.

5

JavaScript (ES6), 62

Використовуючи функцію aux, hяка відображає кожне слово до масиву, що містить положення кожної літери у слові, наприклад: PASS -> [1,2,3,3]. Повернути істину, якщо функція, hзастосована двома словами, дає однаковий результат.

f=(a,b,h=w=>0+[for(c of(n=k=[],w))k[c]=k[c]||++n])=>h(b)==h(a)

// TEST

;[
// True
 ['ESTATE','DUELED']
,['DUELED','ESTATE']
,['XXX','YYY']
,['CBAABC','DEFFED']
,['RAMBUNCTIOUSLY','THERMODYNAMICS']
,['DISCRIMINATIVE','SIMPLIFICATION']

// False:

,['SEE','SAW']
,['ANTS','PANTS']
,['BANANA','SERENE']
,['BANANA','SENSES']
,['XXY','XYY']
,['ABCBACCBA','ABCBACCAB']
]
.forEach(t=>(f(t[0],t[1])?OK:KO).innerHTML+=t+'\n')
Ok<br>
<pre id=OK></pre><br>
KO<br>
<pre id=KO></pre>


1
Іноді просто - це коротше;)
Оптимізатор

5

R, 78

function(x,y)identical((g=function(z)match(a<-strsplit(z,"")[[1]],a))(x),g(y))

Де-гольф:

word_to_num <- function(word) {
   chars <- strsplit(word,"")[[1]]
   match(chars, chars)
}
are_isomorph <- function(word1, word2) identical(word_to_num(word1), 
                                                 word_to_num(word2))

бийте мене до цього! (+1)
shadowtalker

Я думаю all( (g=...)(x)==g(y)), що коротше, ніж identical...
Джузеппе

5

Рубін, 83 байти

t=->x{y=0;z=?`;x.gsub!(y[0],z.succ!)while y=x.match(/[A-Z]/);x};f=->a,b{t[a]==t[b]}

Це функція, fяка бере два аргументи і повертає trueабо false.

Пояснення:

test = -> str {
    y = nil  # we're just initializing this; it doesn't matter to what
             # this is the variable we use to store the `match' result
    z = '`'  # backtick is the ASCII character before `a'
    while y = str.match(/[A-Z]/) do  # while there is an uppercase letter in str
        str.gsub!(y[0], z.succ!)  # replace all instances of the uppercase letter
                                  # with the next unused lowercase letter
    end
    str  # return the new string
}
# self-explanatory
f=->a,b{test[a]==test[b]}

1
Це має заощадити 4 байти:, t=->x{z=?`;x.chars.to_a.uniq.map{|c|x.gsub!(c,z.succ!)};x};f=->a,b{t[a]==t[b]}і ви можете зменшити його до 68, якщо ви використовуєте хеш для заміни:t=->x{h={};i=9;x.gsub!(/./){|c|h[c]||h[c]=i+=1}};f=->a,b{t[a]==t[b]}
blutorange

5

Ява, 107

(s,t)->java.util.Arrays.equals(s.chars().map(s::indexOf).toArray(),t.chars().map(t::indexOf).toArray())

Картує кожен символ sта tйого місце розташування та перевіряє рівність.

Розширено:

class Isomorphs {
    public static void main(String[] args) {
        java.util.function.BiFunction<String, String, Boolean> f =
            (s, t) -> java.util.Arrays.equals(
                                              s.chars().map(s::indexOf).toArray(),
                                              t.chars().map(t::indexOf).toArray()
                                             )
           ;
        System.out.println(f.apply("XXY", "XYY"));
    }
}

Я не думаю, що це буде справно, якщо струни мають різну довжину.
JohnE

@JohnE Так, це так.
Ypnypn

Ага, гаразд - думаю, що "розширена" версія вводить в оману.
JohnE

4

Python 3, 85 байт

f=lambda a,b:''.join(map(lambda g:dict(zip(a,b))[g],a))==b
g=lambda a,b:f(a,b)&f(b,a)

Де вхід / вихід на цьому?
DJMcMayhem

@DJMcMayhem g- головна функція, fє помічником. gВсередині є заплутаний вибір змінної f, але це незв'язана зв'язана змінна .. g=Необов'язково згідно постанови, що дозволяє виконувати функції anon, що зберігає дві символи. '
xnor

4

Pyth, 9 байт

qFmmxdkdQ

Вводиться в такій формі:

"ESTATE", "DUELED"

Якщо це неприйнятно, наступний код - 10 байт:

qFmmxdkd.z

і використовує цю форму введення:

ESTATE
DUELED

Використовує індекс char в рядковому поданні.


Перший формат введення - це нормально. Мене цікавить, як ти зменшуєш перевірку рівності, але мені незрозуміло, як Fпрацює складка. Що <binary>F?
xnor

@xnor <binary>F<seq>буде <binary>загинають <seq>. Це рівнозначно розшифровці <binary>між кожною парою елементів <seq>. Таким чином, <binary>Fна послідовності з 2 елементами просто застосовується функція до послідовності, еквівалентної .*в Pyth або *Python.
isaacg

Я думав, що трейлінг Qмається на увазі в Pyth?
Кіос

@Cyoce Не тоді - ця функція була додана у квітні 2016 року, майже через рік.
isaacg

4

Матлаб, 50 байт

f=@(s,t)isequal(bsxfun(@eq,s,s'),bsxfun(@eq,t,t'))

Функція визначається як анонімна, щоб заощадити деякий простір.

Приклад:

>> f=@(s,t)isequal(bsxfun(@eq,s,s'),bsxfun(@eq,t,t'));
>> f('ESTATE','DUELED')
ans =
     1
>> f('ANTS','PANTS')
ans =
     0

4

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

@(s,t)isequal(s==s',t==t')

3
Виглядає цікаво. пояснення?
гордий haskeller

==- це матрична елементна рівність, а оскільки sі s'є різними розмірами, октава "мовлення" автоматично намагається отримати матриці однакового розміру для роботи - що в цьому випадку означає повторення рядка sта стовпцяs'
rakslice

Це той самий підхід, що і рішення Matlab @ LuisMendo, але розширення там явне.
rakslice


4

APL (Dyalog) , 5 4 байти

-1 завдяки натяку на ngn

Функція анонімного негласного префікса, яка бере аргумент списку з двох рядків.

≡.⍳⍨

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

Це внутрішній продукт, але замість звичного +і ×використовується

 тотожність

. і

ɩ NDEX (перше входження кожного елемента)

 з усім двоелементним списком слів, що використовуються як обидва аргументи

Якщо ми називаємо слова Aі B, тоді ми можемо отримати попереднє рішення наступним чином:

≡.⍳⍨ A B
A B ≡.⍳ A B
(A⍳A) ≡ (B⍳B)
(⍳⍨A) ≡ (⍳⍨B)
≡/ ⍳⍨¨ A B

Попереднє рішення

Функція анонімного негласного префікса, яка бере аргумент списку з двох рядків.

≡/⍳⍨¨

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

 тотожність

/ поперек

ɩ NDEX (перше входження кожного елемента ...)

 selfie (… сам по собі)

¨ кожного


чи можна побачити внутрішній виріб? :)
ngn

@ngn Так, звичайно. СІЛЬ мене.
Adám

Чи повинно верхнє посилання посилатися на старе рішення?
Zacharý

Шкода, що це не працює на масивах вищого рангу: P
Zacharý

1
@ Zacharý як обіцяли: ngn.github.io/apl-codegolf-2017/readme.txt
ngn


3

Рубін, 50 байт

30 байт коротший рубіновий код. Написано до того, як я подивився на рішення, перевіряє для кожного символу обох рядків, чи відповідає показник першої появи цього персонажа; тобто. перетворює рядок у нормалізовану форму 01121тощо і порівнює їх.

->x,y{g=->z{z.chars.map{|c|z=~/#{c}/}};g[x]==g[y]}

Тестові приклади на ideone Як додатковий бонус, це порушує виділення коду ideone.


3

Лушпиння , 5 байт

¤=´×=

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

Пояснення

       -- implicit input A, B (strings aka character lists)       | "ab" "12"
¤=     -- apply the following function to A & B, then compare:    | [1,0,0,1] == [1,0,0,1] -> 1
  ´×   --   Cartesian product with itself under                   | ["aa","ba","ab","bb"] ["11","21","12","22"]
    =  --   equality                                              | [ 1  , 0  , 0  , 1  ] [ 1  , 0  , 0  , 1  ]

3

PCRE, 84 байти

^((.)(?=.+ (\3.|)(.))(?=((?=(\2|)?+.* \3\4(\7?(?(?=.*+\6)(?!\4).|\4))).)+ ))+. \3..$ 

Тема має бути двома розділеними пробілами словами, як в ОП. Ось коротке пояснення:

Для кожної літери X першого слова:

Погляньте наперед до другого слова та встановіть зворотні посилання, щоб згадати, як далеко ми знаходимось, а також букву Y у другому слові, що відповідає X.

Для кожної літери Z, що минула поточну позицію в першому слові:

Створіть подібні зворотні посилання, як описано вище.

Подивіться на відповідну букву в другому слові і перевірте, чи Z = X, а потім відповідати Y, інакше відповідати букві, яка не є Y.

Ця ітерація може закінчитися, коли ми збіжемось до передостанньої літери першого слова. Після цього, оскільки подальша перевірка не потрібна, залишається лише перевірити, що слова мають однакову довжину (зворотний посилання, що містить накопичувальні підрядки другого слова, завжди відстає на 1 букву).


2

Рубін, 31 байт

->a{!!a.uniq!{|s|s.tr s,'a-z'}}

Програма, яка приймає масив рядків і перевіряє, чи є одна одна з одноморфних. tr s,'a-z'за допомогою цих аргументів нормалізується рядок s, замінюючи кожну букву на n-ту букву в алфавіті, де nнайбільший індекс, з яким ця буква відображається в рядку. Наприклад, estateстає fbedef, як це робиться dueled.


1

Кобра, 72 байти

do(a='',b='')=(for i in a get a.indexOf(i))==for i in b get b.indexOf(i)

Ви впевнені, що це означає AB CCтестовий випадок помилковим?
xnor

@xnor виправлено зараз
Οurous

1

JavaScript (ES5), 142 98

Досить великий, але версії ES5 я ще не бачив.

for(l=j=2;j--;){c=prompt();for(i=c.length;i--;)c=c.replace(RegExp(c[i],"g"),i);b=l==c;l=c}alert(b)

Просто замінює кожне виникнення першої літери на зворотне значення індексу. Повторює це для кожного персонажа.

Це робить те саме для обох входів та порівнює створений шаблон.

Порівняння досить потворне, але я не хочу використовувати масив для зберігання та порівняння.


1
Ви не можете перейти ;l=cдо for(l=j=2;j--;та зберегти байт?
Джонатан Фрех

1

Perl, 38 байт

($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a

Виконати як perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS

Друкує 1, якщо правда, нічого, якщо неправдиво.



1

C ++, 213 196 162 байт

-51 байт завдяки Захарі

#include<map>
#define F(X,x)for(auto&e:X){if(x.end()==x.find(e))x[e]=65+x.size();e=x[e];}
auto i=[](auto a,auto b){std::map<int,int>c,d;F(a,c)F(b,d)return a==b;};

Щоб викликати лямбда, вам потрібно передати 2 аргументи std::stringтипу даних

Код для тестування:

std::initializer_list<std::pair<std::string, std::string>> test{
    {"ESTATE","DUELED"},
    {"DUELED","ESTATE"},
    {"XXX","YYY"},
    {"CBAABC","DEFFED"},
    {"RAMBUNCTIOUSLY","THERMODYNAMICS"},
    {"DISCRIMINATIVE","SIMPLIFICATION"},
    {"SEE","SAW"},
    {"ANTS","PANTS"},
    {"BANANA","SERENE"},
    {"BANAnA","SENSES"},
    {"AB","CC"},
    {"XXY","XYY"},
    {"ABCBACCBA","ABCBACCAB"},
    {"ABAB","AC"}
};

for (const auto& a : test) {
    std::cout << "Test with " << a.first << " and " << a.second <<
        " outputs : " << (i(a.first, a.second)?"TRUE":"FALSE") << '\n';
}

для коду, який необхідний для тестування, включаючи файл iostreamта stringзаголовок


1
Це не схоже на те, що ви використовуєте що-небудь із заголовка рядка, тож чи можете ви вилучити його та змусити користувача включити його самі?
Zacharý

Чи має ця робота для 161 байт?
Zacharý

@ Zacharý Якщо ви додасте eяк аргумент find, так, це працює
HatsuPointerKun

Той момент, коли ти
побиваєш

1

JavaScript (ES6), 52 51 50 байт

Ця версія не використовує розуміння масиву та приймає дані за допомогою синтаксису currying.

a=>b=>(f=x=>0+[...x].map(c=>x.search(c)))(a)==f(b)

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