В этом задании вам передают два слова: ваша задача - определить, находятся ли они рядом .
Две буквы соседствуют, если:
- Это одно и то же письмо, или
- Они лексикографически смежные.
Например, J примыкает к I , J и K только. Z не соседствует с A
Два слова соседствуют, если:
- Они одинаковой длины и
- Каждая буква соседствует с уникальной буквой в другом слове.
Например, КПП примыкает к САД , так как C> D, A> A, T> S .
FREE не примыкает к GRRD (каждому E нужна буква для сопряжения) .
Ввод, вывод
Вам передают две строки, и вам нужно вернуть истинное значение, если они смежные, в противном случае ложное значение. Вы должны вернуться в течение минуты для всех тестовых случаев ниже.
Вы можете предположить, что строки будут содержать только заглавные буквы алфавита.
Две строки могут быть переданы в виде списка или объединены, с кавычками или без них.
Тестовые случаи
Truthy:
A A
A B
C B
DD CE
DE FC
ABCD BCDE
AACC DBBB
DJENSKE FDJCLMT
DEFGHIJKL HJLEHMCHE
IKLIJJLIJKKL LJLJLJLJLJHI
ACEGIKMOQSUWY BLNPRDFTVHXJZ
QQSQQRRQSTTUQQRRRS PQTTPPTTQTPQPPQRTP
ELKNSDUUUELSKJFESD DKJELKNSUELSDUFEUS
Falsy:
A C
A Z
B J
JK J
CC BA
CE D
DJENSKE GDJCLMT
DEFGHIJKL HJLHMCHE
IJKLIJKLKIJL LIJLLHJLJLLL
AWSUKMEGICOQY RSHXBLJLNQDFZ
QQSQQRRQSTTUQQQRRS PQTTPPTTQTPQPPQRTT
ELKNSDUVWELSKJFESD DKJELKNSUELSDUFEUS
Это код-гольф , поэтому выигрывает самый короткий действительный ответ!
источник
"A A"
?{'string1' 'string2'}
ли приемлем один массив формы ?Ответы:
CJam,
141312 байтПопробуйте онлайн! или проверьте все тестовые случаи одновременно .
Алгоритм
Пусть s и t два отсортированных слова одинаковой длины. Чтобы s и t были лексикографически смежными (LA), необходимо и достаточно, чтобы все пары соответствующих им символов также были LA.
Условие явно достаточно для всех слов и необходимо для слов длиной 1 .
Теперь предположим, что s и t имеют длину n> 1 , и пусть a и b будут первыми символами, соответственно, s и t .
Так как s и t являются LA, существует некоторое биективное отображение φ между символами s и символами t, такое что x и φ (x) являются LA для всех x в s , что означает, что | x - φ (x) | ≤ 1 для всех х в с .
Пусть c = φ (a) и d = φ -1 (b) . Из-за минимальности a 's и b , a ≤ d (1) и b ≤ c (2) .
Кроме того, поскольку b и d , и a и c , и LA, d ≤ b + 1 (3) и c ≤ a + 1 (4) .
Комбинируя (1) и (3) , а также (2) и (4) , мы получаем, что a≤d≤b + 1 и b≤c≤a + 1 , из чего мы получаем, что a - 1≤b≤a +1 и, следовательно, что a и b являются LA.
Теперь, объединяя (1) и (4) , (2) и (3) , мы получаем, что c - 1 ≤ a ≤ d и d - 1 ≤ b ≤ c , из чего мы получаем, что c - 1 ≤ d ≤ c + 1 и, следовательно, что c и d являются LA.
Таким образом, если мы переопределим φ с помощью φ (a) = b и φ (d) = c , | x - φ (x) | ≤ 1 будет по-прежнему выполняться для всех x в s и, в частности, для всех x в s [1:] .
Таким образом, s [0] = a и t [0] = b , а s [1:] и t [1:] являются LA.
Поскольку s [1:] имеет длину n - 1 , это доказывает необходимость по индукции.
Код
источник
C->Y, D->X
, и их можно просто не пересекать.MATL , 10
1217байтПри этом используется подход Денниса : сначала отсортируйте и сравните символы в соответствующих позициях.
Ввод - это массив строк в формате
{'CAT 'SAD'}
.Вывод представляет собой массив нулей и единиц. Результатом является truthy тогда и только тогда она содержит все те (это согласовано быть truthy).
Использует текущий выпуск (10.2.1) , который является более ранним, чем этот вызов.
РЕДАКТИРОВАТЬ: функция
Xl
была переименована|
в более новых версиях языка (иo
больше не требуется). Ссылка ниже включает эти модификации.Попробуйте онлайн!
Пояснение :
Старый подход, который принимает строки как отдельные входные данные: 12 байт :
РЕДАКТИРОВАТЬ : код в ссылке был изменен в соответствии с изменениями в языке; см. комментарий выше.
Попробуйте онлайн !
Пояснение :
источник
[1 0 1]
является ложным в MATL. Это полезно[0 0]
является правдой?C 233 байта
Вы можете проверить это, сохранив это как
adj.h
и затем используя этотadj.c
файл:Затем скомпилируйте используя
gcc adj.c -o adj
. Выход:источник
Python 2, 90 байт
Простая анонимная функция, у меня должна быть отдельная проверка длины, потому
zip
что я просто буду связываться. Есть похожая функция вitertools
(zip_longest
), которая будет заполнять пустые строки, но это будет довольно дорого.Тестирование с
производит:
источник
JavaScript (ES6), 86
90 94Редактировать 4 байта сохранены thx @Neil
Редактировать 2 4 байта сохранить thx @ Mwr247
Примечание: проверка смежности по паре букв. Возьмите пару за 36 базовое число n , если буквы равны, то
n = a*36+a = a*37
. Если есть разница в 1, тоn = a*36+a+1 = a*37+1
илиn = a*36+a-1 = a*37-1
. Такn % 37
должно быть 0, 1 или 36. Иn%37%36
должно быть 0 или 1.Примечание 2: добавленное «0» используется для обеспечения одинаковой длины a и b. Короче то
a.length==b.length
источник
''
вместо первого,'0'
так как это не меняет значение разбора.b
(a,b)=>[...[...a].sort(),0].every((x,i)=>parseInt(x+([...b].sort()[i]||0),36)%37%36<2)
JavaScript ES6,
117 байтов116 байтов111 байтов109 байтовТестовые случаи
кредит
источник
[...s]
вместоs.split('')
?Pyth,
3731 байтПопробуйте онлайн со всеми тестовыми примерами!
Срезал 6 байтов, используя сокращенное сокращение (
-F
вместо.U-bZ
)Решение, вдохновленное Деннисом
Первая подача в Codegolf!
объяснение
Мы можем разделить выражение на две части, которые сравниваются с
&
выводом результата. Я попытаюсь объяснить, написав какой-то псевдопифонСначала мы проверяем, что длина двух слов одинакова
Затем мы применяем метод Денниса:
Затем мы используем
-
оператор для фильтрации всех элементов этого списка, которых нет в[Z1
([0, 1]
), и проверяем, что результатом является пустой список сqY
источник
JavaScript (ES6), 87 байт
Используется проверка симметричного диапазона с нулевым центрированием путем деления на максимальное значение, а затем усечения с побитовым «или» (
|
). Короче, чем две проверки или одна сMath.abs()
.источник
Haskell,
6763 байтаПример использования:
f "FREE" "GRRD"
->False
.Как это работает (примечание:
f
частично бессмысленно, а второй параметрb
не указан в определении):Редактировать: @xnor нашел 4 байта для сохранения. Благодарность!
источник
id x
не толькоx
? Или как насчет[pred x..succ x]
?\x->map($x)[pred,id,succ]
, так что этоid
был просто остаток. Конечно..
бьет все это. Благодарность!C 172 байта
Тестовые случаи
источник
PowerShell, 140 байт
Может быть возможно получить это короче. В настоящее время он не конкурирует с Python или JavaScript, но использует немного другой подход, поэтому я решил опубликовать его.
объяснение
Этот код действительно сбивает с толку тех, кто не владеет PowerShell, поэтому я постараюсь разбить его на английский как можно лучше ...
Мы начнем с принятия ввода
param($a,$b)
как обычно.Весь остальной код на самом деле является одним оператором и может быть разбит
(...)-and(...)
для проверки двух логических операторов с-and
оператором.Левые парены могут быть разбиты,
(... -eq ...)
чтобы проверить равенство двух объектов. В этом случае объекты - это.Count
s (то есть длина) двух новых символьных массивов. Каждое внутреннее имя($a=[char[]]$a|sort)
берет исходное входное слово, повторно преобразует его в массив символов, затем сортирует его и снова сохраняет в ту же переменную. Мы делаем это для обоих$a
и$b
. Таким образом, левая часть проверяет, что входные слова имеют одинаковую длину. Если они не имеют одинаковую длину, эта половина внешнего логического оператора не будет выполнена иFalse
будет выведена.Переходя к правой части, мы снова тестируем два логических выражения с
(... -and ...)
. Левая часть проверяет, является ли что-то больше или равно отрицательному 1 с-ge-1
. Что - то есть нулевой элемент построенного массива$c
, который создается с помощью:0..($a.count-1)
|%{...}
$a
и вычитаем значение ASCII индексируемого символа в$b
|sort
редактируется по числовому значениюДругая сторона оператора принимает максимальное значение
$c[-1]
массива и гарантирует, что оно меньше или равно 1 с-le1
.Таким образом, если две входные строки действительно смежны,
$c
массив будет выглядеть примерно так@(-1,-1,-1...0,0,0...1,1,1)
. Таким образом, первый элемент будет-1
и последний элемент будет1
. Если они не являются смежными, разница в значениях ASCII для конкретной пары будет либо равна,< -1
либо> 1
, поэтому эта половина внешнего булева теста не будет выполнена иFalse
будет выведена.Только если обе стороны пройдут, будут
True
выведены строки и, следовательно, строки LA.источник
Ржавчина,
269264 байтаExpanded:
Тестовые случаи:
источник
APL, 59 байт (символов)
(61, если мы должны снабдить {и}, 63 с f ←)
Я не лучший APLer, но это слишком весело.
(0=+/2≤|¨∊-/{⎕av⍳⍵}¨(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵])∧=/⍴¨∊¨⍺⍵
=/⍴¨∊¨⍺⍵
входы одинаково длинны?∧
и все ниже(⍺{⌈/⍴¨⍺⍵}⍵)⍴¨⍺[⍋⍺]⍵[⍋⍵]
сортируйте оба входа и формируйте их так, чтобы они были самыми длинными из них (они оборачиваются, если вы сделаете их длиннее, чем они есть)|¨∊-/{⎕av⍳⍵}
преобразовать оба вектора символов в целые вектора их значений ascii, сделать вычитание вектора и абсолютные значения0=+/2≤
суммируйте значения, большие или равные двум, и проверьте, равен ли результат 0источник
K (ок) , 27 байтов
Решение:
Попробуйте онлайн!
Примеры:
Объяснение:
Сначала отсортируйте каждую строку, затем добавьте одинаковую длину, затем возьмите одно из другого (значения символов в ASCII), возведите в квадрат, так как нет встроенной функции
abs
, возьмите максимальную разницу и проверьте, не меньше ли это 2.источник
J, 27 байт
ungolfed
объяснил
&(3&u:@/:~)
сортирует оба аргумента и конвертирует их в числа ascii,:
создает матрицу 2 xn, где n - количество символов в аргументах-/
вычитает одну строку из другой, давая список длины n, представляющий расстояние соответствующих символов(2>|)
возвращает 1, если абсолютное значение расстояния меньше 2, в противном случае 0*/
умножает все эти0
s и1
s вместе: следовательно, конечный результат равен 1, если все пары соответствующих символов смежны.Попробуйте онлайн!
источник