Предположим, мы используем следующие правила для извлечения одной строки из другой строки, содержащей только печатаемые символы ASCII и называемой *
-string. Если строка заканчивается до остановки процесса, это является ошибкой, и результат процесса в этом случае не определен:
- Начать с
d=1, s=""
- Всякий раз, когда вы сталкиваетесь с
*
, умножьтеd
на 2. Всякий раз, когда вы встречаете другого персонажа, объедините его до концаs
и вычтите 1 изd
. Если сейчасd=0
, остановить и вернутьсяs
Определенные примеры :
d->d
769->7
abcd56->a
*abcd56->ab
**abcd56->abcd
*7*690->769
***abcdefghij->abcdefgh
Неопределенные примеры : (обратите внимание, что пустая строка будет одним из них)
*7
**769
*7*
*a*b
*
Ваша задача - взять строку и вернуть самую короткую *
строку, которая генерирует эту строку.
Примеры программ :
7->7
a->a
ab->*ab
abcd->**abcd
769->*7*69
Ваша программа должна обрабатывать любую строку, содержащую хотя бы один символ и только не *
печатаемые символы ASCII. Вы никогда не сможете вернуть строки, для которых процесс не определен, так как по определению они не могут создавать ЛЮБЫЕ строки.
Применяются стандартные лазейки и правила ввода / вывода.
*
?Ответы:
Pyth (
3627 байт)Спасибо Jakube за 9-байтовое улучшение! В настоящее время не так хорошо, как ответ мутной рыбы , но что угодно
Тестирование
Перевод на python:
источник
JavaScript (ES6), 61 байт
Рекурсивная функция, которая выполняет следующие действия:
Если
d
меньше или равно оставшейся длине строки, деленной на 2:Добавить
*
к выводу и умножитьd
на 2Else:
Сдвиньте строку и добавьте к выводу, вычтите 1 из
d
.Посмотрите это в действии:
источник
f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s
Pyth,
2927(замечено разбито)272625 байтОбъяснение впереди.
Тестирование
источник
C 125 байтов
Это использует преимущества очень регулярного шаблона расположения звезд для вывода правильного кодирования. Первоначально я попробовал рекурсивное решение грубой силы, но в ретроспективе должно было быть очевидно, что существует более простое математическое решение.
По сути, у вас всегда будут
2^floor(log_2(length))
звездочки в начале вашего вывода, и последняя звездочка после2^ceil(log_2(length)) - length
символов (если это сработает как минимум до 1 символа).(Немного) негольфированная версия выглядит следующим образом
источник
JavaScript (ES6),
8877 байтСначала я подумал, что так и
abcde
должно быть,*a**bcde
но оказалось, что это**abc*de
работает так же хорошо. Это означает, что выходной сигнал легко построить с использованием ведущих звезд в пол (log₂ (s.length)), а также дополнительной звезды для струн, длина которых не равна степени двойки.Редактировать: Сохранено 8 байт путем рекурсивного вычисления количества ведущих звезд. Сохранены еще 3 байта с помощью специальных строк длиной 1, так что я могу рассматривать строки, длина которых равна степени 2, как наличие дополнительной ведущей звезды.
источник
Haskell, 68 байт
Так же, как и другие ответы, правда. Если EOF, выведите пустую строку. Если оставшаяся длина более чем в два раза
d
, выведите звездочку и удвойтеd
. В противном случае выведите следующий символ и вычтите один изd
.Ungolfed:
источник