Faça um sincelo de palavras

45

Devido a limitações técnicas do Stack Exchange, o título é renderizado incorretamente. O título correto para este desafio é

Faça um

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

O desafio de hoje é fazer pingentes de gelo da palavra de entrada. Dada uma sequência de caracteres ASCII totalmente imprimíveis e pelo menos 2 caracteres não espaciais, execute as seguintes etapas:

  1. Imprima o estado atual da sequência.

  2. Substitua o caractere lexicamente menor (exceto espaços) por um espaço. Se houver um empate, substitua o caractere mais à esquerda.

  3. Repita em linhas consecutivas até que a sequência contenha apenas 1 caractere não espacial.

Isso cria o efeito de que a string de entrada parece estar derretendo ...

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      

Regras

  • Após algumas iterações, sua saída quase certamente terá espaços à direita em cada linha. Se você optar por truncar esses, isso é permitido.

  • Você pode ter uma linha vazia à direita, mas não mais.

  • Lembre-se de que a entrada pode conter vários espaços, mas todos são efetivamente ignorados. Por exemplo, a entrada a adeve fornecer

    a      a
           a
    
  • Você pode considerar a entrada como uma lista de strings, se desejar. Para saída, você pode retornar ou imprimir uma lista de cadeias, uma única cadeia com novas linhas ou matriz de caracteres / matriz 2D. Geralmente, eu prefiro formatos de E / S permissivos; portanto, é provável que outros formatos sejam permitidos desde que sejam consistentes e correspondam claramente à saída correta. Em caso de dúvida, não hesite em perguntar. Como de costume, programas ou funções completos são permitidos.

  • Lembre-se, este é um concurso para obter a resposta mais curta em qualquer idioma! Se você optar por responder em Java, tente fazer a resposta Java mais curta possível (em bytes).

Casos de teste

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
fonte
1
"lexicamente menor" significa por ponto de código?
Giuseppe
1
@Giuseppe Sim, o personagem com o menor ponto de código ASCII (excepto o espaço, obviamente)
DJMcMayhem
2
Lembra-me de outro desafio em que tivemos que repetir verticalmente um caractere por seu índice no alfabeto.
Shaggy
6
@ Shaggy Você provavelmente está pensando em fazer um alfabeto de chuva .
Rainbolt
2
Que a referência a MediaWiki embora ...
Erik o Outgolfer

Respostas:

8

Retina , 28 bytes

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

Experimente online! Explicação:

/\S/+

Repita enquanto o valor de entrada não estiver em branco.

¶<

Imprima o valor atual.

~(

Execute o restante do script no valor. Em seguida, execute o resultado desse script como um script no valor.

O`.

Classifique os caracteres em ordem.

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

Selecione o primeiro caractere não vazio e produza um programa Retina que substitua a primeira $\ocorrência literal ( ) desse caractere ( $&) por um espaço (espaço à direita no código original).

Neil
fonte
6

APL (Dyalog Unicode) , 18 11 bytes

∪∘↓∘⍉⍋∘⍋⍴⌸⊢

Experimente online!

usos ⎕io←1; retorna uma matriz de strings (vetor de vetores de caracteres)

ngn
fonte
É necessário?
Kritixi Lithos
@Cowsquack sim, caso contrário, as primeiras linhas da saída poderia ser idênticos
NGN
@Cowsquack obrigado, eu não percebi isso
ngn 13/04/18
Felizmente, fixando isto levou a uma solução mais curto :)
NGN
Nice one, uso realmente inteligente de ⍋∘⍋:)
Kritixi Lithos
6

05AB1E , 9 bytes

ðм{v=yð.;

Experimente online!

Explicação

ð      # 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
fonte
1
{ðKv=yð.;era minha, legal.
Magic Octopus Urn
@MagicOctopusUrn Heh, bem parecido #
Luis Mendo
1
@MagicOctopusUrn Na verdade, ainda seriam os mesmos 9 bytes na versão mais recente do 05AB1E. :Substitui todos os caracteres em vez de .;substitui o primeiro (ou seja, veja o que o seu 7-byter faz !no caso de teste). Além disso, o desafio afirma explicitamente a exclusão de espaços, para que o seu 7-byter não funcione para entrada com vários espaços. PS: Boa resposta, Luis! +1 de mim. :)
Kevin Cruijssen
1
@KevinCruijssen deixe-me esquecer por que eu tive que usar .;em primeiro lugar. Lembro-me literalmente de ter lutado com isso em 1º de maio no início deste ano, agora que você mencionou.
Magic Octopus Urn
1
@LuisMendo Bem, nenhum dos comandos que você usou nesta resposta foi alterado na reescrita do Elixir em 05AB1E. :)
Kevin Cruijssen
5

Pitão, 17 14 13 bytes

V-SQdQ=XQxQNd

Experimente aqui

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.
Mnemônico
fonte
5

sed -rn , 142 143 bytes

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

Experimente online!

(nota: existem abas no programa)

Como sed não tem um conceito de ordem lexicográfica, tive que codificar o conjunto de caracteres ASCII imprimíveis e ocupar mais da metade do número de bytes.

O uso do sed 4.2.2 reduzirá o número de unidades em 2, pois isso permite rótulos sem nome. Experimente online!


-r permite expressões regulares estendidas (golfista)

-n desativa a impressão implícita do espaço do padrão no final do programa

O espaço do padrão começa com a entrada

:aetiqueta a, este é o loop principal do programa

p imprimir o espaço padrão (nome sofisticado para o buffer)

agora anexamos o conjunto de caracteres ASCII imprimíveis (excluindo o espaço)

s/$/ ABCDEFGHIJKLMNOPQRSTUVWXYZ/ anexa uma guia, atuando como delimitador de 1 byte, seguido pelo alfabeto maiúsculo

s<tab>substituto (sed pode assumir qualquer caractere como delimitador; nesse caso, a guia é usada para evitar que um byte escape do /)

  • \w+$ o alfabeto maiúsculo que acabamos de acrescentar

  • <tab> com

  • !"#$%\&'()*+,-./0123456789:;<=>?@&[\\]^_\`\L&{|}~<tab>o restante dos caracteres, observe que \L&é a versão em minúscula do alfabeto em maiúsculas

:betiqueta b, remova caracteres do conjunto inicial que não estão presentes na entrada

/(.).* \1/! se o primeiro caractere do conjunto ASCII não estiver na entrada

  • s/ ./ / remova

tbrepita baté a substituição falhar

s/(.)(.*) \1.*/ \2/ substitua o primeiro caractere no conjunto ASCII presente na entrada por um espaço e remova o conjunto ASCII

ta recurso

Kritixi Lithos
fonte
A correspondência não gananciosa teria sido realmente útil aqui, mas consegui criar algo que enganasse o sedsuficiente para salvar pelo menos 4 bytes: Experimente online!
Neil
(As vacas quack fora pontas que eu era apenas parcialmente capaz de enganar sed, como eu remover caracteres idênticos na ordem errada.)
Neil
4

Ruby , 60 58 55 47 bytes

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

Experimente online!

Kirill L.
fonte
Você pode trocar em a-b=[' ']e a-bpara uma rápida -2 bytes
benj2240
Sim, obrigado por isso, mas agora mudei um pouco a abordagem, para que não seja mais usada.
21418 Kirill L.
Eu gosto da nova abordagem!
precisa saber é o seguinte
4

R , 140 100 bytes

-40 bytes Graças a Giuseppe!

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

Experimente online!

Uma solução que usa outera magia de Giuseppe para funcionar corretamente é maior em 104 bytes. Inspirado por esta resposta .

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

Experimente online!

JayCe
fonte
109 bytes tendo de entrada como um vector de caracteres
Giuseppe
1
100 bytes tendo entrada como uma string!
Giuseppe
Ainda assim, uma resposta muito agradável; o meu tinha aumentado para mais de 200 bytes desde que eu não me lembrava rank!
Giuseppe
@ Giuseppe Conte-me - tentei pela primeira vez "pedir" um resultado que estava derretendo, mas não na ordem correta!
213 JayCe
O @ Giuseppe e minha tentativa de usar o exterior inspirado em sua postagem conseguiram remover todos os espaços. TIO Eu adoraria ver uma abordagem externa funcional publicada como uma resposta separada. Ainda trabalhando nisso, mas pode não ser tão elegante.
JayCe
3

Python 3 , 71 bytes

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

Experimente online!

-4 bytes graças a ovs

HyperNeutrino
fonte
Salvar 2 bytes usando em *bool({*a}-{" "})vez deif{*a}-{" "}else[a]
RootTwo 13/04/19
@RootTwo isso não resultaria em um RecursionError?
ovs 13/04/19
@RootTwo if/elseatalhos, mas *boolnão, então sim, recursionerror como OVS disse
HyperNeutrino
Claro que você está correto. Por causa de um erro, minha função retornou chamando sua função para que parecesse funcionar.
precisa saber é o seguinte
3

Python 2 , 70 69 66 64 bytes

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

Experimente online!

Thx por 2 bytes de ovs via usando em S and f()vez deif S:f()

Chas Brown
fonte
Você está perdendo a ...If there is a tie, replace the leftmost character...regra, você pode corrigir isso comreplace(min(...),' ',1)
Rod
@Rod: Ah! Entendi ...
Chas Brown
3

Gelatina , 8 bytes

ẋ"ỤỤ$z⁶Q

Experimente online!

Idéia

A idéia básica é construir diretamente as colunas da saída desejada, em vez de manipular a string e retornar todos os resultados intermediários.

Começamos numerando os caracteres da sequência de entrada na ordem em que serão removidos. Por enquanto, fingiremos que os espaços também serão removidos.

tee ay oh
845139276

Agora, criamos as colunas repetindo cada caractere por seu índice nesta enumeração.

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   

Tudo o que resta é remover duplicatas, para dar conta dos espaços.

Código

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

Perl 5 -n , 37 34 bytes

Eliminou três bytes com a ajuda do @TonHospel

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

Experimente online!

Xcali
fonte
Ah, abordagem muito agradável, muito melhor! Eu acho que você precisa do pensamento \Qpara o último caso de teste ... Eu também perdi isso nas primeiras vezes!
Dom Hastings
Você está certo. Adicionado.
Xcali
Shorter: say&&s/\Q$a/ / while($a)=sort/\S/g. Também lida corretamente0
Ton Hospel
3

JavaScript, 67 66 65 bytes

Porque não jogo bêbado há algum tempo!

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

Experimente online

Agradecemos a DanielIndie por apontar 4 bytes redundantes que a cerveja incluía!

Shaggy
fonte
por que você especifica y no mapa? : P pode ser feita 67
DanielIndie
@DanielIndie, porque cerveja! : D Obrigado por apontar.
Shaggy
Sim, eu pensei que seria o caso: P
DanielIndie 14/04
3

K (ngn / k) , 26 24 bytes

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

Experimente online!

ngn
fonte
Bela! Minha tentativa de K veio em 41: `{. [X; (- 1 + # x) & x? _Ci & / _ ic x _dv" ";:;" "]}` Estou desperdiçando bytes convertendo em ints e vice-versa e fazendo Certifique-se de que não sai dos limites.
Uryga
@uryga Obrigado. Se eu tivesse implementado as projeções corretamente, {@[x;y;:;" "]}poderia ter sido @[;;:;" "]. Qual versão do k você usa? Eu não estou familiarizado com estes: _ci _ic _dv.
NGN
Eu acho que é 2.8-ish? Estou usando o intérprete Kona, que fornece operadores como internos: caractere de int, int-de-char, delete-value.
Uryga
2

C # (compilador interativo do Visual C #) , 129 bytes

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

Experimente online!

Pavel
fonte
c!=32pode ser c>32; c==32pode ser c<33; e (char)999pode ser '¡'(ou qualquer outro caractere acima do intervalo unicode ASCII imprimível).
Kevin Cruijssen
Ah, e você pode salvar mais dois bytes alterando o whilepara fore colocando o var s=ReadLine()e s=s.Remove(i,1).Insert(i," ")dentro dele (para que os dois pontos e vírgulas não sejam mais necessários).
Kevin Cruijssen
2

Haskell , 67 bytes

12 bytes salvos graças a Laikoni

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

Experimente online!

Este termina com um erro

Haskell , 83 79 bytes

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

Experimente online!

Este termina com um erro

Haskell , 86 bytes

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

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

Experimente online!

Assistente de Trigo
fonte
67 bytes: f s|(a,_:b)<-span(/=minimum(id=<<words s))s=putStrLn s>>f(a++' ':b) Experimente online!
Laikoni 13/04
@Laikoni Thanks! Eu estava à beira de algo assim e adormeci. No entanto, eu não acho que eu teria que vir para cima com id=<<isso é bastante inteligente
Assistente de trigo
2

JavaScript (Node.js) , 80 65 bytes

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

Experimente online!

Não sabia replacepegar string como string, não regexp

l4m2
fonte
2

K4 , 28 20 18 bytes

Solução:

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

Exemplo:

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

Explicação:

É a mesma coisa que a ngn está fazendo. Encontre índices que resultem em uma lista crescente, substitua-os um por um e " ", em seguida, use o distinto para remover qualquer linha duplicada:

?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
rua
fonte
2

gcc de 32 bits, 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);}

Obrigado por Jonathan Frech por -1 byte

l4m2
fonte
*p==i?...:0;provavelmente poderia ser *p-i?0:...;.
Jonathan Frech
@JonathanFrech Não, é 1 byte mais longo (embora *p-1||(...)tenha o mesmo comprimento)
l4m2 14/04
Desculpe, não reconheci a importância de manter a expressão da vírgula unida. No entanto, isso pode ser 65 bytes . Também não sei como f(a)compila, como adeve ser do tipo char*, mas presumo que isso tenha algo a ver com o uso do gcc de 32 bits.
Jonathan Frech
@JonathanFrech Acho que char*p,i;f(long long a){for(i=31;++i;)for(p=a;*p;)*p==i?puts(a),*p=32:++p;}em tio (64 bits) pode explicar como f(a)funciona
l4m2
Sinto muito, embora tenha perguntado ao OP sobre as especificações do desafio e eles disseram que a sequência de entrada pode começar com um espaço. Portanto, minha solução proposta é inválida (como tal entrada resulta em um loop infinito) e você provavelmente deve voltar à sua solução original.
23818 Jonathan Frech
2

MATLAB, 74 bytes

Isso usa a forma de 2 saídas da função max () para recuperar o menor caractere e seu índice, depois de transformar a sequência em zero nos espaços e 256 em caracteres para os caracteres imprimíveis.

s=input('s');x=1;while(x);disp(s);[x,y]=max((256-s).*(s~=' '));s(y)=' ';end
Richard
fonte
1
Bem-vindo ao PPCG! Bom trabalho!
precisa saber é o seguinte
2

Lisp comum , 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))))

Experimente online!

Esta é a minha primeira vez postando.
Estou no processo de aprender cocô, então tenho certeza que alguém pode pensar em algo mais curto que isso.

JoshM
fonte
1
Bem vindo ao site! É bom ver algum cisco comum!
Assistente de trigo
1

APL (Dyalog Unicode) , SBCS de 39 bytes

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

Experimente online!

Dfn.

Quão?

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

V , 27 bytes

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

Experimente 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
fonte
1

PowerShell , 103 99 bytes

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

Experimente online!

Leva a entrada como uma string para $a. Em seguida, passamos de 2para $a.length(ou seja, o número apropriado de vezes na vertical necessário para remover todos os caracteres, exceto um). A cada iteração, produzimos a string atual e salvamos convenientemente $xao mesmo tempo. Nós então construir um novo [regex]objecto, $pattern consistindo dos restantes caracteres em $aque são -not equa a espaço, sorted, em seguida, o 0th um destes.

Em seguida, definimos $aigual a uma nova string do objeto regex com o .Replacemétodo para substituir na string $x, a $pattern, por um espaço " ", mas apenas a 1st corresponde. Sim, essa sintaxe é estranha.

As strings são deixadas no pipeline e implícitas Write-Outputnos dão uma nova linha entre elas de graça, mais uma nova linha à direita.

AdmBorkBork
fonte
1

Java (JDK 10) , 140 bytes

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

Experimente online!

Tecnicamente, há uma linha em branco, mas não está vazia .

Olivier Grégoire
fonte
1

MATL , 17 16 bytes

tSXz"tOy@=f1)(]x

Experimente online! Ou verifique todos os casos de teste .

Explicação

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
fonte
1

Excel VBA, 167 bytes

Uma função de janela imediata anônima do VBE que leva a entrada do intervalo [A1]e sai para a janela imediata do 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

Sem Golfe e Comentado

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