Мы уже сейчас, как убрать строку из ее пробелов.
Однако, как настоящие джентльмены / леди, мы должны скорее раздеться .
Раздевание строки - это то же самое, что раздевание, только более деликатное. Вместо того, чтобы удалять все начальные и конечные пробелы одновременно, мы удаляем их по одному . Мы также чередуем ведущий и трейлинг, чтобы не сжигать шаги.
Пример, начиная с " codegolf "
(пять начальных и конечных пробелов):
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
codegolf
Сначала выведите строку без изменений. Затем выведите каждый шаг. Начните с удаления начального пробела (если применимо - см. Правило № 2).
Входные данные могут иметь различное количество начальных и конечных пробелов. Если у вас закончились пробелы на одной стороне, продолжайте раздевать другую, пока строка не станет голой.
Вход может не иметь ни начальных, ни конечных пробелов. Если это так, выведите его как есть.
Используйте стандартные методы ввода / вывода PPCG . PPCG По умолчанию лазейки запрещены.
Неопределенное поведение на пустом вводе или вводе, который содержит только пробелы, в порядке.
Вы можете предположить, что строка будет содержать только символы из печатного пространства ASCII (
0x20
to0x7E
).
Примеры - пробелы заменены точками .
для лучшей читаемости:
4 leading spaces, 5 trailing: "....Yes, Sir!....."
....Yes, Sir!.....
...Yes, Sir!.....
...Yes, Sir!....
..Yes, Sir!....
..Yes, Sir!...
.Yes, Sir!...
.Yes, Sir!..
Yes, Sir!..
Yes, Sir!.
Yes, Sir!
6 leading, 3 trailing: "......Let's go golfing..."
......Let's go golfing...
.....Let's go golfing...
.....Let's go golfing..
....Let's go golfing..
....Let's go golfing.
...Let's go golfing.
...Let's go golfing
..Let's go golfing
.Let's go golfing
Let's go golfing
0 leading, 2 trailing: "Hello.."
Hello..
Hello.
Hello
0 leading, 0 trailing: "World"
World
21 leading, 5 trailing: ".....................a....."
.....................a.....
....................a.....
....................a....
...................a....
...................a...
..................a...
..................a..
.................a..
.................a.
................a.
................a
...............a
..............a
.............a
............a
...........a
..........a
.........a
........a
.......a
......a
.....a
....a
...a
..a
.a
a
Джентльмен / леди лаконичны, поэтому выигрывает самый короткий ответ в байтах .
0x20
до0x7E
). Другие являются неопределенным поведением." test\r "
или" \v test"
либо.".....................a....."
? Если так, я предлагаю добавить это, так как некоторые ответы, кажется, не проходят этот вид теста. (точки для лучшей читаемости, конечно)Ответы:
Сетчатка , 26 байт
Попробуйте онлайн! (Набор тестов для ясности использует точки. Нижний колонтитул и верхний колонтитул преобразуют их в пробел и из основного кода.)
объяснение
Было бы хорошо, если бы мы могли просто чередовать отбрасывание начального и конечного пробелов и выводить промежуточный результат каждый раз. Проблема в том, что в настоящее время Retina не может печатать условно, поэтому она даже напечатает этот промежуточный результат, если не осталось начальных или конечных пробелов, генерируя дубликаты. (Retina 1.0 получит опцию, которая печатает результат, только если строка была изменена операцией, но мы еще не там ...)
Вместо этого мы создаем одну строку, содержащую все промежуточные результаты, и печатаем ее в конце.
{
Оборачивает оба этапа программы в цикле , который повторяется до строки перестает изменяться (что означает , что нет ни ведущие / конечные пробелы влево). Сама сцена соответствует начальному пробелу в последней строке строки и этой последней строке, а затем записывает совпадение, а также материал после пробела в новой строке (тем самым удаляя начальный пробел в копии).Удаление пробела немного проще. Если мы просто сопоставим последний пробел, мы сможем получить доступ к материалу перед ним (на той же строке), с помощью
$%`
которого является линейно-зависимый вариант замены префикса$`
.источник
Python 2 ,
12210710310298959391908887 байтПопробуйте онлайн!
Python 3 ,
97959390 байтПопробуйте онлайн!
источник
s=input()
вместо функции заняло бы меньше байтов.5. Undefined behaviour on empty input, or input that only contains spaces, is OK.
, 98 байт .a
его встроенной функцией,id
чтобы избавиться от необходимости определять его в начале. -2 байта.Perl 6 , 55 байт
Сохранено 3 байта благодаря @nwellnhof.
Попробуйте онлайн!
Объяснение :
($_,{$++%2??S/" "$//!!S/^" "//}...*)
рекурсивная бесконечная последовательность, которая начинается с исходной строки ($_
), а следующий элемент задается блоком, вызываемым в предыдущем элементе.Сам блок получает строку в
$_
переменной. ОператорS/(regex)/(string)/
выполнит поиск первого вхождения(regex)
in$_
, заменит его на(string)
и вернет результат. Если совпадений нет, возвращается содержимое$_
без изменений. Мы используем троичный оператор?? !!
с условием$++%2
, которое чередуется междуFalse
иTrue
($
это свободная переменная, которая сохраняет свое содержимое при обращении к блоку.)В худшем случае (все пробелы на одной стороне и 1 другой символ) мы удаляем 1 пробел каждые 2 шага. Таким образом, мы можем быть уверены, что за 2 * (длина строки) шага все пробелы будут удалены. Мы берем столько элементов из рекурсивной последовательности
[^.comb*2]
и, наконец, отбрасываем дубликаты (которые появляются всякий раз, когда пробел должен быть удален, но его там нет).unique
. Это возвращает список строк, постепенно очищаемых от пробелов.источник
[^.comb*2]
экономит 2 байта. По какой-то причине это работает, но[^2*.comb]
не работает. Понятия не имею почему. Использование троичного?? !!
для выбора регулярного выражения сохраняет еще один байт.[^2*.comb]
и это не сработало, поэтому я просто использовал[0..2*.comb]
. И спасибо за тройным, я просто подумал , что это слишком дорого , и это не приходила мне в голову , что я заменил его с чем - то еще более дорогой ...05AB1E ,
2115 байтПопробуйте онлайн!
Объяснение ^
источник
C (gcc) ,
8984 байтаРекурсивная версия короче ;-)
Попробуйте онлайн!
C (gcc) ,
10710210110099 байтовСохранено 2 байта благодаря @Jonathan Frech с использованием пробелов и ~
Попробуйте онлайн!
источник
==46
на, так<33
как пробел - самый маленький печатный символ, и вам нужно только обработать их.++k+
?k
и добавляет единицу, что эквивалентноk = k + 1; i = k + 1;
илиi = k + 2; k = k + 1
.i=k+++2
тоже работает, что я бы использовал, потому что+++
выглядит странно: PJavaScript (ES6) 92
@Upvoters: взгляните на другой ответ JS ниже, длиной 76 байт.
Цикл, ищущий пространство спереди или в конце. Если найдено, удалите пробел и выходную строку. Если место не найдено 2 раза, остановитесь.
источник
<'!'
. Чтобы ваш фрагмент по-прежнему работал, вы можете использовать точкиreplace
с пробелами, прежде чем переходить к своей функции.Perl 5, 32 байта
Сохранено 4 байта благодаря @Abigail .
Требуется,
-pl
считается как 2, с использованием-E
.Образец использования
Попробуйте онлайн!
источник
print;s/^ //&&print,s/ $//&&print while/^ | $/
работает с-n
флагом, также-l
не нужноC # (.NET Core) ,
192183182181179178 байт-3 байта благодаря Кевину Круйссену
Попробуйте онлайн!
источник
var e=1;while(n.Trim()!=n)
->for(var e=1;n.Trim()!=n;)
;if(n[0]==' ')
->if(n[0]<33)
<33
возможно , в связи с вновь добавленным правилом OP в: « Можно предположить , что строка будет содержать только символы из ASCII для печати пространства (0x20
в0x7E
). »Java 8,
150146145137 байт-4 байта благодаря изменению @Nevay
(f<1&s.charAt(0)<33)
наf+s.charAt(0)<33
.-1 байт, используя
!s.trim().equals(s)
трюк из ответа C # .NET @someone вместоs.matches(" .*|.* ")
.-8 байтов, благодаря @Nevay снова, изменив
!s.trim().equals(s)
наs!=s.trim()
, потомуString#trim
что вернет « Копию этой строки с удаленным начальным и конечным пробелом, или эту строку, если у нее нет начального или конечного пробела », таким образом, ссылка остается прежней и!=
может использоваться для проверки, являются ли они одинаковыми ссылками, вместо того,.equals
чтобы проверять одно и то же значение.Объяснение:
Попробуйте это здесь (или попробуйте более визуальную версию здесь с
#
пробелами).источник
s=f+s.charAt(0)<33
вместо(f<1&s.charAt(0)<33)
(-4 байта).s!=s.trim()
вместо!s.trim().equals(s);
(-8 байт).C
9190 байтПопробуйте онлайн!
источник
Желе , 16 байт
Попробуйте онлайн!
-2 байта благодаря Эрику Аутгольферу
-1 байт благодаря милям
объяснение
источник
ḣ1Ḣ=⁶
->=⁶Ḣ
ƭ
нужен только nilad, если цепь длиннее двух.¹Ṛƭ
отлично работает здесь.Рубин , 63 байта
Попробуйте онлайн!
источник
Java (OpenJDK 8) ,
161 147146 байтПопробуйте онлайн!
-1 байт благодаря @Kevin Cruijssen !
источник
(u=32-x.charAt(l)>>-1)
(u=32-x.charAt(l)>>k)
k
это0
каждая вторая итерация.u
. Это не когда я изменить-1
вk
течениеv
. Я смущен, почему это работает, такk
как действительно станет0
послеk=~k
..: Sk=0
сценария: Если слева осталось пробелов, тоu
имеет то же значение, что и before (0
); если слева не осталось пробелов, то(k=~k)&~v|u
вычисляется как-1|u
(~0&-1|u
), поэтому неопределенное (отрицательное) значениеu
не имеет значения (-1|x==-1
).05AB1E ,
2517 байт-8 байт, заимствуя идею « не нужно проверять конец» у Emigna
Попробуйте онлайн!
Я уверен, что менее простой подход может легко победить это решение. Сейчас...
Пояснения:
источник
S
вместо#
(-1 байт). Цикл ... ну ... он сохраняет колоссальный 1 байт по сравнению с простым подходом. В настоящее время я ищу более короткий способ определения конца задачи (5 байтов для этого много), и я также рассматриваю другой подход в целом. Я думаю, что есть более умный способ решить эту проблему.R ,
145133111 байт-12 байт благодаря @Giuseppe, сохраняя результат
sub
в новой переменной и проверяя, изменился ли он-22 байта, возвращая вектор строк, а не строку с символами новой строки
Попробуйте онлайн!
Пояснение к частично негольфированной версии:
источник
C(s<-sub(),\n)
вместо отдельного оператора печати? Ах, нет, из-заsep=" "
sep=""
. В большинстве задач дополнительное место в конце не имеет значения, но здесь, к сожалению, это имеет значение!sub
только что подсказало, IDK, почемуL=s
и вернуть вектор строк?Java (OpenJDK 8) ,
137125121120124 байтовПопробуйте онлайн!
источник
s->{for(int i=0;s!=s.trim();)System.out.println(s=s.substring(s.charAt(0)<33?1-i%2:0,s.length()-(s.endsWith(" ")?i++%2:0)));}
s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}
(124 байта) (кажется, правильно, но не проверял много).MATL ,
2116 байтЭто использует точки вместо пробелов для большей ясности. Для пробелов заменить
46
на32
.Попробуйте онлайн!
объяснение
источник
Шелуха ,
2322 байтаСпасибо Лео за -1 байт.
Попробуйте онлайн!
объяснение
Функция
`G`I
действительно должна быть встроенной ...источник
?
кажется очевидным задним числом ...C ++,
196193189186183 байта-10 байт благодаря Джонатану Фреху
-3 байт благодаря Захари
Компиляция с MSVC требует деактивации проверок SDL
источник
==32
на<33
.#include<string>
действительно необходимо ?if(...){...;D;}
->if(...)...,D;
.#define R ...<33
,||R){
Иif(R){
->#define R ...<33)
,||R{
иif(R{
.C # (.NET Core) ,
176170 байтПопробуйте онлайн!
Это альтернатива @ чьему-то ответу , и она просто выводит строки напрямую.
источник
JavaScript (ES6), 76 байт
Выводится как многострочная строка.
Тестовые случаи
Использование точек вместо пробелов, как большинство ответов делают.
Показать фрагмент кода
источник
Sed, 24 байта
Попробуйте онлайн!
источник
Октава ,
8883 байта5 байт благодаря Стьюи Гриффину!
Попробуйте онлайн!
источник
min
необходима из-заs
того, что она динамически сокращаетсямашинный код x86 для Linux, 60 байт
Это функция для Linux x86. Он принимает в качестве входного указателя строку в
edi
и длину строки вebp
.Ungolfed, с некоторой инфраструктурой для тестирования (скомпилируйте с FASM, запустите со строкой в качестве аргумента программы; ищите
undress:
метку для реального кода функции):источник
sys_write()
делаетeax
ненулевой (в частности1
, количество написанных символов, при условии, что это не так-errno
), так будет,print
если вы неpop eax
в конце. Вы можете простоxor eax,eax
передcmp byte [edi], ' '
и сохранитьmov al,1
, и, возможно, некоторыеeax
сохранить / восстановить. Хотя на самом деле вы не сохраняете его до тех пор, пока не переспитеSYS_WRITE
. Хм, вместо того0
, чтобы вы могли использоватьSYS_WRITE
против1
, такcmp al, imm8
как тот же размер, что иtest al,al
.'\n'
в массив сmov byte [ecx + edx], '\n'
вместо 2-гоwrite()
? (И уменьшить длину после печати?) Могу ли я сэкономить несколько инструкций.print()
настоящее время уходит'\n'
вeax
, который отличается отSYS_WRITE
, так что вы могли бы еще проверить это. Я думал, что вы сохраняете / восстанавливаетеeax
, но это было просто сохранение байтов, копирующих константу. Для длинных строкsys_write()
можно оставить старшие байты eax ненулевыми, так что, к сожалению, исключается только использованиеmov al, SYS_WRITE
.mov al, 1
было посторонним. -2 байта сейчас, спасибо.PHP , 117 байт
Я добавляю дополнительный пробел в начале, чтобы он вынул пробел и показал оригинал без какого-либо дополнительного кода.
Что-то новенькое ... добавит ли <? Php и пробел в начале файла PHP 6 дополнительных байтов или я получу это бесплатно?
Попробуйте онлайн!
источник
php -r "echo 1;"
Но если вы хотите использовать что-то подобное,<?=1;
вы должны включить тег в число байтов.Pyth , 28 байт
Попробуй это здесь! или проверьте все контрольные примеры!
объяснение
источник
Python 2 , 79 байт
-1 байт благодаря @JonathanFrech
Попробуйте онлайн!
Тестовый костюм заменяется
"."
на" "
перед вызовом функции и заменяется" "
обратно на"."
перед печатью результатов для ясности.источник
'!'*i and
->i*'!'and
.C # - еще раз, 125 байтов
Ура!
Попробуйте онлайн!
источник
Октава , 89 байт
Попробуйте онлайн!
Я добавлю объяснение позже, когда у меня будет время. Я мог бы сыграть в гольф несколько байтов, если полностью изменил подход, но, к сожалению, не понимаю, как.
Последние буквы здесь означают: «sendsendendend». Я хотел бы, чтобы был способ хранить
end
в качестве переменной и использовать это, но угадайте, что ...источник
s = ...
? (Обычный вопрос, я знаю)Баш,
9894 байтаСохранено 4 байта с использованием подоболочки вместо последовательностей (низкая производительность)
Первый ответ
Обратите внимание, что
!
должен быть экранирован в интерактивном режимеисточник