ทำแท่งน้ำแข็งคำ


45

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

ทำ

Word Icicle!
Word Icicle 
Word  cicle 
 ord  cicle 
 ord   icle 
 ord   i le 
 or    i le 
 or    i l  
 or      l  
 or         
  r         

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

  1. พิมพ์สถานะปัจจุบันของสตริง

  2. แทนที่อักขระที่เล็กที่สุดของคำ (นอกเหนือจากช่องว่าง) ด้วยช่องว่าง หากมีเน็คไทให้เปลี่ยนตัวละครซ้ายสุด

  3. ทำซ้ำในบรรทัดที่ต่อเนื่องกันจนกว่าสตริงจะมีอักขระที่ไม่ใช่ช่องว่างเพียง 1 ตัว

สิ่งนี้จะสร้างเอฟเฟกต์ที่สตริงอินพุตดูเหมือนว่ากำลังละลาย ...

I'm Melting!!!
I'm Melting !!
I'm Melting  !
I'm Melting   
I m Melting     
  m Melting   
  m  elting   
  m   lting   
  m   ltin    
  m   lt n    
  m    t n    
       t n    
       t      

กฎระเบียบ

  • หลังจากทำซ้ำสองสามครั้งผลลัพธ์ของคุณจะมีช่องว่างต่อท้ายในแต่ละบรรทัดอย่างแน่นอน หากคุณเลือกที่จะตัดทอนสิ่งเหล่านี้จะอนุญาต

  • คุณอาจมีหนึ่งบรรทัดต่อท้ายที่ว่างเปล่า แต่ไม่เกิน

  • โปรดจำไว้ว่าอินพุตอาจมีหลายช่องว่าง แต่สิ่งเหล่านี้จะถูกข้ามอย่างมีประสิทธิภาพ ตัวอย่างเช่นอินพุตa aควรให้

    a      a
           a
    
  • คุณสามารถรับอินพุตเป็นรายการสตริงได้หากต้องการ สำหรับเอาต์พุตคุณอาจส่งคืนหรือพิมพ์รายการสตริงสตริงเดี่ยวที่มีบรรทัดใหม่หรืออาร์เรย์เมทริกซ์ถ่าน / 2D โดยทั่วไปแล้วฉันชอบรูปแบบ IO ที่อนุญาตดังนั้นรูปแบบอื่น ๆ จะได้รับอนุญาตได้มากที่สุดตราบใดที่มีความสอดคล้องและสอดคล้องกับเอาต์พุตที่ถูกต้องอย่างชัดเจน หากมีข้อสงสัยอย่าลังเลที่จะถาม ตามปกติอนุญาตให้โปรแกรมหรือฟังก์ชั่นเต็มรูปแบบได้

  • โปรดจำไว้ว่านี่คือการแข่งขันเพื่อให้ได้คำตอบที่สั้นที่สุดในภาษาใด ๆ ! หากคุณเลือกที่จะตอบใน Java ลองทำคำตอบ Java ที่สั้นที่สุด (เป็นไบต์) ที่คุณสามารถทำได้

กรณีทดสอบ

Hello World! -->

Hello World!
Hello World 
 ello World 
 ello  orld 
 ello  orl  
  llo  orl  
   lo  orl  
    o  orl  
    o  or   
       or   
        r   


AbCdEfGhIjKlMnOpQrStUvWxYz -->

AbCdEfGhIjKlMnOpQrStUvWxYz
 bCdEfGhIjKlMnOpQrStUvWxYz
 b dEfGhIjKlMnOpQrStUvWxYz
 b d fGhIjKlMnOpQrStUvWxYz
 b d f hIjKlMnOpQrStUvWxYz
 b d f h jKlMnOpQrStUvWxYz
 b d f h j lMnOpQrStUvWxYz
 b d f h j l nOpQrStUvWxYz
 b d f h j l n pQrStUvWxYz
 b d f h j l n p rStUvWxYz
 b d f h j l n p r tUvWxYz
 b d f h j l n p r t vWxYz
 b d f h j l n p r t v xYz
 b d f h j l n p r t v x z
   d f h j l n p r t v x z
     f h j l n p r t v x z
       h j l n p r t v x z
         j l n p r t v x z
           l n p r t v x z
             n p r t v x z
               p r t v x z
                 r t v x z
                   t v x z
                     v x z
                       x z
                         z


PPCG is da BEST --> 

PPCG is da BEST
PPCG is da  EST
PP G is da  EST
PP G is da   ST
PP   is da   ST
 P   is da   ST
     is da   ST
     is da    T
     is da     
     is d      
     is        
      s        


({({})({}[()])}{}) -->

({({})({}[()])}{})
 {({})({}[()])}{})
 { {})({}[()])}{})
 { {}) {}[()])}{})
 { {}) {}[ )])}{})
 { {}  {}[ )])}{})
 { {}  {}[  ])}{})
 { {}  {}[  ] }{})
 { {}  {}[  ] }{} 
 { {}  {}   ] }{} 
 { {}  {}     }{} 
   {}  {}     }{} 
    }  {}     }{} 
    }   }     }{} 
    }   }     } } 
        }     } } 
              } } 
                } 

1
"เล็กสุดศัพท์" หมายถึงจุดรหัส?
จูเซปเป้

1
@Giuseppe ใช่ตัวละครที่มีจุดโค้ด ASCII ที่เล็กที่สุด (นอกเหนือจากที่ว่างอย่างเห็นได้ชัด)
DJMcMayhem

2
เตือนฉันถึงความท้าทายอีกอย่างที่เราต้องคิดว่าฉันต้องทำซ้ำตัวละครในแนวตั้งโดยใช้ดัชนีของมันเป็นตัวอักษร
ปุย

6
@Shaggy คุณอาจคิดว่าการทำให้บางตัวอักษรฝน
เรนโบล

2
อ้างอิงถึง MediaWiki แม้ว่า ...
Erik the Outgolfer

คำตอบ:



8

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

/\S/+¶<~(O`.
0L$`\S
0`$\$&¶ 

ลองออนไลน์! คำอธิบาย:

/\S/+

ทำซ้ำในขณะที่ค่าอินพุตไม่ว่างเปล่า

¶<

พิมพ์ค่าปัจจุบัน

~(

ดำเนินการส่วนที่เหลือของสคริปต์กับค่า จากนั้นรันผลลัพธ์ของสคริปต์นั้นเป็นสคริปต์บนค่า

O`.

เรียงอักขระตามลำดับ

0L$`\S
0`$\$&¶ 

เลือกอักขระที่ไม่ใช่ช่องว่างตัวแรกและส่งออกโปรแกรม Retina ที่แทนที่ตัวอักษรแรก ( $\) ที่เกิดขึ้นของตัวละครนั้น ( $&) ด้วยช่องว่าง (เว้นวรรคต่อท้ายในรหัสต้นฉบับ)


6

APL (Dyalog Unicode) , 18 11 ไบต์

∪∘↓∘⍉⍋∘⍋⍴⌸⊢

ลองออนไลน์!

ใช้⎕io←1; ส่งกลับอาร์เรย์ของสตริง (เวกเตอร์ของตัวละครเวกเตอร์ตัวละคร)


คือจำเป็น?
Kritixi Lithos

@Cockquack ใช่มิฉะนั้นแถวสองสามแถวแรกของเอาต์พุตอาจเหมือนกัน
ngn

@Cowsquack ขอบคุณฉันไม่ได้สังเกตเห็นว่า
ngn

โชคดีที่แก้ไขนี้นำไปสู่การแก้ปัญหาที่สั้นกว่า :)
NGN

เป็นการใช้งานที่ดีจริงๆ⍋∘⍋:)
Kritixi Lithos

6

05AB1E , 9 ไบต์

ðм{v=yð.;

ลองออนไลน์!

คำอธิบาย

ð      # Push space
м      # Implicit input. Remove spaces
{      # Sort. Gives string of sorted, non-space chars
v      # For each char in that string
  =    #   Print latest string, without popping. The first time it prints the input
  y    #   Push current char
  ð    #   Push space
  .;   #   Replace first occurrence of current char by space
       # Implicitly end for-each loop

1
{ðKv=yð.;เป็นของฉันเป็นคนดี
Magic Octopus Urn

@ MagicOctopusUrn Heh คล้ายกันมาก
Luis Mendo

1
@MagicOctopusUrn ที่จริงแล้วมันจะยังคงเป็น 9 ไบต์เดียวกันในรุ่น 05AB1E ล่าสุด .. :แทนที่อักขระทั้งหมดแทนที่จะเป็นอักขระ.;แรกที่แทนที่ (เช่นดูว่า 7-byter ของคุณทำกับอะไร!ในกรณีทดสอบ) นอกจากนี้ความท้าทายระบุไว้อย่างชัดเจนว่าไม่รวมช่องว่างดังนั้น 7-byter ของคุณจะไม่ทำงานสำหรับการป้อนข้อมูลด้วยช่องว่างหลายช่อง PS: คำตอบที่ดีหลุยส์! +1 จากฉัน :)
Kevin Cruijssen

1
@KevinCruijssen ปล่อยให้ฉันลืมว่าทำไมฉันต้องใช้.;ในตอนแรก ฉันจำได้ว่าต้องดิ้นรนกับสิ่งนั้นในวันที่ 1 พฤษภาคมเมื่อต้นปีที่แล้วตอนนี้ที่คุณพูดถึงมัน
Magic Octopus Urn

1
@LuisMendo ดีคำสั่งที่คุณใช้ในคำตอบนี้ไม่มีการเปลี่ยนแปลงในการเขียน Elixir ของ 05AB1E :)
Kevin Cruijssen


5

sed -rn , 142 143ไบต์

:a
p
s/$/	ABCDEFGHIJKLMNOPQRSTUVWXYZ/
s	\w+$	!"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_`\L&{|}~	
:b
/(.).*	\1/!s/	./	/
tb
s/(.)(.*)	\1.*/ \2/
ta

ลองออนไลน์!

(หมายเหตุ: มีแท็บในโปรแกรม)

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

การใช้ sed 4.2.2 จะลดจำนวน bytec ลง 2 เนื่องจากจะช่วยให้ใช้ป้ายกำกับที่ไม่มีชื่อลองออนไลน์ได้!


-r เปิดใช้งานนิพจน์ทั่วไปที่ขยายเพิ่ม (นักกอล์ฟ)

-n ปิดใช้งานการพิมพ์พื้นที่รูปแบบโดยนัยในตอนท้ายของโปรแกรม

พื้นที่รูปแบบเริ่มต้นด้วยอินพุต

:aเลเบลaนี่คือลูปโปรแกรมหลัก

p พิมพ์พื้นที่รูปแบบ (ชื่อแฟนซีสำหรับบัฟเฟอร์)

ตอนนี้เราต่อท้ายชุดอักขระ ASCII ที่พิมพ์ได้ (ยกเว้นช่องว่าง)

s/$/ ABCDEFGHIJKLMNOPQRSTUVWXYZ/ ผนวกแท็บซึ่งทำหน้าที่เป็นตัวคั่นขนาด 1 ไบต์ตามด้วยตัวอักษรตัวพิมพ์ใหญ่

s<tab>ทดแทน (sed สามารถใช้ตัวละครใด ๆ เป็นตัวคั่นในกรณีนี้แท็บที่ใช้ในการบันทึกไบต์จากการหลบหนี/)

  • \w+$ ตัวอักษรตัวพิมพ์ใหญ่ที่เราเพิ่งต่อท้าย

  • <tab> กับ

  • !"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_\`\L&{|}~<tab>ส่วนที่เหลือของตัวอักษรโปรดทราบว่า\L&เป็นตัวพิมพ์เล็กของตัวอักษรตัวพิมพ์ใหญ่

:bเลเบลbลบอักขระออกจากชุดเริ่มต้นที่ไม่มีอยู่ในอินพุต

/(.).* \1/! หากอักขระตัวแรกจากชุด ASCII ไม่ได้อยู่ในอินพุต

  • s/ ./ / ย้ายมัน

tbทำซ้ำbจนกระทั่งการทดแทนล้มเหลว

s/(.)(.*) \1.*/ \2/ แทนที่อักขระตัวแรกในชุด ASCII ที่มีอยู่ในอินพุตด้วยช่องว่างและลบชุด ASCII

ta recurse


การจับคู่ที่ไม่โลภจะเป็นประโยชน์จริง ๆ ที่นี่ แต่ฉันสามารถหาสิ่งที่หลอกsedพอที่จะบันทึกอย่างน้อย 4 ไบต์: ลองออนไลน์!
Neil

(วัวต้มตุ๋นออกมาชี้ว่าผมเป็นเพียงบางส่วนสามารถที่จะหลอก sed ที่ผมเอาตัวละครเหมือนกันในคำสั่งที่ไม่ถูกต้อง.)
นีล

4

Ruby , 60 58 55 47 ไบต์

->a{[-a]+a.scan(/\S/).sort.map{|x|a[x]=' ';-a}}

ลองออนไลน์!


คุณสามารถสลับa-b=[' ']และa-bรับไบต์ -2 ได้อย่างรวดเร็ว
benj2240

ใช่ขอบคุณสำหรับสิ่งนั้น แต่ตอนนี้ฉันได้เปลี่ยนวิธีการเล็กน้อยดังนั้นจึงไม่ใช้อีกต่อไป
Kirill L.

ฉันชอบแนวทางใหม่!
benj2240

4

R , 140 100 ไบต์

-40 ไบต์ขอบคุณ Giuseppe!

function(x)for(i in any((z=utf8ToInt(x))<33):max(y<-rank(z,,"f"))){z[y==i]=32
cat(intToUtf8(z),"
")}

ลองออนไลน์!

วิธีการแก้ปัญหาที่ใช้outerและความมหัศจรรย์ของ Giuseppe ในการทำงานอย่างถูกต้องมีความยาว 104 ไบต์ แรงบันดาลใจจากคำตอบนี้

function(x,z=utf8ToInt(x)-32)apply(t(outer(rank(z,,"f"),(2-(min(z)>0)):nchar(x),">=")*z+32),1,intToUtf8)

ลองออนไลน์!


109 ไบต์รับอินพุตเป็นเวกเตอร์ของตัวอักษร
Giuseppe

1
100 ไบต์รับอินพุตเป็นสตริง!
Giuseppe

ยังเป็นคำตอบที่ดีมาก ของฉันมีลูกโป่งพุ่งไปที่ 200 ไบต์ตั้งแต่ฉันจำไม่ได้rank!
Giuseppe

@Giuseppe บอกฉันเกี่ยวกับมัน - ฉันลอง "สั่งซื้อ" เป็นครั้งแรกสำหรับผลลัพธ์ที่กำลังละลาย แต่ไม่ได้อยู่ในลำดับที่ถูกต้อง!
JayCe

@Giuseppe และความพยายามของฉันในการใช้แรงบันดาลใจภายนอกโดยโพสต์ของคุณจัดการเพื่อลบช่องว่างทั้งหมดเท่านั้น TIOฉันชอบที่จะเห็นวิธีการทำงานด้านนอกที่โพสต์เป็นคำตอบที่แยกต่างหาก ยังคงใช้งานได้ แต่อาจไม่สง่างาม
JayCe

3

Python 3 , 71 ไบต์

f=lambda a:[*a.strip()]and[a]+f(a.replace(min(a.replace(*" ~"))," ",1))

ลองออนไลน์!

-4 ไบต์ขอบคุณจาก ovs


บันทึก 2 ไบต์โดยใช้*bool({*a}-{" "})แทนif{*a}-{" "}else[a]
RootTwo

@RootTwo จะไม่ส่งผลให้RecursionErrorหรือไม่
ovs

@RootT if/elseทางลัดสองทาง แต่*boolไม่ทำเช่นนั้นใช่ recursionerror อย่าง
ovs

แน่นอนคุณถูกต้อง เนื่องจากข้อผิดพลาดฟังก์ชั่นของฉันซ้ำโดยการเรียกใช้ฟังก์ชั่นของคุณดังนั้นมันจึงดูเหมือนว่าจะทำงาน
RootTwo

3

Python 2 , 70 69 66 64 ไบต์

def f(s):print s;S=set(s)-{' '};S and f(s.replace(min(S),' ',1))

ลองออนไลน์!

ขอบคุณสำหรับ 2 ไบต์จากovsผ่านการใช้S and f()แทนif S:f()


คุณไม่มี...If there is a tie, replace the leftmost character...กฎคุณสามารถแก้ไขได้ด้วยreplace(min(...),' ',1)
Rod

@Rod: Ah! ได้รับมัน ...
Chas บราวน์

3

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

ẋ"ỤỤ$z⁶Q

ลองออนไลน์!

ความคิด

แนวคิดพื้นฐานคือการสร้างคอลัมน์ของผลลัพธ์ที่ต้องการโดยตรงแทนที่จะจัดการกับสตริงและส่งกลับผลลัพธ์ระดับกลางทั้งหมด

เราเริ่มต้นด้วยการนับจำนวนอักขระของสตริงอินพุตตามลำดับที่จะถูกลบออก ในขณะนี้เราจะทำเป็นช่องว่างจะถูกลบเช่นกัน

tee ay oh
845139276

ตอนนี้เราสร้างคอลัมน์โดยการทำซ้ำอักขระแต่ละตัวด้วยดัชนีในการแจงนับนี้

tee ay oh
tee ay oh
tee ay oh
tee  y oh
t e  y oh
t    y oh
t    y o 
t    y   
     y   

สิ่งที่เหลืออยู่คือการลบรายการที่ซ้ำกันไปยังบัญชีสำหรับช่องว่าง

รหัส

ẋ"ỤỤ$z⁶Q  Main link. Argument: s (string)

    $     Combine the two links to the left into a chain.
  Ụ       Grade up; sort the indices of s by their corresponding values.
          Let's call the result J.
          Grade up again, sorting the indices of J by the corr. values in J.
          This enumerates the positions of s as described before.
ẋ"        Repeat each character of s that many times.
     z⁶   Zip the resulting 2D array, filling missing characters with spaces.
       Q  Unique; deduplicate the array of rows.

3

Perl 5 -n , 37 34 ไบต์

วางสามไบต์ด้วยความช่วยเหลือจาก @TonHospel

say&&s/\Q$a/ / while($a)=sort/\S/g

ลองออนไลน์!


อ่าดีมากเข้าใกล้กว่ามาก! ฉันคิดว่าคุณจำเป็นต้องมี\Qแม้ว่าสำหรับกรณีทดสอบครั้งสุดท้าย .... ฉันพลาดเช่นกันเป็นครั้งแรก!
Dom Hastings

คุณถูก. เพิ่มมัน
Xcali

say&&s/\Q$a/ / while($a)=sort/\S/gสั้น: จัดการได้อย่างถูกต้องอีกด้วย0
Ton Hospel

3

JavaScript, 67 66 65 ไบต์

เพราะฉันไม่ได้เมาเหล้าสักครู่!

s=>[...t=s].sort().map(x=>x>` `?t+=`
${s=s.replace(x,` `)}`:0)&&t

ลองออนไลน์

ขอบคุณ DanielIndie สำหรับการชี้ให้เห็น 4 ไบต์ซ้ำซ้อนที่รวมเบียร์!


ทำไมคุณถึงระบุ y ในแผนที่? : P สามารถสร้างได้ 67
DanielIndie

@DanielIndie เพราะเบียร์! : D ขอบคุณสำหรับการชี้ให้เห็น
ปุย

ใช่ฉันคิดว่าจะเป็นอย่างนั้น: P
DanielIndie

3

K (ngn / k) , 26 24 ไบต์

{?(,x),x{x[y]:" ";x}\<x}

ลองออนไลน์!


สวย! ความพยายาม K ของฉันมาที่ 41: `{. [x; (- 1 + # x) & x? _ci & / _ ic x _dv" ";:;" "]}}` ฉันกำลังสูญเสียไบต์ที่แปลงเป็น ints และย้อนกลับและทำให้ แน่ใจว่ามันจะไม่ออกนอกขอบเขต
uryga

@uryga ขอบคุณ หากฉันได้ดำเนินการฉายอย่างถูกต้องน่า{@[x;y;:;" "]}จะเป็น@[;;:;" "]ไปได้ คุณใช้ k รุ่นไหน ฉันไม่คุ้นเคยกับสิ่งเหล่านี้: _ci _ic _dv.
ngn

ฉันคิดว่ามันคือ 2.8-ish? ฉันใช้ล่าม Kona ซึ่งให้บริการตัวดำเนินการเป็น builtins: char-of-int, int-of-char, delete-value
uryga

2

C # (Visual C # Interactive คอมไพเลอร์) , 129 ไบต์

var s=ReadLine();while(s.Any(c=>c!=32)){WriteLine(s);var i=s.IndexOf(s.Min(c=>c==32?(char)999:c));s=s.Remove(i,1).Insert(i," ");}

ลองออนไลน์!


c!=32สามารถc>32; c==32สามารถc<33; และ(char)999สามารถเป็น'¡'(หรืออักขระอื่นใดที่อยู่เหนือช่วง Unicode ASCII ที่พิมพ์ได้)
Kevin Cruijssen

โอ้และคุณสามารถบันทึกอีกสองไบต์ที่เปลี่ยนwhileไปเป็นforและวางvar s=ReadLine()และs=s.Remove(i,1).Insert(i," ")อยู่ข้างในได้
Kevin Cruijssen

2

Perl 5กับ-nlF/\s|/, 39 ไบต์

@F=sort@F;say,s~\Q$F[$F++]~ ~ while/\S/

นี่อาจเป็นการผลักดันขอบเขตของการตั้งค่าสถานะของ Perl ไม่นับถ้าเป็นเช่นนั้นฉันจะย้อนกลับไปยังคำตอบก่อนหน้า

ลองออนไลน์!


รับลงไปที่ 35 ไบต์โดยมีเพียง-nธง: codegolf.stackexchange.com/questions/162161/make-a-word-icicle/ …
Xcali

2

Haskell , 67 ไบต์

บันทึกได้ 12 ไบต์ขอบคุณ Laikoni

f s|(a,_:b)<-span(/=minimum(id=<<words s))s=putStrLn s>>f(a++' ':b)

ลองออนไลน์!

อันนี้สิ้นสุดลงในข้อผิดพลาด

Haskell , 83 79 ไบต์

g(a,_:b)=a++' ':b
mapM_ putStrLn.(iterate$g.(span=<<(/=).minimum.concat.words))

ลองออนไลน์!

อันนี้สิ้นสุดลงในข้อผิดพลาด

Haskell , 86 ไบต์

u=concat.words
g(a,_:b)=a++' ':b
(take.length.u)<*>(iterate$g.(span=<<(/=).minimum.u))

ลองออนไลน์!

Haskell , 100 91 88 ไบต์

u=concat.words
f x|(a,_:b)<-span(/=minimum(u x))x=a++' ':b
(take.length.u)<*>(iterate f)

ลองออนไลน์!


67 ไบต์: f s|(a,_:b)<-span(/=minimum(id=<<words s))s=putStrLn s>>f(a++' ':b) ลองออนไลน์!
Laikoni

@Laikoni ขอบคุณ! ฉันเพิ่งจะถึงบางสิ่งเช่นนั้นและฉันก็หลับไป อย่างไรก็ตามฉันไม่คิดว่าฉันจะคิดขึ้นมาได้id=<<ว่ามันเป็นสิ่งที่ฉลาดมาก
Wheat Wizard


2

K4 , 28 20 18 ไบต์

วิธีการแก้:

?x{x[y]:" ";x}\<x:

ตัวอย่าง:

q)k)?x{x[y]:" ";x}\<x:"PPCG is da BEST"
"PPCG is da BEST"
"PPCG is da  EST"
"PP G is da  EST"
"PP G is da   ST"
"PP   is da   ST"
" P   is da   ST"
"     is da   ST"
"     is da    T"
"     is da     "
"     is d      "
"     is        "
"      s        "
"               "

คำอธิบาย:

มันเป็นสิ่งเดียวกับที่ngnทำ ค้นหาดัชนีที่จะส่งผลให้มีรายการจากน้อยไปมาก, เขียนทับพวกเขาแบบหนึ่งต่อหนึ่งด้วย" ", จากนั้นใช้ความแตกต่างเพื่อลบบรรทัดที่ซ้ำกัน:

?x{x[y]:" ";x}\<x: / the solution
                x: / save input as x
               <   / return indices that would result in ascending sort
 x{        ; }\    / two-line lambda with scan
        " "        / whitespace
       :           / assignment
   x[y]            / x at index y
            x      / return x
?                  / distinct

2

gcc 32-bit, 66 65 bytes

char*p,i;f(a){for(i=32;i++;)for(p=a;*p;)*p==i?puts(a),*p=32:++p;}
main(){char s[]="3.1415926";f(s);}

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


*p==i?...:0;*p-i?0:...;อาจจะเป็น
Jonathan Frech

@JonathanFrech ไม่มันยาว 1 ไบต์ (แม้ว่า*p-1||(...)จะมีความยาวเท่ากัน)
l4m2

ขออภัยไม่รู้จักความสำคัญในการใช้เครื่องหมายจุลภาคร่วมกัน แต่นี้อาจจะมี 65 ไบต์ ฉันยังไม่ทราบว่าf(a)คอมไพล์อย่างที่aควรจะเป็นแบบไหนchar*แต่ฉันคิดว่ามันเกี่ยวข้องกับการใช้ gcc 32- บิตของคุณ
Jonathan Frech

@ JonathanFrech ฉันคิดว่าchar*p,i;f(long long a){for(i=31;++i;)for(p=a;*p;)*p==i?puts(a),*p=32:++p;}ใน tio (64 บิต) อาจอธิบายวิธีการf(a)ทำงาน
l4m2

ฉันขอโทษแม้ว่าฉันจะถาม OP เกี่ยวกับข้อกำหนดเฉพาะของความท้าทายและพวกเขากล่าวว่าสตริงอินพุตอาจเริ่มต้นด้วยช่องว่าง ดังนั้นโซลูชันที่เสนอของฉันไม่ถูกต้อง (เช่นอินพุตจะส่งผลให้เกิดการวนซ้ำไม่สิ้นสุด) และคุณน่าจะกลับไปใช้โซลูชันเดิมของคุณ
Jonathan Frech

2

MATLAB, 74 ไบต์

สิ่งนี้ใช้รูปแบบ 2 เอาต์พุตของฟังก์ชัน max () เพื่อดึงอักขระที่เล็กที่สุดและดัชนีโดยแปลงสตริงเป็นค่าศูนย์ในช่องว่างและ 256 ค่าอักขระสำหรับอักขระที่พิมพ์ได้

s=input('s');x=1;while(x);disp(s);[x,y]=max((256-s).*(s~=' '));s(y)=' ';end

1
ยินดีต้อนรับสู่ PPCG! เยี่ยมมาก!
AJFaraday

2

Lisp สามัญ , 240 228 224 ไบต์

(setf s(read))(defun f(x)(setf y(char-code(elt s x)))(if(= y 32)1e9 y))(loop for _ across s do(print s)do(setf s(replace s" ":start1(position(code-char(reduce #'min (loop for i from 0 below(length s)collect i):key #'f))s))))

ลองออนไลน์!

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


1
ยินดีต้อนรับสู่เว็บไซต์! ดีที่ได้เห็นเสียงกระเพื่อมที่พบบ่อย!
ข้าวสาลีตัวช่วยสร้าง

1

APL (Dyalog Unicode) , 39 ไบต์SBCS

{⎕←⍵⋄×≢⍵∩g' '~⍨⎕UCS256:∇' '@(⊃g⍋⍵)⊢⍵}

ลองออนไลน์!

DFN

อย่างไร?

{⎕←⍵⋄×≢⍵∩g' '~⍨⎕UCS256:∇' '@(⊃g⍋⍵)⊢⍵}  Main function, argument 
 ⎕←⍵⋄                                     Print 
         g' '~⍨⎕UCS256                  Assign to g every Unicode character except space
     ×≢⍵∩                :                If ⍵∩g is not empty
                                         Recursively call the function with argument:
                           ' '@          Space at
                               (⊃g⍋⍵)     The first (⊃) element in  graded up (⍋) with g
                                          The dyadic grade up function will index  according
                                          to its left argument, in this case g.


1

PowerShell , 103 99 ไบต์

param($a)2..$a.length|%{($x=$a);[regex]$p=""+([char[]]$a-ne' '|sort)[0];$a=($p.replace($x," ", 1))}

ลองออนไลน์!

$aจะเข้าเป็นสตริงเป็น จากนั้นเราวนซ้ำจาก2ไปยัง$a.length(นั่นคือจำนวนเวลาแนวตั้งที่เหมาะสมที่จำเป็นในการลบทั้งหมดยกเว้นหนึ่งตัวอักษร) การวนซ้ำแต่ละครั้งเราส่งออกสตริงปัจจุบันและบันทึกลง$xในเวลาเดียวกันอย่างสะดวก จากนั้นเราจะสร้างใหม่[regex]วัตถุ$pattern ประกอบด้วยอักขระที่เหลืออยู่ใน$aที่มี-nOT equal พื้นที่, sortเอ็ดแล้ว0หนึ่งวันดังกล่าว

จากนั้นเราตั้งค่า$aเท่ากับสตริงใหม่ของวัตถุ regex ด้วย.Replaceวิธีการแทนที่ในสตริง$x, $pattern, ที่มีช่องว่าง" "แต่เฉพาะการ1จับคู่เซนต์ ใช่ไวยากรณ์นี้แปลก

สตริงจะถูกปล่อยไว้ที่ไพพ์ไลน์และโดยปริยายWrite-Outputจะให้เราขึ้นบรรทัดใหม่ระหว่างพวกมันฟรีรวมกับหนึ่งบรรทัดขึ้นบรรทัดใหม่




1

MATL , 17 16 ไบต์

tSXz"tOy@=f1)(]x

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

คำอธิบาย

t       % Implicit input. Duplicate
S       % Sort
Xz      % Remove spaces
"       % For each char in that string
  t     %   Duplicate last result. This is the most recent string obtained
        %   from replacing chars by spaces in the input
  O     %   Push 0
  y     %   Duplicate from below
  @     %   Push current char
  =     %   Equals? (element-wise) Gives 1 for occurrences of current char
        %   in the most recent string, 0 otherwise
  f     %   Indices of nonzeros
  1)    %   Get the first entry
  (     %   Write 0 at that position. Char 0 will be displayed as space
]       % End
x       % Delete last result, which consists only of space / char zero

1

Excel VBA ขนาด 167 ไบต์

ฟังก์ชันหน้าต่าง VBE แบบไม่ระบุชื่อแบบทันทีที่รับอินพุตจากช่วง[A1]และผลลัพธ์ไปยังหน้าต่างทันที VBE

s="Code(Mid(A$1,Row(),1))":[B1].Resize([Len(A1)])="=If("&s &"=32,1E3,"&s &")":For i=1To[Len(A1)-CountIf(B:B,1E3)]:?[A1]:[A1]=[Substitute(A1,Char(Min(B:B))," ",1)]:Next

Ungolfed และแสดงความคิดเห็น

''  run as `call icicle("Test")` or `icicle"I am the WALRUS`
Sub icicle(Optional str As String)
    If Not IsMissing(str) Then [A1] = str   ''  pipe input
    [B:B].Clear                             ''  reset between runs
    [B1].Resize([Len(A1)]) = "=If(Code(Mid(A$1,Row(),1))=32,1E3,Code(Mid(A$1,Row(),1)))"  ''  get char number for every char in input
    For i = 1 To [Len(A1)-CountIf(B:B,1E3)] ''  iterate across from 1 to length of input - number of spaces
        Debug.Print [A1]                    ''  output a single line
        [A1]=[Substitute(A1,Char(Min(B:B))," ",1)]  ''  replace minimum char with space
    Next
End Sub

1

Japt , 32 18 ไบต์

บันทึก 14 ไบต์ขอบคุณ Shaggy!

rS ¬£=hSUbZn gYÃiN

ลองออนไลน์!


บันทึกไบต์ด้วยการส่งคืนบรรทัด: ethproductions.github.io/japt/…
Shaggy

22 ไบต์ จะลองพอร์ตของโซลูชัน JS ของฉันเร็ว ๆ นี้ดูวิธีการทำงาน
ปุย

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