Bir kelime saçağı yapmak


45

Stack Exchange'in teknik kısıtlamaları nedeniyle, başlık yanlış işlendi. Doğru bu meydan okuma için başlıktır

Yapmak

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

Bugünün zorluğu giriş sözcüklerinden buz sarkıtları yapmaktır. Tamamen basılabilir bir ASCII dizisi ve en az 2 boşluksuz karakter verildiğinde aşağıdaki adımları izleyin:

  1. Dizenin geçerli durumunu yazdır.

  2. Sözlüksel olarak en küçük karakteri (boşluklardan başka) bir boşlukla değiştirin. Bir kravat varsa, en soldaki karakteri değiştirin.

  3. Dizi yalnızca 1 boşluksuz karakter içerene kadar ardışık satırlarda tekrarlayın.

Bu, giriş dizgisinin eridiği gibi görünmesini sağlar ...

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      

kurallar

  • Birkaç yinelemeden sonra, çıktınız neredeyse her satırda sonda boşluk bırakacaktır. Bunları kısaltmayı seçerseniz, buna izin verilir.

  • Sen olabilir tek boş satır sondaki, ama fazla.

  • Girişin birkaç boşluk içerebileceğini unutmayın, ancak bunların tümü etkin bir şekilde atlanır. Örneğin, giriş a avermeli

    a      a
           a
    
  • İsterseniz girişi bir dizge listesi olarak alabilirsiniz. Çıktı için, bir dize listesi, yeni satırlı tek bir dize veya char matrix / 2D dizisi döndürebilir veya yazdırabilirsiniz. Genel olarak, izin verilen GÇ formatlarını tercih ederim, bu nedenle tutarlı ve doğru çıktıya açıkça karşılık geldiği sürece diğer formatlara izin verilir. Şüphe durumunda, sormaya çekinmeyin. Her zaman olduğu gibi, tam program veya işlevlere izin verilir.

  • Unutma, bu herhangi bir dilde en kısa cevabı veren bir yarışma! Java ile cevaplamayı seçerseniz, yapabildiğiniz en kısa Java cevabını (bayt cinsinden) yapmaya çalışın.

Test durumları

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
"Sözlüksel olarak en küçük" kod noktasıyla mı ifade eder?
Giuseppe

1
@Giuseppe Evet, en küçük ASCII kod noktasına sahip karakter (açıkça boşluk dışında)
DJMcMayhem

2
Bana bir karakteri alfabedeki indeksiyle dikey olarak tekrar etmek zorunda olduğumuzu hatırlatıyor.
Shaggy,

6
@Shaggy Muhtemelen Alfabe Yağmuru yapmayı düşünüyorsun .
Rainbolt

2
MediaWiki'ye yapılan atıfta olsa ...
Outgolfer Erik

Yanıtlar:



8

Retina , 28 bayt

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

Çevrimiçi deneyin! Açıklama:

/\S/+

Giriş değeri boş değilken tekrarlayın.

¶<

Mevcut değeri yazdırın.

~(

Komut dosyasının geri kalanını değer üzerinde yürütün. Ardından, bu betiğin sonucunu değerde bir komut dosyası olarak yürütün.

O`.

Karakterleri sıraya göre sıralayın.

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

İlk boşluk olmayan karakteri seçin ve $\o karakterin ( $&) ilk değişmez ( ) oluşumunu bir boşlukla (orijinal kodda boşluk bırakarak ) değiştiren bir Retina programı yazdırın .


6

APL (Dyalog Unicode) , 18 11 bayt

∪∘↓∘⍉⍋∘⍋⍴⌸⊢

Çevrimiçi deneyin!

kullanır ⎕io←1; bir dizge dizisi döndürür (karakter vektörleri vektörü)


gerekli?
Kritixi Lithos,

@Cowsquack evet, aksi takdirde çıktının ilk birkaç satırı aynı olabilir
ngn

@Cowsquack teşekkürler, fark etmedim
ngn

neyse ki, bunu düzeltmek daha kısa bir çözüme yol açtı :)
ngn

Güzel bir, gerçekten zekice kullanımı ⍋∘⍋:)
Kritixi Lithos

6

05AB1E , 9 bayt

ðм{v=yð.;

Çevrimiçi deneyin!

açıklama

ð      # 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ð.;benimdi, iyi biri.
Magic Octopus Urn

@MagicOctopusUrn Heh, oldukça benzer
Luis Mendo

1
@MagicOctopusUrn Aslında, en son 05AB1E sürümünde hala aynı 9 bayt olacaktır .. ilk :yerine bunun yerine tüm karakterleri .;değiştirir (yani, 7 baytınızın !test durumunda ne yaptığını görün). Ayrıca, meydan okuma açıkça boşlukları belirtir, böylece 7 baytınız birden çok boşluk içeren girdiler için işe yaramaz. PS: Güzel cevap, Luis! Benden +1. :)
Kevin Cruijssen

1
@KevinCruijssen, neden .;ilk başta kullanmam gerektiğini unutmak için bana bıraktı . Kelimenin tam anlamıyla bu yılın başlarında 1 Mayıs'ta bununla mücadele ettiğini hatırlıyorum.
Magic Octopus Urn,

1
@LuisMendo Peki, bu cevapta kullandığınız hiçbir komut 05AB1E'nin İksir yeniden yazımında değişmedi. :)
Kevin Cruijssen

5

Pyth, 17 14 13 bayt

V-SQdQ=XQxQNd

Burada dene

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 bayt

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

Çevrimiçi deneyin!

(not: programda sekmeler var)

Sed'nin sözlük bilgisi sırası kavramı olmadığı için, yazdırılabilir ASCII karakter setini kodlamam gerekiyordu ve bayt sayısının yarısından fazlasını kaplıyordu.

Sed 4.2.2 kullanmak, adsız etiketleri 2'ye düşürür, çünkü bu adsız etiketlere izin verir, Çevrimiçi deneyin!


-r genişletilmiş düzenli ifadeler sağlar (golfçü)

-n Program sonunda desen boşluğunun örtük yazdırılmasını engeller.

Desen alanı girişle başlar

:aetiket a, bu ana program döngüsü

p desen alanını yazdır (arabellek için süslü ad)

şimdi yazdırılabilir ASCII karakter kümesini (boşluk hariç) ekliyoruz

s/$/ ABCDEFGHIJKLMNOPQRSTUVWXYZ/ 1 bayt sınırlayıcı olarak görev yapan ve ardından büyük harf alfabe olan bir sekme ekleyin.

s<tab>ikame (sed, sınırlayıcı olarak herhangi bir karakteri alabilir, bu durumda sekme bir baytı kaçmaktan kurtarmak için kullanılır /)

  • \w+$ az önce eklediğimiz büyük harf

  • <tab> ile

  • !"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_\`\L&{|}~<tab>karakterlerin kalanını \L&, büyük harfli alfabenin küçük harfli olduğuna dikkat edin.

:betiketinde b, girişte bulunmayan karakterleri başlangıç ​​kümesinden kaldırın.

/(.).* \1/! ASCII setindeki ilk karakter girişte değilse

  • s/ ./ / onu kaldır

tbbdeğişiklik başarısız olana kadar tekrarla

s/(.)(.*) \1.*/ \2/ Girişte mevcut olan ASCII setindeki ilk karakteri bir boşlukla değiştirin ve ASCII setini kaldırın.

ta recurse


Açgözlü olmayan eşleştirme burada gerçekten yararlı olurdu, ancak seden az 4 bayttan tasarruf edecek kadar kandıran bir şey bulabildim : Çevrimiçi deneyin!
Neil

(İnekler quack, aynı karakterleri yanlış sırayla kaldırdığım için sadece kısmen kandırabileceğime dikkat çekti.)
Neil


4

R , 140 100 bayt

-40 bayt Giuseppe sayesinde!

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

Çevrimiçi deneyin!

Bir çözüm kullanarak outerve Giuseppe'nin büyüsünü düzgün çalışması için 104 byte daha uzundur. Bu cevaptan ilham aldım .

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

Çevrimiçi deneyin!


109 bayt , karakter sayısı olarak girdi
Giuseppe

1
Bir dize olarak giriş alarak 100 bayt !
Giuseppe,

Yine de çok güzel bir cevap; benim hatırlamadığımdan beri maden 200 bayttan fazla balon kullanmıştı rank!
Giuseppe,

@Giuseppe Bana bundan bahset - ilk önce erimekte olan fakat doğru sırada olmayan bir sonuç için "sipariş vermeyi" denedim!
JayCe

@Giuseppe ve dış kullanarak benim girişimi esinlenerek Yayınınızla yalnızca tüm boşlukları kaldırmak başardı. TIO Ayrı bir cevap olarak yayınlanan dış bir yaklaşım görmeyi çok isterim. Hala üzerinde çalışıyorum ama o kadar da şık olmayabilir.
JayCe

3

Python 3 , 71 bayt

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

Çevrimiçi deneyin!

Ovs sayesinde -4 bayt


*bool({*a}-{" "})Bunun yerine 2 bayttan if{*a}-{" "}else[a]
tasarruf edin

@RootTwo, bu bir sonuç vermez RecursionErrormi?
ovs

@RootTwo if/elsekısayolları *booldeğil, o yüzden evet,
ovs

Elbette haklısın. Bir hata nedeniyle, işlevim işlevini çağırarak işlev tekrarladı;
RootTwo

3

Python 2 , 70 69 66 64 bayt

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

Çevrimiçi deneyin!

2 bayt Thx OVS kullanılması yoluyla S and f()yerineif S:f()


...If there is a tie, replace the leftmost character...Kuralı kaçırıyorsunuz, sorunu düzeltebilirsinizreplace(min(...),' ',1)
Rod

@Rod: Ah! Anladım ...
Chas Brown

3

Jöle , 8 bayt

ẋ"ỤỤ$z⁶Q

Çevrimiçi deneyin!

Fikir

Temel fikir, dizgiyi değiştirmek ve tüm ara sonuçları döndürmek yerine, istenen çıktının sütunlarını doğrudan oluşturmaktır.

Girdi dizgisinin karakterlerini kaldırılacakları sıraya dizmekle başlarız. Şimdilik, boşluklar da kaldırılmış gibi yapacağız.

tee ay oh
845139276

Şimdi, her bir karakteri bu numaralandırmadaki indeksine göre tekrarlayarak sütunları inşa ediyoruz.

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   

Geriye kalan tek şey, kopyaları kaldırmak, boşlukları hesaba katmak.

kod

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

@TonHospel'in yardımıyla üç bayttan düştü

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

Çevrimiçi deneyin!


Ah, çok hoş, çok daha hoş bir yaklaşım! \QSon test davası için olsa da buna ihtiyacın olduğunu düşünüyorum .
Dom Hastings

Haklısın. Eklendi.
Xcali

Daha kısa: say&&s/\Q$a/ / while($a)=sort/\S/g. Ayrıca düzgün şekilde çalışır0
Ton Hospel

3

JavaScript, 67 66 65 bayt

Çünkü bir süredir sarhoş olmadım!

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

Çevrimiçi deneyin

Bira dahil 4 gereksiz bayt işaret için DanielIndie teşekkürler!


neden haritada y belirtiyorsunuz? : P 67 yapılabilir
DanielIndie

@DanielIndie, çünkü Beer! : D Gösterdiğiniz için teşekkürler.
Shaggy,

evet, böyle olacağını düşündüm: P
DanielIndie

3

K (ngn / k) , 26 24 bayt

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

Çevrimiçi deneyin!


Güzel! K denemem 41'e girdi: `{. [X; (- 1 + # x) & x? _Ci & / _ ic x _dv" ";; eminim sınırların dışına çıkmaz.
uryga

@ uryga Teşekkürler. Projeksiyonları doğru bir şekilde uygulasaydım, {@[x;y;:;" "]}olabilirdi @[;;:;" "]. Hangi k sürümünü kullanıyorsunuz? Bunları aşina değilim: _ci _ic _dv.
ngn

Bence 2.8-s mı? Operatörlere yerleşik olarak sağlayan Kona tercüman kullanıyorum: char-of-int, char-int, char-value
uryga

2

C # (Visual C # Etkileşimli Derleyici) , 129 bayt

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

Çevrimiçi deneyin!


c!=32olabilir c>32; c==32olabilir c<33; ve (veya yazdırılabilir ASCII unicode aralığının üstünde herhangi bir karakter (char)999olabilir '¡') olabilir.
Kevin Cruijssen

Oh, ve iki tane daha değişen bayt kaydedebilirsiniz whileiçin forve yerleştirme var s=ReadLine()ve s=s.Remove(i,1).Insert(i," ")(iki yarı-kolonlar artık ihtiyaç vardır böylece) içeride.
Kevin Cruijssen


2

Haskell , 67 bayt

Laikoni sayesinde 12 bayt kurtarıldı

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

Çevrimiçi deneyin!

Bu hatayla sona eriyor

Haskell , 83 79 bayt

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

Çevrimiçi deneyin!

Bu hatayla sona eriyor

Haskell , 86 bayt

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

Çevrimiçi deneyin!

Haskell , 100 91 88 bayt

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

Çevrimiçi deneyin!


67 bytes: f s|(a,_:b)<-span(/=minimum(id=<<words s))s=putStrLn s>>f(a++' ':b) Çevrimiçi deneyin!
Laikoni

@Likonik Teşekkürler! Ben sadece böyle bir şeyin eşiğindeydim ve uyuyakaldım. Ancak bunun id=<<oldukça zekice olacağını düşünmüyorum
Wheat Wizard


2

K4 , 28 20 18 bayt

Çözüm:

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

Örnek:

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

Açıklama:

Bu aynı şey NGN yapıyor. Artan bir listeyle sonuçlanacak endeksleri bulun, bunları birer birer üzerine yazın " ", sonra yinelenen satırları kaldırmak için farklı bir nokta seçin:

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

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 için -1 bayt için teşekkürler


*p==i?...:0;Muhtemelen olabilir *p-i?0:...;.
Jonathan Frech

@JonathanFrech Hayır, 1 bayt daha uzundur ( *p-1||(...)aynı uzunlukta olsa da)
l4m2

Üzgünüz, virgül ifadesini bir arada tutmanın önemini anlamadım. Ancak, bu 65 bayt olabilir . Ayrıca , türünün olması gerektiği f(a)gibi nasıl derlendiğini de bilmiyorum , ancak bunun 32 bit gcc kullanımınızla ilgisi olduğunu varsayıyorum. achar*
Jonathan Frech

@JonathanFrech Ben char*p,i;f(long long a){for(i=31;++i;)for(p=a;*p;)*p==i?puts(a),*p=32:++p;}tio (64bit) nasıl f(a)çalıştığını açıklayabilir düşünüyorum
l4m2

Üzgünüm, OP'e zorluk şartnamelerini sorduğum halde girdim ve girdi dizesinin bir boşlukla başlayabileceğini söylediler. Bu nedenle benim önerdiğim çözüm geçersiz (böyle bir girdi sonsuz bir döngü oluşturur) ve orijinal çözümünüze geri dönmelisiniz.
Jonathan Frech

2

MATLAB, 74 bayt

Bu, en küçük karakteri ve dizini almak için max () işlevinin 2 çıkış biçimini kullanır, dizeyi boşluklarda sıfır değerine ve yazdırılabilir karakterlerin karakter değerini 256'ya dönüştürür.

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

1
PPCG'ye Hoşgeldiniz! İyi iş!
AJFaraday

2

Ortak Lisp , 240 228 224 bayt

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

Çevrimiçi deneyin!

Bu benim ilk gönderim.
Lisp öğrenme sürecindeyim, bu yüzden birinin bundan daha kısa bir şey düşünebileceğinden eminim.


1
Siteye Hoşgeldiniz! Bazı ortak lisp görmek güzel!
Buğday Sihirbazı

1

APL (Dyalog Unicode) , 39 bayt SBCS

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

Çevrimiçi deneyin!

Dfn.

Nasıl?

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

V , 27 bayt

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

Çevrimiçi deneyin!

HexDump:

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

1

PowerShell , 103 99 bayt

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

Çevrimiçi deneyin!

Girdiyi dizge olarak alır $a. Daha sonra gelen döngü 2için $a.length(yani gerekli dikey zamanlarda uygun sayıda tüm ama bir karakter kaldırmak için). Her yinelemede, geçerli dizgeyi çıkarıyoruz ve $xaynı anda rahatça kaydediyoruz . Daha sonra, yeni bir yapı [regex], bir nesne $pattern kalan karakterden oluşan içinde $aolduğu olan -not euzay, Qual sorted, o zaman 0bunların inci on.

Daha sonra $aregex nesnesinin yeni bir dizgesine .Replace, dizgede $x, $pateşte bir boşlukla " ", ancak sadece 1st eşleşmesi için kullanılan yönteme eşit olarak ayarladık . Evet, bu sözdizimi garip.

İpler boru hattında bırakılır ve örtük olarak Write-Outputbize aralarında ücretsiz yeni bir satır artı bir de yeni satır eklenir.




1

MATL , 17 16 bayt

tSXz"tOy@=f1)(]x

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

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 bayt

Menzilden giriş alan [A1]ve VBE anında penceresine çıkış yapan anonim bir VBE anlık pencere işlevi .

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 ve Yorumlandı

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

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