Buka baju string

48

Kita sekarang sudah bagaimana cara menghilangkan string dari spasi.

Namun, sebagai tuan-tuan yang baik, kita harus membuka pakaian itu.


Menanggalkan suatu string sama dengan melepasnya, hanya saja lebih halus. Alih-alih menghapus semua ruang depan dan belakang secara bersamaan, kami menghapusnya satu per satu . Kami juga bergantian antara memimpin dan mengekor, agar tidak membakar langkah.

Contoh, dimulai dengan " codegolf "(lima spasi depan dan belakang):

     codegolf     
    codegolf     
    codegolf    
   codegolf    
   codegolf   
  codegolf   
  codegolf  
 codegolf  
 codegolf 
codegolf 
codegolf

  1. Output pertama string tidak berubah. Lalu, keluarkan setiap langkah. Mulailah dengan menghapus a spasi terdepan (jika ada - lihat aturan # 2).

  2. Input mungkin memiliki jumlah ruang awal dan akhir yang berbeda. Jika Anda kehabisan ruang di satu sisi, terus membuka baju yang lain sampai string kosong.

  3. Input mungkin tidak memiliki spasi awal atau spasi tambahan. Jika itu masalahnya, output apa adanya.

  4. Gunakan metode I / O standar PPCG . Celah default PPCG dilarang.

  5. Perilaku tidak terdefinisi pada input kosong, atau input yang hanya berisi spasi, adalah OK.

  6. Anda dapat mengasumsikan bahwa string hanya akan berisi karakter dari ruang ASCII yang dapat dicetak ( 0x20ke 0x7E).


Contoh - spasi diganti dengan titik .untuk keterbacaan yang lebih baik:

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

Seorang pria / wanita ringkas, jadi jawaban tersingkat dalam byte menang .

Nathan.Eilisha Shiraini
sumber
Dari Sandbox: codegolf.meta.stackexchange.com/a/13765/71426
Nathan.Eilisha Shiraini
Bisakah kita berasumsi bahwa setidaknya akan ada satu karakter non-spasi?
Martin Ender
2
@KevinCruijssen Anda hanya perlu menangani karakter ASCII dalam ruang yang dapat dicetak ( 0x20untuk 0x7E). Yang lainnya adalah Perilaku Tidak Terdefinisi.
Nathan.Eilisha Shiraini
1
@KevinCruijssen Ya, tidak akan ada ujian seperti ini. Tidak akan ada hal seperti " test\r "atau " \v test"baik.
Nathan.Eilisha Shiraini
1
Apakah ini uji kasus yang valid ".....................a....."? Jika demikian, saya sarankan untuk menambahkannya karena beberapa jawaban tampaknya gagal dalam tes semacam ini. (Titik adalah untuk keterbacaan yang lebih baik tentu saja)
Cinaski

Jawaban:

11

Retina , 26 byte

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

Cobalah online! (Test suite menggunakan periode untuk kejelasan. Footer dan header mengkonversinya ke dan dari spasi untuk kode utama.)

Penjelasan

Alangkah baiknya jika kita hanya bisa bergantian antara menjatuhkan ruang depan dan spasi dan mencetak hasil antara setiap kali. Masalahnya adalah bahwa saat ini Retina tidak dapat mencetak secara kondisional, sehingga bahkan akan mencetak hasil antara ini jika tidak ada spasi tambahan atau tidak ada spasi tambahan yang tersisa, menghasilkan duplikat. (Retina 1.0 akan mendapatkan opsi yang hanya mencetak hasilnya jika string diubah oleh operasi, tapi kami belum ada di sana ...)

Jadi alih-alih, kami membuat string tunggal yang berisi semua hasil antara dan mencetaknya pada akhirnya.

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

The {membungkus kedua tahapan program dalam satu lingkaran yang mengulangi sampai string berhenti berubah (yang berarti ada ada terkemuka / spasi kiri). Tahap itu sendiri cocok dengan ruang terdepan pada baris terakhir dari string, dan baris terakhir, dan kemudian menulis kembali pertandingan, serta hal-hal setelah ruang pada baris baru (dengan demikian menjatuhkan ruang terdepan dalam salinan).

 $
 ¶$%`

Menghapus ruang trailing sedikit lebih mudah. Jika kita hanya mencocokkan ruang terakhir, kita dapat mengakses barang-barang di depannya (pada baris yang sama) dengan $%`yang merupakan varian garis-sadar dari substitusi awalan $`.

Martin Ender
sumber
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

Cobalah online!


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)

Cobalah online!

TFeld
sumber
Menggunakan s=input()alih-alih fungsi akan membutuhkan lebih sedikit byte.
Jonathan Frech
Mengacu pada 5. Undefined behaviour on empty input, or input that only contains spaces, is OK., 98 byte .
Jonathan Frech
Python 3 menyimpan byte.
LyricLy
@ JonathanFrech Saya belum melihat itu; terima kasih :)
TFeld
2
Anda dapat lebih lanjut golf kode Python 2 dengan mengganti adengan fungsi idbawaan untuk menyimpan harus mendefinisikannya di awal. -2 byte.
LyricLy
7

Perl 6 , 55 byte

Disimpan 3 byte berkat @nwellnhof.

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

Cobalah online!

Penjelasan :($_,{$++%2??S/" "$//!!S/^" "//}...*) adalah urutan berulang tak terbatas yang dimulai dengan string asli ( $_) dan elemen berikutnya diberikan oleh blok yang dipanggil pada elemen sebelumnya.

Blok itu sendiri mendapatkan string dalam $_variabel. Operator S/(regex)/(string)/akan mencari kejadian pertama (regex)in $_, menggantinya (string), dan mengembalikan hasilnya. Jika tidak ada kecocokan, itu mengembalikan konten $_tidak berubah. Kami menggunakan operator ternary ?? !!dengan kondisi $++%2, yang bergantian antara Falsedan True($ adalah variabel bebas yang menyimpan kontennya di seluruh panggilan ke blok.)

Dalam kasus terburuk (semua spasi di satu sisi dan 1 karakter lainnya), kami menghapus 1 spasi setiap 2 langkah. Jadi kita dapat yakin bahwa dalam langkah 2 * (panjang string), semua spasi akan dihapus. Kami mengambil banyak elemen dari urutan rekursif dengan [^.comb*2]dan akhirnya membuang duplikat (yang terjadi setiap kali ruang harus dihapus tetapi tidak ada di sana) dengan .unique. Ini mengembalikan daftar string, semakin banyak ruang dilucuti.

Ramillies
sumber
[^.comb*2]menghemat 2 byte. Untuk beberapa alasan ini berhasil, tetapi [^2*.comb]tidak. Tidak tahu kenapa. Menggunakan terner ?? !!untuk memilih regex menyimpan byte lain.
nwellnhof
Terima kasih! Saya mencoba [^2*.comb]dan tidak berhasil, jadi saya gunakan saja [0..2*.comb]. Dan terima kasih untuk ternary, saya hanya berpikir itu terlalu mahal dan tidak terpikir oleh saya untuk menggantinya dengan sesuatu yang bahkan lebih mahal ...
Ramillies
7

05AB1E , 21 15 byte

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

Cobalah online!

Penjelasan ^

=                 # 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
Emigna
sumber
Dang, saya mencoba sesuatu yang serupa tetapi untuk beberapa alasan saya yakin kepala / ekor tidak bekerja pada string, dan saya akan mengangkat masalah tentang hal itu di github. Pasti membaca log debug salah. :-)
scottinet
1
@ skottinet: Saya baru saja menemukan cara untuk menyelesaikan pemeriksaan akhir :)
Emigna
oh ... kenapa kita tidak memikirkan itu sebelumnya? karena kita mencetak secara kondisional, tidak perlu mengulang tepat beberapa kali, kita hanya perlu mengulang berkali-kali. Saya meminjam ide itu untuk meningkatkan jawaban saya :-)
scottinet
1
@ skottinet: Ya. Sudah jelas ketika Anda memikirkannya, tetapi kadang-kadang mudah untuk melewatkan hal-hal itu: P
Emigna
TFW, jawaban berlebihan yang kikuk, yang memimpin ...
Erik the Outgolfer
7

C (gcc) , 89 84 byte

Versi rekursif lebih pendek ;-)

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

Cobalah online!

C (gcc) , 107 102 101 100 99 byte

Disimpan 2 byte berkat @Jonathan Frech menggunakan spasi dan ~

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

Cobalah online!

Cleblanc
sumber
2
Saya pikir pertanyaannya benar-benar ingin Anda menghapus spasi daripada titik. Bahkan ada keuntungan menggunakan spasi; Anda dapat menggantinya ==46dengan <33karena spasi adalah karakter terkecil yang dapat dicetak dan Anda hanya perlu mengatasinya.
Jonathan Frech
Apa yang ++k+dilakukan?
Jonathan Frech
@JonathanFrech Ini pra-kenaikan kdan menambahkan satu, yang setara dengan k = k + 1; i = k + 1;atau i = k + 2; k = k + 1.
HyperNeutrino
Secara teknis i=k+++2juga bekerja yang saya akan gunakan karena +++terlihat aneh: P
HyperNeutrino
@HyperNeutrino Ya, saya tahu apa yang dilakukan operator pra-kenaikan; meskipun saya tidak mengerti bagaimana kode bekerja tanpanya . Jadi sebenarnya saya bertanya apa peran yang dimainkannya, bukan bagaimana itu didefinisikan.
Jonathan Frech
6

JavaScript (ES6) 92

@ Pengunggah: lihat jawaban JS lainnya di bawah yang panjangnya 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))}

Sebuah loop mencari ruang di depan atau di ujung. Jika ditemukan, hapus spasi dan string keluaran. Jika tidak ada ruang yang ditemukan 2 kali, berhenti.

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>

edc65
sumber
Anda dapat menghemat satu byte dengan memeriksa ruang <'!'. Untuk membuat cuplikan Anda tetap berfungsi, Anda dapat menentukan replacetitik dengan spasi sebelum meneruskan ke fungsi Anda.
Justin Mariner
@JustinMariner ok sekarang, karena OP menyatakan tidak ada char yang diharapkan kurang dari ''. Terima kasih
edc65
6

Perl 5, 32 byte

Disimpan 4 byte karena @Abigail .

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

Harus -pldihitung sebagai 2, dipanggil dengan -E.

Contoh Penggunaan

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

Cobalah online!

primo
sumber
Tidak berfungsi dengan benar untuk string tanpa spasi tambahan.
nwellnhof
print;s/^ //&&print,s/ $//&&print while/^ | $/bekerja dengan -nbendera, juga -ltidak diperlukan
Nahuel Fouilleul
@nwellnhof diperbaiki.
primo
5

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

-3 byte terima kasih kepada 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;}

Cobalah online!

some one
sumber
Beberapa hal untuk golf: var e=1;while(n.Trim()!=n)-> for(var e=1;n.Trim()!=n;); if(n[0]==' ')->if(n[0]<33)
Kevin Cruijssen
Saya sudah memikirkan yang kedua, tetapi bagaimana jika string tes berisi baris baru?
seseorang
Oke, <33mungkin karena aturan OP yang baru ditambahkan: " Anda dapat mengasumsikan bahwa string hanya akan berisi karakter dari ruang ASCII yang dapat dicetak ( 0x20ke 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 berkat @Nevay berubah (f<1&s.charAt(0)<33)menjadi f+s.charAt(0)<33.
-1 byte dengan menggunakan !s.trim().equals(s)trik dari @someone 's C # .NET sebagai gantinya s.matches(" .*|.* ").
-8 byte berkat @Nevay lagi dengan mengubah !s.trim().equals(s)ke s!=s.trim(), karena String#trimakan kembali " Salinan string ini dengan memimpin dan trailing spasi dihapus, atau string ini jika tidak memiliki terkemuka atau trailing spasi ", sehingga tetap referensi yang sama dan!=dapat digunakan untuk memeriksa apakah mereka referensi yang sama, bukan.equalsuntuk memeriksa nilai yang sama.

Penjelasan:

Cobalah di sini (atau coba versi yang lebih visual di sini dengan #bukan spasi).

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
Kevin Cruijssen
sumber
1
Anda bisa menggunakan s=f+s.charAt(0)<33sebagai ganti (f<1&s.charAt(0)<33)(-4 bytes).
Nevay
1
Anda bisa menggunakan s!=s.trim()sebagai ganti !s.trim().equals(s);(-8 bytes).
Nevay
4

C, 91 90 byte

i,l;f(char*s){for(i=puts(s);i;i=(s[l=strlen(s)-1]*=s[l]>32)?i:puts(s))i=*s<33&&puts(++s);}

Cobalah online!

Steadybox
sumber
4

Jelly , 16 byte

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

Cobalah online!

-2 byte terima kasih kepada Erik the Outgolfer
-1 byte berkat mil

Penjelasan

Ḋ=⁶Ḣ$¡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
HyperNeutrino
sumber
ḣ1Ḣ=⁶->=⁶Ḣ
Erik the Outgolfer
@EriktheOutgolfer Terima kasih, edit datang.
HyperNeutrino
Ide keren dengan perintah bolak balik / identitas!
Emigna
@Emigna Terima kasih! : DI kebanyakan hanya menginginkan alasan untuk menggunakan quick baru ... heh: P
HyperNeutrino
ƭhanya membutuhkan nilad jika rantai lebih panjang dari dua. ¹Ṛƭberfungsi dengan baik di sini.
mil
3

Ruby , 63 byte

->s{*x=s;(s=~/^ /&&x<<s=$';s=~/ $/&&x<<s=$`)while s=~/^ | $/;x}

Cobalah online!

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

Cobalah online!

-1 byte terima kasih kepada @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;
}
Nevay
sumber
1
Hehe, saya melihat jawaban Anda yang dihapus dan bertanya-tanya kapan Anda di bawah 150 byte saya dan akan membatalkan penghapusan. ;)
Kevin Cruijssen
1
Saya tidak sepenuhnya yakin, tapi saya pikir Anda bisa bermain golf dengan mengubah (u=32-x.charAt(l)>>-1)ke(u=32-x.charAt(l)>>k)
Kevin Cruijssen
@KevinCruijssen Will tidak bekerja, kadalah 0setiap iterasi kedua.
Nevay
1
Ya, tetapi bagian yang aneh adalah TIO berfungsi dan memberikan hasil yang benar untuk semua kasus uji dengan perubahan ini u. Ini tidak ketika saya juga berubah -1untuk kuntuk v. Saya bingung mengapa ini bekerja, karena kmemang akan menjadi 0setelah k=~k..: S
Kevin Cruijssen
1
@KevinCruijssen Untuk k=0skenario: Jika dibiarkan memiliki spasi, maka umemiliki nilai yang sama seperti sebelumnya ( 0); jika kiri tidak memiliki spasi tersisa, maka (k=~k)&~v|umengevaluasi ke -1|u( ~0&-1|u), sehingga nilai undefined (negatif) utidak masalah ( -1|x==-1).
Nevay
3

05AB1E , 25 17 byte

-8 byte dengan meminjam ide no-need-an-end-check dari Emigna

,v2F¬ðQi¦DNiR},}R

Cobalah online!

Saya cukup yakin pendekatan yang tidak langsung dapat mengalahkan solusi itu dengan mudah. Untuk sekarang...

Penjelasan:

,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
scottinet
sumber
Saya suka pendekatan Anda dengan loop :) Saya sudah mencoba mencari cara untuk melakukan semuanya dalam satu lulus tanpa beberapa ifs, tapi saya belum mengetahuinya. Juga, penjelasan Anda tampaknya memiliki string kosong dan bukan spasi.
Emigna
Terima kasih! Saya memperbaiki penjelasannya, saya lupa mengedit bagian "kosong" ketika saya memasukkan kode saya, menggunakan Sbukan #(-1 byte). Loop ... well ... menghemat 1 byte kekalahan dibandingkan dengan pendekatan langsung. Saat ini saya sedang mencari cara yang lebih pendek untuk mendeteksi akhir tugas (5 byte untuk ini banyak), dan saya juga mempertimbangkan pendekatan yang berbeda sama sekali. Saya pikir ada cara yang lebih pintar untuk menyelesaikan tantangan ini.
scottinet
Jika Anda mencoba dan melakukan semuanya dalam satu pass (seperti yang saya lihat sekarang), pemeriksaan terbaik yang saya miliki untuk keluar dari loop adalah 8 byte ...
Emigna
3

R , 145 133 111 byte

-12 byte terima kasih kepada @Giuseppe, dengan menyimpan hasil subdalam variabel baru dan menguji apakah sudah berubah

-22 byte dengan mengembalikan vektor string daripada string dengan baris baru

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}

Cobalah online!

Penjelasan tentang versi yang sebagiannya tidak mengandung ungolf:

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
}                              
pengguna2390246
sumber
tidak bisakah Anda menggunakan C(s<-sub(),\n)alih-alih pernyataan cetak yang terpisah? Ah, tidak, karenasep=" "
Giuseppe
@ Giuseppe Ya, saya pikir ini bekerja sedikit lebih lama untuk memasukkan semuanya dalam satu pernyataan karena kebutuhan untuk menambahkan sep="". Dalam sebagian besar tantangan, ruang tambahan tidak akan menjadi masalah, tetapi sayangnya di sini tidak!
user2390246
133 byte - sesuatu tentang penggunaan Anda subhanya menyarankan ini, IDK mengapa
Giuseppe
@Giuseppe Sangat elegan!
user2390246
Bisakah Anda mengatur L=sdan mengembalikan vektor string?
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))));}

Cobalah online!

Roberto Graham
sumber
Jawaban bagus! Hanya sesingkat jawaban saya dari 137 byte, tetapi Anda masih golf 12 byte seperti ini: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
Ini saat ini tidak "... mengeluarkan string tidak berubah" dan gagal untuk input dengan spasi utama dan tanpa spasi tambahan.
Nevay
1
Mungkin Anda dapat menggunakan 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) (tampaknya benar tetapi tidak banyak menguji).
Nevay
3

MATL , 21 16 byte

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

Ini menggunakan titik alih-alih ruang untuk kejelasan yang lebih besar. Untuk spasi diganti 46dengan 32.

Cobalah online!

Penjelasan

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)
Luis Mendo
sumber
3

Sekam , 23 22 byte

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

Terima kasih kepada Leo untuk -1 byte.

Cobalah online!

Penjelasan

Fungsi ini `G`Iharus benar-benar built-in ...

?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.
Zgarb
sumber
Bagus! Memang kita akan membutuhkan lebih banyak builtin untuk menerapkan fungsi secara siklikal ... tetapi saya telah menemukan cara yang lebih singkat untuk menghapus ruang pertama: tio.run/##yygtzv7/v/…
Leo
@ Leo, terima kasih! Penggunaannya ?tampak jelas di belakang ...
Zgarb
3

C ++, 196 193 189 186 183 bytes

-10 byte terima kasih kepada Jonathan Frech
-3 byte terima kasih kepada 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;}};

Kompilasi dengan MSVC membutuhkan pembatalan pemeriksaan SDL

HatsuPointerKun
sumber
Anda mungkin bisa mengganti ==32dengan <33.
Jonathan Frech
Saya bukan master C ++, meskipun #include<string> benar-benar diperlukan ?
Jonathan Frech
if(...){...;D;}-> if(...)...,D;.
Jonathan Frech
@ JonathanFrech Apa yang Anda lakukan di sana adalah kompiler khusus, tidak dijamin oleh standar. VC ++ tidak dapat menemukan definisi dari << operator tanpa menyertakan string secara eksplisit.
HatsuPointerKun
#define R ...<33, ||R){dan if(R){-> #define R ...<33), ||R{dan 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();}}}

Cobalah online!

Ini adalah alternatif untuk jawaban seseorang , dan hanya menampilkan string secara langsung.

BgrWorker
sumber
Program Anda tidak menghasilkan string yang tidak dimodifikasi sebelum menghapus spasi.
Nathan.Eilisha Shiraini
@ Nathan.EilishaShiraini Saya memperbaiki kesalahan itu dan bermain golf beberapa byte untuk mengurangi jumlah 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)

Output sebagai string multiline.

Uji Kasus

Menggunakan titik alih-alih spasi, seperti yang dilakukan sebagian besar jawaban.

Justin Mariner
sumber
2

Oktaf , 88 83 byte

5 byte off berkat 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

Cobalah online!

Luis Mendo
sumber
Sangat bagus. "Pokoknya, lihat apakah Anda dapat menghapus beberapa byte " :-P
Stewie Griffin
@StewieGriffin yang saya maksudkan dalam jawaban Anda ... :-D Ide bagus, terima kasih!
Luis Mendo
Saya mungkin menghapus milik saya ... Sangat tidak bersemangat dibandingkan dengan ini ...
Stewie Griffin
@StewieGriffin Ini ide untuk menghapus dua byte . Kasihan yang mindiperlukan karena smenyusut secara dinamis
Luis Mendo
2

kode mesin x86 untuk 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

Ini adalah fungsi untuk Linux x86. Dibutuhkan sebagai pointer input ke string edidan panjang string ebp.

Ungolfed, dengan beberapa infrastruktur untuk diuji (kompilasi dengan FASM, jalankan dengan string sebagai argumen program; cari undress:label untuk kode fungsi aktual):

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
Ruslan
sumber
sys_write()membuat eaxnon-nol (khusus 1, jumlah karakter yang ditulis, dengan asumsi tidak -errno), begitu juga printjika Anda tidak pop eaxdi akhir. Anda bisa xor eax,eaxsebelum cmp byte [edi], ' 'dan menyimpan mov al,1, dan mungkin beberapa eaxsave / restore. Meskipun Anda tidak benar-benar menyimpannya sampai setelah musnah SYS_WRITE. Hmm, alih-alih 0, Anda bisa menggunakan SYS_WRITEvs. 1, karena cmp al, imm8ukurannya sama dengan test al,al.
Peter Cordes
Bisakah Anda memasukkan '\n'array ke dalam mov byte [ecx + edx], '\n'daripada melakukan yang ke-2 write()? (Dan mengurangi panjang setelah mencetak?) Mungkin menghemat beberapa instruksi.
Peter Cordes
Sebenarnya, print()saat ini '\n'masuk eax, yang berbeda dari SYS_WRITE, sehingga Anda masih bisa memeriksanya. Saya pikir Anda menyimpan / memulihkan eax, tetapi itu hanya menyimpan byte menyalin konstan di sekitar. Untuk string yang panjang, sys_write()dapat meninggalkan byte tinggi dari eax non-nol, sehingga sayangnya tidak digunakan mov al, SYS_WRITE.
Peter Cordes
@PeterCordes sebenarnya ya, mov al, 1tidak cocok. -2 byte sekarang, terima kasih.
Ruslan
Konvensi pendaftaran panggilan akan menghemat instruksi pemuatan Anda. Dalam kode-golf, konvensi pemanggilan kustom biasanya merupakan permainan yang adil untuk asm. OTOH, jika Anda lebih suka golf konvensi panggilan stack-args standar, itu menarik juga.
Peter Cordes
2

PHP , 117 byte

Saya menambahkan ruang ekstra di awal sehingga akan mengambil ruang dan menunjukkan aslinya tanpa kode tambahan.

Agak baru dalam hal ini ... apakah <? Php dan spasi di awal file PHP menambah 6 byte tambahan atau apakah saya mendapatkannya secara gratis?

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

Cobalah online!

XMark
sumber
1
Menggunakan metode Anda 6 byte dapat dikurangi: Coba online!
Night2
1
Anda dapat menghilangkan tag pembuka PHP karena Anda dapat menjalankannya dengan perintah seperti ini: php -r "echo 1;"Tetapi jika Anda ingin menggunakan sesuatu seperti <?=1;Anda harus memasukkan tag dalam hitungan byte.
Night2
1

Pyth , 28 byte

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

Coba di sini! atau Verifikasi semua kasus uji!

Penjelasan

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.
Tuan Xcoder
sumber
1

Python 2 , 79 byte

-1 byte terima kasih kepada @JonathanFrech

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

Cobalah online!

Setelan uji diganti "."dengan " "sebelum memanggil fungsi dan menggantikan " "kembali "."sebelum mencetak hasil untuk kejelasan.

Felipe Nardi Batista
sumber
'!'*i and-> i*'!'and.
Jonathan Frech
1

C # - lagi, 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);}}

Tepuk tangan!

Cobalah online!

Barodus
sumber
Selamat datang di PPCG!
Laikoni
1

Oktaf , 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

Cobalah online!

Saya akan menambahkan penjelasan nanti, ketika saya punya waktu. Saya mungkin bisa bermain golf beberapa byte jika saya mengubah pendekatan sepenuhnya, tetapi saya tidak bisa melihat betapa sayangnya.

Huruf terakhir di sini menjelaskan: "sendendendendend". Saya berharap ada cara untuk menyimpan endsebagai variabel dan menggunakannya, tapi coba tebak ...

Stewie Griffin
sumber
Apakah valid untuk di-output s = ...? (Pertanyaan biasa, saya tahu)
Luis Mendo
Pokoknya, lihat apakah Anda dapat menghapus beberapa byte :-P
Luis Mendo
1

Pesta, 98 94 byte

Disimpan 4 byte menggunakan subkulit bukan urutan (kinerja buruk)

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

Jawaban pertama

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

Perhatikan bahwa !harus melarikan diri dalam mode interaktif

Nahuel Fouilleul
sumber