Bilden Sie einen Wort-Eiszapfen


45

Aufgrund technischer Einschränkungen von Stack Exchange wird der Titel falsch gerendert. Der richtige Titel für diese Herausforderung ist

Mach ein

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

Die heutige Herausforderung besteht darin, aus dem Eingangswort Eiszapfen zu machen. Führen Sie die folgenden Schritte aus, wenn Sie eine Zeichenfolge mit vollständig druckbarem ASCII-Code und mindestens 2 Zeichen ohne Leerzeichen angeben:

  1. Gibt den aktuellen Status der Zeichenfolge aus.

  2. Ersetzen Sie das lexikalisch kleinste Zeichen (außer Leerzeichen) durch ein Leerzeichen. Wenn es einen Gleichstand gibt, ersetzen Sie das Zeichen ganz links.

  3. Wiederholen Sie dies in aufeinanderfolgenden Zeilen, bis die Zeichenfolge nur noch 1 Zeichen ohne Leerzeichen enthält.

Dies erzeugt den Effekt, dass die Eingabezeichenfolge so aussieht, als würde sie schmelzen ...

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      

Regeln

  • Nach einigen Iterationen wird Ihre Ausgabe mit ziemlicher Sicherheit nachgestellte Leerzeichen in jeder Zeile enthalten. Wenn Sie diese abschneiden möchten, ist dies zulässig.

  • Möglicherweise wird eine Leerzeile nachgestellt, jedoch nicht mehr.

  • Denken Sie daran, dass die Eingabe möglicherweise mehrere Leerzeichen enthält, diese werden jedoch alle effektiv übersprungen. Zum Beispiel sollte die Eingabe a ageben

    a      a
           a
    
  • Sie können Eingaben als Liste von Zeichenfolgen verwenden, wenn Sie möchten. Für die Ausgabe können Sie eine Liste von Zeichenfolgen, eine einzelne Zeichenfolge mit Zeilenumbrüchen oder eine Zeichenmatrix / ein 2D-Array zurückgeben oder drucken. Im Allgemeinen bevorzuge ich zulässige E / A-Formate, sodass andere Formate höchstwahrscheinlich zulässig sind, solange sie konsistent sind und eindeutig der richtigen Ausgabe entsprechen. Im Zweifelsfall können Sie gerne nachfragen. Wie üblich sind vollständige Programme oder Funktionen zulässig.

  • Denken Sie daran, dies ist ein Wettbewerb, um die kürzeste Antwort in jeder Sprache zu geben! Wenn Sie in Java antworten möchten, versuchen Sie, die kürzeste Java-Antwort (in Byte) zu erstellen, die Sie können.

Testfälle

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
"lexikalisch am kleinsten" bedeutet nach Codepunkt?
Giuseppe

1
@ Giuseppe Ja, das Zeichen mit dem kleinsten ASCII-Codepunkt (außer dem Leerzeichen)
DJMcMayhem

2
Erinnert mich an eine weitere Herausforderung, bei der wir, glaube ich, ein Zeichen anhand seines Index im Alphabet vertikal wiederholen mussten.
Shaggy

6
@ Shaggy Du denkst wahrscheinlich an Make some Alphabet Rain .
Rainbolt

2
Dieser Verweis auf MediaWiki obwohl ...
Erik der Outgolfer

Antworten:



8

Retina , 28 Bytes

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

Probieren Sie es online! Erläuterung:

/\S/+

Wiederholen, solange der Eingabewert nicht leer ist.

¶<

Gibt den aktuellen Wert aus.

~(

Führen Sie den Rest des Skripts für den Wert aus. Führen Sie dann das Ergebnis dieses Skripts als Skript für den Wert aus.

O`.

Sortieren Sie die Zeichen in der Reihenfolge.

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

Wählen Sie das erste nicht leere Zeichen aus und geben Sie ein Retina-Programm aus, das das erste literalische ( $\) Vorkommen dieses Zeichens ( $&) durch ein Leerzeichen ersetzt (nachfolgendes Leerzeichen im Originalcode).


6

APL (Dyalog Unicode) , 18 11 Bytes

∪∘↓∘⍉⍋∘⍋⍴⌸⊢

Probieren Sie es online!

verwendet ⎕io←1; gibt ein Array von Strings zurück (Vektor von Zeichenvektoren)


Ist das nötig?
Kritixi Lithos

@Cowsquack ja, sonst könnten die ersten Zeilen der Ausgabe identisch sein
ngn

@Cowsquack danke, ich habe das nicht bemerkt
ngn

Zum Glück führte das zu einer kürzeren Lösung :)
ngn

Schöne, wirklich kluge Verwendung von ⍋∘⍋:)
Kritixi Lithos

6

05AB1E , 9 Bytes

ðм{v=yð.;

Probieren Sie es online!

Erläuterung

ð      # 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ð.;war meins, nett.
Magic Octopus Urn

@MagicOctopusUrn Heh, ziemlich ähnlich
Luis Mendo

1
@MagicOctopusUrn Eigentlich wären es immer noch die gleichen 9 Bytes in der neuesten Version 05AB1E .. Ersetzt :alle Zeichen, anstatt .;die ersten zu ersetzen (dh sehen Sie, was Ihr 7-Byte mit dem !im Testfall macht). Außerdem wird in der Abfrage ausdrücklich das Ausschließen von Leerzeichen angegeben, sodass Ihr 7-Byte-Code nicht für die Eingabe mit mehreren Leerzeichen geeignet ist. PS: Schöne Antwort, Luis! +1 von mir. :)
Kevin Cruijssen

1
@KevinCruijssen überlasse es mir zu vergessen, warum ich das überhaupt benutzen musste .;. Ich erinnere mich buchstäblich, dass ich am 1. Mai dieses Jahres damit zu kämpfen hatte, jetzt, wo Sie es erwähnen.
Magic Octopus Urn

1
@LuisMendo Nun, keiner der Befehle, die Sie in dieser Antwort verwendet haben, hat sich beim Elixir-Umschreiben von 05AB1E geändert. :)
Kevin Cruijssen

5

Pyth, 17 14 13 Bytes

V-SQdQ=XQxQNd

Probieren Sie es hier aus

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 bytes

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

Probieren Sie es online!

(Hinweis: Das Programm enthält Registerkarten.)

Da sed kein Konzept für die lexikografische Reihenfolge hat, musste ich den Satz druckbarer ASCII-Zeichen fest codieren, und es nimmt mehr als die Hälfte der Bytecount in Anspruch.

Wenn Sie sed 4.2.2 verwenden, wird bytecount um 2 reduziert, da dies unbenannte Labels zulässt. Probieren Sie es online aus!


-r ermöglicht erweiterte reguläre Ausdrücke (Golfspieler)

-n Deaktiviert das implizite Drucken des Musterbereichs am Ende des Programms

Der Musterraum beginnt mit der Eingabe

:alabel a, das ist die Hauptprogrammschleife

p Drucken Sie den Musterbereich (ausgefallener Name für den Puffer)

Jetzt hängen wir den Satz druckbarer ASCII-Zeichen an (ohne Leerzeichen)

s/$/ ABCDEFGHIJKLMNOPQRSTUVWXYZ/ Fügen Sie eine Registerkarte als 1-Byte-Trennzeichen gefolgt vom Großbuchstaben hinzu

s<tab>Ersatzzeichen (sed kann ein beliebiges Zeichen als Trennzeichen verwenden. In diesem Fall wird die Registerkarte verwendet, um ein Byte vor dem Entweichen aus dem Zeichen zu schützen. /)

  • \w+$ Das Großbuchstaben haben wir gerade angehängt

  • <tab> mit

  • !"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_\`\L&{|}~<tab>Beachten Sie, dass \L&es sich bei den übrigen Zeichen um die Kleinbuchstabenversion des Großbuchstaben handelt

:bBeschriftung b: Entfernen Sie Zeichen aus dem Anfangssatz, die in der Eingabe nicht vorhanden sind

/(.).* \1/! wenn das erste Zeichen aus dem ASCII-Satz nicht in der Eingabe enthalten ist

  • s/ ./ / entfernen Sie es

tbWiederholen, bbis die Ersetzung fehlschlägt

s/(.)(.*) \1.*/ \2/ Ersetzen Sie das erste Zeichen im ASCII-Satz, das in der Eingabe vorhanden ist, durch ein Leerzeichen, und entfernen Sie den ASCII-Satz

ta rekursieren


Nicht-gierige Übereinstimmungen wären hier wirklich hilfreich gewesen, aber ich konnte mir etwas einfallen lassen, das so täuschte, dass es sedmindestens 4 Bytes sparte: Probieren Sie es online aus!
Neil

(Kühe quaken wies darauf hin, dass ich sed nur teilweise täuschen konnte, da ich identische Zeichen in der falschen Reihenfolge entferne.)
Neil


4

R , 140 100 Bytes

-40 bytes Danke an Giuseppe!

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

Probieren Sie es online!

Eine Lösung, die outerGiuseppes Magie verwendet, um richtig zu funktionieren, ist mit 104 Bytes länger. Inspiriert von dieser Antwort .

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

Probieren Sie es online!


109 Bytes Eingabe als Zeichenvektor
Giuseppe

1
100 Bytes werden als String eingegeben!
Giuseppe

Trotzdem eine sehr schöne Antwort; meins war auf über 200 Bytes angewachsen, seit ich mich nicht mehr daran erinnerte rank!
Giuseppe

@ Giuseppe Erzähl mir davon - ich habe zuerst "order" für ein Ergebnis ausprobiert, das geschmolzen ist, aber nicht in der richtigen Reihenfolge!
JayCe

@ Giuseppe und mein Versuch, Outer inspiriert von Ihrem Beitrag zu verwenden, haben nur alle Leerzeichen entfernt. TIO Ich würde es begrüßen, wenn ein funktionierender äußerer Ansatz als separate Antwort veröffentlicht würde. Ich arbeite immer noch daran, aber es könnte nicht so elegant sein.
JayCe

3

Python 3 , 71 Bytes

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

Probieren Sie es online!

-4 Bytes dank ovs


Speichern Sie 2 Bytes mit *bool({*a}-{" "})anstelle vonif{*a}-{" "}else[a]
RootTwo

@RootTwo würde dies nicht zu einem führen RecursionError?
Ovs

@ RootTwo if/elseVerknüpfungen, *boolaber nicht, so ja, Rekursionsfehler wie Ovs sagte
HyperNeutrino

Natürlich hast du recht. Aufgrund eines Fehlers wurde meine Funktion rekursiv ausgeführt, indem Ihre Funktion aufgerufen wurde, sodass sie zu funktionieren schien.
RootTwo

3

Python 2 , 70 69 66 64 Bytes

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

Probieren Sie es online!

Danke für 2 Bytes von ovs via using S and f()anstelle vonif S:f()


Sie verfehlen die ...If there is a tie, replace the leftmost character...Regel, das können Sie mitreplace(min(...),' ',1)
Rod

@ Rod: Ah!
Chas Brown

3

Gelee , 8 Bytes

ẋ"ỤỤ$z⁶Q

Probieren Sie es online!

Idee

Die Grundidee besteht darin, die Spalten der gewünschten Ausgabe direkt zu erstellen, anstatt die Zeichenfolge zu manipulieren und alle Zwischenergebnisse zurückzugeben.

Wir beginnen mit der Nummerierung der Zeichen der Eingabezeichenfolge in der Reihenfolge, in der sie entfernt werden. Im Moment tun wir so, als würden Leerzeichen ebenfalls entfernt.

tee ay oh
845139276

Jetzt erstellen wir die Spalten, indem wir jedes Zeichen anhand seines Index in dieser Aufzählung wiederholen.

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   

Alles, was übrig bleibt, ist das Entfernen von Duplikaten, um die Leerzeichen zu berücksichtigen.

Code

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

Drei Bytes mit Hilfe von @TonHospel gelöscht

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

Probieren Sie es online!


Ah, sehr schön, viel schöner Ansatz! Ich denke du brauchst das \Qallerdings für den letzten Testfall .... das habe ich auch beim ersten mal verpasst!
Dom Hastings

Du hast recht. Fügte es hinzu.
Xcali

Kürzere: say&&s/\Q$a/ / while($a)=sort/\S/g. Auch richtig behandelt0
Ton Hospel

3

JavaScript, 67 66 65 Bytes

Weil ich seit einiger Zeit nicht mehr betrunken Golf gespielt habe!

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

Probieren Sie es online aus

Vielen Dank an DanielIndie für den Hinweis auf 4 redundante Bytes, die das Bier enthielt!


warum gibst du y in der map an : P es kann 67 gemacht werden
DanielIndie

@ DanielIndie, weil Bier! : D Danke für den Hinweis.
Shaggy

Ja, ich dachte, das wäre der Fall: P
DanielIndie

3

K (NGN / k) , 26 24 Bytes

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

Probieren Sie es online!


Schön! Mein K-Versuch kam um 41: "{. [X; (- 1 + # x) & x? _Ci & / _ic x _dv" ";:" "]}" Ich verschwendete die Umwandlung von Bytes in Ints und zurück und die Erzeugung sicher, es geht nicht über die Grenzen hinaus.
uryga

@uryga Danke. Wenn ich Projektionen richtig umgesetzt {@[x;y;:;" "]}hätte, hätte es sein können @[;;:;" "]. Welche Version von k benutzt du? Ich bin nicht vertraut mit diesen: _ci _ic _dv.
2.

Ich denke, es ist 2,8-ish? Ich verwende den Kona-Interpreter, der Operatoren als eingebaute Elemente bereitstellt: 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," ");}

Probieren Sie es online!


c!=32kann sein c>32; c==32kann sein c<33; und (char)999kann '¡'(oder ein beliebiges anderes Zeichen oberhalb des druckbaren ASCII-Unicode-Bereichs) sein.
Kevin Cruijssen

Oh, und Sie können zwei weitere Bytes einsparen while, forindem Sie das in ändern und das var s=ReadLine()und s=s.Remove(i,1).Insert(i," ")darin platzieren (daher werden die beiden Semikolons nicht mehr benötigt).
Kevin Cruijssen

2

Perl 5 mit -nlF/\s|/39 Bytes

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

Dies könnte bedeuten, dass die Grenzen von Perls Flags überschritten werden, die nicht gezählt werden. In diesem Fall werde ich zur vorherigen Antwort zurückkehren.

Probieren Sie es online!


Mit nur einem -nFlag auf 35 Byte reduziert
Xcali

2

Haskell , 67 Bytes

Dank Laikoni 12 Bytes gespart

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

Probieren Sie es online!

Dieser endet in einem Fehler

Haskell , 83 79 Bytes

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

Probieren Sie es online!

Dieser endet in einem Fehler

Haskell , 86 Bytes

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

Probieren Sie es online!

Haskell , 100 91 88 Bytes

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

Probieren Sie es online!


67 bytes: f s|(a,_:b)<-span(/=minimum(id=<<words s))s=putStrLn s>>f(a++' ':b) Probieren Sie es online!
Laikoni

@Laikoni Danke! Ich war kurz davor und bin eingeschlafen. Aber ich glaube nicht , dass ich würde kommen mit , id=<<dass ziemlich clever
Wheat Wizard


2

K4 , 28 20 18 Bytes

Lösung:

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

Beispiel:

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

Erläuterung:

Es ist dasselbe, was ngn tut. Suchen Sie nach Indizes, die zu einer aufsteigenden Liste führen, überschreiben Sie sie nacheinander mit " "und entfernen Sie doppelte Zeilen mit dem Häkchen:

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

Vielen Dank für Jonathan Frech für -1 Byte


*p==i?...:0;könnte wohl sein *p-i?0:...;.
Jonathan Frech

@ JonathanFrech Nein, es ist 1 Byte länger (obwohl *p-1||(...)es die gleiche Länge hat)
14.04.18

Entschuldigung, habe nicht erkannt, wie wichtig es ist, den Komma-Ausdruck zusammen zu halten. Dies können jedoch 65 Byte sein . Ich weiß auch nicht, wie f(a)kompiliert wird, da adies vom Typ sein sollte char*, aber ich gehe davon aus, dass dies etwas mit Ihrer 32-Bit-GCC-Nutzung zu tun hat.
Jonathan Frech

@ JonathanFrech Ich denke, char*p,i;f(long long a){for(i=31;++i;)for(p=a;*p;)*p==i?puts(a),*p=32:++p;}auf tio (64bit) kann erklären, wie es f(a)funktioniert
l4m2

Es tut mir leid, aber ich habe das OP nach den Herausforderungsspezifikationen gefragt und sie sagten, dass die Eingabezeichenfolge möglicherweise mit einem Leerzeichen beginnt. Daher ist meine vorgeschlagene Lösung ungültig (da eine solche Eingabe zu einer Endlosschleife führt) und Sie sollten höchstwahrscheinlich zu Ihrer ursprünglichen Lösung zurückkehren.
Jonathan Frech

2

MATLAB, 74 Bytes

Dies verwendet die 2-Ausgabe-Form der Funktion max (), um das kleinste Zeichen und seinen Index abzurufen, nachdem die Zeichenfolge in Nullwerte in den Leerzeichen und in 256 Zeichen für die druckbaren Zeichen umgewandelt wurde.

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

1
Willkommen bei PPCG! Gute Arbeit!
AjFaraday

2

Common Lisp , 240 228 224 Bytes

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

Probieren Sie es online!

Dies ist mein erstes Mal Posting.
Ich bin gerade dabei, lispeln zu lernen, also bin ich sicher, dass sich jemand etwas kürzeres als das vorstellen kann.


1
Willkommen auf der Seite! Gut zu sehen, einige gemeinsame lisp!
Weizen-Assistent

1

APL (Dyalog Unicode) , 39 Byte SBCS

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

Probieren Sie es online!

Dfn.

Wie?

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

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

Probieren Sie es online!

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 bis 99 Byte

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

Probieren Sie es online!

Übernimmt die Eingabe als Zeichenfolge in $a. Wir durchlaufen dann eine Schleife von 2bis $a.length(dh die entsprechende Anzahl von vertikalen Malen, die erforderlich sind, um alle Zeichen bis auf ein Zeichen zu entfernen). Bei jeder Iteration geben wir den aktuellen String aus und speichern ihn bequem $xgleichzeitig ab. Wir bauen dann ein neues [regex]Objekt, $pattern , bestehend aus den verbleibenden Zeichen in $aDarin sind -not eQual zum Raum, sorted, dann ist die 0ten davon.

Wir setzen dann $agleich einen neuen String des Regex-Objekts mit der .ReplaceMethode $x, den $pattern im String durch ein Leerzeichen zu ersetzen " ", aber nur die 1st-Übereinstimmung. Ja, diese Syntax ist komisch.

Die Zeichenfolgen Write-Outputverbleiben in der Pipeline, und implizit erhalten wir eine neue Zeile dazwischen sowie eine nachfolgende neue Zeile.




1

MATL , 17 16 Bytes

tSXz"tOy@=f1)(]x

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

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 Byte

Eine anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich [A1]und Ausgaben in das VBE-Direktfenster übernimmt .

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 und Kommentiert

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.