끈을 벗다


48

우리는 이미 공간에서 문자열을 제거하는 방법을 이미 알고 있습니다.

그러나 적절한 신사 / 여성으로서 옷을 벗어야 합니다.


끈을 벗기는 것은 그것을 벗기는 것과 동일하며 더 섬세합니다. 모든 선행 및 후행 공백을 한 번에 제거하는 대신 하나씩 제거합니다 . 또한 계단을 태우지 않도록 선행과 후행을 번갈아 가며 나타냅니다.

예 (시작 " codegolf "과 후행 공백 5 개) :

     codegolf     
    codegolf     
    codegolf    
   codegolf    
   codegolf   
  codegolf   
  codegolf  
 codegolf  
 codegolf 
codegolf 
codegolf

  1. 먼저 문자열을 변경하지 않고 출력하십시오. 그런 다음 모든 단계를 출력하십시오. 선행 공백 을 제거하여 시작 합니다 (해당되는 경우-규칙 # 2 참조).

  2. 입력에 다른 수의 선행 및 후행 공백이있을 수 있습니다. 한쪽에 공간이 부족하면 끈이 벗겨 질 때까지 다른 쪽을 벗으십시오.

  3. 입력에 선행 또는 후행 공백이 없을 수 있습니다. 이 경우 그대로 출력하십시오.

  4. PPCG의 기본 I / O 방법을 사용하십시오 . PPCG 기본 허점 은 금지되어 있습니다.

  5. 빈 입력 또는 공백 만 포함 된 입력에서 정의되지 않은 동작은 정상입니다.

  6. 문자열에 ASCII 인쇄 가능 공간 ( 0x20~ 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

신사 / 부인은 간결하므로 바이트 단위의 최단 답변이 이깁니다 .



공백이 아닌 문자가 하나 이상 있다고 가정 할 수 있습니까?
Martin Ender

2
@KevinCruijssen 인쇄 가능한 공간 ( 0x20~ 0x7E) 에서 ASCII 문자 만 처리 하면 됩니다. 다른 것은 정의되지 않은 행동입니다.
Nathan.Eilisha Shiraini

1
@KevinCruijssen 예, 이와 같은 테스트 사례는 없습니다. 같은 아무 일이 없을 것입니다 " test\r "또는 " \v test"중.
Nathan.Eilisha Shiraini

1
이것은 유효한 테스트 사례 ".....................a....."입니까? 그렇다면 일부 답변이 이러한 종류의 테스트에 실패한 것으로 보이므로 추가하는 것이 좋습니다. (점은 물론 가독성을 높이기위한 것입니다)
Cinaski

답변:


11

레티 나 , 26 바이트

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

온라인으로 사용해보십시오! 테스트 스위트는 명확성을 위해 마침표를 사용합니다. 바닥 글과 머리글은주기를 주 코드의 공백으로 변환합니다.

설명

선행 및 후행 공백을 삭제하고 매번 중간 결과를 인쇄하는 것만 번갈아 가면 좋을 것입니다. 문제는 현재 Retina가 조건부로 인쇄 할 수 없기 때문에 선행 또는 후행 공백이없는 경우이 중간 결과를 인쇄하여 복제본을 생성한다는 것입니다. (Retina 1.0은 조작으로 문자열이 변경된 경우에만 결과를 인쇄하는 옵션을 얻지 만 아직 거기에 없습니다 ...)

대신 모든 중간 결과를 포함하는 단일 문자열을 작성하고 마지막에 인쇄합니다.

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

{문자열 변화 멈출 때까지 반복하는 루프 랩 프로그램의 두 단계는 (여기서 좌측에는 후행 공백 / 선도가 의미). 스테이지 자체는 문자열의 마지막 행에서 선행 공간과 해당 마지막 행을 일치시킨 다음 일치 항목과 새 행의 공백 뒤의 내용을 다시 기록합니다 (따라서 사본에서 선행 공백을 삭제함).

 $
 ¶$%`

후행 공백을 제거하는 것이 조금 더 쉽습니다. 마지막 공간과 일치 $%`하면 접두사 대체의 라인 인식 변형 인 동일한 줄의 앞에있는 항목에 액세스 할 수 있습니다 $`.


11

파이썬 (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

온라인으로 사용해보십시오!


파이썬 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()함수 대신 사용하면 바이트 수가 줄어 듭니다.
Jonathan Frech

로 다스 려 5. Undefined behaviour on empty input, or input that only contains spaces, is OK., 98 바이트 .
Jonathan Frech


@JonathanFrech 나는 그것을 보지 못했다; thanks :)
TFeld

2
a내장 함수 id로 대체하여 Python 2 코드를 더 골프화 하여 시작할 때 정의하지 않아도됩니다. -2 바이트
LyricLy

7

펄 6 , 55 바이트

@nwellnhof 덕분에 3 바이트를 절약했습니다.

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

온라인으로 사용해보십시오!

설명 : ($_,{$++%2??S/" "$//!!S/^" "//}...*)원래 문자열 ( $_)로 시작하는 재귀 무한 시퀀스 이며 다음 요소는 이전 요소에서 호출 된 블록에 의해 제공됩니다.

블록 자체는 $_변수 의 문자열을 가져옵니다 . 연산자 S/(regex)/(string)/(regex)in 의 첫 번째 항목을 검색하여로 $_바꾸고 (string)결과를 반환합니다. 일치하는 것이 없으면 $_변경되지 않은 내용을 반환합니다 . 삼항 연산자 ?? !!와 조건 $++%2사이에 삼항 연산자 를 사용합니다 . 이는 Falseand True( $블록에 대한 호출에서 내용을 보존하는 자유 변수입니다.)

최악의 경우 (한 쪽의 모든 공백과 1 개의 다른 문자), 2 단계마다 1 개의 공백을 제거합니다. 따라서 2 * (문자열 길이) 단계에서 모든 공백이 제거되었음을 확인할 수 있습니다. 우리는 재귀 순서에서 많은 요소를 가져 와서 [^.comb*2](공백을 제거해야하지만 거기에 없을 때마다 발생하는) 복제본을 버립니다 .unique. 공백이 점진적으로 제거 된 문자열 목록을 반환합니다.


[^.comb*2]2 바이트를 절약합니다. 어떤 이유로 이것은 작동하지만 작동 [^2*.comb]하지 않습니다. 왜 그런지 모르겠다. 삼항식 ?? !!을 사용 하여 정규식을 선택하면 다른 바이트가 절약됩니다.
nwellnhof

감사! 시도했지만 [^2*.comb]작동하지 않았으므로 방금 사용했습니다 [0..2*.comb]. 그리고 삼항에 대한 감사로, 나는 그것이 너무 비싸다고 생각했고 그것을 더 비싼 것으로 교체 한 것은 나에게 일어나지 않았다 ...
Ramillies

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

Dang, 나는 비슷한 것을 시도했지만 어떤 이유로 head / tail이 문자열에서 작동하지 않는다고 확신하고 github에서 그것에 대해 문제를 제기하려고했습니다. 디버그 로그를 잘못 읽었어야합니다. :-)
scottinet

1
@scottinet : 방금 최종 점검을하는 방법을 찾았습니다. :)
Emigna

오 ... 왜 우리는 전에 그것에 대해 생각하지 않았습니까? 조건부로 인쇄하면 정확한 횟수만큼 반복 할 필요가 없으므로 충분한 시간 동안 반복하면됩니다. 나는 내 대답을 개선하기 위해 그 아이디어를 빌려왔다 :-)
scottinet

1
@scottinet : 예. 당신이 그것에 대해 생각할 때 분명하지만, 때로는 그러한 것들을 놓치기 쉽습니다 : P
Emigna

TFW
엉뚱한

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 바이트

@Jonathan Frech 덕분에 공백을 사용하여 2 바이트를 절약하고 ~

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공간이 가장 작은 인쇄 가능한 문자 그대로 당신은 만 처리해야합니다.
Jonathan Frech

무엇을 ++k+합니까?
Jonathan Frech

@JonathanFrech 미리 증분 k하고 k = k + 1; i = k + 1;또는에 해당하는 것을 추가합니다 i = k + 2; k = k + 1.
HyperNeutrino

기술적으로 i=k+++2+++이상하게 보이기 때문에 내가 사용했을 것입니다 : P
HyperNeutrino

@HyperNeutrino 그래, 사전 증분 연산자가하는 일을 알고있다. 어떻게하지 않습니다하지만 코드가없이 작동합니다 . 그래서 저는 그것이 어떻게 정의되어 있는지가 아니라 어떤 역할을하는지 묻고있었습니다.
Jonathan Frech

6

자바 스크립트 (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함수에 전달하기 전에 공백 이있는 기간 을 사용할 수 있습니다 .
저스틴 마리너

OP가 ''보다 적은 문자를 기대하지 않기 때문에 @JustinMariner는 이제 ok입니다. 감사합니다
edc65

6

펄 5, 32 바이트

@Abigail 로 인해 4 바이트가 저장 되었습니다 .

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필요하지 않습니다
Nahuel Fouilleul

@nwellnhof가 수정되었습니다.
primo September

5

C 번호 (.NET 코어) , 192 (183) 182 181 179 178 바이트

Kevin Cruijssen 덕분에 -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)
Kevin Cruijssen

두 번째에 대해 생각했지만 테스트 문자열에 줄 바꿈이 있으면 어떻게됩니까?
누군가

좋아, <33인해 영업 이익의 새로 추가 된 규칙에 가능하다 : " 당신은 문자열 만합니다 (ASCII 인쇄 가능한 공간에서 문자를 포함 할 것이라고 가정 할 수 있습니다 0x200x7E). "
케빈 Cruijssen

5

자바 (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. 대신 @someone 의 C # .NET 답변의 트릭을
사용하여 -1 바이트 . -8 바이트 덕분에 @Nevay 변경하여 다시 에 있기 때문에, "반환 선도 공백이 제거 뒤에, 또는이 문자열의 사본 이 더 선행 또는 후행 공백이없는 경우이 문자열 "따라서 기준이 동일하게 유지하고 동일한 값을 확인하는 대신 동일한 참조인지 확인하는 데 사용할 수 있습니다 .!s.trim().equals(s)s.matches(" .*|.* ")
!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
(-4 바이트) s=f+s.charAt(0)<33대신 사용할 수 있습니다 (f<1&s.charAt(0)<33).
Nevay

1
(-8 바이트) s!=s.trim()대신 사용할 수 있습니다 !s.trim().equals(s);.
Nevay


4

젤리 , 16 바이트

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

온라인으로 사용해보십시오!

Outgolfer Erik 덕분에 -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 Erik

@EriktheOutgolfer 감사합니다. 수정 예정입니다.
HyperNeutrino

역 / 동일성의 교대 명령으로 멋진 아이디어!
Emigna

@Emigna 감사합니다! : DI는 대부분 새로운 퀵을 사용하는 변명을 원했다 ... heh : P
HyperNeutrino

ƭ체인이 2보다 긴 경우에만 nilad가 필요합니다. ¹Ṛƭ여기서 잘 작동합니다.
마일


3

자바 (오픈 JDK 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;}

온라인으로 사용해보십시오!

@Kevin Cruijssen 덕분에 -1 바이트 !

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
Hehe, 나는 당신의 삭제 된 답변을 보았고 당신이 내 150 바이트 아래에 있었을 때 궁금해하고 있었고 삭제를 취소 할 것입니다. ;)
Kevin Cruijssen

1
나는 완전히 모르겠지만, 변경하여 골프 바이트를 할 수있는 생각 (u=32-x.charAt(l)>>-1)(u=32-x.charAt(l)>>k)
케빈 Cruijssen

@KevinCruijssen가 작동하지 않습니다, k이다 0초마다 반복.
Nevay

1
예, 그러나 이상한 부분은 TIO가 작동하고에 대한 변경으로 모든 테스트 사례에 대해 올바른 결과를 제공한다는 것입니다 u. 그것은 또한 변경되지 않는 경우 -1k대한 v. 이후는,하지만 작동 내가 왜 혼란 스러워요 k참으로 될 것입니다 0k=~k.. : S
케빈 Cruijssen

1
@KevinCruijssen k=0시나리오 : 왼쪽에 공백이 있으면 u이전과 같은 값 을 갖습니다 ( 0); left에 공백이 없으면 ( ) 로 (k=~k)&~v|u평가 되므로 정의되지 않은 (음수) 값은 중요하지 않습니다 ( ). -1|u~0&-1|uu-1|x==-1
Nevay

3

05AB1E , 25 17 바이트

Emigna에서 필요없는 엔드 체크 아이디어를 빌려서 -8 바이트

,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

나는 루프에 대한 당신의 접근 방식을 좋아한다 :) 나는 여러 번의 if없이 한 번에 모든 것을 수행하는 방법을 알아 내려고 노력했지만 아직 이해하지 못했다. 또한 설명에는 공백 대신 빈 문자열이있는 것 같습니다.
Emigna

감사! 설명을 수정했습니다. 코드를 골프로 칠할 때 (-1 바이트) S대신 "비어 있음"부분을 편집하는 것을 잊었습니다 #. 루프 ... 글쎄 ... 그것은 간단한 접근 방식에 비해 무려 1 바이트를 절약합니다. 나는 현재 작업의 끝을 감지하는 더 짧은 방법을 찾고 있습니다 (5 바이트는 많음). 또한 다른 접근법을 고려하고 있습니다. 이 문제를 해결하는 더 영리한 방법이 있다고 생각합니다.
scottinet

한 번에 모든 작업을 시도하고 수행하면 (현재보고있는 것처럼) 루프를 종료하기위한 최선의 점검은 8 바이트입니다.
Emigna

3

R , 145 (133) 111 바이트

@Giuseppe 덕분에 -12 바이트 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

@Giuseppe 네, 추가해야하기 때문에 단일 명령문에 모두 포함시키는 것이 약간 더 오래 걸린다고 생각합니다 sep="". 대부분의 도전에서 여분의 후행 공간은 중요하지 않지만 불행히도 여기서는 그렇지 않습니다!
user2390246

133 바이트 -사용에 관한 것이 sub방금 제안한 것, IDK 이유
Giuseppe

@ 주세페 매우 우아합니다!
user2390246

L=s문자열 벡터를 설정 하고 반환 할 수 있습니까?
주세페

3

자바 (오픈 JDK 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 바이트 정도로 짧지 만 여전히 12 바이트로 골프를 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)));}

이것은 현재 "... 문자열을 변경하지 않고 출력"하지 않으며 선행 공백과 후행 공백이없는 입력에 실패합니다.
Nevay

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 바이트)를 사용할 수 있습니다 (정확한 것으로 보이지만 많이 테스트하지는 않았습니다).
Nevay

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 바이트의 Leo에게 감사합니다.

온라인으로 사용해보십시오!

설명

이 기능 `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.

좋은! 실제로 우리는 주기적으로 함수를 적용하기 위해 더 많은 내장이 필요하다 ... btw 나는 첫 번째 공간을 제거하는 상당히 짧은 방법을 발견했다 : tio.run/##yygtzv7/v/…
Leo

@ 레오 감사합니다! ?가늠자에서 명백하게 사용하는 것…
Zgarb

3

C ++, 196 193 189 186 183 바이트

Jonathan Frech 덕분에 -10 바이트,
Zacharý 덕분에 -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.
Jonathan Frech

C ++ 마스터는 아니지만 #include<string> 실제로 필요 합니까?
Jonathan Frech

if(...){...;D;}-> if(...)...,D;.
Jonathan Frech

@JonathanFrech 당신이 한 일은 표준에 의해 보장되지 않고 컴파일러에 따라 다릅니다. VC ++은 문자열을 명시 적으로 포함하지 않으면 << 연산자의 정의를 찾을 수 없습니다.
HatsuPointerKun

#define R ...<33, ||R){if(R){-> #define R ...<33), ||R{if(R{.
Jonathan Frech

2

C # (. NET 코어) , 176170 바이트

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

온라인으로 사용해보십시오!

이것은 @ someone 's answer의 대안 이며 문자열을 직접 출력합니다.


공백을 제거하기 전에 프로그램은 수정되지 않은 문자열을 출력하지 않습니다.
Nathan.Eilisha Shiraini

@ Nathan.EilishaShiraini 나는 그 실수를 수정하고 바이트 수를 줄이기 위해 몇 바이트를 골랐다.
BgrWorker

2

자바 스크립트 (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 바이트

Stewie Griffin 덕분에 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
Stewie Griffin

@StewieGriffin 나는 당신의 대답에서 의미했습니다 ... :-D 좋은 생각, 감사합니다!
Luis Mendo

난 내 것을 삭제할 수도 있습니다 ... 이것에 비해 너무 영감이되지 않습니다 ...
Stewie Griffin

@StewieGriffin 다음은 2 바이트제거 하는 아이디어 입니다. 역동적으로 mins
줄어듦

2

Linux 용 x86 기계 코드, 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.

테스트 할 인프라가있는 언 골프 드 (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()eax0이 아닌 (특히 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.
Peter Cordes

2nd 대신에 '\n'배열에 넣을 수 있습니까 ? (인쇄 후 길이를 줄이겠습니까?) 몇 가지 지침을 저장할 수 있습니다. mov byte [ecx + edx], '\n'write()
Peter Cordes

실제로 print()현재 '\n'eax(과) 다른 상태로 SYS_WRITE남아 있으므로 계속 확인할 수 있습니다. 나는 당신이 저장 / 복원하는 줄 eax알았지 만 상수를 복사하는 바이트를 저장하는 것입니다. 긴 문자열의 sys_write()경우 높은 바이트의 eax를 0이 아닌 상태로 둘 수 있으므로 불행히도을 사용하여 제외 mov al, SYS_WRITE됩니다.
Peter Cordes

@PeterCordes는 실제로 그렇습니다 mov al, 1. -2 바이트입니다. 감사합니다.
Ruslan

레지스터 호출 규칙은로드 명령을 저장합니다. 코드 골프에서, 사용자 지정 호출 규칙은 일반적으로 asm에게 공정한 게임입니다. OTOH, 표준 스택 인수 호출 규칙을 사용하고 싶다면 흥미 롭습니다.
Peter Cordes

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 바이트를 줄일 수 있습니다. 온라인으로 사용해보십시오!
밤 2

1
다음과 같은 명령 php -r "echo 1;"을 사용 하여 PHP의 여는 태그를 생략 할 수 있습니다. 그러나 이와 같은 명령 을 사용하려면 <?=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

옥타브 , 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 = ...합니까? (보통의 질문입니다)
Luis Mendo

당신이 할 수 있다면 어쨌든, 참조 바이트의 몇 제거 - P
루이스 Mendo

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% }";};}

는 참고 !대화 형 모드로 이스케이프해야합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.