Buat Icicle Kata

45

Karena keterbatasan teknis dari Stack Exchange, judul diberikan secara salah. The benar judul untuk tantangan ini adalah

Membuat

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

Tantangan hari ini adalah membuat es dari kata input. Dengan serangkaian ASCII yang sepenuhnya dapat dicetak , dan setidaknya 2 karakter tanpa spasi, lakukan langkah-langkah berikut:

  1. Cetak status string saat ini.

  2. Ganti karakter terkecil secara leksikal (selain spasi) dengan spasi. Jika ada dasi, ganti karakter paling kiri.

  3. Ulangi pada garis yang berurutan sampai string hanya berisi 1 karakter non-spasi.

Ini menciptakan efek bahwa string input tampak seperti sedang meleleh ...

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      

Aturan

  • Setelah beberapa iterasi, output Anda hampir pasti memiliki spasi tambahan di setiap baris. Jika Anda memilih untuk memotong ini, itu diperbolehkan.

  • Anda mungkin memiliki satu baris kosong yang tertinggal, tetapi tidak lebih.

  • Ingat bahwa input mungkin berisi beberapa spasi, tetapi ini semua dilewati secara efektif. Misalnya, input a aharus diberikan

    a      a
           a
    
  • Anda dapat mengambil input sebagai daftar string jika Anda mau. Untuk output, Anda dapat mengembalikan atau mencetak daftar string, string tunggal dengan baris baru, atau array char / matriks 2D. Secara umum, saya lebih suka format IO permisif, jadi format lain kemungkinan besar diperbolehkan selama mereka konsisten dan jelas sesuai dengan output yang tepat. Jika ragu, jangan ragu untuk bertanya. Seperti biasa, program atau fungsi penuh diizinkan.

  • Ingat, ini adalah kontes untuk membuat jawaban tersingkat dalam bahasa apa pun! Jika Anda memilih untuk menjawab dalam Java, coba buat jawaban Java terpendek (dalam byte) yang Anda bisa.

Uji kasus

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        


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

({({})({}[()])}{})
 {({})({}[()])}{})
 { {})({}[()])}{})
 { {}) {}[()])}{})
 { {}) {}[ )])}{})
 { {}  {}[ )])}{})
 { {}  {}[  ])}{})
 { {}  {}[  ] }{})
 { {}  {}[  ] }{} 
 { {}  {}   ] }{} 
 { {}  {}     }{} 
   {}  {}     }{} 
    }  {}     }{} 
    }   }     }{} 
    }   }     } } 
        }     } } 
              } } 
                } 
DJMcMayhem
sumber
1
"Terkecil secara leksikal" berarti dengan titik kode?
Giuseppe
1
@ Giuseppe Ya, karakter dengan titik kode ASCII terkecil (selain ruang jelas)
DJMcMayhem
2
Mengingatkan saya pada tantangan lain di mana kami harus, saya pikir, mengulangi karakter secara vertikal dengan indeksnya dalam alfabet.
Shaggy
6
@ Shaggy Anda mungkin berpikir tentang Make Alphabet Rain .
Rainbolt
2
Itu merujuk ke MediaWiki ...
Erik the Outgolfer

Jawaban:

8

Python 2 , 71 70 byte

-1 byte berkat ovs

x=input()
while x.strip():print x;r=x.replace;x=r(min(r(*' ~')),' ',1)

Cobalah online!

tongkat
sumber
8

Retina , 28 byte

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

Cobalah online! Penjelasan:

/\S/+

Ulangi sementara nilai input tidak kosong.

¶<

Cetak nilai saat ini.

~(

Jalankan sisa skrip pada nilai. Kemudian, jalankan hasil skrip itu sebagai skrip pada nilai.

O`.

Urutkan karakter ke dalam urutan.

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

Pilih karakter nonblank pertama dan hasilkan program Retina yang menggantikan $\kemunculan literal pertama ( ) dari karakter tersebut ( $&) dengan spasi (spasi tambahan dalam kode asli).

Neil
sumber
6

APL (Dyalog Unicode) , 18 11 byte

∪∘↓∘⍉⍋∘⍋⍴⌸⊢

Cobalah online!

menggunakan ⎕io←1; mengembalikan array string (vektor vektor karakter)

ngn
sumber
Apakah itu perlu?
Kritixi Lithos
@Cowsquack ya, kalau tidak, beberapa baris pertama dari output bisa identik
ngn
@Cowsquack terima kasih, saya tidak melihat bahwa
ngn
untungnya, memperbaiki ini menyebabkan solusi yang lebih pendek :)
ngn
Bagus, penggunaan yang sangat pintar ⍋∘⍋:)
Kritixi Lithos
6

05AB1E , 9 byte

ðм{v=yð.;

Cobalah online!

Penjelasan

ð      # 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
Luis Mendo
sumber
1
{ðKv=yð.;adalah milikku, bagus.
Magic Octopus Mm
@MagicOctopusUrn Heh, sangat mirip
Luis Mendo
1
@MagicOctopusUrn Sebenarnya, itu akan tetap 9 byte yang sama dalam versi 05AB1E terbaru .. :menggantikan semua karakter alih-alih .;menggantikan yang pertama (yaitu melihat apa yang dilakukan oleh 7-byter Anda dengan !di dalam test case). Juga, tantangannya secara eksplisit menyatakan tidak termasuk spasi, jadi 7-byter Anda tidak akan berfungsi untuk input dengan banyak spasi. PS: Jawaban yang bagus, Luis! +1 dari saya. :)
Kevin Cruijssen
1
@KevinCruijssen serahkan pada saya untuk melupakan mengapa saya harus menggunakannya .;. Saya benar-benar ingat berjuang dengan itu pada 1 Mei awal tahun ini sekarang setelah Anda menyebutkannya.
Magic Gurita Guci
1
@LuisMendo Yah, tidak ada perintah yang Anda gunakan dalam jawaban ini yang telah berubah dalam penulisan ulang Elixir dari 05AB1E. :)
Kevin Cruijssen
5

Pyth, 17 14 13 byte

V-SQdQ=XQxQNd

Coba di sini

V-SQdQ=XQxQNd
V-SQd              For each non-space character in the sorted input (Q)...
     Q             ... print the current value of Q...
      = Q          ... and set Q to itself...
         xQN       ... with the first instance of the character...
       X    d      ... replaced by a space.
Mnemonik
sumber
5

sed -rn , 142 143 byte

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

Cobalah online!

(catatan: ada tab di program)

Karena sed tidak memiliki konsep urutan leksikografis, saya harus meng-hardcode set karakter ASCII yang dapat dicetak dan membutuhkan lebih dari setengah bytecount.

Menggunakan sed 4.2.2 akan mengurangi bytecount sebesar 2, karena itu memungkinkan untuk label yang tidak disebutkan namanya, Coba online!


-r memungkinkan ekspresi reguler yang diperluas (golfier)

-n menonaktifkan pencetakan implisit dari ruang pola di akhir program

Ruang pola dimulai dengan input

:alabel a, ini adalah loop program utama

p cetak spasi pola (nama mewah untuk buffer)

sekarang kita menambahkan set karakter ASCII yang dapat dicetak (tidak termasuk spasi)

s/$/ ABCDEFGHIJKLMNOPQRSTUVWXYZ/ tambahkan tab, bertindak sebagai pembatas 1 byte, diikuti oleh huruf besar

s<tab>pengganti (sed dapat mengambil karakter apa saja sebagai pembatas, dalam hal ini tab digunakan untuk menyimpan byte dari lolos dari /)

  • \w+$ alfabet huruf besar yang baru saja kita tambahkan

  • <tab> dengan

  • !"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_\`\L&{|}~<tab>sisa karakter, perhatikan bahwa itu \L&adalah versi huruf kecil dari alfabet huruf besar

:blabel b, hapus karakter dari set awal yang tidak ada dalam input

/(.).* \1/! jika karakter pertama dari set ASCII tidak ada dalam input

  • s/ ./ / Singkirkan

tbulangi bsampai substitusi gagal

s/(.)(.*) \1.*/ \2/ ganti karakter pertama dalam set ASCII yang ada di input dengan spasi, dan hapus set ASCII

ta berulang

Kritixi Lithos
sumber
Pencocokan non-serakah akan sangat membantu di sini, tetapi saya dapat menemukan sesuatu yang sedcukup bodoh untuk menyelamatkan setidaknya 4 byte: Cobalah secara online!
Neil
(Sapi dukun menunjukkan bahwa saya hanya bisa menipu sebagian, karena saya menghapus karakter yang identik dalam urutan yang salah.)
Neil
4

Ruby , 60 58 55 47 byte

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

Cobalah online!

Kirill L.
sumber
Anda dapat bertukar a-b=[' ']dan a-buntuk -2 byte cepat
benj2240
Ya, terima kasih untuk itu, tapi sekarang saya sudah sedikit mengubah pendekatannya, jadi tidak lagi digunakan.
Kirill L.
Saya suka pendekatan baru!
benj2240
4

R , 140 100 byte

-40 bytes Berkat Giuseppe!

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

Cobalah online!

Solusi menggunakan outerdan sihir Giuseppe untuk bekerja dengan benar lebih lama pada 104 byte. Terinspirasi oleh jawaban ini .

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

Cobalah online!

JayCe
sumber
109 byte mengambil input sebagai vektor karakter
Giuseppe
1
100 byte mengambil input sebagai string!
Giuseppe
Tetap saja, jawaban yang sangat bagus; punyaku menggelembung hingga lebih dari 200 byte karena aku tidak ingat rank!
Giuseppe
@Giuseppe Ceritakan tentang hal itu - saya pertama kali mencoba "memesan" untuk hasil yang mencair tetapi tidak dalam urutan yang benar!
JayCe
@Giuseppe dan upaya saya untuk menggunakan luar yang terinspirasi oleh posting Anda hanya berhasil menghapus semua ruang. TIO Saya ingin melihat pendekatan luar yang berfungsi diposting sebagai jawaban terpisah. Masih mengerjakannya tapi mungkin tidak elegan.
JayCe
3

Python 3 , 71 byte

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

Cobalah online!

-4 bytes terima kasih kepada ovs

HyperNeutrino
sumber
Simpan 2 byte menggunakan *bool({*a}-{" "})bukanif{*a}-{" "}else[a]
RootTwo
@ BootTwo tidakkah ini menghasilkan RecursionError?
Ovs
@RootTwo if/elsepintasan tetapi *booltidak, jadi ya, recursionerror seperti ovs berkata
HyperNeutrino
Tentu saja Anda benar. Karena bug, fungsi saya berulang dengan memanggil fungsi Anda sehingga tampaknya berfungsi.
RootTwo
3

Python 2 , 70 69 66 64 byte

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

Cobalah online!

Thx untuk 2 byte dari Ovs menggunakan S and f()bukan menggunakanif S:f()

Chas Brown
sumber
Anda melewatkan ...If there is a tie, replace the leftmost character...aturan, Anda dapat memperbaikinya denganreplace(min(...),' ',1)
Rod
@Rod: Ah! Mengerti ...
Chas Brown
3

Jelly , 8 byte

ẋ"ỤỤ$z⁶Q

Cobalah online!

Ide

Ide dasarnya adalah membuat kolom dari output yang diinginkan secara langsung, alih-alih memanipulasi string dan mengembalikan semua hasil antara.

Kami mulai dengan menghitung karakter dari string input dengan urutan mereka akan dihapus. Untuk saat ini, kami akan berpura-pura spasi juga akan dihapus.

tee ay oh
845139276

Sekarang, kita membangun kolom dengan mengulangi setiap karakter dengan indeksnya dalam enumerasi ini.

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   

Yang tersisa adalah menghapus duplikat, untuk memperhitungkan spasi.

Kode

ẋ"ỤỤ$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.
Dennis
sumber
3

Perl 5 -n , 37 34 byte

Turun tiga byte dengan bantuan dari @TonHospel

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

Cobalah online!

Xcali
sumber
Ah, pendekatan yang sangat bagus, jauh lebih bagus! Saya pikir Anda perlu \Qolah untuk test case terakhir .... Saya juga melewatkan itu pertama kali!
Dom Hastings
Kamu benar. Menambahkannya.
Xcali
Shorter: say&&s/\Q$a/ / while($a)=sort/\S/g. Juga menangani dengan benar0
Ton Hospel
3

JavaScript, 67 66 65 byte

Karena saya belum pernah bermain golf dalam keadaan mabuk!

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

Cobalah online

Terima kasih kepada DanielIndie karena menunjukkan 4 byte berlebihan yang termasuk dalam bir!

Shaggy
sumber
mengapa Anda menentukan y di peta? : P dapat dibuat 67
DanielIndie
@DanielIndie, karena Bir! : D Terima kasih telah menunjukkannya.
Shaggy
ya, saya pikir itulah yang akan terjadi: P
DanielIndie
3

K (ngn / k) , 26 24 byte

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

Cobalah online!

ngn
sumber
Cantik! Upaya K saya muncul di 41: `{. [X; (- 1 + # x) & x? _Ci & / _ ic x _dv" ";:;" "}} Saya membuang-buang byte yang dikonversi menjadi int dan kembali dan membuat yakin itu tidak keluar batas.
uryga
@uryga Terima kasih. Jika saya telah menerapkan proyeksi dengan benar, {@[x;y;:;" "]}bisa saja @[;;:;" "]. Versi k mana yang Anda gunakan? Saya tidak akrab dengan ini: _ci _ic _dv.
ngn
Saya pikir ini 2.8-ish? Saya menggunakan juru bahasa Kona yang menyediakan operator sebagai builtin: char-of-int, int-of-char, delete-value.
uryga
2

C # (Visual C # Interactive Compiler) , 129 byte

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

Cobalah online!

Pavel
sumber
c!=32bisa c>32; c==32bisa c<33; dan (char)999bisa '¡'(atau karakter lain di atas rentang unicode ASCII yang dapat dicetak).
Kevin Cruijssen
Oh, dan Anda dapat menyimpan dua byte lagi mengubah whileke fordan menempatkan var s=ReadLine()dan s=s.Remove(i,1).Insert(i," ")di dalamnya (sehingga dua semi-titik dua tidak lagi diperlukan).
Kevin Cruijssen
2

Haskell , 67 byte

12 byte disimpan berkat Laikoni

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

Cobalah online!

Yang ini berakhir dengan kesalahan

Haskell , 83 79 byte

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

Cobalah online!

Yang ini berakhir dengan kesalahan

Haskell , 86 byte

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

Cobalah online!

Haskell , 100 91 88 byte

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

Cobalah online!

Wisaya Gandum
sumber
67 byte: f s|(a,_:b)<-span(/=minimum(id=<<words s))s=putStrLn s>>f(a++' ':b) Cobalah online!
Laikoni
@Laikoni Terima kasih! Saya hanya di ambang sesuatu seperti itu dan saya tertidur. Namun saya tidak berpikir saya akan id=<<cukup pintar
Wheat Wizard
2

JavaScript (Node.js) , 80 65 byte

x=>[...x].sort().map(c=>x=x.replace(c,' ',c>' '&&console.log(x)))

Cobalah online!

Tidak tahu replacemengambil string sebagai string, bukan regexp

l4m2
sumber
2

K4 , 28 20 18 byte

Larutan:

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

Contoh:

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        "
"               "

Penjelasan:

Ini sama dengan ngn lakukan. Temukan indeks yang akan menghasilkan daftar naik, timpa satu per satu dengan " ", lalu ambil yang berbeda untuk menghapus garis duplikat apa pun:

?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
streetster
sumber
2

gcc 32-bit, 66 65 byte

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

Terima kasih untuk Jonathan Frech untuk -1 byte

l4m2
sumber
*p==i?...:0;mungkin bisa *p-i?0:...;.
Jonathan Frech
@ JonathanFrech Tidak, ini 1 byte lebih panjang (meskipun *p-1||(...)panjangnya sama)
l4m2
Maaf, tidak mengenali pentingnya menjaga ekspresi koma bersama. Namun, ini mungkin 65 byte . Saya juga tidak tahu bagaimana f(a)mengkompilasi, seperti yang aseharusnya dari tipe char*, tapi saya berasumsi bahwa ada hubungannya dengan penggunaan gcc 32-bit Anda.
Jonathan Frech
@ JonathanFrech Saya pikir char*p,i;f(long long a){for(i=31;++i;)for(p=a;*p;)*p==i?puts(a),*p=32:++p;}di tio (64bit) dapat menjelaskan cara f(a)kerjanya
l4m2
Saya minta maaf, meskipun saya bertanya kepada OP tentang spesifikasi tantangan dan mereka mengatakan string input dapat dimulai dengan spasi. Karenanya solusi yang saya usulkan tidak valid (karena input seperti itu menghasilkan loop tak terbatas) dan kemungkinan besar Anda akan kembali ke solusi semula.
Jonathan Frech
2

MATLAB, 74 byte

Ini menggunakan bentuk 2-output dari fungsi max () untuk mengambil karakter terkecil dan indeksnya, setelah mengubah string ke nilai nol dalam spasi dan 256-nilai karakter untuk karakter yang dapat dicetak.

s=input('s');x=1;while(x);disp(s);[x,y]=max((256-s).*(s~=' '));s(y)=' ';end
Richard
sumber
1
Selamat datang di PPCG! Kerja bagus!
AJFaraday
2

Common Lisp , 240 228 224 byte

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

Cobalah online!

Ini adalah postingan pertama saya.
Saya sedang dalam proses belajar lisp jadi saya yakin seseorang dapat memikirkan sesuatu yang lebih pendek dari ini.

JoshM
sumber
1
Selamat datang di situs ini! Bagus melihat beberapa cadel umum!
Wheat Wizard
1

APL (Dyalog Unicode) , 39 byte SBCS

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

Cobalah online!

Dfn.

Bagaimana?

{⎕←⍵⋄×≢⍵∩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.
J. Sallé
sumber
1

V , 27 byte

>>ò2Ùúú^lDhrfDj|@"r kdòdj<H

Cobalah online!

Hexdump:

00000000: 3e3e f232 d9fa fa5e 6c44 6872 6644 6a7c  >>.2...^lDhrfDj|
00000010: 4022 7220 6b64 f264 6a3c 48              @"r kd.dj<H
DJMcMayhem
sumber
1

PowerShell , 103 99 byte

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

Cobalah online!

Mengambil input sebagai string $a. Kami kemudian beralih dari 2ke $a.length(yaitu, jumlah waktu vertikal yang sesuai yang diperlukan untuk menghapus semua kecuali satu karakter). Setiap iterasi, kami menampilkan string saat ini dan disimpan dengan mudah $xpada saat yang sama. Kami kemudian membangun baru [regex]objek, $pattern terdiri dari karakter yang tersisa di $ayang -not equal ruang, sorted, maka 0th satu daripadanya.

Kami kemudian mengatur $asama dengan string baru dari objek regex dengan .Replacemetode untuk menggantikan dalam string $x, $pattern, dengan spasi " ", tetapi hanya 1pertandingan st. Ya, sintaksis ini aneh.

String dibiarkan di atas pipa dan implisit Write-Outputmemberi kita garis baru di antara mereka secara gratis, ditambah satu baris baru.

AdmBorkBork
sumber
1

Java (JDK 10) , 140 byte

s->{for(int m=1,i;m>0;s=s.substring(0,i=s.indexOf(m=s.chars().filter(c->c>32).min().orElse(0)))+" "+s.substring(i+1))System.out.println(s);}

Cobalah online!

Secara teknis ada garis kosong, tetapi tidak kosong .

Olivier Grégoire
sumber
1

MATL , 17 16 byte

tSXz"tOy@=f1)(]x

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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
Luis Mendo
sumber
1

Excel VBA, 167 byte

Fungsi jendela langsung VBE anonim yang mengambil input dari jarak [A1]dan keluaran ke jendela langsung 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

Tidak Disatukan dan Dikomentari

''  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
Taylor Scott
sumber