Не путать с паролем епископа Боже !
Если дана строка, ответьте (истина / ложь или два непротиворечивых значения), если она представляет собой надежный пароль против епископов .
Пароль надежен против епископов, если это строка, состоящая из чередующихся букв (in a-h
) и цифр (in 1-8
), так что каждая пара символов может быть интерпретирована как квадрат на шахматной доске, и если вы поместите белую пешку на каждый квадрат с именем в пароле белый слон не сможет ни за какое количество последовательных ходов переместиться из любого квадрата в первой ( 1
) строке в любой квадрат в последней ( 8
) строке.
Примеры
Надежные пароли против епископов
a1b1c1d1e1f1g1h1
a8b8c8d8e8f8g8h8
a1b2c3d4d5f5f4g3g4h2b5
h4g4f4e4c4b4a4c3e3
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
b4b5d4d5f4f5g3h5
Например,
a1b1c1d1e1f1g1a8b8c8d8e8f8g8
соответствует позиции иb4b5d4d5f4f5g3h5
соответствует позиции
Слабые пароли против епископов
a4c4e4g4g5d6f6e3d2b2
(Хорошо сформированный, но не сильный - спасибо Джо Кинг за этот пример!)b1c1d1e1f1g1h1a8b8c8d8e8f8g8
(хорошо сформированный, но не сильный)h4g4f4e4c4b4a4c3
(хорошо сформированный, но не сильный)d4
(хорошо сформированный, но не сильный)b4b5d4d5f4f5g2h5
(хорошо сформированный, но не сильный)correct horse battery staple
(Плохо сформированы)1a1b1c1d1e1f1g8a8b8c8d8e8f8g
(Плохо сформированы)a
(Плохо сформированы)aa
(Плохо сформированы)
code-golf
string
decision-problem
path-finding
chess
Quuxplusone
источник
источник
1
через8
в первом тесте? Он не может перемещаться к каждому столбцу, посколькуa
столбец полностью заполнен пешками, но он может перемещаться к каждому ряду без проблем, не так ли? У меня такое чувство, что я что-тоОтветы:
Рубин,
115182163 байтаПопробуйте онлайн!
Возвращает
1
для сильных иnil
для слабых. (+67 байт было для учета "возврата".)Несколько хитростей, которые были использованы:
Вместо числового диапазона
0..99
мы используем диапазон строк,'00'..'99'
так что число автоматически дополняется слева до 2 цифр и переводится в строку . Это делает проверку границ очень короткой - совпадение с регулярным выражением/[09]/
.Внутри функции - помощника, при построении списка новых координат
[x-11, x-9, x+9, x+11]
, мы одновременно назначитьz[x]
для9
процесса, который , случается, значение truthy (маркировка квадрат посещаемый).В последней строке мы хотим проверить, что массив
z[81,9]
не содержит9
. Мы делаем это, удаляя все экземпляры9
(z[81,9]-[9]
), затем запрашивая 9-й элемент результирующего массива ([8]
). Поскольку мы знаем, что в массиве изначально было 9 элементов, если они были удалены, мы получимnil
, тогда как, если они все остались, мы получим последний элемент массива (который всегда будет1
).источник
Python 2 ,
330318313309370 байтПопробуйте онлайн!
Попробуйте практическую версию онлайн! (для полной проверки оригинала может потребоваться 4 ^ 32 операций, я предлагаю использовать одно и то же количество байтов)
Не очень короткое решение - я не мог понять, как сделать версию лямбда-функции g короче, чем сама g.
-4 байта благодаря Quuxplusone
+61 байт для учета возврата (спасибо за указание на это Джо Кинга и за советы по игре в гольф)
источник
q=r=1
будет корочеq=1 r=1
, верно? Иif r:
короче чемif r>0:
.Python 2 ,
490476474Попробуйте онлайн!
Это работает "заливают". Сначала мы создаем список
a
квадратов, смежных с какими квадратами, по епископу. Затем мы создаем наборx
исключений (на основе пароля). Затем мы инициализируем наборr
достижимых квадратов, который начинается как первый ряд (без каких-либо исключений), и многократно «затопляет» оттуда 99 раз, чего должно быть более чем достаточно. Наконец, мы проверяем, попали ли какие-либо квадраты в последнем ряду в наш достижимый набор. Если так, у нас слабый пароль! Если нет, у нас есть надежный пароль.Недостаток, возможно, дисквалификация (я не знаю обычного правила здесь): если пароль неверно сформирован (например, «правильное сшивание батареи»), то вместо возврата мы выдаем исключение
False
. Но мы всегда возвращаем,True
если пароль надежный!Минус 16 байтов благодаря Джо Кингу. Мы включаем
a
в одном месте, где оно используется, и постоянно складываем некоторые математические данные.источник
for
секунд еще есть пробелы, которые я не мог понять, как удалить. Я обнаружил, что заменаrange(99)
наrepr(f)
работает на моей локальной машине, но не на интерпретаторе tio.run ... но потом я обнаружил, что[1]*99
это все равно было короче! Так что сэкономили еще 4 байта.for
с, что я не мог видеть, как удалить - О! Очевидно, что Python обрабатывает33for
как дваfor33
токена (тогда как один токен). Сегодня я узнал. Тогда минус 2 байта.Чисто , 285 байт
Попробуйте онлайн!
$[]
составляется$ :: [[Int]] [Char] -> Bool
с первым аргументом, дающим\ [Char] -> Bool
.Функция работает, потребляя строку по два символа за раз, немедленно возвращая false, если строка имеет недопустимый формат, как только она увидит недопустимую часть. Как только строка обработана, она помещает слона на каждый пустой квадрат с одной стороны доски и перемещает их всеми возможными способами 64 раза и проверяет, находится ли какая-либо из конечных позиций в целевой строке.
источник
True
дляa1b1c1d1e1f1g1
? Не то чтобы я что-то понял о том, как это работает. :)Wolfram Language (Mathematica) ,
339316358353345 байт-23 байта благодаря @ Doorknob.
+42 байта с учетом возврата.
Попробуйте онлайн!
Я переписал большую часть этого, чтобы учесть обратную реакцию, я думаю, что может быть более простой способ определить график
g
, у Mathematica естьGraphData[{"bishop",{8,8}}]
график всех ходов, которые епископ может сделать на шахматной доске ( Bishop Graph ), но этот график включает в себя дальнейшие связи чем ближайший диагональный сосед. Если кто-нибудь знает более короткий способ сделать это, дайте мне знать. Кредит на построение графика идет на этот ответ MathematicaSE .Возвращает
True
для надежных паролей,False
для слабых / плохо сформированных паролей. Обратите внимание, что для большинства плохо сформированных паролей он выдаст кучу сообщений об ошибках, а затем вернетFalse
. Если это не соответствует правилам, то их можно подавить, изменив стоимостьf[n_]:=...
доf[n_]:=Quiet@...
6 байтов.Ungolfed:
Сломать:
Принимает строковый аргумент и разбивает его на список строк, каждая из которых имеет длину
m
.Возвращает,
False
если генерируются какие-либо сообщения об ошибках, то есть, как мы ловим неправильно сформированные строки (т.е. предполагаем, что они правильно сформированы, что неизбежно приводит к ошибке в дальнейшем).Занимает последовательность позиций пешки и разделяет ее так, что
"a2h5b"
становится{{"a","2"},{"h","5"},{"b"}}
, затемLetterNumber
преобразует букву в число (a -> 1
и т. Д.) ИFromDigits
преобразует цифру в целое число. Если строка не правильно сформирована, этот шаг приведет к ошибке, которая будетCheck
возвращенаFalse
. Эти два числа затем преобразуются в целое число, соответствующее квадрату на доске.Создает график всех диагональных ребер ближайших соседей с удаленными позициями пешек.
Это списки незанятых начальных и конечных вершин соответственно
Зацикливается на начальной и конечной вершинах, для каждой пары
FindPath
будет список путей между ними. Если между ними нет путей, это будет пустой список, поэтомуLength@
возвращается0
. Если путей вообще нет, тоm
будет ноль, и мы вернемсяTrue
, в противном случае вернемсяFalse
.источник
True
аFalse
можно1>0
и0>1
соответственно.p[1]@#&/@
эквивалентно простоp@1/@
.Sequence@@
можно заменить на##&@@
. Вместо{LetterNumber[#[[1]]],FromDigits[#[[2]]]}&/@
, вы можете использовать{LetterNumber@#,FromDigits@#2}&@@@
.p@1/@
, но я вижу общую идею. Я полагаюp@1 = StringPartition[#,1]&
, это немного сбивает меня с толку, я думаю, потому чтоp
принимает два аргумента двумя разными способами, один какm_
и другой как#...&
, я думаю, это просто вопрос приоритета. Это имеет смысл, хотя этоp@m = p[m]
.f
которая принимает один аргумент,f@#&
имеет то же поведение, что и простоf
- здесь,f
естьp[1]
. (Затем я изменил[]
обозначение на@
, которое всегда идентично, за исключением приоритета.)