Допустим, у вас есть список слов, и вы хотите использовать буквенные карточки для написания каждого слова. Например, чтобы записать слово « кошка» , вы должны использовать три карты с надписью C, A, T.
Предполагая, что каждая карточка двусторонняя , отправьте программу, чтобы определить минимальное количество карточек, которое можно использовать для написания всего списка слов.
Ввод - это список слов, он может быть на основе файлов, жестко запрограммирован, из командной строки, что угодно. Вывод - это список карточек, отформатированный и упорядоченный по вашему усмотрению, при условии, что понятно, как помечены карточки.
Случай не имеет значения: гольф, гольф и гольф одинаковы.
Некоторые намеки:
- количество карточек может быть не меньше длины самого длинного слова
- для карты нет смысла иметь одинаковые буквы на обеих сторонах
- хотя регистр не имеет значения, рекомендуется использовать строчные буквы, чтобы использовать определенные симметрии
Примеры, они используют определенные симметрии :
Входные данные: Бен, болото, жук, жук, день, До, Доу, собака, должный, вырыли, Эд, конец, Гоб, Бог, Нед, Ода, ручка, По, мопс
Выход: б / д, э / г, о / п
Входные данные:, и, обезьяна, есть, быть, кровать, бутон, бур, Дэн, Деб, даб, ухо, Эд, эра, сон, пан, горох, паб, Рей, бег, руб
Выход: a / b, d / r, e / n
Делая это соревнованием популярности, так важны элегантность кода, производительность во время выполнения и хитрость (в том числе правила и лазейки)!
Дополнение : Некоторые спрашивают о «разрешенных» симметриях, можно ли использовать специальные шрифты и можно ли сложить карточки.
Разрешенные симметрии - это любые буквы, которые после поворота на 0, 90, 180 или 270 градусов выглядят похожими друг на друга. Это включает в себя b / q, d / p и n / u. Я также сказал бы M / W, Z / N и, конечно, I / l (заглавная i, строчная L). Я, вероятно, царапаю поверхность, так что если есть другие, в которых вы не уверены, просто спросите.
Для простоты, пожалуйста, используйте стандартный шрифт без засечек, скажем, используемый в SE.
Что касается фальцовки, в то время как вы можете делать удивительные замены, например, B может быть D, E, F, I, P или R, и, возможно, C или L, если вы действительно творчески складываете, я думаю, что это изгибает, буквально, слишком много !
Я столкнулся с этой проблемой, играя с некоторыми похожими картами с моими детьми. Я отметил, насколько легко было придумать односторонние карты, и насколько сложно было придумать двухсторонние карты.
Дополнение : предоставили награду за самый популярный ответ. Если есть галстук, наградит тот, кто подал первым.
Еще один намек:
- Решение односторонней задачи даст вам представление о минимальном количестве необходимых карточек (например, 20 односторонних карточек соответствует минимум 10 необходимым двусторонним карточкам)
Дополнение : О, беспокойство, я был занят и забыл об истечении срока действия награды. Это ни к чему не привело, потому что единственный ответ был представлен до начала награды! Прости за это.
n/u
,d/p
? А как насчетb/q
иm/w
? А что если я сложуP
карту пополам, чтобы верхняя половина сталаD
?Ответы:
C # - CardChooser
Резюме
Это приложение использует метод грубой силы, чтобы попытаться решить каждый список. Сначала я создаю список потенциальных карт для выбора, затем я определяю, какая из них подходит лучше всего (удаляет большинство символов + сокращает большинство длинных слов), добавляю это в список результатов и продолжаю этот процесс, пока не выберу достаточно потенциальных карт. чтобы удалить каждое слово в списке, затем я сопоставляю эти карточки с каждым словом и печатаю вывод.
Если вы хотите увидеть более ограниченную версию этого кода, не загружая и не создавая прилагаемое приложение Windows Form, вы можете использовать предоставленную ссылку для запуска моей программы на меньших наборах данных, обратите внимание, что это версия консольного приложения, поэтому карты НЕ вращаются: http://ideone.com/fork/VD1gJF
лист регистраций изменений
Current - добавлена улучшенная оптимизация результатов, предложенная @Zgarb
Обновление 3 - больше очистки кода, исправлено больше ошибок, улучшены результаты
Обновление 2 - Windows Forms, более подробный вывод
Обновление 1 - новая / улучшенная поддержка симметрии символов
Оригинал - Консольное приложение
Примеры
acr, aft, ain, sll, win, скажем, сказал, быстрый, эпический
он, будет, не будет, будет, не хотел бы, пока, ты, ты, ты
аааа, bbbb, cccc
Код
Мне все еще нужно объединить это в один более крупный проект с использованием кода ConsoleApp и WindowsForms, которые используют одни и те же классы и методы, а затем разделить различные области в методе RunButton_Click, чтобы я мог писать единицы вокруг них, в любом случае, когда бы я ни нашел время для этого Я буду, пока это то, что у меня есть:
источник
i
карточки?said
последнее письмо не W или р