Ищу Leapers

19

Недавно я получил действительно странную нерегулярную шахматную доску. Это квадраты повсюду и даже не все связаны. По крайней мере, они все еще расположены на регулярной сетке. Я хочу адаптировать шахматные правила, чтобы иметь возможность играть на доске, но для начала мне нужна фигура, которая действительно может быть в любом месте на доске, и мне кажется, что прыжок - моя лучшая ставка для этого.

Прыжки - это сказочные шахматные обобщения рыцарей. Листы параметризованы двумя целыми числами m и n и могут перемещать m квадратов в одном направлении, а затем другие n квадратов в любом перпендикулярном направлении. Для стандартного рыцаря имеем (m, n) = (2, 1) . Весь ход считается одним прыжком, так что ни один из квадратов на пути к цели не должен быть пустым или даже существовать.

Соревнование

Вам предоставляется «шахматная доска» в виде списка положительных двумерных целочисленных координат, которые представляют собой квадраты, являющиеся частью доски. Ваша задача - найти прыгуна, который при достаточном количестве ходов может достичь любого квадрата на доске.

Давайте посмотрим на некоторые примеры. Стандартная шахматная доска использует регулярную сетку 8х8 квадратов (обратите внимание, что для этой задачи мы не различаем белые и черные квадраты):

########
########
########
########
########
########
########
########

Стандартный рыцарь может достичь всего этого, так (2, 1)что будет правильным выходом. Однако, (1, 1)например, не будет действительным, так как такая часть может достигать только половины квадратов, независимо от того, где она начинается. (1, 0)с другой стороны, также был бы действительный вывод, так как все квадраты ортогонально связаны.

Теперь, если у нас есть неправильная доска, как:

#   #
 # # #
  # # #
 # #
    #

Тогда возможны решения (1, 1)и (3, 1). У нас также может быть доска с полностью отключенными регионами, такими как:

#### ####
#### ####
#### ####
#### ####

Стандартный рыцарь (2, 1)все еще может достичь всех квадратов, что на самом деле является единственным решением.

И, наконец, ни один прыгун не может полностью достичь следующей простой доски:

#
 ##

Обратите внимание, что формат ввода будет не в виде представления ASCII, а в виде списка координат. Например, второй пример выше может быть представлен как:

[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]]

правила

Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).

Входные координаты могут быть взяты в любом удобном формате списка (плоский список, список пар, список сложных целых чисел, строка с непротиворечивыми разделителями и т. Д.).

Выходными данными должны быть два целых числа m и n, которые идентифицируют скачок, если решение существует (как два отдельных целых числа, список, строка с нечисловым разделителем и т. Д.). Если решения не существует, вы можете вывести любое непротиворечивое значение, которое не может быть допустимым скачком. Это включает в себя пару целых чисел (0, 0)в вашем обычном формате, а также все, что не является парой неотрицательных целых чисел.

Ваша программа должна обработать любой тест в течение минуты . Это несколько нечеткое ограничение, но руководствуйтесь здравым смыслом: если на вашей машине это займет 2 минуты, я думаю, мы можем предположить, что оно может работать в пределах 1 на чужой, но если это займет 20 минут, это менее вероятно. Не должно быть трудно решить каждый тестовый случай в считанные секунды, поэтому это правило действует только для исключения наивной грубой силы.

Применяются стандартные правила .

Тестовые случаи

Каждый тестовый пример имеет форму board => all valid leapers. Помните, что вам нужно вывести только один из них. Если список прыгунов пуст, обязательно верните что-то, что не является допустимым прыгуном.

Examples above:
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [6, 8], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7], [7, 8], [8, 1], [8, 2], [8, 3], [8, 4], [8, 5], [8, 6], [8, 7], [8, 8]] => [[0, 1], [1, 2], [1, 4], [2, 3], [3, 4]]
[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]] => [[1, 1], [1, 3]]
[[1, 1], [2, 2], [3, 2]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => [[1, 2]]

Square boards:
[[1, 1], [1, 2], [2, 1], [2, 2]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [2, 3]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]] => [[0, 1], [1, 2], [2, 3]]

Miscellaneous:
[[1, 1], [2, 1]] => [[0, 1]]
[[1, 1], [1, 2]] => [[0, 1]]
[[1, 1], [12, 35]] => [[11, 34]]
[[1, 1], [1, 2], [2, 1], [2, 2], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 5], [3, 6], [4, 1], [4, 2], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [1, 4]]
[[2, 2], [2, 4], [2, 6], [2, 8], [4, 2], [4, 4], [4, 6], [4, 8], [6, 2], [6, 4], [6, 6], [6, 8], [8, 2], [8, 4], [8, 6], [8, 8]] => [[0, 2], [2, 4]]

Random boards:
[[1, 5], [1, 9], [2, 6], [2, 8], [2, 10], [2, 12], [3, 5], [3, 7], [3, 9], [3, 11], [3, 13], [4, 2], [4, 4], [4, 6], [4, 8], [4, 14], [5, 1], [5, 3], [5, 5], [5, 7], [6, 2], [6, 4], [7, 1], [8, 2]] => [[1, 1], [1, 3]]
[[1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 6], [3, 7], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 3], [5, 4], [5, 6]] => [[0, 1], [1, 2]]
[[1, 8], [2, 6], [2, 10], [3, 3], [3, 4], [3, 8], [4, 1], [4, 11], [5, 3], [5, 9], [6, 12], [8, 11], [10, 10], [11, 12], [12, 6], [12, 8], [13, 6], [13, 8], [13, 10], [13, 11], [14, 5], [14, 7], [14, 8], [14, 13], [14, 14], [15, 7], [15, 9], [15, 11], [15, 12], [16, 6], [16, 7], [16, 9], [16, 13], [16, 14], [17, 10], [17, 12], [18, 8], [18, 12], [20, 9], [21, 11], [22, 13], [23, 10], [23, 11], [23, 15], [24, 12]] => [[1, 2]]
[[1, 17], [1, 21], [3, 11], [3, 15], [3, 19], [3, 23], [5, 13], [5, 21], [7, 11], [7, 15], [7, 19], [9, 1], [9, 13], [9, 17], [11, 3], [11, 7], [11, 15], [11, 19], [13, 5], [13, 9], [13, 13], [13, 17], [13, 21], [15, 11], [15, 15], [15, 19], [17, 13], [17, 17]] => [[2, 2], [2, 6], [2, 10]]
[[1, 3], [2, 4], [2, 5], [3, 6], [4, 1], [5, 3], [5, 6], [5, 7], [6, 12], [6, 14], [6, 21], [7, 9], [7, 19], [8, 9], [8, 15], [8, 17], [8, 18], [8, 24], [9, 12], [9, 19], [10, 12], [10, 14], [10, 17], [10, 21], [11, 22], [12, 15], [12, 17], [12, 24], [13, 16], [14, 20], [14, 21], [14, 26], [15, 13], [15, 19], [16, 18], [16, 23], [17, 16], [17, 24]] => [[2, 3]]
[[1, 11], [3, 13], [4, 10], [6, 14], [8, 12], [9, 9], [9, 15], [12, 8], [13, 5], [13, 19], [13, 21], [14, 8], [15, 1], [15, 17], [16, 4], [16, 14], [16, 18], [16, 20], [17, 21], [18, 2], [18, 16], [18, 18], [19, 9], [19, 13], [19, 15], [20, 12], [21, 1], [21, 17], [22, 4], [22, 10], [23, 7]] => [[1, 3]]
[[1, 39], [6, 37], [8, 32], [10, 27], [11, 31], [11, 35], [12, 22], [16, 21], [16, 29], [16, 33], [18, 34], [21, 3], [21, 9], [21, 19], [23, 8], [23, 14], [23, 22], [23, 24], [23, 36], [24, 6], [25, 13], [25, 17], [26, 1], [26, 11], [28, 6], [28, 20], [28, 26], [28, 30], [28, 34], [30, 11], [30, 15], [30, 21], [32, 6], [33, 28], [33, 32], [35, 13], [35, 23]] => [[2, 5]]

В качестве особого случая обратите внимание, что для доски, состоящей только из одной ячейки, любой скачок работает, но ваш вывод должен соответствовать фактическому скачку, поэтому [0, 0]не является действительным выводом.

Мартин Эндер
источник
Быстрый вопрос. Как рыцарь (2,1)? Поправьте меня, если я ошибаюсь, но я почти уверен, что рыцари могут перемещать 3 квадрата в любом направлении, а затем 1 квадрат в любом направлении, перпендикулярном предыдущему, так что должно быть (3,1).
Р. Кап
1
@ R.Kap Ты не прав. ;) en.wikipedia.org/wiki/Knight_(chess)#Movement
DLosc
@DLosc Хорошо, вау. Я думаю, я был. Спасибо за это!
Р. Кап
Можем ли мы вывести все действительные списки в списке? Если мы это сделаем, мы можем вывести эквивалентные прыгун как [[1, 0], [0, 1]]?
FryAmTheEggman
@FryAmTheEggman Просто (любой) один из них, пожалуйста.
Мартин Эндер

Ответы:

12

Pyth, 41 35

hfqQu@+G+VM*s_BM*F_BMTGQ]hQ)maVhQdt

Выход при ошибке, если нет допустимых переходов, и пустая строка, если STDERR игнорируется.

Попробуйте здесь или запустите Test Suite

Сохранено 6 байтов благодаря isaacg ! По сути, просто находит всех кандидатов на прыжок, выбирая каждого действующего прыжка от первого тайла до друг друга. Затем для каждого из них он делает все восемь конфигураций [x, y]смещений, которые может принять прыгун. Затем он находит все ходы, начиная с первого тайла, следующего за ходом, и сбрасывает те, которые отсутствуют во входных данных. Он продолжает делать это, пока результат не изменится. Если этот окончательный список совпадает с вводом, то прыжок был действительным.

Стандартная шахматная доска заняла больше всего времени, когда я тестировал, на моем не очень впечатляющем компьютере это заняло около 3 секунд.

FryAmTheEggman
источник