Предполагая, что A = 1, B = 2 ... Z = 26, а значение слова является суммой этих буквенных значений, можно разбить некоторые слова на две части, чтобы они имели равные значения.
Например, «wordsplit» можно разбить на две части следующим образом: ordsl wpit, потому что o + r + d + s + l = w + p + i + t.
Это был вызов, который нам дал мой учитель информатики - очевидно, это старый вызов Lionhead Studios. Я решил это на Python, и вскоре опубликую свой ответ.
Задача: самая короткая программа, которая может перечислить все возможные сплиты, которые имеют равные оценки. Обратите внимание, что для каждой группы букв должен быть указан только один - например, ordsl wpit аналогичен rdosl wtip. Проще перечислить их в том порядке, в котором они встречаются в слове.
Бонус:
- Если вы выделите пары, в которых оба слова являются действительными английскими словами (или есть некоторая перестановка букв), используйте какой-либо список слов. (Это можно сделать, поставив звездочку рядом с каждым или каким-либо другим методом, но сделайте это ясно.)
- Добавление опции для удаления дубликатов (это не должно быть по умолчанию.)
- Поддержка более двух разбиений, например, трех, четырех или даже n-сторонних.
Ответы:
Perl, 115
118123Беги с
perl -nE '<code goes here>'
. Это 'n' считается в размере кода.Respaced:
С комментариями и именами переменных:
Некоторые из используемых трюков:
1..1<<@_
охватывает тот же битовый диапазон, что и0..(1<<@_)-1
, но он короче. (обратите внимание, что если рассматривать проблему издалека, в том числе многократные границы диапазона, то в любом случае это не приведет к неправильному выводу)64-ord$_[$_]
вместо добавленияord$_[$_]-64
выигрывает невидимый символ: так как он заканчивается разделителем, он делает пространство передfor
ненужным.cond ? var1 : var2 = new_value
.&&
и||
используются вместо соответствующих условных выражений .$l-$r
короче чем$l!=$r
источник
J (109)
Выход для
wordsplit
:Объяснение:
1!:1[1
: прочитать строку из stdin([{~(i.@!A.i.)@#)
: получить все перестановки"1
: для каждой перестановки:(96-~a.&i.)
: получить буквенные оценки}.@(split~&.>i.@#@>)@<
: разделить каждую перестановку баллов в каждом возможном интервале, кроме как до первого и после последнего числа>(>@(=/@:(+/"1&>)&.>)#[)
: посмотрите, какие перестановки имеют совпадающие половинки, и выберите их{&a.@(96&+)&.>
: превратить счет обратно в буквы~.(/:{[)
: удалить тривиальные вариации (например,ordsl wpit
иordsl wpti
)источник
{a,bc}
он уже найден, удалить,{a,cb}
но не удалить{bc,a}
. (И, конечно, я не обижаюсь, если я на самом деле / имел / дублировал чей-то ответ, я бы предпочел, чтобы кто-то на это указал.)c99 - 379 необходимых символов
Подход довольно очевиден. Существует функция, которая суммирует слова в соответствии с маской, и функция, которая печатает их также в соответствии с маской. Ввод со стандартного ввода. Одна странность в том, что процедура печати вставляет пробелы для буквы, а не в маску. Вкладка используется для разделения групп.
Я не делаю ни одного из бонусных предметов, и его нелегко конвертировать для поддержки
Читается и комментируется:
Проверка
источник
Рубин: 125 символов
Образец прогона:
источник
Mathematica
123111Находит все подмножества слов , которые имеют 1/2 «ASCii общие» слова,
d
. Затем находит дополнения этих подмножеств.d = "WORDSPLIT"
источник
J, 66 символов
Использование цифр номеров base2 для выбора каждого возможного подмножества.
источник
Мое решение ниже. Это почти анти-гольф по своим размерам, но он работает очень хорошо. Он поддерживает n-стороннее разбиение (хотя вычислительное время становится очень большим для более чем 3-х разбиений) и поддерживает удаление дубликатов.
Пример вывода:
источник
Луа - 195
ввод должен быть заглавными буквами:
источник
Питон - 127
а вот версия с n-разбиением с 182 байтами без дубликатов:
Ввод, например:
источник