В Vim вы можете повторить команду, поставив перед ней число, аналогичное 3dd
эквивалентному dd dd dd
. Ну, этот повторяющийся шаблон не ограничен командами Vim. Строка также может быть скопирована таким же образом.
Спецификация:
Для заданной строки, состоящей только из цифр, буквенных символов (как в верхнем, так и в нижнем регистре) и пробелов, с необязательным завершающим переводом строки в качестве входных данных, напишите программу, которая выполняет следующую работу:
Каждое «слово» состоит из цифр и алфавитов. Если перед буквой стоит число (может быть несколько цифр в номере или число равно нулю), повторите эту букву для заданного времени. Например:
a2bc -> abbc 3xx1yz -> xxxxyz 10ab0c0d0e -> aaaaaaaaaab # No 'cde' because there's a zero 2A2a2A2a -> AAaaAAaa
Слова разделены пробелами. Максимум один пробел между каждыми двумя смежными словами.
Легко, правда? Вот дополнительные вещи:
Если перед пробелом стоит число, повторите следующее слово для заданного времени. Номер всегда будет прикреплен к концу предыдущего слова или в начале строки. Пример:
a2bc3 2d -> abbc dd dd dd 3 3a -> aaa aaa aaa 33a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 abcd0 efgh3 2x -> xx xx xx a3 0xc b -> a c c c b
Если пустое слово должно быть повторено, не выводите несколько пробелов подряд. Раздавить их:
a3 0x2 b -> a b b # NOT 'a b b'
Другими словами, ваша программа никогда не должна выводить два пробела вместе.
Входные данные никогда не бывают пустыми, но необязательно, чтобы выходные данные были непустыми:
0 3x -> (empty)
Ввод и вывод могут быть приняты любым предпочтительным способом. Функция, принимающая входные данные из аргументов и выдающая выходные данные через возвращаемые значения, также приемлема.
Если это программа, она не должна завершаться с ошибкой (т.е. возвращаемое значение равно нулю).
Числа всегда десятичные и никогда не начинаются с нуля, если только само число не равно нулю, в этом случае есть только один ноль. Т.е. вам не нужно рассматривать
077a
или000a
давать в качестве входных данных.Все числа меньше 2 ^ 31 (2 147 483 648). Максимальная длина вывода составляет менее 2 32 (4 294 967 296) байтов.
Программа может дополнительно вывести один завершающий пробел и / или один завершающий символ новой строки. Эти пробел и новая строка не влияют на достоверность вывода. Даже если правильный вывод должен быть пустым, вывод пробела, за которым следует символ новой строки, будет квалифицирован.
Короче говоря, правильный ввод соответствует этому регулярному выражению:
([0-9]+ )?([0-9A-Za-z]*[A-Za-z])([0-9]* [0-9A-Za-z]*[A-Za-z])*( ?\n?)
И для правильного вывода:
([A-Za-z]+)( [A-Za-z]+)*( ?\n?)
Примеры тестовых случаев:
abcdefg -> abcdefg
a3bcd -> abbbcd
a3bbbc -> abbbbbc
3a0b -> aaa
abc 3d -> abc ddd
abc3 d -> abc d d d
5 1x5 1y0 z -> x x x x x y y y y y
a999 0x b -> a b
999 0s -> (empty)
0 999s -> (empty)
0 999s4 t -> t t t t
a3 0xc b -> a c c c b
ABC3 abc -> ABC abc abc abc
Это код-гольф , поэтому выигрывает самая короткая программа в байтах на каждом языке!
a3 0xc b
->a c c c b
, так как у меня изначально был код, который работал для всех тестовых случаев выше, но не работал правильно для этого.Ответы:
JavaScript (Node.js) ,
102129110106 байтПопробуйте онлайн!
Спасибо за @Arnauld за -4 байта.
источник
Perl 6, 88 байт
Проверь это
Expanded:
~(…).words
Комбинация удаляет лишние пробелы, что полезно , если «слово» получает удален.источник
Python 2,
286275260257238 байт-19 байт благодаря овсу
f
принимает строку в качестве аргумента и печатает отформатированную строку.Вот repl.it с тестовыми примерами .
Код Ungolfed:
Все еще работаю над улучшениями.
источник
exec
, поскольку это единственная строка в функции.Perl 5 , 77 + 1 (
-p
) = 78 байтПопробуйте онлайн!
источник
Чисто ,
443... 306 байтПопробуйте онлайн!
источник
Луа , 113 байт
Попробуйте онлайн!
источник