m | Y bR | ain есть We | iRd. F (o) RT (h) E La | sT fi (v) e YE | ars O | R s | o, (I) ha | ve C (u) T wO | rds в h (a) lf wh | En (I) s (e) e Th | em. Я начал это делать, чтобы сделать все возможное - B (U) TI почти не (L) не N (O) T D | O это. N (o) w, я делаю это в затылке, a (n) d вряд ли когда-нибудь не будет | iCe это. Тем не менее, я думал, что это будет большой вызов.
Определения
Для этой задачи каждой букве присваивается балл, исходя из моего суждения о ее ширине шрифтом без засечек. Вы будете использовать эту ширину, чтобы разрезать слово на две половины одинаковой ширины. Символы, которые будут использовать в этом задании, - это алфавит в нижнем и верхнем регистре, апостроф и дефис.
Width Characters
1 i l I '
2 f j r t -
3 a b c d e g h k n o p q s u v x y z
4 m w A B C D E F G H J K L N O P Q R S T U V X Y Z
5 M W
Для моих объяснений и контрольных примеров, |
обозначает место, в котором слово может быть чисто разделено пополам. (
и )
по обе стороны от буквы указывают, что эта буква будет разделена пополам, чтобы создать чистое разделение.
вход
Ввод будет состоять из одного «слова» (которое не обязательно должно быть в словаре). Вы можете использовать это слово при любом вводе текста (строка, массив символов и т. Д.). Это слово будет содержать только буквы '
, и -
(см. Таблицу выше). Из-за того, что вы будете делать с этим словом (см. Ниже), случай ввода оставлен на усмотрение разработчика. Замыкающие переводы допускаются при необходимости.
Задание
Перестановка через все формы ввода (все буквы во всех возможных прописных или строчных буквах). Например, для ввода it's
ниже приведены все перестановки:
it's
it'S
iT's
iT'S
It's
It'S
IT's
IT'S
Чтобы разделить перестановку слова пополам, точки на одной стороне слова должны совпадать с точками на другой стороне слова. Однако, если буква застряла между двумя четными секциями, вы также можете аккуратно разрезать букву пополам.
Обратите внимание, что «половина» не означает, что вы перешли на половину строки. «Половина» означает, что точки с обеих сторон равны.
Примеры:
W
5 баллов. i
это 1 балл. Расщепление перестановкиWiiiii
пополам приведет к тому W | iiiii
, что по 5 точек на каждой стороне |
.
T
3 балла. Разделение перестановки TTTT
пополам приведет к TT | TT
6 точкам на каждой стороне |
.
w
4 балла. а 3 балла. Разделение перестановки waw
пополам приведет к w (a) w
5,5 баллам с каждой стороны. Точки от a
распределяются в обе стороны, так как a
делятся пополам.
Выход
Ваш вывод является целым числом числа уникальных перестановок ввода, которые могут быть аккуратно разделены пополам. Замыкающие переводы допускаются при необходимости.
Тестовые случаи
Я буду выводить все действительные перестановки ввода для тестовых случаев. Помните, что это не является частью спецификации для вас.
В моем промежуточном выводе числа указывают значение точки буквы над ними, поэтому вывод немного проще визуализировать.
Input: a
( a )
3
( A )
4
Output: 2
Input: in
Output: 0
Input: ab
A | B
4 4
a | b
3 3
Output: 2
Input: abc
A ( B ) C
4 4 4
A ( b ) C
4 3 4
a ( B ) c
3 4 3
a ( b ) c
3 3 3
Output: 4
Input: will
W ( I ) L l
5 1 4 1
W ( I ) l L
5 1 1 4
W ( i ) L l
5 1 4 1
W ( i ) l L
5 1 1 4
w I | L l
4 1 4 1
w I | l L
4 1 1 4
w i | L l
4 1 4 1
w i | l L
4 1 1 4
Output: 8
Input: stephen
S T E ( P ) H E N
4 4 4 4 4 4 4
S T E ( p ) H E N
4 4 4 3 4 4 4
S T E | p h e n
4 4 4 3 3 3 3
S T e ( P ) H E n
4 4 3 4 4 4 3
S T e ( P ) H e N
4 4 3 4 4 3 4
S T e ( P ) h E N
4 4 3 4 3 4 4
S T e ( p ) H E n
4 4 3 3 4 4 3
S T e ( p ) H e N
4 4 3 3 4 3 4
S T e ( p ) h E N
4 4 3 3 3 4 4
S t E ( P ) H e n
4 2 4 4 4 3 3
S t E ( P ) h E n
4 2 4 4 3 4 3
S t E ( P ) h e N
4 2 4 4 3 3 4
S t E ( p ) H e n
4 2 4 3 4 3 3
S t E ( p ) h E n
4 2 4 3 3 4 3
S t E ( p ) h e N
4 2 4 3 3 3 4
S t e ( P ) h e n
4 2 3 4 3 3 3
S t e p | H E N
4 2 3 3 4 4 4
S t e ( p ) h e n
4 2 3 3 3 3 3
s T E ( P ) H E n
3 4 4 4 4 4 3
s T E ( P ) H e N
3 4 4 4 4 3 4
s T E ( P ) h E N
3 4 4 4 3 4 4
s T E ( p ) H E n
3 4 4 3 4 4 3
s T E ( p ) H e N
3 4 4 3 4 3 4
s T E ( p ) h E N
3 4 4 3 3 4 4
s T e ( P ) H e n
3 4 3 4 4 3 3
s T e ( P ) h E n
3 4 3 4 3 4 3
s T e ( P ) h e N
3 4 3 4 3 3 4
s T e ( p ) H e n
3 4 3 3 4 3 3
s T e ( p ) h E n
3 4 3 3 3 4 3
s T e ( p ) h e N
3 4 3 3 3 3 4
s t E ( P ) h e n
3 2 4 4 3 3 3
s t E p | H E N
3 2 4 3 4 4 4
s t E ( p ) h e n
3 2 4 3 3 3 3
s t e P | H E N
3 2 3 4 4 4 4
s t e p | H E n
3 2 3 3 4 4 3
s t e p | H e N
3 2 3 3 4 3 4
s t e p | h E N
3 2 3 3 3 4 4
Output: 37
Input: splitwords
S P L I T | W O r d s
4 4 4 1 4 5 4 2 3 3
<snip>
s p l i t w | o R d S
3 3 1 1 2 4 3 4 3 4
Output: 228
Input: 'a-r
' a ( - ) R
1 3 2 4
' a | - r
1 3 2 2
Output: 2
Input: '''''-
' ' ' ( ' ) ' -
1 1 1 1 1 2
Output: 1
победа
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах. Вы должны быть в состоянии вывести все контрольные примеры (то есть все вводные данные длиной до 10 символов) за разумное время. Не искусственно ограничивайте свой ввод.
премия
Я не знаю, если это возможно. Тем не менее, вы играете в гольф - вы сделаете все для представителя. Я предлагаю вознаграждение в 200 представителей (я начну его, как только это условие будет выполнено, поскольку оно кажется мне в принципе невозможным), для программы, которая выводит правильный вывод antidisestablishmentarianism
менее чем за 15 секунд на среднем компьютере (так же, как у меня). Обратите внимание, что этот контрольный пример не должен быть жестко закодирован.
@DigitalTrauma сокрушил мою награду, прибыв намного меньше двух секунд. Проверьте его ответ здесь .
antidisestablishmentarianism
(не для гольфа) -83307040
(и соответствует всем тестовым случаям), но на моем ноутбуке это занимает ~ 37 секунд (учтите, что это Python). У кого-нибудь также есть счет для этого?Ответы:
Pyth ,
75747370 байтПопробуйте онлайн!
Ради любви к Богу, пожалуйста, даже не пытайтесь
antidisestablishmentarianism
переводчика. Вы сломаете это.объяснение
Давайте разберем этот код на X частей.
Первая часть: генерация версий и отображение значений
Давайте будем здесь ясны. В не части процесса буквы заглавной буквы. Нам просто нужно сопоставить одну букву двум значениям (а знаки пунктуации - одному значению) без необходимости их прописной буквы. Мы будем решать, для каких символов нам понадобятся два значения, а для каких символов нам понадобится одно:
Как видите, даже первая часть слишком длинная.
Первое значение для строчной версии, которая включает в себя
'
и-
. Второе значение для заглавной версии, с'
и-
не будет принимать.Первое значение:
Первая строка содержит
"mw"
индекс 0. Она имеет значение 4, что объясняет необходимость логического или. Обратите внимание, что Pyth использует 0-индексирование. Кроме того, пространство перед4
должно отделить его от1
.Второе значение (в верхнем регистре):
Если
d
есть"i"
, то это дает1
на первом шаге. В противном случае это продолжается. Еслиd
есть"m"
или"w"
, то третий шаг дает1
, который добавляется4
к дать5
. Еслиd
нет"m"
или"w"
, то третий шаг дает0
, который добавляется4
к дать4
.Вторая часть: выполнение работы
Это предшествует первой части, которая технически не отделена от второй части (это все еще одна команда). Итак, значение из первой части передается вправо.
Напомним: в первой части мы сопоставили буквы с их возможными значениями (строчные и прописные буквы, только одно значение для двух знаков препинания). За вход
"ab"
можно получить[[3,4],[3,4]]
.Чтобы сгенерировать разные версии в оболочке (что должно было быть сделано в первой части, но это могло бы привести к переполнению), мы неоднократно используем декартово произведение, а затем выравниваем результат. Проблемы возникают, когда есть только одна буква (первый контрольный пример), потому что декартово произведение не даст нам массив, а команда flatten (
.n
) переполнена, чтобы дать странные результаты для чисел. Посмотрим, как я обошел эту проблему.Если это раскол в середине
|
, то в префиксе сумма должна быть удвоена и равна сумме итоговой суммы.Если он разделен на
()
, то сумма префикса удваивается, минус значение в скобках будет суммой итога.источник
с 378 байт; около 0,6 с
antidisestablishmentarianism
Обновленный ответ . Я прочитал @ комментарий JonathanAllan в о
i
с, и сначала я не понимал эту оптимизацию, но теперь я вижу , что с тех пор , какi
иI
имеют ширину 1, то мы можем считать связанные перестановки дважды только того , чтобы проверить один раз. Ранее мое решение использовало несколько потоков, чтобы распределить нагрузку по нескольким процессорам, и с этим я почти смог выполнить все 28 вариантов на моей машине. Теперь сi
оптимизацией нет необходимости связываться с потоками - один поток выполняет работу легко в течение ограниченного времени.Без лишних слов - игра в гольф c:
Рекурсивная функция
f
принимает 3 параметра - указатель на входную строку, длину строки и смещение в строке, чтобы начать обработку (должно быть 0 для вызова верхнего уровня). Функция возвращает количество перестановок.Попробуйте онлайн . TIO обычно проходит через все тесты (включая
antidisestablishmentarianism
менее чем за 2 секунды).Обратите внимание , что есть некоторые непечатные в строке,
bcopy()
Эдаm[]
. TIO, кажется, справляется с этим правильно.Ungolfed:
У меня MacBook Pro середины 2015 года под управлением MacOS 10.12.4. Компилятор является Maclan Clang по умолчанию. Я собираю с:
Запуск всех тестовых примеров, в том числе
antidisestablishmentarianism
дает:Это ни в коем случае не оптимально. Алгоритм просто перебирает все возможности (по модулю
i
- см. Комментарии выше) и подсчитывает слова, которые могут быть разделены в соответствии с критериями.источник
i
,-
,'
,l
,mw
,fjrt
, иabcdeghknopqsuvxyz
, но это заняло бы приложение из Полиа перечисления теоремы (или эквивалентный комбинаторный метод перечисления), в котором я не очень хорошо разбираюсь.JavaScript (ES6),
199169167 байтОжидает входную строку в нижнем регистре. Слишком медленно для награды.
Контрольные примеры
Показать фрагмент кода
источник
С,
403394 байта,Спасибо, Кевин!
Попробуйте онлайн
Код Ungolfed:
источник
f(char* w, int l){
f(char*w,int l){