Tạo một từ icicle


45

Do những hạn chế kỹ thuật của Stack Exchange, tiêu đề được hiển thị không chính xác. Các đúng tiêu đề cho thách thức này là

Làm một

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

Thách thức của ngày hôm nay là tạo ra các cột từ từ đầu vào. Đưa ra một chuỗi ASCII hoàn toàn có thể in và ít nhất 2 ký tự không phải dấu cách, thực hiện các bước sau:

  1. In trạng thái hiện tại của chuỗi.

  2. Thay thế ký tự từ vựng nhỏ nhất (trừ khoảng trắng) bằng khoảng trắng. Nếu có cà vạt, thay thế ký tự ngoài cùng bên trái.

  3. Lặp lại trên các dòng liên tiếp cho đến khi chuỗi chỉ chứa 1 ký tự không phải khoảng trắng.

Điều này tạo ra hiệu ứng mà chuỗi đầu vào trông giống như nó đang tan chảy ...

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      

Quy tắc

  • Sau một vài lần lặp lại, đầu ra của bạn gần như chắc chắn sẽ có khoảng trắng ở mỗi dòng. Nếu bạn chọn cắt bớt những thứ này, điều đó được cho phép.

  • Bạn có thể có một dòng trống, nhưng không nhiều hơn.

  • Hãy nhớ rằng đầu vào có thể chứa một số khoảng trắng, nhưng tất cả chúng đều bị bỏ qua một cách hiệu quả. Ví dụ, đầu vào a asẽ cung cấp cho

    a      a
           a
    
  • Bạn có thể lấy đầu vào làm danh sách các chuỗi nếu bạn muốn. Đối với đầu ra, bạn có thể trả về hoặc in danh sách các chuỗi, một chuỗi có dòng mới hoặc mảng ma trận char / 2D. Nói chung, tôi thích các định dạng IO cho phép, vì vậy các định dạng khác rất có thể được cho phép miễn là chúng phù hợp và rõ ràng tương ứng với đầu ra đúng. Nếu nghi ngờ, hãy hỏi. Như thường lệ, các chương trình hoặc chức năng đầy đủ được cho phép.

  • Hãy nhớ rằng, đây là một cuộc thi để đưa ra câu trả lời ngắn nhất bằng bất kỳ ngôn ngữ nào! Nếu bạn chọn trả lời bằng Java, hãy thử tạo câu trả lời Java ngắn nhất (tính bằng byte) mà bạn có thể.

Các trường hợp thử nghiệm

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
"Từ vựng nhỏ nhất" có nghĩa là bởi điểm mã?
Giuseppe

1
@Giuseppe Có, nhân vật có điểm mã ASCII nhỏ nhất (không phải là không gian rõ ràng)
DJMcMayhem

2
Nhắc nhở tôi về một thử thách khác mà chúng tôi phải thực hiện, theo chiều dọc, lặp lại một ký tự theo chỉ số của nó trong bảng chữ cái.
Shaggy

6
@Shaggy Có lẽ bạn đang nghĩ đến việc tạo ra một vài cơn mưa Bảng chữ cái .
Rainbolt

2
Điều đó liên quan đến MediaWiki mặc dù ...
Erik the Outgolfer

Câu trả lời:



8

Võng mạc , 28 byte

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

Hãy thử trực tuyến! Giải trình:

/\S/+

Lặp lại trong khi giá trị đầu vào không trống.

¶<

In giá trị hiện tại.

~(

Thực hiện phần còn lại của tập lệnh trên giá trị. Sau đó, thực hiện kết quả của tập lệnh đó dưới dạng tập lệnh trên giá trị.

O`.

Sắp xếp các ký tự theo thứ tự.

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

Chọn ký tự không trống đầu tiên và xuất chương trình Retina thay thế lần $\xuất hiện bằng chữ ( ) đầu tiên của ký tự đó ( $&) bằng khoảng trắng (dấu cách trong mã gốc).


6

APL (Dyalog Unicode) , 18 11 byte

∪∘↓∘⍉⍋∘⍋⍴⌸⊢

Hãy thử trực tuyến!

công dụng ⎕io←1; trả về một chuỗi các chuỗi (vectơ của vectơ ký tự)


cần thiết?
Kritixi Lithos

@Cowsquack có, nếu không, một vài hàng đầu tiên của đầu ra có thể giống hệt nhau
ngn

@Cowsquack cảm ơn, tôi đã không nhận thấy điều đó
ngn

may mắn thay, việc khắc phục điều này đã dẫn đến một giải pháp ngắn hơn :)
ngn

Một cái hay, cách sử dụng thực sự thông minh của ⍋∘⍋:)
Kritixi Lithos

6

05AB1E , 9 byte

ðм{v=yð.;

Hãy thử trực tuyến!

Giải trình

ð      # 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ð.;là của tôi, một trong những tốt đẹp.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Heh, khá giống nhau
Luis Mendo

1
@MagicOctopusUrn Trên thực tế, nó vẫn sẽ là 9 byte giống nhau trong phiên bản 05AB1E mới nhất .. :thay thế tất cả các ký tự thay vì thay thế ký tự .;đầu tiên (nghĩa là xem 7-byter của bạn làm gì với !trường hợp thử nghiệm). Ngoài ra, thách thức nêu rõ ràng loại trừ không gian, do đó, bộ 7 của bạn sẽ không hoạt động cho đầu vào có nhiều khoảng trắng. PS: Câu trả lời hay đấy, Luis! +1 từ tôi. :)
Kevin Cruijssen

1
@KevinCruijssen để lại cho tôi để quên tại sao tôi phải sử dụng .;ngay từ đầu. Tôi thực sự nhớ rằng đã đấu tranh với điều đó vào ngày 1 tháng 5 đầu năm nay khi bạn đề cập đến nó.
Bạch tuộc ma thuật Urn

1
@LuisMendo Chà, không có lệnh nào bạn sử dụng trong câu trả lời này đã thay đổi trong phần viết lại Elixir của 05AB1E. :)
Kevin Cruijssen

5

Pyth, 17 14 13 byte

V-SQdQ=XQxQNd

Hãy thử nó ở đây

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.

5

sed -rn , 142 143 byte

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

Hãy thử trực tuyến!

(lưu ý: có các tab trong chương trình)

Vì sed không có khái niệm về thứ tự từ điển, tôi đã phải mã hóa tập hợp các ký tự ASCII có thể in được và nó chiếm hơn một nửa số lượng phụ.

Sử dụng sed 4.2.2 sẽ giảm 2 lần, vì điều đó cho phép các nhãn không tên, Hãy thử trực tuyến!


-r cho phép mở rộng biểu thức chính quy (golfier)

-n vô hiệu hóa in ấn không gian mẫu vào cuối chương trình

Không gian mẫu bắt đầu với đầu vào

:anhãn a, đây là vòng lặp chương trình chính

p in không gian mẫu (tên ưa thích cho bộ đệm)

bây giờ chúng tôi nối thêm bộ ký tự ASCII có thể in (không bao gồm dấu cách)

s/$/ ABCDEFGHIJKLMNOPQRSTUVWXYZ/ nối thêm một tab, đóng vai trò là dấu phân cách 1 byte, theo sau là bảng chữ cái viết hoa

s<tab>thay thế (sed có thể lấy bất kỳ ký tự nào làm dấu phân cách, trong trường hợp này, tab được sử dụng để lưu một byte khỏi thoát /)

  • \w+$ bảng chữ cái viết hoa chúng ta vừa thêm

  • <tab> với

  • !"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_\`\L&{|}~<tab>phần còn lại của các ký tự, lưu ý đó \L&là phiên bản chữ thường của bảng chữ cái viết hoa

:bnhãn b, loại bỏ các ký tự từ bộ bắt đầu không có trong đầu vào

/(.).* \1/! nếu ký tự đầu tiên từ bộ ASCII không có trong đầu vào

  • s/ ./ / loại bỏ nó

tblặp lại bcho đến khi sự thay thế thất bại

s/(.)(.*) \1.*/ \2/ thay thế ký tự đầu tiên trong bộ ASCII có trong đầu vào bằng khoảng trắng và xóa bộ ASCII

ta tái diễn


Kết hợp không tham lam sẽ thực sự hữu ích ở đây, nhưng tôi đã có thể tìm ra thứ gì đó sedđủ lừa để tiết kiệm ít nhất 4 byte: Hãy thử trực tuyến!
Neil

(Quack quack chỉ ra rằng tôi chỉ có thể đánh lừa một phần sed, khi tôi loại bỏ các ký tự giống hệt nhau theo thứ tự sai.)
Neil

4

Ruby , 60 58 55 47 byte

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

Hãy thử trực tuyến!


Bạn có thể trao đổi trong a-b=[' ']a-blấy -2 byte nhanh chóng
benj2240

Vâng, cảm ơn vì điều đó, nhưng bây giờ tôi đã thay đổi cách tiếp cận một chút, vì vậy nó không còn được sử dụng nữa.
Kirill L.

Tôi thích cách tiếp cận mới!
benj2240

4

R , 140 100 byte

-40 byte Cảm ơn Giuseppe!

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

Hãy thử trực tuyến!

Một giải pháp sử dụng outervà phép thuật của Giuseppe để hoạt động chính xác dài hơn ở mức 104 byte. Lấy cảm hứng từ câu trả lời này .

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

Hãy thử trực tuyến!


109 byte lấy đầu vào làm vectơ ký tự
Giuseppe

1
100 byte lấy đầu vào là một chuỗi!
Giuseppe

Tuy nhiên, một câu trả lời rất hay; của tôi đã tăng lên hơn 200 byte kể từ khi tôi không nhớ về rank!
Giuseppe

@Giuseppe Hãy cho tôi biết về điều đó - Lần đầu tiên tôi đã thử "đặt hàng" cho một kết quả đang tan chảy nhưng không theo đúng thứ tự!
JayCe

@Giuseppe và nỗ lực của tôi trong việc sử dụng cảm hứng bên ngoài từ bài đăng của bạn chỉ được quản lý để xóa tất cả các khoảng trắng. TIO Tôi muốn thấy một cách tiếp cận bên ngoài làm việc được đăng dưới dạng một câu trả lời riêng biệt. Vẫn làm việc trên nó nhưng nó có thể không thanh lịch.
JayCe

3

Python 3 , 71 byte

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

Hãy thử trực tuyến!

-4 byte nhờ vào ovs


Lưu 2 byte bằng cách sử dụng *bool({*a}-{" "})thay vìif{*a}-{" "}else[a]
RootTwo

@RootTwo sẽ không có kết quả này trong một RecursionError?
trứng

@RootTwo if/elsetắt nhưng *boolkhông, vì vậy, vâng, người đệ quy như ovs đã nói
HyperNeutrino

Tất nhiên bạn đúng. Do một lỗi, chức năng của tôi đã được xử lý bằng cách gọi hàm của bạn để nó có vẻ hoạt động.
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))

Hãy thử trực tuyến!

Thx cho 2 byte từ ovs thông qua sử dụng S and f()thay vìif S:f()


Bạn đang thiếu ...If there is a tie, replace the leftmost character...quy tắc, bạn có thể sửa lỗi đó vớireplace(min(...),' ',1)
Rod

@Rod: À! Hiểu rồi ...
Chas Brown

3

Thạch , 8 byte

ẋ"ỤỤ$z⁶Q

Hãy thử trực tuyến!

Ý tưởng

Ý tưởng cơ bản là trực tiếp xây dựng các cột của đầu ra mong muốn, thay vì thao tác chuỗi và trả về tất cả các kết quả trung gian.

Chúng tôi bắt đầu bằng cách đánh số các ký tự của chuỗi đầu vào theo thứ tự chúng sẽ bị xóa. Hiện tại, chúng tôi sẽ giả vờ không gian cũng sẽ bị xóa.

tee ay oh
845139276

Bây giờ, chúng tôi xây dựng các cột bằng cách lặp lại từng ký tự theo chỉ mục của nó trong bảng liệt kê này.

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   

Tất cả những gì còn lại là để loại bỏ các bản sao, để chiếm các khoảng trống.

ẋ"ỤỤ$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 byte

Giảm ba byte với sự trợ giúp từ @TonHosp

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

Hãy thử trực tuyến!


Ah, rất tốt, cách tiếp cận đẹp hơn nhiều! Tôi nghĩ rằng bạn cần \Qmặc dù cho trường hợp thử nghiệm cuối cùng .... Tôi đã bỏ lỡ rằng lần đầu tiên quá!
Dom Hastings

Bạn đúng. Đã thêm nó.
Xcali

Ngắn hơn : say&&s/\Q$a/ / while($a)=sort/\S/g. Cũng xử lý đúng cách0
TonMedel

3

JavaScript, 67 66 65 byte

Bởi vì tôi đã không chơi golf trong một thời gian!

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

Dùng thử trực tuyến

Cảm ơn DanielIndie đã chỉ ra 4 byte dự phòng mà bia bao gồm!


Tại sao bạn chỉ định y trong bản đồ? : P nó có thể được thực hiện 67
DanielIndie

@DanielIndie, vì Bia! : D Cảm ơn đã chỉ ra.
Xù xì

vâng, tôi nghĩ đó là trường hợp: P
DanielẤn

3

K (ngn / k) , 26 24 byte

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

Hãy thử trực tuyến!


Đẹp! Nỗ lực K của tôi xuất hiện ở 41: `{. [X; (- 1 + # x) & x? _Ici & / _ ic x _dv" ";:;" "]} chắc chắn rằng nó không đi ra khỏi giới hạn.
uryga

@uryga Cảm ơn. Nếu tôi đã thực hiện các dự báo đúng cách, {@[x;y;:;" "]}có thể đã được @[;;:;" "]. Bạn sử dụng phiên bản nào của k? Tôi không quen thuộc với những điều này : _ci _ic _dv.
ngn

Tôi nghĩ đó là 2,8-ish? Tôi đang sử dụng trình thông dịch Kona cung cấp các toán tử dưới dạng dựng sẵn: char-of-int, int-of-char, xóa-value.
uryga

2

C # (Trình biên dịch tương tác Visual C #) , 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," ");}

Hãy thử trực tuyến!


c!=32có thể được c>32; c==32có thể được c<33; và (char)999có thể '¡'(hoặc bất kỳ ký tự nào khác trên phạm vi unicode ASCII có thể in).
Kevin Cruijssen

Oh, và bạn có thể tiết kiệm thêm hai byte thay đổi whileđể forvà đặt var s=ReadLine()s=s.Remove(i,1).Insert(i," ")bên trong nó (vì vậy hai dấu chấm phẩy không còn cần thiết).
Kevin Cruijssen


2

Haskell , 67 byte

12 byte được lưu nhờ Laikoni

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

Hãy thử trực tuyến!

Điều này chấm dứt trong một lỗi

Haskell , 83 79 byte

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

Hãy thử trực tuyến!

Điều này chấm dứt trong một lỗi

Haskell , 86 byte

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

Hãy thử trực tuyến!

Haskell , 100 91 88 byte

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

Hãy thử trực tuyến!


67 byte: f s|(a,_:b)<-span(/=minimum(id=<<words s))s=putStrLn s>>f(a++' ':b) Hãy thử trực tuyến!
Laikoni

@Laikoni Cảm ơn! Tôi đang trên bờ vực của một cái gì đó như thế và tôi ngủ thiếp đi. Tuy nhiên tôi không nghĩ rằng tôi sẽ nghĩ ra id=<<điều đó khá thông minh
Wheat Wizard


2

K4 , 28 20 18 byte

Giải pháp:

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

Thí dụ:

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

Giải trình:

Đó là điều tương tự như ngn đang làm. Tìm các chỉ mục dẫn đến danh sách tăng dần, ghi đè lên từng cái một " ", sau đó lấy phần riêng biệt để xóa bất kỳ dòng trùng lặp nào:

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

Cảm ơn Jonathan Frech cho -1 byte


*p==i?...:0;có thể có thể được *p-i?0:...;.
Jonathan Frech

@JonathanFrech Không, nó dài hơn 1 byte (mặc dù *p-1||(...)có cùng độ dài)
l4m2

Xin lỗi, đã không nhận ra tầm quan trọng để giữ biểu thức dấu phẩy cùng nhau. Tuy nhiên, điều này có thể là 65 byte . Tôi cũng không biết làm thế nào f(a)biên dịch, như aphải thuộc loại char*, nhưng tôi cho rằng có một cái gì đó để làm với việc sử dụng gcc 32-bit của bạn.
Jonathan Frech

@JonathanFrech Tôi nghĩ char*p,i;f(long long a){for(i=31;++i;)for(p=a;*p;)*p==i?puts(a),*p=32:++p;}trên tio (64 bit) có thể giải thích cách f(a)làm việc
l4m2

Tôi xin lỗi, mặc dù tôi đã hỏi OP về các thông số kỹ thuật thách thức và họ nói rằng chuỗi đầu vào có thể bắt đầu bằng một khoảng trắng. Do đó, giải pháp đề xuất của tôi không hợp lệ (như vậy sẽ dẫn đến một vòng lặp vô hạn) và rất có thể bạn sẽ quay trở lại giải pháp ban đầu của mình.
Jonathan Frech

2

MATLAB, 74 byte

Điều này sử dụng dạng 2 đầu ra của hàm max () để lấy ký tự nhỏ nhất và chỉ mục của nó, đã chuyển chuỗi thành giá trị 0 trong khoảng trắng và 256 - giá trị ký tự cho các ký tự có thể in được.

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

1
Chào mừng đến với PPCG! Công việc tốt đẹp!
AJFaraday

2

Lisp thường gặp , 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))))

Hãy thử trực tuyến!

Đây là lần đầu tiên tôi đăng bài.
Tôi đang trong quá trình học lisp nên tôi chắc chắn ai đó có thể nghĩ ra thứ gì đó ngắn hơn cái này.


1
Chào mừng đến với trang web! Tốt để xem một số lisp phổ biến!
Thuật sĩ lúa mì

1

APL (Dyalog Unicode) , 39 byte SBCS

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

Hãy thử trực tuyến!

Dfn.

Làm sao?

{⎕←⍵⋄×≢⍵∩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 byte

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

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng một chuỗi vào $a. Sau đó, chúng tôi lặp từ 2đến $a.length(nghĩa là số lần thích hợp cần thiết để loại bỏ tất cả trừ một ký tự). Mỗi lần lặp, chúng ta xuất chuỗi hiện tại và thuận tiện lưu vào $xcùng một lúc. Sau đó chúng tôi xây dựng một mới [regex]đối tượng, $pattern bao gồm các nhân vật còn lại trong $ađó là -not equal vào không gian, sorted thì0 một ngày đó.

Sau đó, chúng tôi đặt $abằng một chuỗi mới của đối tượng regex bằng .Replacephương thức để thay thế trong chuỗi $x, $pattern, bằng một khoảng trắng " ", nhưng chỉ1 khớp st. Vâng, cú pháp này là lạ.

Các chuỗi được để lại trên đường ống và ẩn Write-Outputcho chúng ta một dòng mới giữa chúng miễn phí, cộng với một dòng mới.




1

MATL , 17 16 byte

tSXz"tOy@=f1)(]x

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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

VBA Excel, 167 byte

Một chức năng cửa sổ ngay lập tức VBE ẩn danh nhận đầu vào từ phạm vi [A1]và đầu ra cho cửa sổ ngay lập tức 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 và bình luận

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.