Два слова являются изоморфами, если они имеют одинаковый шаблон повторения букв. Например, оба ESTATE
и DUELED
имеют шаблонabcdca
ESTATE
DUELED
abcdca
потому что буквы 1 и 6 одинаковы, буквы 3 и 5 одинаковы, и больше ничего. Это также означает, что слова связаны шифром замещения, здесь с соответствием E <-> D, S <-> U, T <-> E, A <-> L
.
Напишите код, который берет два слова и проверяет, являются ли они изоморфами. Побеждает несколько байтов.
Ввод: две непустые строки заглавных букв A..Z
. Если вы хотите, вы можете взять их как набор из двух строк или как одну строку с разделителем.
Вывод: непротиворечивое значение Truthy для пар, которые являются изоморфами , и непротиворечивое значение Falsey, если это не так. Строки разной длины являются допустимыми входными данными, которые никогда не являются изоморфными.
Тестовые случаи:
Правда:
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
Не стесняйтесь добавлять больше тестов, которые вы считаете полезными.
Leaderboard
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
var QUESTION_ID=50472;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>
ABAB CD
(для zip-подобных подходов)Ответы:
J, 4 байта
использование
объяснение
=
с 1 аргументом создает таблицу равенства, сравнивающую элементы ввода и его кусочек.-:
с 2 аргументами проверяет их равенство (как==
обычно делает). Это работает и для матриц разного размера (или даже разных типов).f&g
применяет g к обоим входным данным по отдельности, а затем применяет f к двум результатам вместеx f&g y == f(g(x), g(y))
.Итак, в нашем случае мы сравниваем две таблицы равенства.
Попробуйте это онлайн здесь.
источник
&
, вероятно, самое близкое, что вы могли бы сделать в K~/{x=/:x}'
, это намного дольше.=
будет иметь какое-либо иное использование, чем для подсчета случаев.К 5 байт
Это восхитительно элегантное решение в K!
Оператор «группа» (монадический
=
) создает именно ту сигнатуру, которую мы хотим для изоморфизма слова; сбор векторов индексов каждого элемента вектора с группами, упорядоченными по внешнему виду:Взяв пару строк в качестве вектора, нам просто нужно применить группу к каждому элементу (
=:'
), а затем уменьшить с помощью «match» (~
), оператора глубокого равенства:источник
Python 2, 41 байт
источник
CJam, 9 байт
Печатает,
1
если слова изоморфы, а0
если нет.Попробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник
JavaScript, ES7,
62 55 54 5251 байтЛогика проста. Я просто конвертирую оба входа в соответствующие им значения индекса символов, преобразую этот массив в строку и сравниваю.
Попробуйте приведенный выше код, используя фрагмент ниже.
Показать фрагмент кода
2 байта сохранены благодаря @ edc65
источник
+0
вместо+""
?Bash + coreutils, 38
Обратите внимание, что здесь мы используем обычную идею оболочки истина / ложь - ноль означает УСПЕХ или ИСТИНА, а ненулевое значение означает ошибку или ЛОЖЬ:
источник
Хаскелл,
3329РЕДАКТИРОВАТЬ:
это слишком поздно, но я нашел это улучшение с помощью аппликативов, которые были добавлены к прелюдии только в марте 2015 года.
Старая версия:
функция проверки
(%)
это работает, генерируя для каждой строки свою «запись равенства»: для каждых двух индексов ij записывается, имеют ли они одинаковые символы. запись упорядочена таким образом, чтобы запись для двух индексов i, j всегда находилась в одном и том же месте *, и поэтому проверка равенства записей вернула бы, имеют ли строки одинаковый шаблон.
например, запись равенства «ABC»
[1,0,0,0,1,0,0,0,1]
(1 для истины, 0 для ложной) - там,True
где любой индекс сравнивается с самим собой. где-нибудь еще является ложным. (пропуск этих проверок может быть более эффективным, но сложнее с точки зрения игры в гольф)* если строки имеют одинаковую длину. в противном случае он возвращает false только потому, что записи имеют разную длину
источник
Haskell,
4541 байтВозвращает
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..])
.Brainfuck,
169168162144140131130Совместим с bff Алекса Панкратова (интерпретатор brainfuck, используемый на SPOJ и ideone) и BFI Томаса Корта (используется на Anarchy Golf).
Ожидаемый ввод - две строки, разделенные табуляцией, без новой строки после второй строки. Вывод предназначен
1
для изоморфов и0
неизоморф, что удобно для визуальной проверки результатов, хотя и не является самым коротким вариантом. ( Обновление: сокращенный вариант с\x01
и в\x00
качестве выходного сигнала , и в\x00
качестве разделителя в нижней части ответа.)Демонстрация на идеоне.
Эта проблема, оказывается, очень хороша для мозгового срыва.
Основная идея индексации - вернуться назад от конца текущего строкового префикса. Если символ ранее не встречался, мы можем взять длину префикса строки. Например:
Индексация в коде на самом деле немного отличается, но использует тот же принцип.
Расположение памяти в блоках по 5:
c
обозначает символ,i
индекс иp
предыдущий (индекс). Когда первая строка обрабатывается, всеp
слоты равны нулю. Ячейка слева отc
содержит копию текущего символа, индекс которого мы пытаемся найти. Ячейка слева от текущегоi
используется-1
для удобной навигации по указателю.Есть много условий, которые необходимо тщательно продумать. В конце мы проверяем изоморфы, сравнивая
(i,p)
пары, и достигаем кластера с нулевыми ячейками слева от самой левой(i,p)
пары тогда и только тогда, когда строки являются изоморфами. Вот закомментированная версия кода, чтобы было легче следовать:Обновить:
Вот версия, которая печатает
\x01
для изоморфов и\x00
неизоморф. Это, пожалуй, более точная интерпретация Истины и Фолси для мозгового срыва, из-за способа[
и]
работы. Разница только в самом конце.Дополнительно: теперь используется
\x00
в качестве разделителя для сохранения 10 байтов.источник
JavaScript (ES6), 62
Использование вспомогательной функции,
h
которая отображает каждое слово в массив, содержащий положение каждой буквы в слове, например: PASS -> [1,2,3,3]. Вернуть true, если функцияh
применила два слова и даст одинаковый результат.источник
R 78
Де-golfed:
источник
all( (g=...)(x)==g(y))
корочеidentical
...Рубин, 83 байта
Это функция,
f
которая принимает два аргумента и возвращаетtrue
илиfalse
.Объяснение:
источник
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]}
Ява, 107
Сопоставляет каждый символ
s
иt
его местоположение и проверяет равенство.Expanded:
источник
Python 3, 85 байт
источник
g
- основная функция,f
помощник. Там очень запутанным выбор переменнойg
внутриf
, но это не связано связанной переменной .. Дляg=
необязателен в соответствии с постановлением , позволяя функции Анон, что экономит два символа.Pyth, 9 байт
Принимает ввод в следующем виде:
Если это не приемлемо, следующий код составляет 10 байтов:
и использует эту форму ввода:
Использует индекс char в строковом представлении.
источник
F
работает сложение. Что<binary>F
?<binary>F<seq>
будет<binary>
загибают<seq>
. Это эквивалентно вкраплению<binary>
между каждой парой элементов<seq>
. Таким образом,<binary>F
для последовательности из 2 элементов просто применяется функция к последовательности, эквивалентная.*
в Pyth или*
Python.Q
было скрыто в Pyth?Matlab, 50 байтов
Функция определена как анонимная для экономии места.
Пример:
источник
Октава, 26 байт
источник
==
является матричным поэлементным равенством, и посколькуs
иs'
имеют разные размеры, «широковещание» октавы автоматически пытается получить матрицы одинакового размера для работы - что в этом случае означает повторение строкиs
и столбцаs'
05AB1E , 6 байтов
Попробуйте онлайн!
Принимает ввод в виде списка:
['ESTATE', 'DUELED']
Пояснения:
источник
APL (Дьялог) ,
54 байта-1 благодаря подсказке ngn.
Функция анонимного молчаливого префикса, которая принимает список из двух строк в качестве аргумента.
Попробуйте онлайн!
Это внутренний продукт, но вместо обычного
+
и×
он использует≡
одинаковости.
а также⍳
ɩ NDEX (первое вхождение каждого элемента)⍨
со всем двухэлементным списком слов, используемых в качестве обоих аргументовЕсли мы назовем слова
A
иB
, то мы можем вывести предыдущее решение следующим образом:≡.⍳⍨ A B
A B ≡.⍳ A B
(A⍳A) ≡ (B⍳B)
(⍳⍨A) ≡ (⍳⍨B)
≡/ ⍳⍨¨ A B
Предыдущее решение
Функция анонимного молчаливого префикса, которая принимает список из двух строк в качестве аргумента.
Попробуйте онлайн!
≡
одинаковости/
через⍳
ɩ NDEX (первое вхождение каждого элемента ...)⍨
селфи (… сама по себе)¨
каждогоисточник
Mathematica, 46 байтов
источник
Рубин, 50 байтов
30 байтов короче код рубина. Написанный до того, как я взглянул на решения, проверяет для каждого символа обеих строк, совпадает ли индекс первого вхождения этого символа; то есть. преобразует строку в ее нормализованную форму и
01121
т. д. и сравнивает их.Тестовые случаи на ideone В качестве дополнительного бонуса это нарушает подсветку кода ideone.
источник
Шелуха , 5 байт
Попробуйте онлайн!
объяснение
источник
PCRE, 84 байта
Тема должна состоять из двух слов, разделенных пробелами, как в OP. Вот краткое объяснение:
источник
Рубин, 31 байт
Proc, который принимает массив строк и проверяет, изоморфны ли они друг другу.
tr s,'a-z'
с этими аргументами нормализует строкуs
, заменяя каждую букву n-й буквой в алфавите, гдеn
это наибольший индекс, с которым эта буква появляется в строке. Например,estate
становитсяfbedef
, как делаетdueled
.источник
Кобра, 72 байта
источник
AB CC
контрольный пример False?JavaScript (ES5),
14298Довольно большой, но я еще не видел версию 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)
Просто заменяет каждое вхождение первой буквы на обратное значение индекса. Повторяет это для каждого персонажа.
Он делает то же самое для обоих входов и сравнивает сгенерированный шаблон.
Сравнение довольно уродливо, но я не хочу использовать массив для хранения и сравнения.
источник
;l=c
чтобыfor(l=j=2;j--;
и сохранить байты?Perl, 38 байт
Беги как
perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS
Печатает 1, если истина, ничего, если ложь.
источник
Common Lisp, 76 байт
Попробуйте онлайн!
источник
C ++,
213196162 байта-51 байт благодаря Захари
Чтобы вызвать лямбду, вам нужно передать 2 аргумента
std::string
типа данныхКод для тестирования:
для кода, который тестирует, включая
iostream
иstring
заголовочный файлисточник
e
аргумент какfind
, да, это работаетJavaScript (ES6),
525150 байтЭта версия не использует понимание массива и принимает ввод с использованием синтаксиса каррирования.
Показать фрагмент кода
источник