Пользователи космического отступа, объединяйтесь ! Мы должны бороться со всеми непритязательными пользователями вкладок !
Ваша миссия (если вы решите принять это) - написать программу или функцию, которая принимает два аргумента:
- Строка: это вход.
- Целое положительное число: это количество пробелов на вкладке.
Вы должны пройти через каждую строку строки и заменить каждую вкладку, используемую для отступа, указанным количеством пробелов, а каждую вкладку, не использованную для отступа (например, в середине строки), одним пробелом.
Обратите внимание, что такие строки, как \t \tabc
неопределенное поведение; они были вставлены злыми пользователями вкладки, чтобы усложнить ваши программы.
Согласно Обществу Tabs Must Die, ваша программа должна быть максимально короткой, чтобы ее не могли обнаружить злые пользователи вкладок.
пример
\t
используется для представления вкладок здесь.
Строка ввода:
a
\t\tb\tc
d
Введите номер:
4
Выход:
a
b c
d
Средняя строка была с отступом в 8 пробелов, по 4 на табуляцию (так как данное число было 4).
Строка ввода:
\ta\t\tb
Введите номер:
4
Выход:
a b
ПРИМЕЧАНИЕ. Это не является дубликатом задачи расширения вкладки ; это требует совсем другого формата ввода и немного других требований.
источник
\ta\t\tb
,4
(мой предыдущий пересмотр был провал , что один)Ответы:
CJam,
302423 байтаЯ обычно отказываюсь размещать вредоносный код в интернете ...
Это полная программа, которая читает строку из STDIN и число в качестве аргумента командной строки.
Попробуйте онлайн в интерпретаторе CJam .
Как это работает
Что
NA=
делает:Для первого символа
N
будет содержать значение по умолчанию, т. Е. Строку"\n"
.Для всех последующих символов
N
будет содержать результат последней итерации, т. Е. Последний символ ввода, пробел или строку из одного или нескольких пробелов.Если
N
это строка,NA=
выбирается элемент с индексом 10 из N (обтекание). Результатом будет пробел или символ перевода строки. Оба правдивы.Если N символ,
NA=
нажимает 1 для перевода строки и 0 в противном случае.Из-за вышеизложенного
NA=
будет выдано истинное значение для первого символа, символа, которому предшествует перевод строки, или символа, которому предшествует строка пробелов (отступ, который уже был заменен).Во всех других случаях (включая табулятор, который был заменен символом пробела ),
NA=
будет выдавать ложное значение.источник
К5,
5345 байтВ бою:
Я просто хочу, чтобы запись показала, что этот вопрос морально предосудителен.
источник
... this question is morally reprehensible.
`0:
и `" \ n "\`.Perl, 23 байта
Код 22 байта + командная строка 1 байт
Надеюсь, не слишком дерзко предположить, что числовой ввод может быть задан параметром -i! Обязательно замените \ t в приведенном ниже коде реальным символом табуляции.
Пример использования:
Или для удобства:
Объяснение:
Использование
-p
аргумента приведет к выполнению программы для каждой строки во входных данных, а затем напечатает результат в конце.В приведенном выше примере замена регулярного выражения заменяется
\G\t
на" "x4
(пробел повторяется четыре раза).\G
является малоизвестной конструкцией регулярного выражения, которая соответствует либо позиции первого совпадения, если первая итерация, либо позиции предыдущего совпадения, если не первой итерации, то есть она заменит все вкладки в начале строки и будет сделать это один за другим.y/\t/ /
Просто заменяет все остальные вкладки с пробелами.источник
Юлия,
6959 байтUngolfed:
Сохранено 10 байт и исправлена проблема благодаря Glen O!
источник
"hello\t\t1"
?"\t \t"
ситуаций), вы можете сделать это:,f(s,n)=(r=replace)(r(s,r"^\t*"m,i->" "^endof(i)n),"\t"," ")
которая использует функцию замены и поймает все вкладки отступа за один удар.Haskell, 82 байта
Тогда
g 3 "a\n\t\tb\tc\nd"
делает вещь.источник
Mathematica,
4237 байтСпасибо @ LegionMammal978 за несколько предложений по сохранению кода. Первый параметр
#
- для входного текста, второй параметр#2
- для количества пробелов на вкладке.источник
Table[" ",{#2}]
чтобы" "~Table~{#2}
сохранить байты. Почему выStringJoin
вставляете на него пустую строку?Рубин 49 байтов
источник
JavaScript (ES6), 70
Используя строки шаблона, новая строка значима и считается
Попробуйте запустить фрагмент ниже в Firefox.
источник
CoffeeScript, 72 байта
(Попытка сыграть в гольф еще как минимум на 2 укуса, чтобы он побил решение ES6 ... Помощь оценена: D)
Использование:
источник
Сетчатка, 42 байта
Все вхождения
.
являются пробелами, все\t
являются буквенными табуляциями (1 байт) и<empty>
представляют собой пустой файл. Это просто для удобства чтения. Я также не совсем уверен, что делаю цикл правильно, но я так думаю. Каждая строка должна быть размещена в своем собственном файле. Я добавил 1 байт для каждого дополнительного файла.Предполагается, что ввод в унарном формате находится на отдельной строке в конце ввода.
объяснение
Я добавляю
_
перед входом Unary, чтобы разделить его во время замены, чтобы не удалять концевые из входной строки. Затем я заменяю все вкладки не в начале строки одним пробелом. Затем я зацикливаюсь, удаляя один1
и добавляя один пробел после каждой вкладки, пока у меня не закончится ввод. Наконец, я очищаю, удаляя вкладки и подчеркивания.источник
Python,
7268 байтВкладки являются буквенными (1 байт), поэтому
r'...'
не нужны. К сожалению, Python требует «предопределенной ширины», поэтому я не могу использовать(?<!^|\t)
. Использует почти тот же метод, что и мое решение Retina.источник
Stax , 20 байт
Запустите и отладьте его
Эта программа читает первую строку как ширину отступа, а остальную часть ввода - как программу.
источник
Japt v2.0a0, 17 байт
Попытайся
источник
Haskell , 75 байт
Попробуйте онлайн! Это предполагает, что входные данные содержат только печатные символы, а также вкладки и переводы строк, как разрешено OP в комментариях.
Объяснение:
Внешняя
#
функция принимает строкуs
и числоm
и вызывает внутреннюю локально определенную#
функцию с теми же аргументами. Это делается для отслеживания исходногоm
значения, так как внутренняя#
функция меняет число:('\t':r)#n=(' '<$[1..n])++r#n
Если вы встретите вкладку, замените ееn
пробелами и оставьтеn
без изменений.(x:r)#n=x:r#(m^sum[1|x<' '])
Еслиx
встречается что- то, что не является вкладкой, оставьте это как есть, но установитеn
исходное число,m
еслиx
это новая строка, и в1
противном случае. Это делается путемm^sum[1|x<' ']
:m
берется в силуsum[1|x<' ']
которого оценивается,1
когдаx
меньше, чем пробел (то есть, новая строка), так что мы получаемm^1 = m
. В противном случае это0
и у насm^0 = 1
.источник
Java 11, 134 байта
Попробуйте онлайн.
ПРИМЕЧАНИЕ: Java 11 еще не на TIO, поэтому
" ".repeat(n)
эмулируется, какrepeat(" ",n)
вместо этого (с тем же количеством байтов).Объяснение:
источник