Есть классическое кодирование и декодирование длин серий.
input output
a3b2c5 aaabbccccc
И это довольно просто и сделано раньше.
Задача также состоит в том, чтобы учитывать нестандартное поведение, когда несколько символов предшествуют длине цикла ( одна цифра от 0 до 9). Каждый символ перед цифрой длины серии (последняя цифра перед нецифрой или концом строки) имеет это значение, которое применяется к нему индивидуально и распечатывается по порядку.
Некоторые тестовые входные и выходные данные, включая некоторые крайние случаи:
input output
ab3c5 aaabbbccccc
a0b3 bbb
13b1 111b
a13b1 aaa111b
a123b1 aaa111222b
aa2a1b1 aaaaab
- Последовательность символов (
[a-zA-Z0-9]+
) должна сопровождаться длиной строки ([0-9]
) - Необходимо учитывать только действительные данные (
([a-zA-Z0-9]+[0-9])*
)- да, пустая строка является допустимым вводом.
- Вход через стандартный вход, выход через стандартный выход
Это код гольфа, количество байтов определяет победителя.
Ответы:
Пип, 22 + 1 = 23 байта
Использует
-r
флаг. Обратите внимание, что для этого необходимо либо 1) ввести EOF после ввода (Ctrl-D в Linux, Ctrl-Z в Windows), либо 2) передать вход откуда-либо еще.Объяснение:
Результатом операции map на самом деле является список списков, но по умолчанию списки просто объединяются вместе при печати, поэтому ручное преобразование в строку не требуется.
Пример с вводом
a13b1
:Пип имеет базовую поддержку регулярных выражений с ... 2 дня назад . Отличное время!
источник
-r
флагом. (Вопрос указывает, что входные данные должны поступить от STDIN.)q
вместоa
лишних флагов, но, похоже, есть ошибка, и она запрашивает ввод дважды.Perl / Bash
5440 + 1 = 41 байтЭто в основном регулярное выражение в регулярном выражении. И немного магии.
объяснение
Внешнее регулярное выражение
/(\D*\d*)(\d)/g
извлекает каждую закодированную группу длин серий. Мы фиксируем материал для повторения$1
и количество повторений$2
. Теперь мы заменяем каждую такую группу расширением этой группы. Для этого мы оцениваем код"\$1=~s/./\$&x$2/egr"
два раза (как с помощью/ee
флага на внешней замене).Первая оценка будет только интерполировать количество повторений в строку - остальные переменные защищены обратной косой чертой. Таким образом, при условии ввода
a14
, мы теперь имеем код$1=~s/./$&x4/egr
, который будет оценен снова.Это будет применять подстановку к содержимому
$1
(материал для повторенияa1
). Подстановка соответствует каждому символу.
.$&
Переменная содержит весь матч, который мы повторятьx4
раз. Мы делаем это/g
глобально для каждого совпадения и/r
переворачиваем замещенную строку, а не модифицируем$1
переменную (которая доступна только для чтения). Таким образом, результат внутренней замены естьaaaa1111
.-p
Флага применяет замену каждой входной линии , и выводит результат.источник
-p
модификатора. Я считаю 45 байтов. Кроме того, вы должны иметь возможность использовать\D
вместо[a-z]
, что также устраняет необходимостьi
.CJam,
33 3127 байтТьфу, отсутствие регулярных выражений делает это довольно длинным ...
Как это устроено
Мы перебираем все символы входной строки и в каждой итерации отслеживаем последний встреченный символ (начиная с пустого символа в первый раз). Затем мы проверяем, является ли текущий символ не числовым и последний символ числовым. Если это так, мы повторяем каждый предыдущий символ (который уже не повторялся), количество раз.
(Немного устаревшее расширение кода)
Попробуйте это онлайн здесь
источник
RS ,
4371 символовНу, это быстро обернулось. Глупые цифры ...
Попробуй это здесь!
Оригинальная версия (не работает с вводом, как
123
):объяснение
Первая строка помещает пробелы между сериями, содержащими числа, например, превращаясь
a313
вa3 13
.Вторая строка непрерывно расширяет сжатые кодировки, такие как
aa5
вa5a5
.Третья строка преобразует каждый экземпляр
a5
вaaaaa
использование оператора повторения .Последняя строка удаляет пробелы.
источник
a123b1
?Javascript ( ES6 ),
8683 байтакомментарии:
источник
alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(c+1).join(b)))
делать то же самое? Это всего 71 байт.Array(6).join('12')
и он вернется'1212121212'
.alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(-~c).join(b)))
(те же 71 байт, протестировано на es6fiddle.net/ia7gocwg )CJam,
2725 байтовПопробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник
Pyth,
333228 байтПопробуйте онлайн: демонстрация или тестовая привязь
объяснение
Я объясню код, используя пример ввода
aa1a23b2
. Надеюсь, что это немного легче следовать, чем без.источник
Рубин 73
Тесты: http://ideone.com/L1fssb
источник
JavaScript 112
источник
Python 2.7, 98 байт
Это просто выполняет регулярное регулярное выражение для поиска цифр, за которыми не следует цифра, а затем выполняет строковую арифметику для каждой группы и объединяет их все вместе.
источник
raw_input
становится,input
ноprint
нуждается в скобках.Юлия,
105999587 байтЭто создает безымянную функцию, которая принимает строку в качестве входных данных и возвращает строку. Чтобы назвать его, дайте ему имя, например
f=s->...
.Здесь используются два понимания массива, одно вложено в другое. Внешнее понимание действует на каждое совпадение входной строки с регулярным выражением
\D*\d*\d
. Внутреннее понимание повторяет каждый символ в соответствии с последней цифрой. Элементы внутреннего массива объединяются в строку, поэтому внешний массив представляет собой массив строк. К ним присоединяются и возвращаются.В Julia строки могут рассматриваться как массивы символов. Тем не менее, обратите внимание , что
Char
иString
типы в Джулию не имеют одни и те же методы определены; в частности, нет способа повторения, использующего^
для символов. Это использует запутанный обходной путь:chop()
.string()
.int('4')
не возвращает 4. Скорее, он возвращает кодовую точку, которая в данном случае равна 52. Таким образом, мы можем вычесть 48, чтобы получить действительное целое число.string(b)
согласноint(p[end]) - 48
.Примеры:
источник
Python 3,
148144136135 байтСпасибо Pietu1998 и mbomb007 за предложения.
Python 2,
161151147139138 байтМожет быть, сегодня просто был долгий день на работе, но я не могу понять, как играть в гольф это ..
источник
raw_
в скобкахprint
).len(d)>0
может быть заменено,d
так как пустой список ложный, а непустой список правдив.list(...)
можно идти прямо кfor
. Квадратные скобкиw([...])
не нужны, так как это единственный аргумент. Вы можете удалить пространство в) for
. Это все мелкие вещи, которые я придумал до сих пор.list()
поскольку строки являются итеративными. Вы можете использоватьw=r=''
. Если вы готовы многое изменить, посмотрите мое решение. :)if c.isdigit()
может статьif'/'<c<':'
, если я не ошибаюсь.Java 7, 175 байт
Задача сложнее, чем кажется
Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник