вступление
Вы сидите в зале заседаний в конце длинного стола. Вы оглядываетесь вокруг и видите Тима Кука, совет директоров Apple, призрака Стива Джобса и Джека Донахи. Apple созвала эту встречу, потому что они поняли, насколько холоднее экран блокировки Android, и хотят их 1-UP. Все в комнате смотрят на тебя, как призрак Стив кричит: «Помоги мне, Человек-КодГольф! Ты моя единственная надежда!»
Проблема
Экран блокировки Android представляет собой сетку точек 3 x 3, которую можно соединить, проведя пальцем от одной точки к другой, создавая путь. Паролем считается любой возможный путь, который включает любое количество точек и исключает любое количество точек. (На реальном телефоне длина пути должна быть не менее 4 точек. В этом случае игнорируйте это ограничение.) Apple планирует заменить сетку 3 x 3 сеткой M x N, которая равна (M * N) / 9. раз лучше!
Правила:
Например, в сетке 3x3 с точками, пронумерованными от 1 до 9:
1 2 3
4 5 6
7 8 9
Некоторые допустимые пути:
1
3
7,2,3
1,5,9,2
1,8,6,5,4
4,2,3,5,6,7,8,9
5,9,6,4
И некоторые неверные пути:
1,3
1,9,5
7,5,4,7
4,6
Ваш вход будет три числа:
(M,N,d)
Где сетка M x N, а d - длина пути
1 <= M <= 16
1 <= N <= 16
1 <= d <= M * N
Ваша программа или функция получат ввод в виде строки, разделенной запятыми, и она должна вернуть количество возможных паролей этой длины. Например:
Input: 2,2,1
Output: 4
Input: 2,2,2
Output: 12
Input: 7,4,1
Output: 28
Применяются стандартные правила игры в гольф, самый короткий код выигрывает!
//If I've made a mistake or the rules are unclear, please correct me!
источник
256!
перестановок точек в сетке 16 x 16 представляет действительный шаблон разблокировки. На практике такая программа никогда не прекратится.Ответы:
Python - 170 байт
Я понимаю, что скобки внутри
sum([...])
не являются строго необходимыми, но есть большой штраф производительности за их отсутствие.Выход для всех 3х3:
Производит:
Для тестирования / подтверждения, первые 6 значений для доски 4х5:
4x5 - интересный случай для проверки, потому что он имеет 2x2, 3x3 и 2x4 скачка колышка.
Краткое объяснение
В общем, это исчерпывающий поиск с накопительной обрезкой. Например, поскольку
p(3, 3, 4)
1624,p(3, 3, 5)
будет проверять только 8120 возможностей, а не наивно проверять все 15120. Большая часть логики содержится в условии:На простом английском языке это можно понимать как:
источник
s
набор вместо списка. Я не вижу большого снижения производительности при отбрасывании скобок; с чего бы такое наказание?s
набор. Мой урок питона на сегодня:{i}
оценивается какset([i])
. Я ожидал бы синтаксическую ошибку. Затем добавляется элемент к наборуs|{i}
, и он такжеi in s
может быть заменен наs&{i}
.