Работая над непалиндромной полиглотой Boggle , я счел весьма утомительным максимально эффективно упаковывать коды на доску Boggle, даже используя только две строки. Но мы программисты, верно? Мы знаем, как автоматизировать вещи.
Имея список строк, вы должны создать доску Boggle, на которой можно найти каждую из этих строк (независимо от других). Задача состоит в том, чтобы сделать доску Boggle как можно меньше. Поскольку это (надеюсь) довольно сложная задача, это сложная задача для кода : требования к оптимальности не требуются - задача состоит в том, чтобы сделать это как можно лучше.
правила
- Доска Boggle будет прямоугольной и содержать только заглавные буквы. Поэтому входные строки также будут содержать только заглавные буквы.
- Применяются обычные правила Boggle: строка является частью доски, если, начиная с любого места, вы можете найти строку, многократно перемещаясь к смежным символам (по горизонтали, вертикали или диагонали). Чтобы сформировать одну строку, вы не можете использовать любую ячейку доски более одного раза. Однако символы могут быть повторно использованы в разных строках.
- У вас есть 30 минут для обработки тестовых данных, и ваш код не должен использовать более 4 ГБ памяти. Я немного расскажу об ограничении памяти, но если ваша программа постоянно использует более 4 ГБ или резко превышает ее, я (временно) дисквалифицирую ее.
- Я протестирую все заявки на своем компьютере под управлением Windows 8. У меня есть виртуальная машина Ubuntu, но если мне придется протестировать ее, вы не сможете использовать эти 30 минут так же часто, как иначе. Пожалуйста, включите ссылку на бесплатный переводчик / компилятор для выбранного вами языка, а также инструкции о том, как скомпилировать / запустить ваш код.
- Ваша оценка будет равна размеру доски Boggle для данных теста ниже (не считая перевода строки). В случае ничьей (например, из-за того, что нескольким людям удалось найти оптимальное решение), победителем будет представление, которое даст это оптимальное решение быстрее.
- Вы не должны оптимизировать свой код специально для тестовых данных. Если я подозреваю кого-либо в этом, я оставляю за собой право создавать новые тестовые данные.
пример
Учитывая строки
FOO
BAR
BOOM
Однажды можно было просто положить их на доску 4x3 Boggle:
FOOX
BARX
BOOM
Используя тот факт, что строки не обязательно должны быть прямыми, мы можем сжать их до 5x2:
BORFO
OMABO
Но мы можем сделать его еще меньше, повторно используя символы между различными строками и поместив строки в 4x2:
FOOM
BARX
Теперь B
используется для обоих BOOM
и BAR
, и OO
используется для обоих BOOM
и FOO
.
Тестовые данные
Ваша заявка будет проверена на следующих 50 строк. Для целей тестирования вы можете просто использовать меньшие подмножества этих данных, которые затем должны выполняться быстрее. Я считаю, что абсолютной нижней границей для этих тестовых данных является доска с 120 символами, хотя это не обязательно достижимо.
T
WP
GVI
CIHM
EGWIV
QUTYFZ
LWJVPNG
XJMJQWSW
JLPNHFDUW
SWMHBBZWUG
XVDBMDQWDEV
TIUGAVZVUECC
IWDICFWBPSPQR
MMNWFBGMEXMSPY
YIHYXGJXKOUOIZA
BZSANEJNJWWNUJLJ
XTRMGOVPHVZYLLKKG
FLXFVVHNTWLMRRQYFQ
VZKJRAFQIYSBSXORTSH
FNQDIGCPALCHVLHDNZAV
GEAZYFSBSWCETXFKMSWLG
KWIZCEHVBDHEBGDGCJHOID
SKMQPHJAPDQKKHGTIPJCLMH
ZSFQDNYHALSUVWESQVVEUIQC
HXHBESUFCCECHNSTQGDUZPQRB
DSLXVHMOMLUXVHCNOJCBBRPVYB
DVTXKAOYYYRBVAVPSUAOYHIPPWN
PJAIYAWHMTNHTQDZDERPZYQEMLBZ
SYNSHJNOIWESMKWTBIANYUAUNRZOS
WADGUKIHUUFVRVUIBFUXQIOLAWIXAU
LGLXUFIXBEPSOFCKIAHXSHVKZPCXVPI
LIUYFHITTUYKDVQOZPNGZLWOZSRJTCTZ
IZDFTFFPNEBIYGVNTZHINICBXBXLBNBAL
BSKQNTPVUAVBXZGHVZCOUCRGCYISGFGYAS
DPGYYCIKDGCETXQOZGEQQLFQWACMVDTRYAT
RQDNIPGUHRYDRVHIPJLOWKBXMIBFAWCJGFMC
PFKOAGEQLXCMISSVEARWAPVYMRDCLSLPJOMQQ
EQPCNHQPTWABPFBVBXHQTFYELPNMNCWVKDDKGR
RAHTJMGIQJOJVWJBIHVRLJYVCSQJCKMEZRGRJMU
SZBJBPQYVYKDHAJHZMHBEWQEAQQKIEYCFACNLJBC
ANVDUCVXBPIZVRAXEBFEJOHSYKEKBIJELPIWEYXKH
DJUNPRLTISBFMGBEQNXSNUSOGDJNKESVKGAAMTIVXK
TZPUHDSHZFEURBNZTFBKXCDPYRELIAFMUWDIQTYWXGU
FJIKJROQSFSZUCGOOFJIEHBZREEUUSZWOLYFPCYHUSMR
TPMHJEAWVAJOCSDOPMQMHKRESBQSTRBXESYGCDVKLFOVS
ABJCCDJYMYDCYPZSGPGIAIKZQBYTZFDWYUZQBOESDSDGOY
IIHKTVPJNJDBCBOHCIYOPBKOVVKGNAKBDKEEKYIPRPHZOMF
IABGEPCSPNSMLVJBSGLRYNFSSYIALHWWAINTAVZAGJRVMDPW
GFMFVEFYJQJASVRIBLULUEHPMZPEXJMHIEMGJRMBLQLBDGTWT
YPWHLCVHQAVKVGHMLSOMPRERNHVYBECGCUUWTXNQBBTCMVTOVA
контрольник
Вы можете использовать следующий фрагмент стека, чтобы проверить, содержит ли доска Boggle все строки в данном списке. Я перенес код поиска Boggle из ответа edc65 здесь . Дайте мне знать, если что-то кажется глючным.