Bir dizeyi soyun


48

Şimdiden bir dize alanlarından nasıl sıyrılacağını şimdiden öğrendik.

Ancak, baylar / bayanlar olarak, onu soyunmalıyız .


Bir dizeyi soyunmak, onu sıyırmakla aynıdır, sadece daha hassastır. Tüm önde gelen ve arkadaki boşlukları bir kerede kaldırmak yerine, bunları birer birer kaldırıyoruz . Ayrıca , adımları yakmamak için kılavuz çizgileriyle iz arasında da değişiklik yapıyoruz .

Örnek, " codegolf "(beş önde ve sondaki boşluk) ile başlayan:

     codegolf     
    codegolf     
    codegolf    
   codegolf    
   codegolf   
  codegolf   
  codegolf  
 codegolf  
 codegolf 
codegolf 
codegolf

  1. İlk önce dizgiyi değiştirmeden çıktı. Ardından, her adımda çıktı alın. Baştaki boşluğu kaldırarak başlayın (varsa - kural 2'ye bakın).

  2. Girdi, farklı sayıda öncü ve takip eden boşluklara sahip olabilir. Bir taraftaki boşluklar tükenirse, dize çıplak kalana kadar diğerini soyunmaya devam edin.

  3. Girdide öncü veya sondaki boşluklar olmayabilir. Bu durumda, olduğu gibi çıktı alın.

  4. Kullanım PPCG varsayılan G / Ç yöntemleri . PPCG Varsayılan boşluklar yasaktır.

  5. Boş girişte tanımlanmamış davranış veya yalnızca boşluk içeren giriş tamam.

  6. Dizenin yalnızca ASCII yazdırılabilir alanından ( 0x20to 0x7E) karakterleri içereceğini varsayabilirsiniz .


Örnekler - boşlukları .daha iyi okunabilmesi için noktalarla değiştirilir :

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

Bir beyefendi / bayan özlüdür, bu yüzden bayt cinsinden en kısa cevap kazanır .



En az bir tane boşluksuz karakter olacağını varsayabilir miyiz?
Martin Ender

2
@KevinCruijssen ASCII karakterlerini yalnızca yazdırılabilir alanda ( 0x20to 0x7E) kullanmanız gerekir. Diğerleri Tanımsız Davranış.
Nathan.Eilisha Shiraini 21:17

1
@KevinCruijssen Evet, böyle bir test davası olmayacak. Gibi " test\r "ya " \v test"da hiçbir şey olmayacak .
Nathan.Eilisha Shiraini 21:17

1
Bu geçerli bir test durumu ".....................a....."mu? Öyleyse eklemenizi öneririm, çünkü bazı cevaplar bu tür testlerde başarısız olmuş gibi görünüyor. (Noktalar elbette daha iyi okunabilirlik içindir)
Cinaski

Yanıtlar:


11

Retina , 26 bayt

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

Çevrimiçi deneyin! (Test paketi netlik için dönemler kullanır. Altbilgi ve üstbilgi, onları ana kod için alanlara dönüştürür.)

açıklama

Önde gelen ile arkada kalan alanı bırakıp ara sonucu her seferinde basmak arasında geçiş yapmamız güzel olurdu. Sorun şu ki, Retina şu anda koşullu olarak yazdıramıyor, bu nedenle kopyalar oluşturacak boş alan yoksa ya da hiç boşluk yoksa bu ara sonucu bile yazdırabilir. (Retina 1.0, yalnızca işlem tarafından dize değiştirildiyse sonucu yazdırır bir seçenek alır, ancak henüz orada değiliz ...)

Bunun yerine, tüm ara sonuçları içeren ve sonunda baskı yapan tek bir ip oluşturuyoruz.

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

Programın {her iki aşamasını, dize değişmeyi bırakana kadar tekrar eden bir döngüde sarar (bu, kalan / kalan boşluk kalmadığı anlamına gelir). Sahnenin kendisi, dizenin son satırında ve o son satırdaki baştaki boşluklarla eşleşir ve ardından eşleşmeyi ve yeni satırdaki alandan sonrakileri (böylece kopyadaki baştaki alanı bırakarak) geri yazar.

 $
 ¶$%`

Sondaki boşluğu kaldırmak biraz daha kolaydır. Eğer son boşluğu yeni eşleştirirsek $%`, önek yerine koyma satırının farkında olan bir çeşidi olan önündeki öğelere (aynı satırda) erişebiliriz $`.


11

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

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

Çevrimiçi deneyin!


Python 3 , 97 95 93 90 bayt

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)

Çevrimiçi deneyin!


s=input()Bir işlev yerine kullanmak daha az bayt alır.
Jonathan Frech

Atıfta 5. Undefined behaviour on empty input, or input that only contains spaces, is OK., 98 bayt .
Jonathan Frech


@JonathanFrech Bunu görmedim; thanks :)
TFeld

2
Python 2 kodunu , başlangıçta tanımlamak zorunda kalmadan kaydetmek aiçin yerleşik işlevle değiştirerek daha fazla golf oynayabilirsiniz id. -2 bayt.
LyricLy

7

Perl 6 , 55 bayt

@Nwellnhof sayesinde 3 bayt kaydedildi.

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

Çevrimiçi deneyin!

Açıklama : ($_,{$++%2??S/" "$//!!S/^" "//}...*)orijinal dize ( $_) ile başlayan özyinelemeli bir sonsuz dizidir ve bir sonraki eleman bir önceki eleman üzerinde çağrılan blok tarafından verilir.

Bloğun kendisi $_değişkende dizgeyi alır . Operatör S/(regex)/(string)/ilk oluşumu arayacaktır (regex)içinde $_, değiştirir (string)ve sonucu döndürür. Eşleşme yoksa, $_değişmeyen içeriğini döndürür . Biz üçlü operatörünü kullanmak ?? !!koşulu ile $++%2, aralarında hangi alternatiflerini Falseve True( $bloğuna çağrıları arasında içeriğini korur ücretsiz bir değişkendir.)

En kötü durumda (bir tarafta tüm boşluklar ve diğer 1 karakter), her 2 adımda 1 boşluk kaldırıyoruz. Böylece 2 * (dizginin uzunluğu) adımlarında tüm boşlukların kaldırıldığından emin olabiliriz. Özyinelemeli dizideki birçok öğeyi yinelemelerle birlikte atarız [^.comb*2]ve sonunda (bir alan kaldırılmış olması gerektiğinde oluşur, ancak orada olmadığında) .unique. Bu, aşamalı olarak boşluklardan sıyrılmış dizelerin listesini döndürür.


[^.comb*2]2 bayt kaydeder. Nedense bu işe yarıyor ama [^2*.comb]çalışmıyor. Neden hiçbir fikrim yok. Düzenli ifadeyi ?? !!seçmek için bir ternary kullanmak , başka bir bayttan tasarruf sağlar.
nwellnhof

Teşekkürler! Denedim [^2*.comb]ve işe yaramadı, ben de kullandım [0..2*.comb]. Üçlü için teşekkürler, sadece çok pahalı olduğunu düşündüm ve benim için daha pahalı bir şeyle değiştirdiğimde başıma gelmedi ...
Ramillies

7

05AB1E , 21 15 bayt

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

Çevrimiçi deneyin!

Açıklama ^

=                 # 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, benzer bir şey denedim ama bir nedenden ötürü kafa / kuyruğun iplerde işe yaramadığından emindim ve github'da bir sorun ortaya çıkarmak üzereydim. Hata ayıklama günlüklerini yanlış okumuş olmalı. :-)
scottinet 21:17

1
@scottinet: Son kontrolün etrafından dolaşmanın bir yolunu buldum :)
Emigna

oh ... neden bunu daha önce düşünmedik? Koşullu olarak yazdırdığımızdan, tam olarak doğru sayıda döngü yapmaya gerek olmadığından, yalnızca yeterli sayıda döngüden geçmemiz gerekir. Cevabımı geliştirmek için bu fikri ödünç alıyorum :-)
scottinet 21:17

1
@scottinet: Evet. Bunu düşündüğünüzde açık, ama bazen bu şeyleri kaçırmak kolaydır: P
Emigna 21:17

TFW clunky gereksiz cevap yol alır ...
Outgolfer Erik

7

C (gcc) , 89 84 bayt

Özyinelemeli sürümü kısa ;-)

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

Çevrimiçi deneyin!

C (gcc) , 107 102 101 100 99 bayt

@Jonathan Frech sayesinde boşlukları kullanarak ~ 2 byte kurtarıldı ve

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

Çevrimiçi deneyin!


2
Bence asıl soru noktalardan ziyade boşlukları çıkarmanızı istiyor. Boşluk kullanmanın bile bir avantajı var; Eğer yerini alabilir ==46ile <33uzay küçük basılabilir karakter olarak ve yalnızca bu başa çıkmak zorundadır.
Jonathan Frech

Ne yapar ++k+?
Jonathan Frech

@JonathanFrech Önceden artırır kve ekler ( k = k + 1; i = k + 1;veya ona eşdeğer olan) i = k + 2; k = k + 1.
HyperNeutrino 21:17

Teknik olarak i=k+++2da kullanacağım işe yarıyor çünkü +++garip görünüyor: P
HyperNeutrino

@HyperNeutrino Evet, ön artış operatörünün ne yaptığını biliyorum; Ancak kodun onsuz nasıl çalıştığını anlamıyorum . Bu yüzden gerçekten nasıl tanımlandığından ziyade hangi rolü oynadığını soruyordum.
Jonathan Frech

6

JavaScript (ES6) 92

@Yakınmacılar: Aşağıya 76 bayt uzunluğundaki diğer JS cevabına bir göz atın

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

Önde veya sonunda bir boşluk arayan bir döngü. Eğer bulunursa, boşluk ve çıktı dizesini kaldırın. Boşluk 2 kez bulunamadıysa, dur.

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>


Boşluğu kontrol ederek bir bayttan tasarruf edebilirsiniz <'!'. Snippet'inizin hala çalışmasını replacesağlamak için, işlevinize geçmeden önce boşluklarla dönem yapabilirsiniz .
Justin Mariner

@JustinMariner şimdi tamam, çünkü OP '' dan daha az karakter beklenmiyor. Teşekkür
edc65

6

Perl 5, 32 bayt

@Abigail nedeniyle 4 bayt kaydedildi .

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

Gerektiren -pl2 olarak sayılır, çağrılır -E.

Örnek Kullanım

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

Çevrimiçi deneyin!


Boşluk bırakmayan dizeler için düzgün çalışmıyor.
nwellnhof

print;s/^ //&&print,s/ $//&&print while/^ | $/-nbayrakla çalışır , ayrıca -lgerekli değildir
Nahuel Fouilleul 21:17

@nwellnhof düzeltildi.
primo

5

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

Kevin Cruijssen sayesinde -3 bayt

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

Çevrimiçi deneyin!


Golf oynamak için bazı şeyler: var e=1;while(n.Trim()!=n)-> for(var e=1;n.Trim()!=n;); if(n[0]==' ')->if(n[0]<33)
Kevin Cruijssen 21:17

İkinciyi düşündüm, ama ya test dizgisinde yeni satırlar varsa?
birisi

Tamam, <33OP'nin yeni eklenmiş kuralı nedeniyle mümkündür: " Dizginin yalnızca ASCII yazdırılabilir alanından ( 0x20için 0x7E) karakterler içereceğini varsayabilirsiniz "
Kevin Cruijssen 21:17

5

Java 8, 150 146 145 137 bayt

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

@Nevay'in değiştirdiği (f<1&s.charAt(0)<33)için -4 byte f+s.charAt(0)<33.
-1 kullanarak bayt !s.trim().equals(s)gelen hile @someone 'ın C # .NET cevap yerine s.matches(" .*|.* ").
-8 sayesinde bayt @Nevay tekrar değiştirerek !s.trim().equals(s)için s!=s.trim()çünkü String#trim"dönecektir beyaz boşluk kaldırılır Baştaki ve sondaki bu dizenin bir kopyasını veya bu dize eğer sahip hiçbir lider veya beyaz boşluk sondaki " Aynı, böylece referans kalır ve Aynı değeri kontrol etmek !=yerine, aynı referans olup olmadıklarını kontrol etmek için kullanılabilir .equals.

Açıklama:

Burada deneyin (veya daha görsel bir sürümünü denemek burada ile #yerine boşluk).

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 bayt) s=f+s.charAt(0)<33yerine kullanabilirsiniz (f<1&s.charAt(0)<33).
Nevay

1
(-8 bayt) s!=s.trim()yerine kullanabilirsiniz !s.trim().equals(s);.
Nevay


4

Jöle , 16 bayt

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

Çevrimiçi deneyin!

-2 Erik Outgolfer sayesinde bayt
-1 mil bayt sayesinde

açıklama

Ḋ=⁶Ḣ$¡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 Teşekkürler, düzenleme geliyor.
HyperNeutrino 21:17

Alternatif ters / kimlik komutları ile harika bir fikir!
Emigna

@Emigna Teşekkürler! : DI çoğunlukla sadece yeni çabuk kullanımı için bir bahane istedi ... heh: P
HyperNeutrino

ƭsadece zincir ikiden uzunsa bir nilada ihtiyaç duyar. ¹ṚƭBurada iyi çalışıyor.
mil,


3

Java (OpenJDK 8) , 161 147 146 bayt

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

Çevrimiçi deneyin!

@Kevin Cruijssen ! ' E -1 bayt teşekkürler !

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, silinmiş cevabını gördüm ve 150 baytımın altına düştüğünde merak etmiştim. ;)
Kevin Cruijssen 21:17

1
Tam olarak emin değilim, ama değiştirerek golf bir byte can düşünüyorum (u=32-x.charAt(l)>>-1)için(u=32-x.charAt(l)>>k)
Kevin Cruijssen

@KevinCruijssen Will değil iş, kolan 0her saniye yineleme.
Nevay

1
Evet, ama garip olan kısmı, TIO'nun bu değişiklikle birlikte tüm test durumları için doğru şekilde çalışması ve sonuç vermesiu . Ben de değişmez zaman -1için kiçin v. Olsa neden çalıştığını beri, kafam karıştı kdoğrusu olacaktır 0sonra k=~kS: ..
Kevin Cruijssen

1
@KevinCruijssen k=0Senaryo için: Eğer solda boşluk bırakılmışsa, uöncekiyle aynı değere sahip ( 0); solda boşluk kalmadıysa, ( ) olarak (k=~k)&~v|udeğerlendirir , böylece undefined (negatif) değeri farketmez ( ). -1|u~0&-1|uu-1|x==-1
Nevay

3

05AB1E , 25 17 bayt

-8 byte emigna'dan uçtan uca kontrol fikirini ödünç alarak

,v2F¬ðQi¦DNiR},}R

Çevrimiçi deneyin!

Daha az basit bir yaklaşımın bu çözümü kolayca yenebileceğinden eminim. Şimdilik...

açıklamalar:

,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

Döngü ile olan yaklaşımınızı beğendim :) Birden fazla ifs olmadan her şeyi bir seferde yapmanın bir yolunu bulmaya çalışıyorum, ancak henüz çözemedim. Ayrıca, açıklamanızdaki boşluk yerine boş bir dize var gibi görünüyor.
Emigna

Teşekkürler! Ben kullanarak kodumu golfed zaman parçası "boş" düzenlemek unuttum açıklama sabit Syerine #(-1 byte). Döngü ... peki ... basit bir yaklaşıma kıyasla 1 bayttan tasarruf sağlar. Şu anda görevin sonunu tespit etmek için daha kısa bir yol arıyorum (bunun için 5 bayt çoktur) ve ayrıca tamamen farklı bir yaklaşım düşünüyorum. Bu zorluğu çözmenin daha akıllıca bir yolu olduğunu düşünüyorum.
scottinet

Her şeyi tek seferde (denemek istediğim gibi) yapmaya çalışırsanız, döngüden çıkmak için
elimdeki

3

R , 145 133 111 bayt

@Giuseppe sayesinde -12 bayt, sonucu subyeni bir değişkende saklayarak ve değişip değişmediğini test ederek

-22 bayt newlines ile bir dize yerine bir dize vektörü döndürerek

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}

Çevrimiçi deneyin!

Kısmen ungolfed versiyonuyla ilgili açıklama:

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)ayrı bir baskı ifadesi yerine kullanamaz mısınız? Ah, hayır, çünküsep=" "
Giuseppe

@Giuseppe Evet, ekleme ihtiyacı nedeniyle hepsini tek bir ifadeye dahil etmenin biraz daha uzun sürdüğünü düşünüyorum sep="". Çoğu zorlukta ekstra boşluk olmaz, ama burada ne yazık ki var!
user2390246 21:17

133 bayt - kullanmayla ilgili bir şey subaz önce bunu önerdi, IDK neden
Giuseppe

@Giuseppe Çok zarif!
user2390246 21:17

Sadece L=sbir vektör dizgisi ayarlayıp döndürür müsünüz?
Giuseppe

3

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

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

Çevrimiçi deneyin!



Bu, şu anda "... dizeyi değiştirmeden çıkarmaz" değil ve satır aralığı olan ve sondaki boşluk olmayan girdilerde başarısız olur.
Nevay

1
Belki 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) kullanabilirsiniz (doğru gibi görünüyor, fakat fazla test etmedi).
Nevay

3

MATL , 21 16 bayt

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

Bu, daha fazla netlik için boşluk yerine nokta kullanır. Alanlar için yerine 46göre 32.

Çevrimiçi deneyin!

açıklama

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

Kabuğu , 23 22 bayt

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

Leo'ya -1 bayt için teşekkürler.

Çevrimiçi deneyin!

açıklama

İşlev `G`Igerçekten yerleşik olmalı ...

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

Güzel! Aslında, döngüsel olarak fonksiyonlar uygulamak için daha fazla yapıya ihtiyacımız var ... btw İlk boşluğu kaldırmak için daha kısa bir yol buldum: tio.run/##yygtzv7/v/…
Leo

@Leo Teşekkürler! Kullanmak ?
açıkçası

3

C ++, 196 193 189 186 183 bayt

Jonathan Frech sayesinde -10 bayt
, Zacharý sayesinde -3 bayt

#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 ile derleme, SDL kontrollerinin etkinleşmemesini gerektirir


Sen yerine mümkün olabilir ==32ile <33.
Jonathan Frech

C ++ ustası değilim, #include<string> gerçekte gerekli mi?
Jonathan Frech

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

@JonathanFrech Yaptıklarınız, standart tarafından garanti edilmeyen, özel olarak derleyiciydi. VC ++, dize açık bir şekilde dahil edilmeden << işleçlerinin tanımını bulamaz.
HatsuPointerKun

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

2

C # (.NET Core) , 176 170 bayt

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

Çevrimiçi deneyin!

Bu, @ birisinin cevabına bir alternatiftir ve sadece dizeleri doğrudan çıkarır.


Programınız, boşlukları kaldırmadan önce değiştirilmemiş dizeyi çıkarmaz.
Nathan.Eilisha Shiraini 21:17

@ Nathan.EilishaShiraini Bu hatayı düzelttim ve yine de bayt sayısını azaltmak için birkaç bayt golf yaptım.
BgrWorker

2

JavaScript (ES6), 76 bayt

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

Çok satırlı bir dizge olarak çıktı verir.

Test Kılıfları

Çoğu cevap gibi, boşluk yerine nokta kullanmak.



2

Octave , 88 83 bayt

Stewie Griffin sayesinde 5 bayt !

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

Çevrimiçi deneyin!


Çok hoş. "Her neyse, bir kaç bayt kaldırabilir misin " :-P
Stewie Griffin

@StewieGriffin Cevabınızı kastetmiştim ... :-D İyi fikir, teşekkürler!
Luis Mendo

Benimkini silebilirim ... Buna kıyasla çok sönük değil ...
Stewie Griffin

@StewieGriffin İşte iki bayt kaldırmak için bir fikir . Dinamik olarak küçültüldüğü miniçin ihtiyaç duyulan üzücüs
Luis Mendo

2

Linux için x86 makine kodu, 60 bayt

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

Bu Linux x86 için bir fonksiyondur. Bu dize giriş işaretçisi olarak alır edive içinde dize uzunluğu ebp.

Ungolfed, test edilecek bir altyapıya sahip (FASM ile derleyin, dizeyi program argümanı olarak çalıştırın; undress:gerçek işlev kodu için etiket arayın ):

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()yapar eax(özellikle sıfır olmayan 1o değil varsayarak, karakter sayısı yazılı -errno, So olacaktır) printAksi takdirde pop eaxsonunda. Sadece xor eax,eaxönce cmp byte [edi], ' 've kurtarabilirsin mov al,1, ve belki de eaxkurtarır / kurtarırsın. Gerçekte, gizlice geçene kadar saklamıyorsun SYS_WRITE. Hmm, yerine 0şunu kullanabilirsiniz SYS_WRITEvs 1beri cmp al, imm8aynı boyuttadır test al,al.
Peter Cordes

2. '\n'sırayı yapmak mov byte [ecx + edx], '\n'yerine diziye girebilir misiniz write()? (Yazdırma işleminden sonra uzunluğu azaltın mı?) Size birkaç talimatdan tasarruf etmenizi sağlayabilir.
Peter Cordes

Aslında, print()şu anda farklı olan, içeriye '\n'giren eax, SYS_WRITEhala kontrol edebilirsiniz. Tasarruf / geri yükleme yaptığınızı sanıyordum eax, ancak bu sadece sabit bir bayt kopyalayarak bayt tasarrufu oldu. Uzun dizeler için, sys_write()eax'in yüksek baytlarını sıfır olmayan olarak bırakabilir, böylece ne yazık ki sadece kullanım dışı kalır mov al, SYS_WRITE.
Peter Cordes

@PeterCordes aslında evet, yabancıydı mov al, 1. -2 bayt şimdi, teşekkürler.
Ruslan

Bir kayıt çağıran kongre size yükleme talimatlarını kaydeder. Kod golfünde, özel bir arama kuralı normalde asm için adil bir oyundur. OTOH, standart yığın argümanları arama kuralına uymayı tercih ediyorsanız, bu da ilginç.
Peter Cordes

2

PHP , 117 bayt

Başlangıçta fazladan bir boşluk eklerim, böylece boşluk bırakıp orijinali herhangi bir ekstra kod olmadan gösterecektir.

Bunun için biraz yeni ... <? Php ve PHP dosyasının başlangıcındaki alan 6 fazla bayt ekler mi yoksa bedavaya mı alırım?

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

Çevrimiçi deneyin!


1
Yönteminizi kullanarak 6 bayt azaltılabilir: Çevrimiçi deneyin!
Gece2

1
PHP'nin açılış etiketini ihmal edebilirsiniz, çünkü böyle bir komutla çalıştırabilirsiniz: php -r "echo 1;"Fakat böyle bir şey kullanmak <?=1;istiyorsanız, etiketi bayt sayımına dahil etmeniz gerekir.
Gece2

1

Pyth , 28 bayt

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

Burada dene! veya Tüm test durumlarını doğrulayın!

açıklama

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 bayt

@JonathanFrech sayesinde -1 bayt

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

Çevrimiçi deneyin!

Test takım cümledeki "."ile " "işlevini çağırmak ve cümledeki önce " "hiç geri "."netlik için sonuçlar yazdırmadan önce.


'!'*i and-> i*'!'and.
Jonathan Frech

1

C # - yine, 125 bayt

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

Şerefe!

Çevrimiçi deneyin!


PPCG'ye Hoşgeldiniz!
Laikoni,

1

Oktav , 89 bayt

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

Çevrimiçi deneyin!

Vaktim olduğunda daha sonra bir açıklama ekleyeceğim. Yaklaşımı tamamen değiştirirsem, bazı baytları golf oynayabilirim ama ne yazık ki göremiyorum.

Buradaki son harfler hecelendi: "sendendendendend". Keşke endbir değişken olarak saklamanın ve bunu kullanmanın bir yolu olsaydı , ama bil bakalım ne ...


İle çıktı almak için geçerli s = ...mi? (Her zamanki soru, biliyorum)
Luis Mendo

Her neyse, bakın bir kaç baytı kaldırabilir misin :-P
Luis Mendo

1

Bash, 98 94 bayt

Diziler yerine alt kabuk kullanılarak 4 bayt kurtarıldı (düşük performans)

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

İlk cevap

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

!İnteraktif modda kaçılması gerektiğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.