Подумайте, как можно расположить слово в произвольно большой сетке Boggle, если игнорируется правило о том, что не следует использовать один и тот же буквенный куб более одного раза . Также предположим, что у вас есть неограниченное количество буквенных кубов (со всеми присутствующими буквами), и Qu
это просто Q
.
Слово MISSISSIPPI
может быть организовано с использованием только 6 кубов. Вот одна из возможных договоренностей:
S
MIS
PP
Начиная с, M
мы многократно делаем любой шаг по горизонтали, вертикали или диагонали, пока все слово не будет прописано.
Удивительно, но более длинная фраза вроде AMANAPLANACANALPANAMA
также требует только 6 кубов:
MAN
PLC
Однако минимальное количество кубов, необходимое для более длинных и сложных строк, не всегда очевидно.
Вызов
Напишите программу, которая принимает строку и упорядочивает ее в стиле Boggle так , чтобы использовалось минимальное количество кубов . (Размеры результирующей сетки и количество пустых ячеек не имеют значения.)
Предположим, у вас есть неограниченное количество кубов для каждого печатаемого символа ASCII, кроме пробела (шестнадцатеричные коды от 21 до 7E), поскольку он используется в качестве пустой ячейки сетки. Будут введены только печатаемые строки ASCII (без пробелов).
Ввод должен быть взят из стандартного ввода или командной строки. Вывод должен идти в стандартный вывод (или ближайший вариант).
Лидирующие или завершающие символы новой строки и пробелы в выводе хороши (но, надеюсь, не слишком много).
По мере увеличения длины строки пространство поиска увеличивается экспоненциально, но вам не нужно пытаться сделать ваш алгоритм эффективным (хотя это было бы неплохо :)). Это код-гольф, поэтому выигрывает самое короткое решение в байтах .
пример
Если бы входные данные были Oklahoma!
(минимум 8 символов), все они были бы действительными выходными данными, потому что у всех было ровно 8 заполненных ячеек сетки, и они следовали (пересмотренному) шаблону чтения Boggle:
Oklaho
!m
или
!
Oamo
klh
или
lkO
!amo
h
и т.п.
Ответы:
Python 342
355398Отступ на четыре пробела на самом деле является символом табуляции.
AMANAPLANACANALPANAMA
:MISSISSIPPI
:Oklahoma!
:Llanfairpwllgwyngyll
является летальной ;)источник
import sys
и заменивsys.argv[1]
наraw_input()
.elif
чтобыelif not c and (not A or len(b)<len(A[-1])):
и он работает намного быстрее"Oklahoma!"
все в порядке, вы можете просто использоватьinput()
вместоraw_input()
.