Digamos que eu tenha um texto como este (cada palavra em uma linha, sem espaços)
Programming
Puzzles
&
Code
Golf
Isso não faz sentido! Isso desafia totalmente as leis da física.
Seu desafio é remediar essa situação impossível e recolher o texto da seguinte maneira:
P
Prog
&uzz
Coderam
Golflesming
Para que não haja espaço vazio embaixo de qualquer caractere, os caracteres mantêm sua ordem vertical.
O objetivo é satisfazer os requisitos, mas use o menor número possível de bytes de código-fonte.
Respostas:
Pitão, 10 bytes
Experimente online no Pyth Compiler / Executor .
Idéia
Podemos alcançar a saída desejada aplicando quatro transformações simples:
Inverta a ordem das linhas:
Transponha linhas e colunas:
Esta parte superior justifica, recolhendo as colunas originais.
Transponha linhas e colunas:
Inverta a ordem das linhas:
Código
fonte
Haskell, 62 bytes
Sou muito madura
fonte
Python 2, 104 bytes
Um algoritmo iterativo de uma passagem. Analisamos cada linha em ordem, atualizando a lista
l
de linhas para saída. A nova palavra efetivamente sai do fundo, deslocando todas as letras acima dela em um espaço. Por exemplo, no caso de testedepois que terminamos
Code
, temose, em seguida, adicionando
Golf
resultados emque podemos ver como a combinação de duas peças
onde a primeira peça foi deslocada
golf
. Realizamos esse deslocamento com umzip
da lista de saída com o elemento no final (lado esquerdo) e a precedência da lista de saída por uma linha em branco (lado direito), cortando cada parte no comprimento do novo elemento.Pode parecer mais natural, ao contrário, iterar para trás, deixando que novas cartas caiam do topo, mas minha tentativa disso acabou por mais tempo.
Para comparação, aqui está uma abordagem
zip
/filter
, commap(None,*x)
usado paraiziplongest
(109 bytes):fonte
CJam, 11 bytes
Experimente online no intérprete CJam .
Como funciona
A idéia é a mesma da minha resposta Pyth .
fonte
JavaScript (ES6), 146
(As duas novas linhas dentro das seqüências de modelo são significativas e contadas)
A idéia de @Dennis implementada em JavaScript. A longa função S faz a transposição linha por linha e char por char, deixando o resultado na
t
matriz.Menos golfe dentro do snippet (experimente no Firefox)
fonte
S(t.reverse()),t.reverse().join
porS(R=t.reverse()),R.join
.R, 223 bytes
Essa é uma maneira absurdamente longa e ingênua de fazer isso.
Ungolfed:
Você pode experimentá-lo online .
fonte
Matlab / Octave, 99 bytes
Exemplo :
Defina uma sequência de entrada em uma variável, digamos
s
.10
é o caractere de avanço de linha:Função de chamada
f
com entradas
:Ou experimente on-line (obrigado a @beaker pela ajuda com o intérprete Octave on-line)
fonte
JavaScript ES6, 119 bytes
Aqui ele é não-destruído e no ES5 com comentários explicando como funciona:
fonte
APL (Dyalog Extended) ,
1311 bytes SBCS-2 com minhas extensões para Dyalog APL.
Função tácita anônima, recebendo e retornando uma matriz de caracteres.
Experimente online!
~
remova∘
os' '
espaços⍤
das1
linhas (sub-matrizes 1D iluminadas)⍢
enquanto⍉
transpostas⍢
enquanto⊖
viradasfonte
R,
190178175 BytesProvavelmente ainda há espaço para jogar nisto. Provavelmente algumas operações desnecessárias lá
Ungolfed e explicou
Execução de teste. É interessante notar que, devido à maneira como a digitalização funciona, a frase inteira pode ser inserida com espaços e ainda fornecer a saída conforme especificado.
fonte
STATA, 323 bytes
Recebe entrada em um arquivo chamado ab. Só funciona com até 24 caracteres agora. Será atualizado mais tarde para fazê-lo funcionar com mais. Além disso, não funciona no compilador online. Requer o compilador não livre.
Editar: moveu o silenciosamente (para suprimir a saída) para o próprio loop de cada instrução no loop, economizando 8 bytes.
fonte
R, 171 bytes
Com novas linhas e recuo:
Uso:
fonte
Gelatina , 6 bytes (não concorrente)
Experimente online!
Como funciona
A idéia é a mesma da minha resposta Pyth .
fonte
Turtlèd , 72 bytes, não competidor
Com certeza eu poderia mudar a abordagem para salvar bytes, mas mais tarde.
: p Esolang não-golfe bate langs regulares: p
O estranho de Turtlèd é que ele foi originalmente feito depois de uma discussão sobre ascii art langs, mas na verdade parece ser melhor nesses tipos de desafios
Turtlèd não pode receber entrada de nova linha, mas para várias entradas, e isso requer apenas uma entrada: termine cada palavra com um espaço, incluindo a última.
Experimente online!
Explicação:
fonte
Perl, 133 bytes
Esse foi um daqueles desafios que mudaram na minha cabeça de ser muito difícil, fácil e muito mais código do que eu previra ... Não estou particularmente feliz com a abordagem, tenho certeza de que há uma maneira muito melhor de reduzir o
print pop@F...
bit usando talvez-n
ou apenas regex puro, mas não posso chegar lá agora ... Originalmente, eu estava usandosay
, mas acho que teria que pontuar mais (use 5.01
) por causa disso$'
.Uso
Salvar como
vertically-collapse-text.pl
.fonte
SmileBASIC, 90 bytes
Aplica gravidade a todo o texto no console. Não tenho certeza se isso é válido ou se tenho que usar uma matriz de string.
fonte
Ruby,
9982 bytesChegando la...
Uma tentativa de explicação:
Execute-o assim:
fonte
K, 30
.
Explicação
x@\:!|/#:'x
estende cada string para criar uma matriz de caracteres quadrada.+
transpõe{(-#x)$x@&~^x}
removerá os espaços de uma string e, em seguida, preencherá a string pelo comprimento originalAplique essa função a cada uma das seqüências de caracteres transpostas e depois gire a saída para obter o resultado
fonte
{+{(-#x)$x@&~^x}'+(|/#:'x)$x}
para 29.pb - 310 bytes
Que desastre. Eu mal me lembro de nada sobre como isso funciona.
Devido à maneira como a entrada do pb funciona (uma única linha ao mesmo tempo), é necessário usar espaços em vez de novas linhas na entrada. Se o intérprete não fosse lixo e você pudesse incluir novas linhas na entrada, a única alteração seria a
[B=32]
do início[B=10]
.Estou trabalhando em uma atualização para o pbi (o intérprete) que limpará os recursos visuais se você quiser assistir o programa sendo executado. Ele ainda precisa de muito trabalho, mas, enquanto isso, você pode assistir a este programa no YouTube .
fonte
J, 17 bytes
Solução bastante agradável.
Explicação:
Caso de teste explicado
Casos de teste
fonte
;@;:&.(|:@|.)
for 13Na verdade , 13 bytes
Isso usa o algoritmo descrito na resposta de Dennis 'Jelly . Entrada e saída são duas listas de strings. Infelizmente, a função de transposição interna não funciona muito bem se as listas ou cadeias internas não tiverem o mesmo comprimento, o que meio que anularia o ponto de colapsar verticalmente em primeiro lugar. Sugestões de golfe são bem-vindas. Experimente online!
Ungolfing
fonte
Raquete 312 bytes
Ungolfed:
Testando:
Resultado:
fonte
JavaScript (ES6), 103 bytes
Dividido no CR, o mapa externo garante que passemos o tempo suficiente para permitir que a "gravidade" solte as letras o quanto for necessário.
O mapa interno primeiro verifica se existe uma próxima linha, se houver, e é mais curta, solte o estouro para a próxima linha. ou seja, se a 1ª linha tiver "ABCD" e a 2ª linha tiver "FG", solte o "CD" da 1ª para a 2ª para que a 1ª linha se torne "AB" e a 2ª se torne "FGCD".
Como fazemos isso quantas vezes houver linhas, as letras caem o mais longe que deveriam, deixando-nos com o resultado desejado.
fonte
Japonês , 8 bytes
Experimente online!
Como funciona
Há também o
z
que gira a string 2D em um múltiplo de 90 graus, mas de alguma forma trunca a string quandoheight > length
.fonte
05AB1E ,
109 bytesExperimente online.
ou com partida alternativa:
Experimente online.
Abordagem semelhante à resposta de @ Dennis ♦ 'Pyth .
-1 byte graças a @Emigna substituindo
ðõ:
porðм
.Explicação:
Explicação alternativa:
fonte
R,
s8152 bytesTomei alguma liberdade na interpretação da questão e presumi que o texto é representado em uma matriz com um caractere por célula, assim:
Então x se torna:
Agora eu uso
order
e[
para classificar as colunas para que os NAs cheguem primeiro e depois todos os outros valores:Torna-se mais longo se for necessário que a saída seja palavras:
fonte
function(x)
devem ser incluídos na contagem de bytes.R,
196189170 bytesUma versão legível por humanos:
Como funciona:
(Ou, em outras palavras, partes "supérfluas" caem até que tudo o que pode cair caia.)
Entrada: um vetor de caracteres.
fonte
Julia 0.6 , 141 bytes
Experimente online!
A transmissão com
g.([w], [d d])
me permite livrar-me de qualquer declaração do mapa e me salva em torno de 7 bytes.fonte