При кодировании на Python иногда вам нужна многострочная строка внутри функции, например
def f():
s = """\
Line 1
Line 2
Line 3"""
(Обратный слеш должен убрать ведущий символ новой строки)
Если вы попытаетесь распечатать s
, вы получите
Line 1
Line 2
Line 3
Это совсем не то, что мы хотим! Слишком много ведущих пробелов!
Соревнование
Учитывая многострочную строку, состоящую только из буквенно-цифровых символов, пробелов и символов новой строки, удалите все общие пробелы в начале каждой строки. Каждая строка гарантированно имеет по крайней мере один непробельный символ и не будет завершающих пробелов. Вывод может не иметь посторонних пробелов, будь то до или после всего вывода или отдельной строки (за исключением одного необязательного завершающего символа новой строки).
Ввод может быть через STDIN или аргумент функции, а выход может быть через STDOUT или возвращаемое значение функции. Вы не можете использовать любые встроенные функции, предназначенные для отступления многострочных строк или выполнения этой точной задачи, например Python textwrap.dedent
.
Это код-гольф , поэтому выигрывает решение с наименьшим количеством байтов. Применяются стандартные лазейки .
Контрольные примеры
"a" -> "a"
" abc" -> "abc"
" abc\n def\n ghi" -> " abc\ndef\n ghi"
" a\n b\n c" -> "a\nb\nc"
" a\n b\n c\nd" -> " a\n b\n c\nd"
" a b\n c d\n e f" -> "a b\n c d\n e f"
Например, последний контрольный пример
a b
c d
e f
и должен выглядеть следующим образом после удаления ведущих пробелов:
a b
c d
e f
источник
Ответы:
CJam,
2014 байтовАлгоритм :
qN/_
)z{S-}#
).f>
)N*
)Расширение кода
Попробуйте онлайн здесь
источник
Pyth,
19181714 байтовРеализация довольно крутая.
u .z
захватывает все строки stdin в массиве, помещает его вG
. Затем он оценивает внутреннее тело, помещает результатG
и продолжает делать это до тех пор, пока он больше не изменится (фиксированная точка).!rhCG6
transposesG
, получает первый элемент транспонированного массива (первый столбец), удаляет его из любого пробела и проверяет, остались ли какие-либо непробельные символы.Значение от 2 является логическим значением, которое можно рассматривать как целое число 0 или 1.
>R G
захватывает это число и отсекает столько символов слева от каждой строки вG
. Комбинированные шаги 1, 2 и 3 в основном означают, что он будет удалять столбцы пробелов, пока не останется чистый столбец пробелов.jb
соединяет массив строк с помощью новых строк и печатает его.источник
sed - 26 байт
бежать с
-rz
Довольно просто:
-r
опция включает расширенные регулярные выражения,-z
читает весь ввод как одну строку (фактически использует NUL-байт в качестве разделителя строк)источник
:;N;$!b
или подобное для начала собирать строки ввода в единое пространство шаблонов? Изменить: нет, вы не делаете; для этого и нужен-z
флаг.:;/^\S/M!s/^ //mg;t
-r
SWI-Пролог,
233223217 байтИзменить : полностью изменил мой ответ. Теперь он использует коды символов вместо строк.
Примером вызова этого может быть
a(` a b\n c d\n e f`).
обратная кавычка. Возможно, вам придется использовать двойные кавычки,"
если у вас старый дистрибутив SWI-Prolog.источник
Юлия,
939281 байтСохранено 10 байтов благодаря Glen O.
Это создает безымянную функцию, которая принимает строку и печатает на стандартный вывод.
Ungolfed + объяснение:
источник
minimum([length(search(j, r"^ +")) for j in p])+1
, чтобы использоватьminimum([search(j,r"[^ ]")[1]for j=p])
. Поскольку в задании указано, что во всех строках будет текст без пробелов, это безопасно и сэкономит вам 9 байт (включая 3, сохраненных с использованием=
вместо `in). Still looking to see if more can be saved. (I wish I could drop the
[1]`), но при поиске создается массив перечислителей типа Any, хотя минимум требует тип Int)s->for i=(p=split(s,"\n")) println(i[minimum([search(j,r"[^ ]")[1]for j=p]):end])end
minimum(x)
когдаx
массив, используйтеmin(x...)
для сохранения одного дополнительного байта (я собираюсь добавить этот в свой список советов Джулии по игре в гольф).\S
, чем[^ ]
, что сохраняет байт.\S
это тоже полезно для моего решения.Ява, 159
Потому что явно не хватает Java ...
Это просто циклы, сравнивающие длину с усеченной длиной, затем выплевывающие подстроки. Ничего особенного. Для полосы прокрутки:
источник
Perl,
4733Спасибо @ThisSuitIsBlackNot за предложение использовать неявный цикл Perl
Выше оценивается как 30 байтов для строки кода + 3 для
00p
флагов.Оригинальная версия, как функция:
Это помещает аргумент в
$_
, а затем пытается жадно сопоставлять пробелы, которые присутствуют во всех строках, с/^( +).*(\n\1.*)*$/
- в случае успеха$1
теперь содержит самый длинный общий префикс, и мы выполняем замену,s/^$1//mgr
чтобы удалить его из начала каждой строки и вернуть полученную строку.Тестовое задание
источник
perl -00pe '/^( +).*(\n\1.*)*$/&&s/^$1//mg'
(30 байтов + 3 для00p
)./me
уходит, чтобы посмотреть вверх-00p
; спасибо @ThisSuitPython 2,
867975 байтЭто почти наверняка может быть сокращено еще немного, но сейчас это не плохо.
Спасибо xnor за сохранение 4 байта!
источник
x.find(x.strip())
.input()
в Python 2 захлебнулся бы этими данными.):
Рубин:
7773706665585740 символовОбразец прогона:
источник
f=->t{t.gsub /^#{t.scan(/^ */).min}/,""}
?C #, 18 + 145 = 163 байта
Требуется (18 байт):
Метод (145 байт):
Метод вычисляет наименьшее количество начальных пробелов в строках и создает новую строку, построенную из всех строк, с пропуском N символов (где N - это ранее вычисленное число).
источник
C #, всего 149 байт
Практически такое же решение, как и в ProgramFOX, хотя количество символов для обрезки рассчитывается вручную.
И сама функция:
источник
Питон 3, 100
источник
JavaScript, ES6,
8986 байтЭтот полностью использует только совпадения и замены RegEx.
Как всегда, только Firefox, начиная с ES6. Позже добавлю версию ES5.
источник
К, 31 байт
Вводит список строк и выводит результат на стандартный вывод.
источник
Haskell, 52 байта
Пример использования:
unlines.until(any(/=' ').map head)(map tail).lines $ " abc\n def\n ghi"
->" abc\ndef\n ghi\n"
Как это устроено:
источник
Python, 94/95
лямбда (94 байта):
def (95 байт)
источник
bash + sed + coreutils,
74,56, 55Тестовые данные
Ответ
Выход
источник
cut -c$[`grep -o '^ *'<<<"$s"|sort|sed q|wc -c`]-<<<"$s"
$[]
арифметике. Использованиеcut
для выбора столбца намного лучше. Я никогда не виделsed q
в качестве альтернативыhead -n1
, это хороший трюк в гольф. Благодарность!head -n1
vssed q
,line
в пакете util-linux есть инструмент.R,
118111 байтИспользование замечательных строковых функций R :) Это похоже / аналогично другим решениям, уже опубликованным. Ввод через STDIN и кошек в STDOUT.
Тест и объяснение
источник
Юлия,
726261575449 байтовUngolfed:
Старый раствор (57 байт):
Исходное решение (72 байта):
источник
к (24 байта)
Принимает строку в качестве аргумента и возвращает строку (с завершающей новой строкой).
Пример:
источник
05AB1E , 10 байтов
Попробуйте онлайн!
источник
*
повторяет строку b несколько раз? .. Не знал об этой функции*
. Я обычно делаюs∍
(поменять и удлинить), когда я хочу повторить определенный символ.и
выдает список символов.Gawk,
101100Например...
Выход...
источник
/^( +)/
→/^ +/
(тогда у вас будет нужное значениеt[0]
вместоt[1]
); изменитьs==""
→!s
; удалить{
и}
вокруг кода послеif
; удалить;
до}
; используя специфическую для Gawk функцию, чтобы иметь возможность удалять{
и}
вокруг кода послеfor
:{sub(s,"",z[r]);print z[r]}
→print gensub(s,"",1,z[r])
.C GCC, 74 байта
Удаляет только все пробелы, не относящиеся к предыдущим строкам, запрашивая помощь для завершения. ТАКЖЕ, с точки зрения общих пробелов, означает ли OP, что у какой строки наименьшее количество начальных пробелов, то есть количество пробелов, которые должны быть удалены из каждой строки?
источник
Сложенный , неконкурентный, 43 байта
Попробуйте онлайн!
Это работает путем нахождения количества пробелов в начале каждой строки (
'^ +'match$#'"!
), получения минимума, повторения пробела много раз и замены его ничем в каждой строке.источник
Vim,
33, 31 байтПопробуйте онлайн!
Старая версия:
источник
Stax , 9 байт
Запустите и отладьте его
источник
CoffeeScript, 112 байт
источник
JavaScript (ES6),
10698 байтНовые строки необходимы и учитываются как 1 байт каждый:
демонстрация
Как и в случае с другими ответами ES6, в данный момент они работают только в Firefox.
источник
JavaScript ES6, 85 байт
Новые линии значимы
ES5 Демо:
источник
JavaScript ( ES6 ) 56
Рекурсивный, пытается удалить по одному пробелу за раз из каждой строки, пока не будет найден не пробел.
Попробуйте запустить фрагмент ниже - ES6, только Firefox
источник