Ваша задача, учитывая квадратную сетку цифр ( 0-9
), вывести один из способов, которыми цифры могут быть сгруппированы так, чтобы:
- Каждая цифра является частью ровно одной группы
- Все группы имеют одинаковое количество цифр
- Все группы ограничены одной многоугольной формой (это означает, что каждая цифра в группе находится рядом с [влево, вправо, вверх, вниз] по крайней мере еще одной цифрой в той же группе, если в каждой группе нет 1 элемента).
- Все группы имеют одинаковую сумму
Сетка ввода всегда будет квадратом: вы можете выбрать любой метод ввода, который вам нравится (включая предоставление аргументов функции или методу). Кроме того, на входе будет указано количество групп, в которые ваша программа должна сгруппировать цифры.
Пример ввода:
Предположим, ваш формат ввода stringOfDigits numberOfGroups
.
Пример ввода будет:
156790809 3
который будет переводить в (сетка sqrt(9) * sqrt(9)
)
1 5 6
7 9 0
8 0 9
которую вам придется разделить на 3 группы, каждая из которых должна иметь 9 / 3 = 3
элементы с одинаковой суммой.
Вывод: Вывод должен быть строкой цифр с необязательными пробелами и символами новой строки для форматирования, за каждой цифрой следует буква, a-z
обозначающая ее группу. Там должно быть точно numberOfTotalDigits / numberOfGroups
элементы в каждой группе. Вам никогда не придется делить что-то на более чем 26 групп.
Пример вывода:
1a 5a 6b
7c 9a 0b
8c 0c 9b
Обратите внимание, что замена всех a
s на b
s и b
s на a
s одинаково действительна. Пока каждая группа обозначена отдельной буквой, выходные данные действительны.
Кроме того, я ожидаю, что большинство программ будет выводить что-то вроде этого, потому что новые строки / пробелы являются необязательными:
1a5a6b7c9a0b8c0c9b
В этом случае добавляются все цифры группы a
, b
или c
составляет 15. Кроме того, все группы связаны каким-либо полигоном.
Неверные выходы:
1a 5a 6b
7c 9a 0c
8c 0b 9b
потому что группы не образуют многоугольники (в частности, они 6b
изолированы и 0c
также одиноки).
1a 5a 6b
7c 9a 0b
8c 0b 9b
потому что группа b
имеет 4 элемента, в то время как c
только 2.
И т.п.
Если нет действительного решения, ваша программа может сделать что-нибудь (то есть остановить, завершить сбоем, запустить навсегда), но если ваша программа печатает, None
когда нет действительного решения, -15
на ваш счет.
Если существует более одного решения, вам нужно распечатать только одно, но -20
если ваша программа печатает их все, разделенные каким-либо разделителем.
Это код гольф, поэтому самый короткий код (с бонусами) выигрывает!
6b
он изолирован, а не0b
.156790889 3
кажется, что так и должно быть156790809 3
Ответы:
Пиф , 122 - 20 - 15 = 87
Изменения:
130 -> 120: переключен на разделенный вводом символ новой строки.
120 -> 134: исправлена ошибка, связанная с группами, размер которых не равен длине стороны матрицы.
134 -> 120: печать всех решений, в том числе эквивалентных при групповом переименовании.
120 -> 122: исправлена ошибка, из-за которой генерировались только пути, а не все легальные группы.
Тестовый забег:
Объяснение:
источник
JavaScript (ES6) 361 (376-15)
372(Может быть, еще можно играть в гольф еще немного)
Как функция, первый параметр - это строка цифр, а второй - количество групп.
Это наивный рекурсивный поиск с остановкой при первом найденном решении (без бонуса -20).
Нужно еще несколько тестов для проверки производительности при большем вводе.
Ungolfed & объяснил
Тест в консоли FireFox / FireBug
F("156790809",3)
выход1c5c6b7a9c0b8a0a9b
F("156790819",3)
выходNone
источник