Раздень строку


48

Мы уже сейчас, как убрать строку из ее пробелов.

Однако, как настоящие джентльмены / леди, мы должны скорее раздеться .


Раздевание строки - это то же самое, что раздевание, только более деликатное. Вместо того, чтобы удалять все начальные и конечные пробелы одновременно, мы удаляем их по одному . Мы также чередуем ведущий и трейлинг, чтобы не сжигать шаги.

Пример, начиная с " codegolf "(пять начальных и конечных пробелов):

     codegolf     
    codegolf     
    codegolf    
   codegolf    
   codegolf   
  codegolf   
  codegolf  
 codegolf  
 codegolf 
codegolf 
codegolf

  1. Сначала выведите строку без изменений. Затем выведите каждый шаг. Начните с удаления начального пробела (если применимо - см. Правило № 2).

  2. Входные данные могут иметь различное количество начальных и конечных пробелов. Если у вас закончились пробелы на одной стороне, продолжайте раздевать другую, пока строка не станет голой.

  3. Вход может не иметь ни начальных, ни конечных пробелов. Если это так, выведите его как есть.

  4. Используйте стандартные методы ввода / вывода PPCG . PPCG По умолчанию лазейки запрещены.

  5. Неопределенное поведение на пустом вводе или вводе, который содержит только пробелы, в порядке.

  6. Вы можете предположить, что строка будет содержать только символы из печатного пространства ASCII ( 0x20to 0x7E).


Примеры - пробелы заменены точками .для лучшей читаемости:

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

Джентльмен / леди лаконичны, поэтому выигрывает самый короткий ответ в байтах .



Можем ли мы предположить, что будет хотя бы один непробельный символ?
Мартин Эндер

2
@KevinCruijssen Вы должны обрабатывать только символы ASCII в области печати ( 0x20до 0x7E). Другие являются неопределенным поведением.
Натан. Элиша Ширайни

1
@KevinCruijssen Да, такого теста не будет. Там не будет никаких вещей, как " test\r "или " \v test"либо.
Натан. Элиша Ширайни

1
Это правильный тестовый пример ".....................a....."? Если так, я предлагаю добавить это, так как некоторые ответы, кажется, не проходят этот вид теста. (точки для лучшей читаемости, конечно)
Cinaski

Ответы:


11

Сетчатка , 26 байт

{m`^ (.+)\z
$&¶$1
 $
 ¶$%`

Попробуйте онлайн! (Набор тестов для ясности использует точки. Нижний колонтитул и верхний колонтитул преобразуют их в пробел и из основного кода.)

объяснение

Было бы хорошо, если бы мы могли просто чередовать отбрасывание начального и конечного пробелов и выводить промежуточный результат каждый раз. Проблема в том, что в настоящее время Retina не может печатать условно, поэтому она даже напечатает этот промежуточный результат, если не осталось начальных или конечных пробелов, генерируя дубликаты. (Retina 1.0 получит опцию, которая печатает результат, только если строка была изменена операцией, но мы еще не там ...)

Вместо этого мы создаем одну строку, содержащую все промежуточные результаты, и печатаем ее в конце.

{m`^ (.+)\z
$&¶$1

{Оборачивает оба этапа программы в цикле , который повторяется до строки перестает изменяться (что означает , что нет ни ведущие / конечные пробелы влево). Сама сцена соответствует начальному пробелу в последней строке строки и этой последней строке, а затем записывает совпадение, а также материал после пробела в новой строке (тем самым удаляя начальный пробел в копии).

 $
 ¶$%`

Удаление пробела немного проще. Если мы просто сопоставим последний пробел, мы сможем получить доступ к материалу перед ним (на той же строке), с помощью $%`которого является линейно-зависимый вариант замены префикса $`.


11

Python 2 , 122 107 103 102 98 95 93 91 90 88 87 байт

s=input()+' '
a=0
while-a*s!=id:
 if a:id=s
 a=~a
 if'!'>s[a]:s=s[1+a:len(s)+a];print s

Попробуйте онлайн!


Python 3 , 97 95 93 90 байт

s=input()
a=p=print
p(s)
while s!=a:
 a=s
 if'!'>s:s=s[1:];p(s)
 if'!'>s[-1]:s=s[:-1];p(s)

Попробуйте онлайн!


Использование s=input()вместо функции заняло бы меньше байтов.
Джонатан Фрех

Ссылаясь на 5. Undefined behaviour on empty input, or input that only contains spaces, is OK., 98 байт .
Джонатан Фрех


@JonathanFrech Я этого не видел; спасибо :)
TFeld

2
Вы можете дополнительно поиграть в код Python 2, заменив aего встроенной функцией, idчтобы избавиться от необходимости определять его в начале. -2 байта.
LyricLy

7

Perl 6 , 55 байт

Сохранено 3 байта благодаря @nwellnhof.

{($_,{$++%2??S/" "$//!!S/^" "//}...*)[^.comb*2].unique}

Попробуйте онлайн!

Объяснение : ($_,{$++%2??S/" "$//!!S/^" "//}...*)рекурсивная бесконечная последовательность, которая начинается с исходной строки ( $_), а следующий элемент задается блоком, вызываемым в предыдущем элементе.

Сам блок получает строку в $_переменной. Оператор S/(regex)/(string)/выполнит поиск первого вхождения (regex)in $_, заменит его на (string)и вернет результат. Если совпадений нет, возвращается содержимое $_без изменений. Мы используем троичный оператор ?? !!с условием $++%2, которое чередуется между Falseи True( $это свободная переменная, которая сохраняет свое содержимое при обращении к блоку.)

В худшем случае (все пробелы на одной стороне и 1 другой символ) мы удаляем 1 пробел каждые 2 шага. Таким образом, мы можем быть уверены, что за 2 * (длина строки) шага все пробелы будут удалены. Мы берем столько элементов из рекурсивной последовательности [^.comb*2]и, наконец, отбрасываем дубликаты (которые появляются всякий раз, когда пробел должен быть удален, но его там нет) .unique. Это возвращает список строк, постепенно очищаемых от пробелов.


[^.comb*2]экономит 2 байта. По какой-то причине это работает, но [^2*.comb]не работает. Понятия не имею почему. Использование троичного ?? !!для выбора регулярного выражения сохраняет еще один байт.
nwellnhof

Спасибо! Я пытался, [^2*.comb]и это не сработало, поэтому я просто использовал [0..2*.comb]. И спасибо за тройным, я просто подумал , что это слишком дорого , и это не приходила мне в голову , что я заменил его с чем - то еще более дорогой ...
Рамильи

7

05AB1E , 21 15 байт

=v¬ðQi¦=}¤ðQi¨=

Попробуйте онлайн!

Объяснение ^

=                 # print input
 v                # for each character in input
  ¬ðQi  }         # if the first char in the current string is a space
      ¦=          # remove it and print without popping
         ¤ðQi     # if the last char in the current string is a space
             ¨=   # remove it and print without popping

Черт, я попробовал нечто подобное, но по какой-то причине я был уверен, что голова / хвост не работает на струнах, и я собирался поднять проблему об этом на github. Должно быть, неправильно прочитали журналы отладки. :-)
Скоттнет

1
@scottinet: я только что нашел способ обойти контрольную проверку :)
Emigna

о ... почему мы не думали об этом раньше? так как мы печатаем условно, нет необходимости циклически повторять правильное количество раз, нам нужно только циклически повторяться достаточно много раз. Я заимствую эту идею, чтобы улучшить свой ответ :-)
scottinet

1
@scottinet: Да. Это очевидно, когда вы думаете об этом, но иногда легко пропустить эти вещи: P
Emigna

TFW неуклюжий избыточный ответ получает преимущество ...
Эрик Outgolfer

7

C (gcc) , 89 84 байта

Рекурсивная версия короче ;-)

j;f(char*s){puts(s);*s^32||puts(++s);s[j=strlen(s)-1]<33?s[j]=0,f(s):*s^32||f(s+1);}

Попробуйте онлайн!

C (gcc) , 107 102 101 100 99 байтов

Сохранено 2 байта благодаря @Jonathan Frech с использованием пробелов и ~

i,j,k;f(char*s){for(i=~++k,puts(s);i^k;k=s[j=strlen(s)-1]<33?s[j]=0,puts(s):0)*s^32?i=0:puts(++s);}

Попробуйте онлайн!


2
Я думаю, что вопрос действительно хочет, чтобы вы убрали пробелы, а не точки. Есть даже преимущество в использовании пробелов; Вы можете заменить ==46на, так <33как пробел - самый маленький печатный символ, и вам нужно только обработать их.
Джонатан Фрех

Что делает ++k+?
Джонатан Фрех

@JonathanFrech Предварительно увеличивает kи добавляет единицу, что эквивалентно k = k + 1; i = k + 1;или i = k + 2; k = k + 1.
HyperNeutrino

Технически i=k+++2тоже работает, что я бы использовал, потому что +++выглядит странно: P
HyperNeutrino

@HyperNeutrino Да, я знаю, что делает оператор предварительного увеличения; хотя я не понимаю, как работает код без него . Поэтому на самом деле я спрашивал, какую роль он играет, а не как это определяется.
Джонатан Фрех

6

JavaScript (ES6) 92

@Upvoters: взгляните на другой ответ JS ниже, длиной 76 байт.

(s,q,l=2,p=0)=>{for(alert(s);l--;p=!p)s[+p&&s.length-p]<'!'&&alert(s=s.slice(!p,-p||q,l=2))}

Цикл, ищущий пространство спереди или в конце. Если найдено, удалите пробел и выходную строку. Если место не найдено 2 раза, остановитесь.

F=
(s,q,l=2,p=0)=>{for(alert(s);l--;p=!p)s[+p&&s.length-p]<'!'&&alert(s=s.slice(!p,-p||q,l=2))}

// some trick to show dots instead of spaces, for test
alert=x=>console.log(x
  .replace(/^ +/g,z=>'.'.repeat(z.length))
  .replace(/ +$/g,z=>'.'.repeat(z.length))
)

function go() {F(I.value.replace(/\./g,' '))}

go()
<input ID=I value='....yes Sir!....'> (use dot instead of space)
<button onclick='go()'>Go</button>


Вы можете сохранить байт, проверив место с помощью <'!'. Чтобы ваш фрагмент по-прежнему работал, вы можете использовать точки replaceс пробелами, прежде чем переходить к своей функции.
Джастин Маринер

@JustinMariner теперь хорошо, потому что OP заявил, что нет ожидаемого символа меньше, чем ''. Спасибо
edc65

6

Perl 5, 32 байта

Сохранено 4 байта благодаря @Abigail .

1while s/^ /!say/e+s/ $/!say/e

Требуется, -plсчитается как 2, с использованием -E.

Образец использования

$ echo '   test   ' | perl -plE'1while s/^ /!say/e+s/ $/!say/e'
   test   
  test   
  test  
 test  
 test 
test 
test

Попробуйте онлайн!


Не работает правильно для строк без конечных пробелов.
nwellnhof

print;s/^ //&&print,s/ $//&&print while/^ | $/работает с -nфлагом, также -lне нужно
Науэль Фуйе

@nwellnhof исправлено.
прима

5

C # (.NET Core) , 192 183 182 181 179 178 байт

-3 байта благодаря Кевину Круйссену

n=>{var o=n+"\n";for(var e=1;n.Trim()!=n;){if(1>(e^=1))if(n[0]<33)n=n.Remove(0,1);else continue;else if(n.TrimEnd()!=n)n=n.Remove(n.Length-1);else continue;o+=n+"\n";};return o;}

Попробуйте онлайн!


Некоторые вещи для гольфа: 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). »
Кевин Cruijssen

5

Java 8, 150 146 145 137 байт

s->{String r=s;for(int f=0;s!=s.trim();f^=1)r+="\n"+(s=f+s.charAt(0)<33|!s.endsWith(" ")?s.substring(1):s.replaceAll(" $",""));return r;}

-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->{                               // Method with String as both parameter and return-type
  String r=s;                      //  Result-String (starting at the input)
  for(int f=0;                     //  Flag-integer (starting at 0)
      s!=s.trim();                 //  Loop as long as `s` contains leading/trailing spaces
      f^=1)                        //    And XOR(1) `f` after every iteration (0->1; 1->0)
    r+="\n"                        //   Append the result with a new-line
       +(                          //    Followed by:
         s=f+                      //     If `f` is 0,
             s.charAt(0)<33        //     and `s` starts with a space
           |!s.endsWith(" ")?      //     Or doesn't end with a space
            s.substring(1)         //      Remove the first leading space
           :                       //     Else:
            s.replaceAll(" $",""));//      Remove the last trailing space
                                   //  End of loop (implicit / single-line body)
  return r;                        //  Return the result-String
}                                  // End of method

1
Вы можете использовать s=f+s.charAt(0)<33вместо (f<1&s.charAt(0)<33)(-4 байта).
Неваи,

1
Вы можете использовать s!=s.trim()вместо !s.trim().equals(s);(-8 байт).
Неваи,


4

Желе , 16 байт

Ḋ=⁶Ḣ$¡UµÐĿ¹Ṛƭ€QY

Попробуйте онлайн!

-2 байта благодаря Эрику Аутгольферу
-1 байт благодаря милям

объяснение

Ḋ=⁶Ḣ$¡UµÐĿ¹Ṛƭ€QY  Main link
       µÐĿ        While the results are unique (collecting intermediate results), apply the last link (`µ` creates a new monadic link):
Ḋ=⁶Ḣ$¡            Remove a space from the beginning if there is one
 =⁶Ḣ$             If the first character is a space, then 1, else 0
 =                Compare each character to
  ⁶               ' '
   Ḣ              Get the first comparison
Ḋ                 Then Dequeue the string (s -> s[1:])
    ¡             That many times
     U            And reverse the string (the next time this is called, it will remove spaces from the end instead)
             €    For each string
            ƭ     Alternate between two commands:
          ¹       Identity (do nothing), and
           Ṛ      Reverse
          ¹Ṛƭ€    Correct all strings that are reversed to remove the trailing space
              Q   Remove duplicates (where there was no space to remove)
               Y  Join on newlines

ḣ1Ḣ=⁶->=⁶Ḣ
Эрик Outgolfer

@EriktheOutgolfer Спасибо, редактируем
HyperNeutrino

Классная идея с чередующимися командами реверса / идентичности!
Emigna

@ Emigna Спасибо! :
D

ƭнужен только nilad, если цепь длиннее двух. ¹Ṛƭотлично работает здесь.
миль


3

Java (OpenJDK 8) , 161 147 146 байт

x->{for(int l=0,r=x.length(),k=-1,u,v;((u=32-x.charAt(l)>>k)*(v=32-x.charAt(r-1)>>-1))<1;x+="\n"+x.substring(l-=k&~u|v,r+=(k=~k)&~v|u));return x;}

Попробуйте онлайн!

-1 байт благодаря @Kevin Cruijssen !

x -> {
    /*
     * l: left index (inclusive)
     * r: right index (exclusive)
     * k: side to remove from, -1:=left, 0:=right
     * u: left character   0:=space, <0:=no space (-1 if k is left side)
     * v: right character  0:=space, -1:=no space
     */
    for (int l = 0, r = x.length(), k = -1, u, v;
            ((u = 32 - x.charAt(l) >> k)
           * (v = 32 - x.charAt(r - 1) >> -1)) < 1; // loop while left or right has space(s)
            x += "\n" + x.substring(                // append newline and substring
                    l -= k & ~u | v,                // inc. left  if k is left side
                                                    //               and left has space
                                                    //            or right has no space
                    r += (k = ~k) & ~v | u));       // dec. right if k is right side
                                                    //               and right has space
                                                    //            or left has no space
    return x;
}

1
Хе-хе, я видел твой удаленный ответ и задавался вопросом, когда ты был меньше моих 150 байтов и мог бы восстановить его. ;)
Кевин Круйссен

1
Я не совсем уверен, но я думаю, что вы можете (u=32-x.charAt(l)>>-1)(u=32-x.charAt(l)>>k)
сыграть

@KevinCruijssen Не будет работать, kэто 0каждая вторая итерация.
Невай

1
Да, но странная часть заключается в том, что TIO работает и дает правильный результат для всех тестовых случаев с этим изменением для u. Это не когда я изменить -1в kтечение v. Я смущен, почему это работает, так kкак действительно станет 0после k=~k..: S
Кевин Круйссен

1
@KevinCruijssen Для k=0сценария: Если слева осталось пробелов, то uимеет то же значение, что и before ( 0); если слева не осталось пробелов, то (k=~k)&~v|uвычисляется как -1|u( ~0&-1|u), поэтому неопределенное (отрицательное) значение uне имеет значения ( -1|x==-1).
Неваи,

3

05AB1E , 25 17 байт

-8 байт, заимствуя идею « не нужно проверять конец» у Emigna

,v2F¬ðQi¦DNiR},}R

Попробуйте онлайн!

Я уверен, что менее простой подход может легко победить это решение. Сейчас...

Пояснения:

,v2F¬ðQi¦DNiR},}R           Full Programm
,                           Print the input string
 v                          For each char of the string
                               (we don't really care, we only need to loop
                                enough times to accomplish our task, since
                                we print conditionally we can loop more
                                times than necessary)
  2F...........}            Two times...
    ¬õQi                       Is 1st item a space?
        ¦D                        Remove 1st item + duplicate
          NiR}                    If on the second pass: reverse the list
              ,                   Pop & print with newline
               }               End If
                 R          Reverse the list

Мне нравится ваш подход с циклом :) Я пытался найти способ сделать все за один проход без нескольких ifs, но я еще не понял этого. Кроме того, ваше объяснение, кажется, содержит пустую строку вместо пробела.
Emigna

Спасибо! Я исправил объяснение, я забыл отредактировать часть «пусто», когда играл в гольф, используя Sвместо #(-1 байт). Цикл ... ну ... он сохраняет колоссальный 1 байт по сравнению с простым подходом. В настоящее время я ищу более короткий способ определения конца задачи (5 байтов для этого много), и я также рассматриваю другой подход в целом. Я думаю, что есть более умный способ решить эту проблему.
Скоттнет

Если вы попытаетесь сделать все за один проход (как я сейчас
изучаю

3

R , 145 133 111 байт

-12 байт благодаря @Giuseppe, сохраняя результат subв новой переменной и проверяя, изменился ли он

-22 байта, возвращая вектор строк, а не строку с символами новой строки

function(s){L=s
while(grepl("^ | $",s)){if((x=sub("^ ","",s))!=s)L=c(L,x)
if((s=sub(" $","",x))!=x)L=c(L,s)}
L}

Попробуйте онлайн!

Пояснение к частично негольфированной версии:

function(s){
  L=s                          # Initialise a vector with the original string
  while(grepl("^ | $",s)){     # While there are leading or trailing spaces...
    if((x=sub("^ ","",s))!=s){ # Check whether we can remove a leading space
      L=c(L,x)                 # If so, add the shortened string to the vector
    }
    if((s=sub(" $","",x))!=x){ # Check whether we can remove a trailing space
      L=c(L,x)                 # If so, add the shortened string to the vector
    }
  }
  L                            # Return the vector
}                              

вы не можете использовать C(s<-sub(),\n)вместо отдельного оператора печати? Ах, нет, из-заsep=" "
Джузеппе

@Giuseppe Да, я думаю, что это работает немного дольше, чтобы включить все это в одно утверждение из-за необходимости добавлять sep="". В большинстве задач дополнительное место в конце не имеет значения, но здесь, к сожалению, это имеет значение!
user2390246

133 байта - кое-что из того, что вы используете, subтолько что подсказало, IDK, почему
Джузеппе

@ Giuseppe Очень элегантно!
user2390246

Не могли бы вы просто установить L=sи вернуть вектор строк?
Джузеппе

3

Java (OpenJDK 8) , 137 125 121 120 124 байтов

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))));}

Попробуйте онлайн!


Хороший ответ! Так же коротко, как мой ответ о 137 байтах, но вы все еще можете 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)));}
Кевин Круйссен

В настоящее время это не «... выводит строку без изменений» и не может быть введено с начальными пробелами и без конечных пробелов.
Неваи,

1
Может быть, вы можете использовать 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 байта) (кажется, правильно, но не проверял много).
Неваи,

3

MATL , 21 16 байт

tnE:"t@o&)w46-?x

Это использует точки вместо пробелов для большей ясности. Для пробелов заменить 46на 32.

Попробуйте онлайн!

объяснение

tn      % Input (implicit). Duplicate and push length, say L
E       % Multiply by 2
:       % Push range [1 2 ... 2*L]
"       % For each k in that array
  t     %   Duplicate the string at the top of the stack
  @     %   Push k
  o     %   Parity: gives 1 or 0
  &)    %   Two-ouput indexing. Pushes the k-th entry of the string and then
        %   the rest of the string. The 1-st output is the first, the 0-th
        %   is the last (indexing is 1-based dand modular)
  w     %   Swap
  46-   %   Subtract 46, which ias ACII for '.'
  ?     %   If non-zero
    x   %     Delete sub-string that was obained by removing that entry
        %   End (implicit)
        % End (implicit)
        % Display stack (implicit)

3

Шелуха , 23 22 байта

u§↑L`G`I¢e₁ȯ↔₁↔
?tI<"!

Спасибо Лео за -1 байт.

Попробуйте онлайн!

объяснение

Функция `G`Iдействительно должна быть встроенной ...

?tI<"!  Helper function: remove initial space.
?  <"!  If less than the string "!",
 t      remove first character,
  I     else return as is.
u§↑L`G`I¢e₁ȯ↔₁↔  Main function.
         e       List containing
          ₁      the helper function
           ȯ↔₁↔  and the composition reverse-helper-reverse.
        ¢        Repeat it cyclically.
    `G`I         Cumulative reduce from left by function application
                 using input string as initial value.
 §↑L             Take first length(input) values.
u                Remove duplicates.

Приятно! На самом деле, нам нужно больше встроенных функций для циклического применения функций ... Кстати, я нашел чуть более короткий способ удаления первого пробела: tio.run/##yygtzv7/v/…
Лев

@ Лео Спасибо! Использование ?кажется очевидным задним числом ...
Zgarb

3

C ++, 196 193 189 186 183 байта

-10 байт благодаря Джонатану Фреху
-3 байт благодаря Захари

#include<iostream>
#include<string>
#define D std::cout<<s<<'\n'
#define R ~-s.size()
auto u=[](auto s){D;while(s[0]<33||s[R]<33){if(s[0]<33)s.erase(0,1),D;if(s[R]<33)s.erase(R),D;}};

Компиляция с MSVC требует деактивации проверок SDL


Вы можете заменить ==32на <33.
Джонатан Фрех

Я не мастер C ++, хотя это #include<string> действительно необходимо ?
Джонатан Фрех

if(...){...;D;}-> if(...)...,D;.
Джонатан Фрех

@JonathanFrech То, что вы сделали, было специфическим для компилятора, не гарантированным стандартом. VC ++ не может найти определение операторов << без явного включения строки.
HatsuPointerKun

#define R ...<33, ||R){И if(R){-> #define R ...<33), ||R{и if(R{.
Джонатан Фрех

2

C # (.NET Core) , 176 170 байт

using System;s=>{Action o=()=>Console.WriteLine(s);o();Func<int>l=()=>s.Length-1;while(s!=s.Trim()){if(s[0]<33){s=s.Remove(0,1);o();}if(s[l()]<33){s=s.Remove(l());o();}}}

Попробуйте онлайн!

Это альтернатива @ чьему-то ответу , и она просто выводит строки напрямую.


Ваша программа не выводит строку без изменений перед удалением пробелов.
Натан. Илиша Ширайни

@ Nathan.EilishaShiraini Я исправил эту ошибку и поиграл несколько байтов, чтобы уменьшить количество байтов.
BgrWorker

2

JavaScript (ES6), 76 байт

f=(s,r,n,l=s.length)=>s[r?--l:0]<"!"?s+`
`+f(s.slice(!r,l),!r):n?s:f(s,!r,1)

Выводится как многострочная строка.

Тестовые случаи

Использование точек вместо пробелов, как большинство ответов делают.



2

Октава , 88 83 байта

5 байт благодаря Стьюи Гриффину!

x=[input('') 0];for p=mod(1:sum(x),2)if x(~p+end*p)<33,disp(x=x(2-p:end-p)),end,end

Попробуйте онлайн!


Очень хорошо. «В любом случае, посмотрите, сможете ли вы удалить пару байтов » :-P
Стьюи Гриффин,

@StewieGriffin Я имел в виду в вашем ответе ... :-D Хорошая идея, спасибо!
Луис Мендо

Я мог бы удалить мой ... Это так скучно по сравнению с этим ...
Стьюи Гриффин

@StewieGriffin Вот идея удалить два байта . Жалость, которая minнеобходима из-за sтого, что она динамически сокращается
Луис Мендо,

2

машинный код x86 для Linux, 60 байт

e8 1f 00 00 00 31 c0 80 3f 20 75 09 47 4d 74 10
e8 0f 00 00 00 80 7c 2f ff 20 74 05 84 c0 75 e5
c3 4d eb dc 6a 04 58 50 31 db 43 89 f9 89 ea cd
80 58 6a 0a 89 e1 89 da cd 80 58 c3

Это функция для Linux x86. Он принимает в качестве входного указателя строку в ediи длину строки в ebp.

Ungolfed, с некоторой инфраструктурой для тестирования (скомпилируйте с FASM, запустите со строкой в ​​качестве аргумента программы; ищите undress:метку для реального кода функции):

format ELF executable
segment executable
SYS_WRITE = 4
    jmp     callUndress
; -------------------- the function itself --------------------------------
; Input:
;   edi=string
;   ebp=length
undress:
undressLoopPrint:
    call    print
undressLoop:
    xor     eax, eax    ; flag of having printed anything on this iteration
    cmp     byte [edi], ' '
    jne     startsWithoutSpace
    inc     edi
    dec     ebp
    jz      quit
    call    print
startsWithoutSpace:
    cmp     byte [edi+ebp-1], ' '
    je      endsWithSpace
    test    al, al      ; if print has been called, then we have 0x0a in eax
    jnz     undressLoop
quit:
    ret
endsWithSpace:
    dec     ebp
    jmp     undressLoopPrint
print:
    push    SYS_WRITE
    pop     eax
    push    eax
    xor     ebx, ebx
    inc     ebx ; STDOUT
    mov     ecx, edi
    mov     edx, ebp
    int     0x80
    pop     eax
    push    0x0a    ; will print newline
    mov     ecx, esp
    mov     edx, ebx ; STDOUT=1, which coincides with the length of newline
    int     0x80
    pop     eax
    ret
; --------------------- end undress ---------------------------------------
SYS_EXIT = 1
STDERR = 2
callUndress:
    pop     eax     ; argc
    cmp     eax, 2
    jne     badArgc
    pop     eax     ; argv[0]
    pop     edi
    mov     al, 0
    cld
    mov     ecx, -1
    repne   scasb
    lea     edi, [edi+ecx+1] ; argv[1]
    neg     ecx
    sub     ecx, 2
    mov     ebp, ecx     ; strlen(argv[1])
    call    undress
    xor     ebx, ebx
exit:
    mov     eax, SYS_EXIT
    int     0x80
    ud2
badArgc:
    mov     esi, eax
    mov     eax, SYS_WRITE
    mov     ebx, STDERR
    mov     ecx, badArgcMsg
    mov     edx, badArgcMsgLen
    int     0x80
    mov     ebx, esi
    neg     ebx
    jmp     exit
badArgcMsg:
    db      "Usage: undress YourString",0x0a,0
badArgcMsgLen = $-badArgcMsg
segment readable writable
string:
    db      100 dup(0)
    stringLen = $-string

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.
Питер Кордес

@PeterCordes на самом деле да, mov al, 1было посторонним. -2 байта сейчас, спасибо.
Руслан

Соглашение о вызовах в регистре спасет вас от загрузки инструкций. В коде-гольфе обычное соглашение о вызовах обычно является честной игрой для asm. OTOH, если вы предпочитаете стандартное соглашение о вызовах в стеке, это тоже интересно.
Питер Кордес

2

PHP , 117 байт

Я добавляю дополнительный пробел в начале, чтобы он вынул пробел и показал оригинал без какого-либо дополнительного кода.

Что-то новенькое ... добавит ли <? Php и пробел в начале файла PHP 6 дополнительных байтов или я получу это бесплатно?

$s=" $argn";while($r!=$s){$r=$s;if($s[0]==" ")echo($s=substr($s,1))."
";if($s[-1]==" ")echo($s=substr($s,0,-1))."
";}

Попробуйте онлайн!


1
Используя ваш метод, можно уменьшить 6 байт: попробуйте онлайн!
Night2

1
Вы можете опустить открывающий тег PHP, так как вы можете запустить его с помощью команды, подобной этой: php -r "echo 1;"Но если вы хотите использовать что-то подобное, <?=1;вы должны включить тег в число байтов.
Night2

1

Pyth , 28 байт

QW<lrKQ6lQ=hZ?&%Z2qdhQ=tQ=PQ

Попробуй это здесь! или проверьте все контрольные примеры!

объяснение

QW<lrKQ6lQ=hZ?&%Z2qdhQ=tQ=PQ   ~ Full program. Q is autoinitialized to input.

Q                              ~ Output the input.
 W<lrKQ6lQ                     ~ Loop while the condition is met.
  <                            ~ Is smaller?
   lrKQ6                       ~ The length of the original input, stripped on both sides.
        lQ                     ~ The length of the current Q.
          =hZ                  ~ Increment a variable Z, initially 0
             ?&%Z2qdhQ         ~ If Z % 2 == 1 and Q[0] == " ", then:
                      =tQ      ~ Make Q equal to Q[1:] and output, else:
                         =PQ   ~ Make Q equal to Q[:-1] and output.

1

Python 2 , 79 байт

-1 байт благодаря @JonathanFrech

f=lambda s,i=1:[s]+(s>i*'!'and'!'>s[-1]and f(s[:-1])or'!'>s and f(s[1:],0)or[])

Попробуйте онлайн!

Тестовый костюм заменяется "."на " "перед вызовом функции и заменяется " "обратно на "."перед печатью результатов для ясности.


'!'*i and-> i*'!'and.
Джонатан Фрех


1

Октава , 89 байт

s=input('');while any(s([1,end])<33)if s(1)<33,s(1)=[],end,if s(end)<33,s(end)=[],end,end

Попробуйте онлайн!

Я добавлю объяснение позже, когда у меня будет время. Я мог бы сыграть в гольф несколько байтов, если полностью изменил подход, но, к сожалению, не понимаю, как.

Последние буквы здесь означают: «sendsendendend». Я хотел бы, чтобы был способ хранить endв качестве переменной и использовать это, но угадайте, что ...


Это действительно для вывода с s = ...? (Обычный вопрос, я знаю)
Луис Мендо

В любом случае, посмотрите, сможете ли вы удалить пару байтов :-P
Луис Мендо

1

Баш, 98 94 байта

Сохранено 4 байта с использованием подоболочки вместо последовательностей (низкая производительность)

r()(s=$1;[[ $s = $b ]]||([[ $s = $a ]]||echo "$s"
b=$a a=$s;((i=!i))&&r "${s# }"||r "${s% }"))

Первый ответ

r(){ s=$1;[[ $s = $b ]]||{ [[ $s = $a ]]||echo "$s"
b=$a a=$s;((i=!i))&&r "${s# }"||r "${s% }";};}

Обратите внимание, что !должен быть экранирован в интерактивном режиме

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.