Cởi quần áo


48

Bây giờ chúng ta đã làm thế nào để tách một chuỗi từ không gian của nó.

Tuy nhiên, là quý ông / quý bà thích hợp, chúng ta nên cởi quần áo ra.


Cởi một chuỗi cũng giống như tước nó, chỉ tinh tế hơn. Thay vì xóa tất cả các không gian hàng đầu và dấu cùng một lúc, chúng tôi xóa từng khoảng một . Chúng tôi cũng xen kẽ giữa dẫn đầu và theo dõi, để không đốt cháy các bước.

Ví dụ, bắt đầu bằng " codegolf "(năm khoảng trắng ở đầu và cuối):

     codegolf     
    codegolf     
    codegolf    
   codegolf    
   codegolf   
  codegolf   
  codegolf  
 codegolf  
 codegolf 
codegolf 
codegolf

  1. Đầu tiên đầu ra chuỗi không thay đổi. Sau đó, đầu ra từng bước. Bắt đầu bằng cách xóa một không gian hàng đầu (nếu có - xem quy tắc số 2).

  2. Đầu vào có thể có một số lượng không gian hàng đầu và dấu khác nhau. Nếu bạn hết chỗ trống ở một bên, hãy tiếp tục cởi quần áo cho đến khi chuỗi trống.

  3. Các đầu vào có thể không có không gian hàng đầu cũng như dấu. Nếu đó là trường hợp, đầu ra nó là như vậy.

  4. Sử dụng các phương pháp I / O mặc định của PPCG . PPCG Mặc định sơ hở bị cấm.

  5. Hành vi không xác định trên đầu vào trống, hoặc đầu vào chỉ chứa khoảng trắng, là OK.

  6. Bạn có thể giả sử rằng chuỗi sẽ chỉ chứa các ký tự từ không gian có thể in ASCII ( 0x20đến 0x7E).


Ví dụ - khoảng trắng được thay thế bằng dấu chấm .để dễ đọc hơn:

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

Một quý ông / quý bà súc tích, vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng .



Chúng ta có thể cho rằng sẽ có ít nhất một nhân vật không phải không gian?
Martin Ender

2
@KevinCruijssen Bạn chỉ phải xử lý các ký tự ASCII trong không gian có thể in ( 0x20đến 0x7E). Những cái khác là Hành vi không xác định.
Nathan.Eilisha Shiraini

1
@KevinCruijssen Vâng, sẽ không có trường hợp thử nghiệm như thế này. Sẽ không có những thứ như " test\r "hoặc " \v test"một trong hai.
Nathan.Eilisha Shiraini

1
Đây có phải là một trường hợp thử nghiệm hợp lệ ".....................a....."? Nếu vậy tôi đề nghị thêm nó vì một số câu trả lời dường như thất bại trong loại thử nghiệm này. (dấu chấm là để dễ đọc hơn tất nhiên)
Cinaski

Câu trả lời:


11

Võng mạc , 26 byte

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

Hãy thử trực tuyến! (Bộ kiểm tra sử dụng dấu chấm cho rõ ràng. Phần chân trang và tiêu đề chuyển đổi chúng sang và từ khoảng trắng cho mã chính.)

Giải trình

Sẽ thật tuyệt nếu chúng ta chỉ có thể xen kẽ giữa việc thả một khoảng trống hàng đầu và dấu cách và in kết quả trung gian mỗi lần. Vấn đề là hiện tại Retina không thể in một cách có điều kiện, do đó, nó thậm chí sẽ in kết quả trung gian này nếu không còn khoảng trống ở đầu hoặc không còn dấu, tạo ra các bản sao. (Retina 1.0 sẽ nhận được một tùy chọn chỉ in kết quả nếu chuỗi được thay đổi bởi thao tác, nhưng chúng tôi chưa có ở đó ...)

Vì vậy, thay vào đó, chúng tôi đang xây dựng một chuỗi duy nhất chứa tất cả các kết quả trung gian và in ở cuối.

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

Việc {kết thúc cả hai giai đoạn của chương trình trong một vòng lặp lặp lại cho đến khi chuỗi dừng thay đổi (có nghĩa là không còn khoảng trắng ở đầu / cuối). Bản thân sân khấu khớp với một không gian hàng đầu trên dòng cuối cùng của chuỗi và dòng cuối cùng đó, sau đó ghi lại trận đấu, cũng như nội dung sau khoảng trắng trên một dòng mới (do đó bỏ khoảng trống hàng đầu trong bản sao).

 $
 ¶$%`

Loại bỏ không gian dấu là dễ dàng hơn một chút. Nếu chúng ta chỉ khớp với không gian cuối cùng, chúng ta có thể truy cập vào thứ ở phía trước nó (trên cùng một dòng) với $%`biến thể nhận biết dòng của sự thay thế tiền tố $`.


11

Python 2 , 122 107 103 102 98 95 93 91 90 88 87 byte

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

Hãy thử trực tuyến!


Python 3 , 97 95 93 90 byte

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)

Hãy thử trực tuyến!


Sử dụng s=input()thay vì một hàm sẽ mất ít byte hơn.
Jonathan Frech

Đề cập đến 5. Undefined behaviour on empty input, or input that only contains spaces, is OK., 98 byte .
Jonathan Frech


@JonathanFrech Tôi đã không thấy điều đó; cảm ơn :)
TFeld

2
Bạn có thể đánh gôn thêm mã Python 2 bằng cách thay thế abằng hàm tích hợp idđể tiết kiệm khi phải xác định mã khi bắt đầu. -2 byte.
LyricLy

7

Perl 6 , 55 byte

Đã lưu 3 byte nhờ @nwellnhof.

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

Hãy thử trực tuyến!

Giải thích : ($_,{$++%2??S/" "$//!!S/^" "//}...*)là một chuỗi vô hạn đệ quy bắt đầu bằng chuỗi gốc ( $_) và phần tử tiếp theo được đưa ra bởi khối được gọi trên phần tử trước đó.

Các khối tự nhận được chuỗi trong $_biến. Toán tử S/(regex)/(string)/sẽ tìm kiếm sự xuất hiện đầu tiên của (regex)in $_, thay thế nó bằng (string)và trả về kết quả. Nếu không có kết quả khớp, nó trả về nội dung $_không thay đổi. Chúng tôi sử dụng toán tử ternary ?? !!với điều kiện $++%2, xen kẽ giữa FalseTrue( $là một biến miễn phí bảo tồn nội dung của nó qua các cuộc gọi đến khối.)

Trong trường hợp xấu nhất (tất cả các khoảng trắng ở một bên và 1 ký tự khác), chúng tôi sẽ xóa 1 khoảng trắng sau mỗi 2 bước. Vì vậy, chúng tôi có thể chắc chắn rằng trong các bước 2 * (độ dài của chuỗi), tất cả các khoảng trắng sẽ bị xóa. Chúng tôi lấy nhiều yếu tố từ trình tự đệ quy [^.comb*2]và cuối cùng loại bỏ các bản sao (xảy ra bất cứ khi nào cần xóa một khoảng trắng nhưng không có ở đó) .unique. Điều này trả về danh sách các chuỗi, dần dần bị tước khoảng trắng.


[^.comb*2]tiết kiệm 2 byte. Đối với một số lý do điều này hoạt động, nhưng [^2*.comb]không. Không biết tại sao. Sử dụng một ternary ?? !!để chọn regex lưu một byte khác.
nwellnhof

Cảm ơn! Tôi đã thử [^2*.comb]và nó không hoạt động, vì vậy tôi chỉ sử dụng [0..2*.comb]. Và cảm ơn vì chim nhạn, tôi chỉ nghĩ rằng nó quá đắt và tôi đã không thay thế nó bằng một thứ thậm chí còn đắt hơn ...
Ramillies

7

05AB1E , 21 15 byte

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

Hãy thử trực tuyến!

Giải thích ^

=                 # 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, tôi đã thử một cái gì đó tương tự nhưng vì một số lý do tôi chắc chắn đầu / đuôi không hoạt động trên dây và tôi sắp sửa đưa ra một vấn đề về nó trên github. Phải đọc nhật ký gỡ lỗi sai. :-)
scottinet

1
@scottinet: Tôi vừa tìm được cách vượt qua kiểm tra cuối :)
Emigna

oh ... tại sao chúng ta không nghĩ về điều đó trước đây? vì chúng tôi in một cách có điều kiện nên không cần phải lặp chính xác số lần đúng, chúng tôi chỉ cần lặp qua đủ số lần. Tôi đang mượn ý tưởng đó để cải thiện câu trả lời của mình :-)
scottinet

1
@scottinet: Vâng. Thật rõ ràng khi bạn nghĩ về nó, nhưng đôi khi thật dễ dàng bỏ lỡ những điều đó: P
Emigna

TFW, câu trả lời dư thừa vụng về được dẫn đầu ...
Erik the Outgolfer

7

C (gcc) , 89 84 byte

Phiên bản đệ quy ngắn hơn ;-)

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

Hãy thử trực tuyến!

C (gcc) , 107 102 101 100 99 byte

Đã lưu 2 byte nhờ @Jonathan Frech sử dụng khoảng trắng và ~

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

Hãy thử trực tuyến!


2
Tôi nghĩ rằng câu hỏi thực sự muốn bạn loại bỏ khoảng trắng hơn là dấu chấm. Thậm chí còn có một lợi thế để sử dụng không gian; bạn có thể thay thế ==46bằng <33không gian là ký tự có thể in nhỏ nhất và bạn chỉ phải xử lý chúng.
Jonathan Frech

Làm gì ++k+?
Jonathan Frech

@JonathanFrech Nó tăng trước kvà thêm một, tương đương với k = k + 1; i = k + 1;hoặc i = k + 2; k = k + 1.
HyperNeutrino

Về mặt kỹ thuật i=k+++2cũng hoạt động mà tôi sẽ sử dụng vì +++trông lạ: P
HyperNeutrino

@HyperNeutrino Vâng, tôi biết toán tử tăng trước làm gì; mặc dù tôi không hiểu làm thế nào mã hoạt động mà không có nó . Vì vậy, thực sự tôi đã hỏi nó đóng vai trò gì, hơn là cách nó được xác định.
Jonathan Frech

6

JavaScript (ES6) 92

@Upvoters: hãy xem câu trả lời JS khác bên dưới dài 76 byte

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

Một vòng lặp tìm kiếm một không gian ở phía trước hoặc ở cuối. Nếu tìm thấy, loại bỏ không gian và chuỗi đầu ra. Nếu không tìm thấy không gian 2 lần, dừng lại.

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>


Bạn có thể lưu một byte bằng cách kiểm tra không gian với <'!'. Để làm cho đoạn mã của bạn vẫn hoạt động, bạn có thể định replacekỳ với khoảng trắng trước khi chuyển đến chức năng của mình.
Justin Mariner

@JustinMariner ok ngay bây giờ, vì OP tuyên bố không có char mong đợi ít hơn ''. Cảm ơn
edc65

6

Perl 5, 32 byte

Đã lưu 4 byte do @ Abigail .

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

Yêu cầu -plđược tính là 2, được gọi với -E.

Sử dụng mẫu

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

Hãy thử trực tuyến!


Không hoạt động chính xác cho chuỗi mà không có dấu cách.
nwellnhof

print;s/^ //&&print,s/ $//&&print while/^ | $/hoạt động với -ncờ, cũng -lkhông cần thiết
Nahuel Fouilleul

@nwellnhof cố định.
primo

5

C # (.NET Core) , 192 183 182 181 179 178 byte

-3 byte nhờ Kevin Cruijssen

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

Hãy thử trực tuyến!


Một số điều để chơi golf: var e=1;while(n.Trim()!=n)-> for(var e=1;n.Trim()!=n;); if(n[0]==' ')->if(n[0]<33)
Kevin Cruijssen

Tôi đã nghĩ về cái thứ hai, nhưng nếu chuỗi thử nghiệm chứa dòng mới thì sao?
ai đó

Ok, <33có thể do quy tắc mới được thêm vào của OP: " Bạn có thể giả sử rằng chuỗi sẽ chỉ chứa các ký tự từ không gian có thể in ASCII ( 0x20đến 0x7E). "
Kevin Cruijssen

5

Java 8, 150 146 145 137 byte

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 byte nhờ @Nevay đổi (f<1&s.charAt(0)<33)thành f+s.charAt(0)<33.
-1 byte bằng cách sử dụng !s.trim().equals(s)thủ thuật từ câu trả lời C # .NET của @someone thay vì s.matches(" .*|.* ").
-8 byte nhờ @Nevay một lần nữa bằng cách thay đổi !s.trim().equals(s)thành s!=s.trim(), bởi vì String#trimsẽ trả về " Một bản sao của chuỗi này với khoảng trắng ở đầu và cuối bị xóa hoặc chuỗi này nếu nó không có khoảng trắng ở đầu hoặc cuối ", do đó tham chiếu vẫn giữ nguyên và !=có thể được sử dụng để kiểm tra nếu chúng là cùng một tham chiếu, thay vì .equalskiểm tra cùng một giá trị.

Giải trình:

Hãy thử nó ở đây (hoặc thử một phiên bản trực quan hơn ở đây với #thay vì khoảng trắng).

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
Bạn có thể sử dụng s=f+s.charAt(0)<33thay vì (f<1&s.charAt(0)<33)(-4 byte).
Nevay

1
Bạn có thể sử dụng s!=s.trim()thay vì !s.trim().equals(s);(-8 byte).
Nevay


4

Thạch , 16 byte

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

Hãy thử trực tuyến!

-2 byte nhờ Erik các Outgolfer
-1 byte nhờ dặm

Giải trình

Ḋ=⁶Ḣ$¡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Ḣ=⁶->=⁶Ḣ
Erik the Outgolfer

@EriktheOutgolfer Cảm ơn, chỉnh sửa sắp tới.
HyperNeutrino

Ý tưởng tuyệt vời với các lệnh xen kẽ của đảo ngược / danh tính!
Emigna

@Emigna Cảm ơn! : DI hầu như chỉ muốn một cái cớ để sử dụng nhanh chóng mới ... heh: P
HyperNeutrino

ƭchỉ cần một nilad nếu chuỗi dài hơn hai. ¹Ṛƭhoạt động tốt ở đây.
dặm


3

Java (OpenJDK 8) , 161 147 146 byte

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

Hãy thử trực tuyến!

-1 byte nhờ @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
Hehe, tôi đã thấy câu trả lời đã bị xóa của bạn và tự hỏi khi bạn ở dưới 150 byte của tôi và sẽ phục hồi nó. ;)
Kevin Cruijssen

1
Tôi không hoàn toàn chắc chắn, nhưng tôi nghĩ bạn có thể chơi một byte bằng cách đổi (u=32-x.charAt(l)>>-1)thành(u=32-x.charAt(l)>>k)
Kevin Cruijssen

@KevinCruijssen Sẽ không hoạt động, k0mỗi lần lặp thứ hai.
Nevay

1
Có, nhưng phần kỳ lạ là TIO hoạt động và đưa ra kết quả chính xác cho tất cả các trường hợp thử nghiệm với thay đổi này u. Nó không khi tôi cũng thay đổi -1đến kcho v. Tôi bối rối tại sao nó hoạt động mặc dù, vì kthực sự sẽ trở thành 0sau k=~k..: S
Kevin Cruijssen

1
@KevinCruijssen Đối với k=0kịch bản: Nếu còn lại có khoảng trắng, thì ucó cùng giá trị như trước ( 0); nếu trái không có khoảng trắng còn lại, sau đó (k=~k)&~v|uước tính thành -1|u( ~0&-1|u), do đó, giá trị (âm) không xác định của ukhông quan trọng ( -1|x==-1).
Nevay

3

05AB1E , 25 17 byte

-8 byte bằng cách mượn ý tưởng kiểm tra không cần thiết cho việc kết thúc từ Emigna

,v2F¬ðQi¦DNiR},}R

Hãy thử trực tuyến!

Tôi khá chắc chắn rằng một cách tiếp cận ít đơn giản hơn có thể đánh bại giải pháp đó một cách dễ dàng. Bây giờ ...

Giải thích:

,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

Tôi thích cách tiếp cận của bạn với vòng lặp :) Tôi đã cố gắng tìm ra cách để làm mọi thứ trong một lượt mà không cần nhiều if, nhưng tôi vẫn chưa tìm ra. Ngoài ra, lời giải thích của bạn dường như có một chuỗi trống thay vì một khoảng trắng.
Emigna

Cảm ơn! Tôi đã sửa lỗi giải thích, tôi quên chỉnh sửa phần "trống" khi tôi đánh mã, sử dụng Sthay vì #(-1 byte). Vòng lặp ... tốt ... nó tiết kiệm được 1 byte so với cách tiếp cận đơn giản. Tôi hiện đang tìm kiếm một cách ngắn hơn để phát hiện kết thúc nhiệm vụ (5 byte cho việc này là rất nhiều) và tôi cũng đang xem xét một cách tiếp cận hoàn toàn khác. Tôi nghĩ có một cách thông minh hơn để giải quyết thách thức này.
scottinet

Nếu bạn thử và làm mọi thứ trong một lượt (như tôi hiện đang xem xét), kiểm tra tốt nhất tôi có để thoát khỏi vòng lặp là 8 byte ...
Emigna

3

R , 145 133 111 byte

-12 byte nhờ @Giuseppe, bằng cách lưu trữ kết quả của submột biến mới và kiểm tra xem nó có thay đổi không

-22 byte bằng cách trả về một vectơ của chuỗi chứ không phải là chuỗi có dòng mới

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}

Hãy thử trực tuyến!

Giải thích về phiên bản chưa được chỉnh sửa một phần:

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
}                              

bạn không thể sử dụng C(s<-sub(),\n)thay vì một tuyên bố in riêng biệt? À, không, vìsep=" "
Giuseppe

@Giuseppe Vâng, tôi nghĩ rằng nó hoạt động lâu hơn một chút để bao gồm tất cả trong một tuyên bố vì cần phải thêm sep="". Trong hầu hết các thử thách, không gian kéo dài thêm sẽ không thành vấn đề, nhưng ở đây thật không may!
dùng2390246

133 byte - một cái gì đó về việc bạn sử dụng subchỉ đề xuất điều này, IDK tại sao
Giuseppe

@Giuseppe Rất thanh lịch!
dùng2390246

Bạn có thể chỉ cần thiết lập L=svà trả về một vectơ của chuỗi?
Giuseppe

3

Java (OpenJDK 8) , 137 125 121 120 124 byte

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

Hãy thử trực tuyến!


Câu trả lời tốt đẹp! Chỉ ngắn gọn như câu trả lời của tôi là 137 byte, nhưng bạn vẫn có thể chơi golf 12 byte như thế này: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)));}
Kevin Cruijssen

Điều này hiện không "... xuất chuỗi không thay đổi" và không thành công cho đầu vào có khoảng trắng ở đầu và không có dấu cách.
Nevay

1
Có thể bạn có thể sử dụng 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 byte) (có vẻ đúng nhưng không kiểm tra nhiều).
Nevay

3

MATL , 21 16 byte

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

Điều này sử dụng dấu chấm thay vì không gian cho rõ ràng hơn. Đối với không gian thay thế 46bởi 32.

Hãy thử trực tuyến!

Giải trình

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

Husk , 23 22 byte

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

Cảm ơn Leo cho -1 byte.

Hãy thử trực tuyến!

Giải trình

Các chức năng `G`Ithực sự nên được tích hợp ...

?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.

Đẹp! Thật vậy, chúng ta sẽ cần nhiều nội dung hơn để áp dụng các chức năng theo chu kỳ ... btw Tôi đã tìm thấy một cách ngắn hơn để loại bỏ không gian đầu tiên: tio.run/##yygtzv7/v/iêu
Leo

@Leo Cảm ơn! Sử dụng ?dường như rõ ràng trong nhận thức muộn ...
Zgarb

3

C ++, 196 193 189 186 183 byte

-10 byte nhờ Jonathan Frech
-3 byte nhờ Zacharý

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

Việc biên dịch với MSVC yêu cầu không kích hoạt kiểm tra SDL


Bạn có thể thay thế ==32bằng <33.
Jonathan Frech

Tôi không phải là bậc thầy về C ++, mặc dù có #include<string> thực sự cần thiết ?
Jonathan Frech

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

@JonathanFrech Những gì bạn đã làm ở đó là trình biên dịch cụ thể, không được đảm bảo bởi tiêu chuẩn. VC ++ không thể tìm thấy định nghĩa của các toán tử << mà không bao gồm chuỗi rõ ràng.
HatsuPulumKun

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

2

C # (.NET Core) , 176 170 byte

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

Hãy thử trực tuyến!

Đây là một thay thế cho câu trả lời của @ ai đó và chỉ xuất ra các chuỗi trực tiếp.


Chương trình của bạn không xuất chuỗi không thay đổi trước khi xóa khoảng trắng.
Nathan.Eilisha Shiraini

@ Nathan.EilishaShiraini Tôi đã sửa lỗi đó và đánh gôn vài byte để giảm số byte.
BgrWorker

2

JavaScript (ES6), 76 byte

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

Đầu ra là một chuỗi nhiều dòng.

Các trường hợp thử nghiệm

Sử dụng dấu chấm thay vì dấu cách, như hầu hết các câu trả lời đang làm.



2

Octave , 88 83 byte

Giảm 5 byte nhờ Stewie Griffin!

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

Hãy thử trực tuyến!


Rất đẹp. "Dù sao, hãy xem liệu bạn có thể loại bỏ một vài byte " :-P
Stewie Griffin

@StewieGriffin Ý tôi là trong câu trả lời của bạn ... :-D Ý kiến ​​hay, cảm ơn!
Luis Mendo

Tôi có thể xóa của tôi ... Thật là không mệt mỏi so với điều này ...
Stewie Griffin

@StewieGriffin Đây là một ý tưởng để loại bỏ hai byte . Đáng tiếc minlà cần thiết vì sbị thu hẹp động
Luis Mendo

2

Mã máy x86 cho Linux, 60 byte

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

Đây là một chức năng cho Linux x86. Nó nhận làm con trỏ đầu vào cho chuỗi trong edivà độ dài chuỗi trong ebp.

Ungolfed, với một số cơ sở hạ tầng để kiểm tra (biên dịch với FASM, chạy với chuỗi dưới dạng đối số chương trình; tìm undress:nhãn cho mã chức năng thực tế):

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()làm cho eaxkhác không (cụ thể 1là số lượng ký tự được viết, giả sử là không -errno), vì vậy, printnếu bạn không pop eaxở cuối. Bạn có thể ngay xor eax,eaxtrước cmp byte [edi], ' 'và lưu mov al,1, và có thể một số eaxlưu / khôi phục. Mặc dù bạn không thực sự lưu nó cho đến khi bị mắc kẹt SYS_WRITE. Hmm, thay vì 0, bạn có thể sử dụng SYS_WRITEso với 1, vì cmp al, imm8có cùng kích thước với test al,al.
Peter Cordes

Bạn có thể đặt một '\n'mảng mov byte [ecx + edx], '\n'vào thay vì làm thứ 2 write()không? (Và giảm độ dài sau khi in?) Có thể giúp bạn tiết kiệm một vài hướng dẫn.
Peter Cordes

Trên thực tế, print()hiện lá '\n'trong eax, đó là khác nhau từ SYS_WRITE, vì vậy bạn vẫn có thể kiểm tra xem. Tôi nghĩ rằng bạn đang lưu / khôi phục eax, nhưng đó chỉ là lưu byte sao chép một hằng số xung quanh. Đối với các chuỗi dài, sys_write()có thể để các byte cao của eax khác không, do đó không may loại trừ việc sử dụng mov al, SYS_WRITE.
Peter Cordes

@PeterCordes thực sự có, mov al, 1là không liên quan. -2 byte bây giờ, cảm ơn.
Ruslan

Một quy ước gọi đăng ký sẽ giúp bạn tiết kiệm các hướng dẫn tải. Trong code-golf, một quy ước gọi tùy chỉnh thường là trò chơi công bằng cho asm. OTOH, nếu bạn thích chơi golf theo quy ước gọi stack-args tiêu chuẩn, điều đó cũng thú vị.
Peter Cordes

2

PHP , 117 byte

Tôi thêm một không gian bổ sung khi bắt đầu để nó sẽ lấy không gian ra và hiển thị bản gốc mà không cần thêm bất kỳ mã nào.

Một điều mới mẻ về điều này ... liệu <? Php và khoảng trống ở đầu tệp PHP có thêm 6 byte hay tôi có được miễn phí không?

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

Hãy thử trực tuyến!


1
Sử dụng phương pháp 6 byte của bạn có thể được giảm: Hãy thử trực tuyến!
Đêm2

1
Bạn có thể bỏ qua thẻ mở của PHP vì bạn có thể chạy nó bằng một lệnh như thế này: php -r "echo 1;"Nhưng nếu bạn muốn sử dụng một cái gì đó giống như <?=1;bạn phải bao gồm thẻ trong số byte.
Đêm2

1

Bình thường , 28 byte

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

Hãy thử nó ở đây! hoặc Xác minh tất cả các trường hợp thử nghiệm!

Giải trình

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

C # - một lần nữa, 125 byte

while(s.Trim()!=s){if(s[0]==' '){yield return s=s.Substring(1);}if(s.Last()==' '){yield return s=s.Substring(0,s.Length-1);}}

Chúc mừng!

Hãy thử trực tuyến!


Chào mừng đến với PPCG!
Laikoni

1

Octave , 89 byte

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

Hãy thử trực tuyến!

Tôi sẽ thêm một lời giải thích sau, khi tôi có thời gian. Tôi có thể bỏ qua một số byte nếu tôi thay đổi hoàn toàn cách tiếp cận, nhưng tôi không thể thấy thật đáng tiếc.

Các chữ cái cuối cùng ở đây đánh vần: "sendsendendend". Tôi ước có một cách để lưu trữ endnhư một biến và sử dụng nó, nhưng đoán xem ...


Có hợp lệ để đầu ra với s = ...? (Câu hỏi thông thường, tôi biết)
Luis Mendo

Dù sao, hãy xem liệu bạn có thể xóa một vài byte :-P
Luis Mendo

1

Bash, 98 94 byte

Đã lưu 4 byte bằng cách sử dụng mạng con thay vì chuỗi (hiệu suất kém)

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

Câu trả lời đầu tiên

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

Lưu ý !phải được thoát trong chế độ tương tác

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.