Вступление
Арифметическая тюрьма - это специальное средство, которое заключает в себе положительные целые числа. Однако в последнее время положительные целые числа пытались убежать. Поэтому надзиратели решили убрать некоторые положительные целые числа, чтобы отправить сообщение другим целым числам. Они наняли разработчика программного обеспечения для написания программы, чтобы выяснить, какие целые числа исключить для достижения максимального эффекта.
Описание входа
Ввод осуществляется через STDIN, аргументы командной строки или пользовательскую функцию ввода (например, raw_input
). Вы не можете иметь его в качестве аргумента функции или предварительно инициализированной переменной (например, эта программа ожидает ввода в переменную x
).
Первая строка содержит одно положительное целое число, n
где 8 >= n >= 3
. Далее следуют n
строки, содержащие n
символы из набора [1,2,3,4,5,6,7,8,9]
. Вот пример ввода:
5
22332
46351
65455
24463
65652
Описание выхода
Надзиратели хотели бы убрать числа, чтобы выполнялись следующие условия:
- В каждой строке и столбце результирующей сетки ни одно число не появится дважды;
- Два исключенных числа не могут быть смежными по горизонтали или вертикали;
- Выжившие числа должны образовывать ортогонально смежную группу - можно будет перейти от любого уцелевшего числа к любому другому уцелевшему числу, двигаясь только по горизонтали и вертикали и никогда не пересекая ни одно из удаленных чисел.
Выведите ввод (минус первая строка) с заменой удаленных чисел на #
.
Там может быть более одного решения. Если это так, вы можете вывести любое решение.
Там также может быть никакого решения. Если это так, выведите строку no answer
.
Вот возможный вывод для примера ввода:
#2#3#
46351
6#4#5
24#63
#56#2
Пример входов и выходов
Есть несколько выходов для каждого входа, поэтому эти выходы являются лишь примерами.
Входные данные:
5
46551
51565
32654
14423
43244
Выход:
46#51
#156#
326#4
1#423
#324#
Входные данные:
7
7183625
1681563
5238564
8786268
1545382
3814756
5325345
Выход:
71#362#
#6815#3
5238#64
#7#62#8
154#382
3814756
#325#4#
Входные данные:
8
21534768
75196287
68392184
96244853
44865912
76516647
89751326
43698979
Выход:
21#34768
#5196287
683#21#4
9#24#853
#4865912
7#51#64#
89751326
436#8#7#
Входные данные:
4
2222
2331
3112
1322
Выход:
no answer
prompt
не допускает многострочный ввод.Ответы:
Ruby,
346344329316 байт, sl∞∞∞∞∞∞wwЭто код-гольф, а не код-быстрый, так что ...
Используйте это как:
Флаг
-W0
не нужен, но я предлагаю вам либо добавить его, чтобы отключить предупреждения, либо перенаправитьstderr
...Скажите, хватит ли у вас терпения запустить его на примерах для n = 6,7,8
Изменения
each
⇨map
, благодаря @NotThatCharlesregexp
секунды, аналогично тому, что предлагал @NotThatCharlesисточник
\d
короче, чем[^#]
в предпоследней строке;M.times.to_a
Дольше, чем(0..M-1).to_a
M.times.to_a
это 1 байт короче , чем(0..M-1).to_a
;)(0...M).to_a
тоже работает и имеет ту же длину.Рубин -
541 ...,394Основной алгоритм - это рекурсивный поиск дубликатов в глубину для утвердительного выбора, просматривая строку 1, затем столбец 1, затем строку 2 и т. Д., И проверяя, что два соседа не уничтожены и что сетка подключена (это
break if
условие в там, и бит, который предшествует этому).Некоторые аккуратные трюки:
if w[1]
намного короче,if !w.one?
и если вы знаете, что есть хотя бы один участник, это тот же результат.Точно так же
[0]
короче, чемany?
если нет блока, иs[j]
это симпатичный ярлык дляj<s.size
(технически, это больше похоже наj.abs<s.size
)И
y%N+(y/N).i
намного корочеComplex(y%N,y/N)
Кроме того, когда есть два сложных условия для генерации строк, это может быть короче,
[cond1?str1a:str1b,cond2?str2a:str2b]*''
чем добавить все парены или#{}
в.Разоблачение и объяснение:
(Это из 531-байтовой версии. Я внес изменения. Наиболее примечательно, что с тех пор я исключил обращение к продукту - просто решаю по одной цифре на строку / столбец за раз, а J теперь просто массив, проиндексированный целые числа. Все координаты просто целые числа.)
H
рассчитывает соседейN
это размер сеткиK
ключи к карте (комплексные числа)J
карта ввода (джейл)k
являются неубиваемыми ключамиQ
является основным рекурсивным методомКод выполняется с:
Изменения
394 добавил предложение @ blutorange ниже, и вырубил намного больше манипуляций
408 пересмотрен выход еще раз. Также используйте
.min
вместо,.inject(:+)
так как я все равно беру один ряд.417 короче выходной расчет
421 выпало комплексных чисел. Просто используйте целые числа. Сохранить пакет
Еще 450 улучшений ввода
456 улучшений ввода
462 дополнительных улучшения - особенно
find
неselect
475 упал
u
и раздавил строителя503 решает только одну повторяющуюся цифру на строку / столбец за раз.
530 использовать
map &:pop
вместоvalues
531 вытащить лямбду, которая делает массив dupes
552 упс! пропустил требование
536 незначительно улучшенная совокупность массивов дупсов (что было раньше
d
)541 начальный
источник
break
можно использовать вместоreturn
, может сохранить еще один байт. Мне действительно нравится этот, много трюков и намного быстрее.a
используется только один раз, вы можете сделать этоJ=gets(p).split*''
. Вы пробовали аргументы кли, видите мой ответ?HTML + JavaScript ( ES6 ) 459
Использование текстовой области HTML для получения многострочного ввода.
Чтобы проверить, запустите фрагмент в Firefox. Увеличьте текстовую область, если хотите, вставьте ввод внутри текстовой области (будьте осторожны: точный ввод, без лишних пробелов ни в одной строке) и уберите вкладку. Результат прилагается.
Метод: Рекурсивная Глубина Первого Серарха. Он находит неоптимальные решения для всех тестовых случаев в считанные секунды (это gode golf, но действительный ответ должен заканчиваться для обычных тестовых случаев)
Первая попытка
Метод: Глубина Первый Serarch, не рекурсивный, используя пользовательский стек.
Функция может быть легко преобразован в поиск в ширину, chaging
l.pop
кl.shift
, поэтому использование очереди вместо стека, но это слишком медленно , и я не уверен , что он может найти оптимальное решение в любом случае.Показать фрагмент кода
источник