ปลดเชือก


48

ตอนนี้เรามีวิธีดึงสตริงออกจากช่องว่างแล้ว

อย่างไรก็ตามในฐานะสุภาพบุรุษ / สุภาพสตรีที่เหมาะสมเราควรถอดเสื้อผ้าออก


การถอดสายจะเหมือนกับการลอกให้ละเอียดยิ่งขึ้นเท่านั้น แทนที่จะลบช่องว่างนำหน้าและหลังทั้งหมดในคราวเดียวเราจะลบทีละช่อง นอกจากนี้เรายังสลับกันระหว่างการนำหน้าและต่อท้ายเพื่อไม่ให้ขั้นตอนการเบิร์นเสีย

ตัวอย่างเริ่มต้นด้วย" codegolf "(ห้าช่องว่างนำหน้าและต่อท้าย):

     codegolf     
    codegolf     
    codegolf    
   codegolf    
   codegolf   
  codegolf   
  codegolf  
 codegolf  
 codegolf 
codegolf 
codegolf

  1. ก่อนอื่นเอาท์พุทสตริงไม่เปลี่ยนแปลง จากนั้นส่งออกทุกขั้นตอน เริ่มต้นด้วยการลบช่องว่างนำหน้า (ถ้ามี - ดูกฎ # 2)

  2. อินพุตอาจมีช่องว่างนำหน้าและต่อท้ายจำนวนแตกต่างกัน หากคุณไม่มีที่ว่างในอีกด้านหนึ่งให้คลายอีกส่วนหนึ่งจนกว่าสตริงนั้นจะว่างเปล่า

  3. อินพุตอาจไม่มีช่องว่างนำหน้าหรือต่อท้าย หากเป็นกรณีนี้ให้ส่งออกตามที่เป็นอยู่

  4. ใช้ค่าเริ่มต้นฉันวิธีการ / O PPCG ของ PPCG ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม

  5. พฤติกรรมที่ไม่ได้กำหนดไว้ในอินพุตว่างหรืออินพุตที่มีช่องว่างเท่านั้นก็โอเค

  6. คุณสามารถสันนิษฐานได้ว่าสตริงจะมีอักขระจากพื้นที่พิมพ์ ASCII ( 0x20ถึง0x7E) เท่านั้น


ตัวอย่าง - ช่องว่างจะถูกแทนที่ด้วยจุด.เพื่อให้อ่านง่ายขึ้น:

4 leading spaces, 5 trailing: "....Yes, Sir!....."
....Yes, Sir!.....
...Yes, Sir!.....
...Yes, Sir!....
..Yes, Sir!....
..Yes, Sir!...
.Yes, Sir!...
.Yes, Sir!..
Yes, Sir!..
Yes, Sir!.
Yes, Sir!

6 leading, 3 trailing: "......Let's go golfing..."
......Let's go golfing...
.....Let's go golfing...
.....Let's go golfing..
....Let's go golfing..
....Let's go golfing.
...Let's go golfing.
...Let's go golfing
..Let's go golfing
.Let's go golfing
Let's go golfing

0 leading, 2 trailing: "Hello.."
Hello..
Hello.
Hello

0 leading, 0 trailing: "World"
World

21 leading, 5 trailing: ".....................a....."
.....................a.....
....................a.....
....................a....
...................a....
...................a...
..................a...
..................a..
.................a..
.................a.
................a.
................a
...............a
..............a
.............a
............a
...........a
..........a
.........a
........a
.......a
......a
.....a
....a
...a
..a
.a
a

สุภาพบุรุษ / สุภาพสตรีเป็นรัดกุมเพื่อให้คำตอบที่สั้นที่สุดในไบต์ชนะ



เราสามารถสมมติได้ว่าจะมีอักขระที่ไม่ใช่ช่องว่างอย่างน้อยหนึ่งตัว
Martin Ender

2
@KevinCruijssen คุณต้องจัดการอักขระ ASCII ในพื้นที่ที่สามารถพิมพ์ได้ ( 0x20ถึง0x7E) อีกอันคือพฤติกรรมที่ไม่ได้กำหนด
Nathan.Eilisha Shiraini

1
@KevinCruijssen ใช่จะไม่มีกรณีทดสอบเช่นนี้ จะไม่มีอะไรเหมือน" test\r "หรือ" \v test"อย่างใดอย่างหนึ่ง
Nathan.Eilisha Shiraini

1
นี่เป็นกรณีทดสอบที่ถูกต้อง".....................a....."หรือไม่? ถ้าเป็นเช่นนั้นฉันขอแนะนำให้เพิ่มเพราะคำตอบบางอย่างดูเหมือนว่าจะล้มเหลวในการทดสอบประเภทนี้ (จุดมีไว้เพื่อการอ่านที่ดีขึ้นแน่นอน)
Cinaski

คำตอบ:


11

เรติน่า 26 ไบต์

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

ลองออนไลน์! (ชุดทดสอบใช้ระยะเวลาเพื่อความชัดเจนส่วนท้ายและส่วนหัวจะแปลงเป็นและจากช่องว่างสำหรับรหัสหลัก)

คำอธิบาย

มันคงจะดีถ้าเราสามารถสลับระหว่างการลดพื้นที่นำหน้าและช่องว่างท้ายและพิมพ์ผลกลางในแต่ละครั้ง ปัญหาคือว่าในปัจจุบัน Retina ไม่สามารถพิมพ์แบบมีเงื่อนไขดังนั้นแม้จะพิมพ์ผลลัพธ์ระดับกลางนี้หากไม่มีส่วนนำหน้าหรือไม่มีช่องว่างต่อท้ายทำให้เกิดการซ้ำซ้อน (Retina 1.0 จะได้รับตัวเลือกที่พิมพ์ผลลัพธ์เฉพาะเมื่อมีการเปลี่ยนแปลงสตริงโดยการดำเนินการ แต่เรายังไม่ได้ ...

ดังนั้นเราจึงสร้างสตริงเดี่ยวที่มีผลลัพธ์ระดับกลางทั้งหมดและพิมพ์ในตอนท้าย

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

{ตัดทั้งสองขั้นตอนของโปรแกรมในวงที่ซ้ำจนกว่าสตริงหยุดการเปลี่ยนแปลง (ซึ่งหมายความว่าจะไม่มีชั้นนำ / ช่องว่างต่อท้ายซ้าย) สเตจนั้นตรงกับพื้นที่นำในบรรทัดสุดท้ายของสตริงและบรรทัดสุดท้ายแล้วเขียนการแข่งขันกลับรวมถึงเนื้อหาหลังช่องว่างในบรรทัดใหม่ (ดังนั้นจึงลดพื้นที่นำในสำเนา)

 $
 ¶$%`

การลบพื้นที่ต่อท้ายง่ายกว่าเล็กน้อย ถ้าเราเพียงแค่ตรงกับพื้นที่สุดท้ายเราสามารถเข้าถึงสิ่งที่อยู่ตรงหน้ามัน (ในบรรทัดเดียวกัน) ด้วยซึ่งเป็นตัวแปรบรรทัดตระหนักถึงการเปลี่ยนตัวคำนำหน้า$%`$`


11

Python 2 , 122 107 103 102 98 95 93 91 90 88 87 ไบต์

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

ลองออนไลน์!


Python 3 , 97 95 93 90 ไบต์

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

ลองออนไลน์!


การใช้s=input()ฟังก์ชั่นแทนจะใช้เวลาน้อยกว่าไบต์
Jonathan Frech

หมายถึง5. Undefined behaviour on empty input, or input that only contains spaces, is OK., 98 ไบต์
Jonathan Frech


@ JonathanFrech ฉันไม่เห็นเลย ขอบคุณ :)
TFeld

2
คุณสามารถใส่รหัส Python 2 เพิ่มเติมได้โดยแทนที่aด้วยฟังก์ชันในตัวidเพื่อประหยัดโดยไม่จำเป็นต้องกำหนดในตอนเริ่มต้น -2 ไบต์
LyricLy

7

Perl 6 , 55 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ @nwellnhof

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

ลองออนไลน์!

คำอธิบาย : ($_,{$++%2??S/" "$//!!S/^" "//}...*)เป็นลำดับไม่สิ้นสุดซ้ำที่เริ่มต้นด้วยสตริงเดิม ( $_) และองค์ประกอบต่อไปจะได้รับจากบล็อกที่เรียกว่าองค์ประกอบก่อนหน้า

บล็อกเองได้รับสตริงใน$_ตัวแปร โอเปอเรเตอร์S/(regex)/(string)/จะค้นหาการเกิดขึ้นครั้งแรกของ(regex)ใน$_แทนที่ด้วย(string)และส่งกลับผลลัพธ์ หากไม่มีการจับคู่ก็จะส่งคืนเนื้อหาของ$_ไม่เปลี่ยนแปลง เราใช้ผู้ประกอบการที่ประกอบไป?? !!ด้วยเงื่อนไข$++%2ซึ่งสลับไปมาระหว่างFalseและTrue( $เป็นตัวแปรอิสระที่สงวนเนื้อหาในการโทรไปยังบล็อก)

ในกรณีที่เลวร้ายที่สุด (ช่องว่างทั้งหมดด้านหนึ่งและอีก 1 ตัวอักษร) เราจะลบ 1 ช่องว่างออกทุก 2 ขั้นตอน ดังนั้นเราจึงมั่นใจได้ว่าในขั้นตอน 2 * (ความยาวของสตริง) ช่องว่างทั้งหมดจะถูกลบ เราจะใช้องค์ประกอบที่จำนวนมากจากลำดับ recursive ด้วย[^.comb*2]และในที่สุดก็ทิ้งซ้ำกัน (ซึ่งเกิดขึ้นเมื่อใดก็ตามที่พื้นที่ควรจะถูกลบออก แต่มันก็ไม่ได้มี) .uniqueด้วย สิ่งนี้จะคืนค่ารายการของสตริงที่มีการเว้นช่องว่าง


[^.comb*2]บันทึก 2 ไบต์ ด้วยเหตุผลบางอย่างใช้งานได้ แต่[^2*.comb]ไม่ได้ ไม่รู้ว่าทำไม การใช้ ternary ?? !!เพื่อเลือก regex จะบันทึกไบต์อื่น
nwellnhof

ขอบคุณ! ฉันพยายามและมันไม่ได้ทำงานดังนั้นฉันเพิ่งใช้[^2*.comb] [0..2*.comb]และขอบคุณที่ประกอบไปด้วยฉันแค่คิดว่ามันแพงเกินไปและมันก็ไม่ได้เกิดขึ้นกับฉันว่าฉันแทนที่มันด้วยบางสิ่งที่มีราคาแพงกว่า ...
Ramillies

7

05AB1E , 21 15 ไบต์

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

ลองออนไลน์!

คำอธิบาย ^

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

แดงฉันลองอะไรที่คล้ายกัน แต่ด้วยเหตุผลบางอย่างฉันแน่ใจว่าหัว / หางไม่ทำงานบนสายอักขระ จะต้องอ่านบันทึกการแก้ไขข้อผิดพลาด :-)
scottinet

1
@scottinet: ฉันเพิ่งพบวิธีที่จะได้รับรอบปลายตรวจสอบ :)
Emigna

โอ้ ... ทำไมเราไม่คิดเรื่องนั้นมาก่อน เนื่องจากเราพิมพ์แบบมีเงื่อนไขไม่จำเป็นต้องวนซ้ำตามจำนวนที่ถูกต้องเราจึงต้องวนซ้ำในเวลาที่เพียงพอเท่านั้น ฉันยืมความคิดนั้นเพื่อปรับปรุงคำตอบของฉัน :-)
scottinet

1
@scottinet: ใช่ เห็นได้ชัดเมื่อคุณคิดถึงมัน แต่บางครั้งก็ง่ายที่จะคิดถึงสิ่งเหล่านั้น: P
Emigna

TFW คำตอบที่ซ้ำซ้อน clunky ได้รับความเป็นผู้นำ ...
Erik the Outgolfer

7

C (gcc) , 89 84 ไบต์

เวอร์ชันแบบเรียกซ้ำนั้นสั้นกว่า ;-)

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

ลองออนไลน์!

C (gcc) , 107 102 101 100 99 ไบต์

บันทึก 2 ไบต์ด้วย @Jonathan Frech โดยใช้ช่องว่างและ ~

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

ลองออนไลน์!


2
ฉันคิดว่าคำถามต้องการให้คุณลบช่องว่างมากกว่าจุด แม้จะมีข้อได้เปรียบในการใช้ช่องว่าง คุณสามารถแทนที่==46ด้วย<33พื้นที่เป็นตัวพิมพ์ที่เล็กที่สุดและคุณต้องจัดการกับมัน
Jonathan Frech

อะไร++k+ทำอย่างไร
Jonathan Frech

@JonathanFrech มันก่อนเพิ่มขึ้นkและเพิ่มหนึ่งซึ่งเทียบเท่ากับหรือk = k + 1; i = k + 1; i = k + 2; k = k + 1
HyperNeutrino

ในทางเทคนิคi=k+++2ก็ใช้งานได้เหมือนกันซึ่งฉันจะใช้เพราะ+++รูปลักษณ์แปลก ๆ : P
HyperNeutrino

@HyperNeutrino ใช่ฉันรู้ว่าผู้ประกอบการเพิ่มขึ้นทำอะไร แม้ว่าผมจะไม่ได้รับวิธีการรหัสทำงานโดยไม่ได้ ดังนั้นฉันจึงถามว่ามันมีบทบาทอย่างไรมากกว่าที่มันจะถูกกำหนด
Jonathan Frech

6

JavaScript (ES6) 92

@Upvoters: ดูที่คำตอบ JS อื่น ๆ ด้านล่างที่มีความยาว76ไบต์

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

ลูปกำลังมองหาที่ว่างด้านหน้าหรือท้าย หากพบให้ลบช่องว่างและสตริงออก หากไม่พบช่องว่าง 2 ครั้งให้หยุด

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

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

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

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


<'!'คุณสามารถประหยัดไบต์โดยตรวจสอบพื้นที่ที่มี ในการทำให้ข้อมูลโค้ดของคุณยังคงใช้งานได้คุณสามารถปิดreplaceกั้นช่องว่างก่อนที่จะผ่านไปยังฟังก์ชั่นของคุณ
Justin Mariner

@JustinMariner ตกลงตอนนี้เนื่องจาก OP ระบุว่าไม่คาดว่าถ่านจะน้อยกว่า '' ขอบคุณ
edc65

6

Perl 5, 32 ไบต์

ที่บันทึกไว้ 4 ไบต์เนื่องจาก@Abigail

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

ต้อง-plนับเป็น 2 -Eเรียกด้วย

ตัวอย่างการใช้งาน

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

ลองออนไลน์!


ทำงานไม่ถูกต้องสำหรับสตริงที่ไม่มีช่องว่างต่อท้าย
nwellnhof

print;s/^ //&&print,s/ $//&&print while/^ | $/ทำงานกับ-nธง-lไม่จำเป็นต้องใช้
Nahuel Fouilleul

@nwellnhof แก้ไขแล้ว
โม่

5

C # (. NET Core) , 192 183 182 181 179 178 ไบต์

-3 ไบต์ขอบคุณ 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;}

ลองออนไลน์!


สิ่งที่ต้องตีกอล์ฟ: var e=1;while(n.Trim()!=n)-> for(var e=1;n.Trim()!=n;); if(n[0]==' ')->if(n[0]<33)
Kevin Cruijssen

ฉันคิดว่าอันที่สอง แต่ถ้าสตริงทดสอบมีการขึ้นบรรทัดใหม่
ใครบางคน

ตกลง<33เป็นไปได้เนื่องจากกฎที่เพิ่มใหม่ของ OP: " คุณสามารถสันนิษฐานได้ว่าสตริงจะมีอักขระจากพื้นที่ ASCII ที่สามารถพิมพ์ได้ ( 0x20ถึง0x7E) เท่านั้น "
Kevin Cruijssen

5

Java 8, 150 146 145 137 ไบต์

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

-4 ไบต์ขอบคุณที่@Nevayเปลี่ยนไป(f<1&s.charAt(0)<33) ไบต์ -1 โดยใช้เคล็ดลับจาก@someone C # .NET คำตอบ 'sแทน -8 ไบต์ขอบคุณ@Nevayอีกครั้งโดยเปลี่ยนเป็นเพราะจะส่งคืน " สำเนาของสตริงนี้ที่นำพื้นที่ว่างสีขาวนำหน้าและต่อท้ายหรือสตริงนี้หากไม่มีพื้นที่สีขาวนำหน้าหรือต่อท้าย " ดังนั้นการอ้างอิงยังคงเหมือนเดิมและสามารถใช้เพื่อตรวจสอบว่าพวกเขาเป็นข้อมูลอ้างอิงเดียวกันแทนที่จะตรวจสอบค่าเดียวกันf+s.charAt(0)<33
!s.trim().equals(s)s.matches(" .*|.* ")
!s.trim().equals(s)s!=s.trim()String#trim!=.equals

คำอธิบาย:

ลองได้ที่นี่ (หรือลองรุ่นภาพมากขึ้นที่นี่ด้วย#แทนช่องว่าง)

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

1
คุณสามารถใช้s=f+s.charAt(0)<33แทน(f<1&s.charAt(0)<33)(-4 ไบต์)
Nevay

1
คุณสามารถใช้s!=s.trim()แทน!s.trim().equals(s);(-8 ไบต์)
Nevay


4

เยลลี่ขนาด 16 ไบต์

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

ลองออนไลน์!

-2 ไบต์ขอบคุณ Erik the Outgolfer
-1 ไบต์ขอบคุณไมล์

คำอธิบาย

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

ḣ1Ḣ=⁶->=⁶Ḣ
Erik the Outgolfer

@EriktheOutgolfer ขอบคุณแก้ไขมา
HyperNeutrino

ไอเดียเจ๋งด้วยคำสั่งสลับของการย้อนกลับ / เอกลักษณ์!
Emigna

@ Emigna ขอบคุณ! : DI ส่วนใหญ่ต้องการเพียงข้ออ้างที่จะใช้ quick new ... heh: P
HyperNeutrino

ƭต้องการเพียง nilad หากเชนนั้นยาวกว่าสอง ¹Ṛƭทำงานได้ดีที่นี่
ไมล์


3

Java (OpenJDK 8) , 161 147 146 ไบต์

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

ลองออนไลน์!

-1 ไบต์ขอบคุณ@Kevin Cruijssen !

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

1
Hehe ฉันเห็นคำตอบที่ถูกลบของคุณและสงสัยว่าเมื่อคุณอยู่ต่ำกว่า 150 ไบต์ของฉันและจะยกเลิกการลบ ;)
Kevin Cruijssen

1
ฉันไม่แน่ใจทั้งหมด แต่ฉันคิดว่าคุณสามารถตีกอล์ฟด้วยการเปลี่ยน(u=32-x.charAt(l)>>-1)เป็น(u=32-x.charAt(l)>>k)
Kevin Cruijssen

@KevinCruijssen ไม่ทำงานkนั่นคือ0การวนซ้ำทุกวินาที
Nevay

1
ใช่ แต่ส่วนที่แปลกคือTIOทำงานและให้ผลลัพธ์ที่ถูกต้องสำหรับกรณีทดสอบทั้งหมดที่มีการเปลี่ยนแปลงuนี้ มันไม่ได้เมื่อฉันยังเปลี่ยน-1ไปสำหรับk vฉันสับสนว่าทำไมมันถึงใช้งานได้kจริง ๆเพราะจะกลายเป็น0หลังจากk=~k.. : S
Kevin Cruijssen

1
@KevinCruijssen สำหรับk=0สถานการณ์: หากด้านซ้ายมีช่องว่างเหลืออยู่จะuมีค่าเหมือนกับก่อนหน้า ( 0); หาก left ไม่มีช่องว่างเหลือให้(k=~k)&~v|uประเมินเป็น-1|u( ~0&-1|u) ดังนั้นค่าที่ไม่ได้กำหนด (ค่าลบ) ของuไม่สำคัญ ( -1|x==-1)
Nevay

3

05AB1E , 25 17 ไบต์

-8 ไบต์โดยการยืมความคิดที่ไม่จำเป็นสำหรับการตรวจสอบจาก Emigna

,v2F¬ðQi¦DNiR},}R

ลองออนไลน์!

ฉันค่อนข้างมั่นใจว่าวิธีการที่ตรงไปตรงมาน้อยกว่าสามารถเอาชนะโซลูชันนั้นได้อย่างง่ายดาย สำหรับตอนนี้...

คำอธิบาย:

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

ฉันชอบแนวทางของคุณกับลูป :) ฉันพยายามหาวิธีที่จะทำทุกอย่างในครั้งเดียวโดยไม่ต้องใช้หลายไอเอฟเอส แต่ฉันยังไม่ได้คิดออก นอกจากนี้คำอธิบายของคุณดูเหมือนจะมีสตริงว่างแทนที่จะเว้นวรรค
Emigna

ขอบคุณ! ฉันแก้ไขคำอธิบายฉันลืมที่จะแก้ไขส่วน "ว่างเปล่า" เมื่อฉันเล่นกอล์ฟรหัสของฉันใช้Sแทน#(-1 ไบต์) การวนซ้ำ ... ดี ... มันช่วยประหยัดขนาด 1 ไบต์เมื่อเปรียบเทียบกับวิธีการตรงไปตรงมา ฉันกำลังมองหาวิธีที่สั้นกว่าในการตรวจจับจุดจบของงาน (5 ไบต์สำหรับสิ่งนี้มีจำนวนมาก) และฉันก็กำลังพิจารณาแนวทางที่แตกต่างออกไปโดยสิ้นเชิง ฉันคิดว่ามีวิธีที่ฉลาดกว่าในการแก้ปัญหานี้
กอตติเนต์

หากคุณพยายามทำทุกอย่างในครั้งเดียว (ขณะที่ฉันกำลังตรวจสอบอยู่) การตรวจสอบที่ดีที่สุดที่ฉันมีเพื่อออกจากลูปคือ 8 ไบต์ ...
Emigna

3

R , 145 133 111 ไบต์

-12 ไบต์ขอบคุณ @Giuseppe โดยเก็บผลลัพธ์subไว้ในตัวแปรใหม่และทดสอบว่ามีการเปลี่ยนแปลงหรือไม่

-22 ไบต์โดยส่งคืนเวกเตอร์ของสตริงแทนที่จะเป็นสตริงที่มีบรรทัดใหม่

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

ลองออนไลน์!

คำอธิบายเกี่ยวกับเวอร์ชันที่ไม่ดีบางส่วน:

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

คุณไม่สามารถใช้C(s<-sub(),\n)แทนคำสั่งพิมพ์แยกต่างหากได้ อ๊ะไม่ใช่เพราะsep=" "
จูเซปเป้

@Giuseppe sep=""ใช่ฉันคิดว่ามันทำงานออกเล็กน้อยอีกต่อไปที่จะรวมทุกอย่างไว้ในคำเดียวเพราะความจำเป็นที่จะเพิ่ม ในความท้าทายส่วนใหญ่พื้นที่ท้ายสุดจะไม่สำคัญ แต่น่าเสียดายที่นี่!
user2390246

133 ไบต์ - บางอย่างเกี่ยวกับการใช้งานของคุณsubแนะนำสิ่งนี้ทำไม IDK
Giuseppe

@Giuseppe สง่างามมาก!
2390246

คุณสามารถตั้งค่าL=sและคืนค่าเวกเตอร์ของสตริงได้หรือไม่?
Giuseppe

3

Java (OpenJDK 8) , 137 125 121 120 124 ไบต์

s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}

ลองออนไลน์!


คำตอบที่ดี! สั้นเท่ากับคำตอบของฉันที่ 137 ไบต์ แต่คุณยังสามารถเล่นกอล์ฟ 12 ไบต์ได้เช่นนี้:s->{for(int i=0;s!=s.trim();)System.out.println(s=s.substring(s.charAt(0)<33?1-i%2:0,s.length()-(s.endsWith(" ")?i++%2:0)));}
Kevin Cruijssen

ปัจจุบันนี้ไม่ได้ "... เอาท์พุทของสตริงที่ไม่เปลี่ยนแปลง" และล้มเหลวในการป้อนข้อมูลด้วยช่องว่างนำหน้าและไม่มีช่องว่างต่อท้าย
Nevay

1
บางทีคุณสามารถใช้s->{int i=1;do System.out.println(s);while(s!=(s=s.substring(s.charAt(0)<33?i:(i=0),s.length()-(s.endsWith(" ")?i^=1:0))));}(124 ไบต์) (ดูเหมือนว่าจะถูกต้อง แต่ไม่ได้ทดสอบมาก)
Nevay

3

MATL , 21 16 ไบต์

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

สิ่งนี้ใช้จุดแทนการเว้นวรรคเพื่อความชัดเจนที่มากขึ้น สำหรับพื้นที่แทนที่โดย4632

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ขอบคุณ Leo สำหรับ -1 ไบต์

ลองออนไลน์!

คำอธิบาย

ฟังก์ชั่น`G`Iควรเป็นแบบในตัว ...

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

ดี! แน่นอนว่าเราต้องการบิวอินมากขึ้นสำหรับการใช้ฟังก์ชั่นแบบวนรอบ ... btw ฉันพบวิธีที่สั้นกว่าเล็กน้อยในการลบช่องว่างแรก: tio.run/##yygtzv7/v/…
Leo

@Leo ขอบคุณ! การใช้?ดูเหมือนจะชัดเจนในการเข้าใจถึงปัญหาหลัง ...
Zgarb

3

C ++, 196 193 189 186 183 ไบต์

-10 ไบต์ขอบคุณ Jonathan Frech
-3 ไบต์ขอบคุณ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;}};

การคอมไพล์ด้วย MSVC ต้องมีการยกเลิกการเปิดใช้งานการตรวจสอบ SDL


คุณอาจจะสามารถที่จะแทนที่ด้วย==32 <33
Jonathan Frech

ฉันไม่ใช่อาจารย์ C ++ แต่#include<string> จำเป็นจริงๆหรือ?
Jonathan Frech

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

@JonathanFrech สิ่งที่คุณทำมีเฉพาะคอมไพเลอร์ไม่ได้ถูกรับรองโดยมาตรฐาน VC ++ ไม่สามารถหาคำจำกัดความของตัวดำเนินการ << ได้โดยไม่มีการรวมสตริงไว้อย่างชัดเจน
HatsuPointerKun

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

2

C # (. NET Core) , 176 170 ไบต์

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

ลองออนไลน์!

นี่เป็นทางเลือกแทนคำตอบของใครบางคน @และเพียงแค่ส่งออกสตริงโดยตรง


โปรแกรมของคุณจะไม่ส่งออกสตริงที่ไม่ได้แก้ไขก่อนที่จะลบช่องว่าง
Nathan.Eilisha Shiraini

@ Nathan.EilishaShiraini ฉันแก้ไขข้อผิดพลาดนั้นและเล่นกอล์ฟสองสามไบต์เพื่อลดจำนวนไบต์ต่อไป
BgrWorker

2

JavaScript (ES6), 76 ไบต์

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

ส่งออกเป็นสตริงหลายบรรทัด

กรณีทดสอบ

ใช้จุดแทนการเว้นวรรคเนื่องจากคำตอบส่วนใหญ่กำลังทำอยู่



2

อ็อกเท88 88ไบต์

ปิด 5 ไบต์ด้วย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

ลองออนไลน์!


ดีมาก. "ต่อไปดูว่าคุณสามารถลบสองสามไบต์ " :-P
Stewie Griffin

@StewieGriffin ฉันหมายถึงคำตอบของคุณ ... :- ความคิดที่ดีขอบคุณ!
Luis Mendo

ฉันอาจจะลบฉัน ... มันปฏิภาณมากเมื่อเทียบกับนี้ ...
สตีวีกริฟฟิ

@StewieGriffin นี่ความคิดที่จะเอาสองไบต์ สงสารที่minจำเป็นเพราะsหดตัวแบบไดนามิก
Luis Mendo

2

รหัสเครื่อง x86 สำหรับ Linux, 60 ไบต์

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

นี่คือฟังก์ชั่นสำหรับ Linux x86 มันใช้เป็นตัวชี้เข้ากับสตริงในediและความยาวสตริงในebpและระยะเวลาในสตริงใน

Ungolfed พร้อมโครงสร้างพื้นฐานที่จะทดสอบ (คอมไพล์ด้วย FASM รันด้วยสตริงเป็นอาร์กิวเมนต์ของโปรแกรมค้นหาundress:เลเบลสำหรับโค้ดฟังก์ชันจริง):

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

sys_write()ทำให้eaxไม่ใช่ศูนย์ (โดยเฉพาะ1จำนวนตัวอักษรที่เขียนสมมติว่าไม่ใช่-errno) ดังนั้นจะprintทำอย่างไรถ้าคุณไม่pop eaxสิ้นสุด คุณสามารถทำได้xor eax,eaxก่อนcmp byte [edi], ' 'และบันทึกmov al,1และอาจมีบางeaxบันทึก / กู้คืน แม้ว่าคุณจะไม่จริงบันทึกไว้จนกว่าหลังจาก clobbering SYS_WRITEด้วย อืมแทน0คุณสามารถใช้SYS_WRITEเทียบกับ1ตั้งแต่เป็นขนาดเดียวกับcmp al, imm8 test al,al
Peter Cordes

คุณสามารถใส่'\n'อาเรย์ด้วยmov byte [ecx + edx], '\n'การทำลำดับที่ 2 ได้write()หรือไม่? (และลดความยาวหลังจากพิมพ์ได้หรือไม่) อาจช่วยให้คุณประหยัดคำแนะนำเล็กน้อย
Peter Cordes

อันที่จริงprint()ในปัจจุบันใบ'\n'ในeaxซึ่งจะแตกต่างจากSYS_WRITEเพื่อให้คุณยังคงสามารถตรวจสอบว่า ฉันคิดว่าคุณกำลังบันทึก / กู้คืนeaxแต่นั่นเป็นเพียงการบันทึกไบต์คัดลอกค่าคงที่รอบ ๆ สำหรับสายยาวsys_write()สามารถออกจากไบต์สูงของ EAX mov al, SYS_WRITEไม่ใช่ศูนย์เพื่อที่ว่าน่าเสียดายที่ออกกฎเพียงแค่ใช้
Peter Cordes

@PeterCordes ใช่จริงแล้วmov al, 1เป็นสิ่งภายนอก -2 ไบต์ตอนนี้ขอบคุณ
Ruslan

ระเบียบการเรียกใช้การลงทะเบียนจะช่วยให้คุณประหยัดคำแนะนำในการโหลด ใน code-golf การเรียกแบบกำหนดเองเป็นเกมที่ค่อนข้างปกติสำหรับ asm OTOH ถ้าคุณอยากเล่นกอล์ฟสแต็กการประชุมมาตรฐานที่น่าสนใจก็น่าสนใจเช่นกัน
Peter Cordes

2

PHP , 117 ไบต์

ฉันเพิ่มช่องว่างเพิ่มเติมในตอนเริ่มต้นเพื่อให้มีพื้นที่ว่างและแสดงต้นฉบับโดยไม่มีรหัสพิเศษใด ๆ

ค่อนข้างใหม่สำหรับสิ่งนี้ ... <? php และพื้นที่ที่จุดเริ่มต้นของไฟล์ PHP จะเพิ่ม 6 ไบต์พิเศษหรือฉันจะได้รับสิ่งนั้นฟรีหรือไม่

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

ลองออนไลน์!


1
การใช้วิธีลดขนาด 6 ไบต์: ลองออนไลน์!
Night2

1
คุณสามารถละเว้นแท็กเปิดของ PHP ได้เนื่องจากคุณสามารถเรียกใช้ด้วยคำสั่งดังนี้: php -r "echo 1;"แต่ถ้าคุณต้องการใช้บางอย่างเช่น<?=1;คุณต้องรวมแท็กด้วยจำนวนไบต์
Night2

1

Pyth , 28 ไบต์

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

ลองที่นี่! หรือตรวจสอบกรณีทดสอบทั้งหมด!

คำอธิบาย

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

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

1

Python 2 , 79 ไบต์

-1 ไบต์ขอบคุณ @JonathanFrech

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

ลองออนไลน์!

ชุดทดสอบจะแทนที่"."ด้วย" "ก่อนที่จะเรียกใช้ฟังก์ชันและแทนที่" "กลับไป"."ก่อนพิมพ์ผลลัพธ์เพื่อความชัดเจน


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


1

อ็อกเทฟ , 89 ไบต์

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

ลองออนไลน์!

ฉันจะเพิ่มคำอธิบายในภายหลังเมื่อฉันมีเวลา ฉันอาจตีกอล์ฟบางไบท์ได้ถ้าฉันเปลี่ยนวิธีการอย่างสมบูรณ์ แต่ฉันไม่สามารถดูว่าน่าเสียดาย

ตัวอักษรตัวสุดท้ายที่นี่สะกด: "sendendendend" ฉันหวังว่าจะมีวิธีเก็บendเป็นตัวแปรและใช้สิ่งนั้น แต่เดาว่า ...


ใช้ได้กับเอาต์พุตs = ...หรือไม่ (คำถามปกติฉันรู้)
Luis Mendo

อย่างไรก็ตามดูว่าคุณสามารถลบสองสามไบต์ :-P
Luis Mendo

1

ทุบตี, 98 94 ไบต์

บันทึก 4 ไบต์โดยใช้ subshell แทนที่จะเป็นซีเควนซ์ (ประสิทธิภาพต่ำ)

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

คำตอบแรก

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

โปรดทราบว่า!จะต้องหลีกเลี่ยงในโหมดโต้ตอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.