Imprimir três colunas separadas verticalmente por espaços

15

Tarefa

  • Pegue a sequência de entrada separada pelo espaço.
  • Classifique as palavras em ordem alfabética.
  • Imprima-os verticalmente em 3 colunas separadas por espaço (s).

Desafio

  • As alturas de todas as três colunas devem ter o peso mais uniforme possível.
  • Todas as três colunas devem ficar alinhadas à esquerda.

Isso é , então o código mais curto vence!

Exemplo

Se a entrada for:

"cat caterpillar pie frog elephant pizza", 

A saída deve ser:

cat         elephant pie
caterpillar frog     pizza

Cuidado com os casos, se a entrada for:

"a b c d e f g" 

Deve ser impresso como:

a c e
b d f
    g

# or

a d f
b e g
c

# and not

a d g
b e
c f
Satendra
fonte
2
Além disso, recomendo que você remova o requisito estrito de E / S; isto é, considere a entrada como uma lista de cadeias de caracteres em qualquer forma (conforme o atendente desejar) e como um programa ou função que esteja na lista.
HyperNeutrino
É aceitável enviar isso para o primeiro exemplo?
caird coinheringaahing
4
@Satendra Não se preocupe com o "colocar em espera como fora de tópico ...", quando / se a pergunta for suficientemente boa, ela será reaberta. | Você pode usar a sandbox.
user202729
3
Considere usar o Sandbox no futuro para obter feedback sobre seus desafios antes de publicá-los no site principal.
Mego 16/11
1
@Satendra Bom primeiro desafio. Se as colunas devem ser separadas por um único espaço no espaço mais estreito, você deve indicar isso.
Adám 16/11/17

Respostas:

4

Casca , 24 17 bytes

TmoTT' §CȯmLTC3Ow

Experimente online!

Explicação

Esse foi um desafio surpreendentemente complicado, já que Husk atualmente não possui um mecanismo embutido para dividir uma lista em um determinado número de partes.

TmoTT' §CȯmLTC3Ow  Implicit input, say s="bbb a cc ddd e"
                w  Split at spaces: x=["bbb","a","cc","ddd","e"]
             C3    Cut into slices of length 3: [["bbb","a","cc"],["ddd","e"]]
            T      Transpose: [["bbb","ddd"],["a","e"],["cc"]]
         ȯmL       Map length: [2,2,1]
                   These are the correct lengths of the columns.
       §C      O   Sort x and split into these lengths: [["a","bbb"],["cc","ddd"],["e"]]
                   These are the columns of the correct output, without padding.
 mo                For each column,
    T'             transpose and pad with spaces: [["ab"," b"," b"],["cd","cd"," d"],["e"]]
   T               then transpose back: [["a  ","bbb"],["cc ","ddd"],["e"]]
T                  Transpose the whole list: [["a  ","cc ","e"],["bbb","ddd"]]
                   Implicitly join each row by spaces,
                   join the resulting strings by newlines and print.
Zgarb
fonte
2

Gelatina , 6 bytes

Ṣœs3ZG

Experimente online!

Erik, o Outgolfer
fonte
@DLosc Na verdade, ele também foi testado com o a b c d e f gcaso, e fiz outros testes extensivos porque também tive esse sentimento. Ah, e sua falta vem do G(Format as G rid.) Embutido.
Erik the Outgolfer
Ah, tem um embutido. (Por que estou surpreso?) Isso explica muito.
21417 DLosc #
2

Python 3 , 148 bytes

-6 bytes graças a ovs.

l=sorted(input().split())
n=-~len(l)//3
f=lambda l:[i.ljust(max(map(len,l)))for i in l+['']]
for i in zip(f(l[:n]),f(l[n:n*2]),f(l[n*2:])):print(*i)

Experimente online!

Trabalhando nisso. Tudo o que tentei faz com que a saída seja desigual ...

totalmente humano
fonte
1
148 bytes usando python 3.
ovs 17/11
1

Mathematica, 115 bytes

Grid[Transpose@PadRight@TakeList[#,Last@IntegerPartitions[Tr[1^#],3]]&@Sort@StringSplit@#/. 0->"",Alignment->Left]&

experimentá-lo na caixa de areia wolfram

cole o código a seguir e pressione Shift + Enter

Grid[Transpose@PadRight@TakeList[#,Last@IntegerPartitions[Tr[1^#],3]]&@Sort@StringSplit@#/. 0->"",Alignment->Left]&["cat caterpillar pie frog elephant pizza"]
J42161217
fonte
1
@HalvardHummel corrigido
J42161217 16/11
1

Perl 5 , 134 + 1 ( -a) = 135 bytes

$.=(sort{$b=~y///c-length$a}(@F=sort@F))[0]=~y///c;@a=splice@F,0,@F/3;@b=splice@F,0,@F/2;printf"%-$.s "x3 .$/,shift@a,shift@b,$_ for@F

Experimente online!

Xcali
fonte
O que isso significa?
xyz123
1

05AB1E , 8 bytes

#{.B3äζ»

Experimente online!


#        | Split on spaces.
 {       | Sort aphabetically.
  .B     | Pad to max string length.
    3ä   | Split into columns.
      ζ  | Transpose.
       » | Print with newlines.
Urna de polvo mágico
fonte
1

Javascript 181 175 bytes

f=a=>(a=a.split` `).sort().map(c=>(t[y]=[...t[y]||[],c],M[x]>(l=c.length)?0:M[x]=l,a[++y*3+x]?y:y=x++*0),M=[t=[x=y=0]])&&t.map(x=>x.map((c,y)=>c.padEnd(M[y])).join` `).join`
`

console.log(f("cat caterpillar pie frog elephant pizza"))
console.log("-------------------")
console.log(f("cat caterpillar pie frog frog123123 pizza"))
console.log("-------------------")
console.log(f("a b c d e f g"))
console.log("-------------------")
console.log(f("a b c d e f"))
console.log("-------------------")
console.log(f("a b c d e"))
console.log("-------------------")
console.log(f("a b c d"))

/*
f=a=>(a=a.split` `).sort().map(c=>((t[y] =t[y]||[])[x]=c,M[x]>(l=c.length)?0:M[x]=l,++y*3+x<a.length?0:y=x++*0),M=[t=[x=y=0]])&&t.map(x=>x.map((c,y)=>c.padEnd(M[y])).join` `).join`\n`

f=a=>(a=a.split` `).sort().map(c=>(t[y]=[...t[y]||[],c],M[x]>(l=c.length)?0:M[x]=l,++y*3+x<a.length?0:y=x++*0),M=[t=[x=y=0]])&&t.map(x=>x.map((c,y)=>c.padEnd(M[y])).join` `).join`\n`

*/

DanielIndie
fonte
0

J , 73 bytes

,.@(' ',"1[:>|:)@((](s,(s=.]{.1:),(1:{.~[-2*]))([:<.0.5+%&3))@#];.1])@/:~

Eu posso explicar essa bagunça mais tarde, se alguém estiver interessado.

Experimente online!

Galen Ivanov
fonte
0

Carvão , 65 64 bytes

≔⪪θ ηFη«⊞υ⌊η≔⟦⟧ηF⪪θ ¿¬№υκ⊞ηκ»FE³✂υ÷×ιLυ³÷×⊕ιLυ³I1«P⪫ι¶¿ιM⊕⌈EιLκ→

Experimente online! Link é a versão detalhada do código. Economize 2 bytes se não precisar lidar com menos de 3 palavras. Provavelmente há uma "avaliação" de classificação que eu deveria estar usando ... Explicação:

≔⪪θ η

Divida a entrada em espaços.

Fη«⊞υ⌊η≔⟦⟧ηF⪪θ ¿¬№υκ⊞ηκ»

Classifique a matriz.

FE³✂υ÷×ιLυ³÷×⊕ιLυ³I1«

Faça um loop sobre três fatias aproximadamente iguais da matriz. ( I1realmente deveria ser ¦¹.)

P⪫ι¶

Junte a fatia com novas linhas e imprima-a sem mover o cursor.

¿ιM⊕⌈EιLκ→

Se a fatia não estiver vazia, mova para a direita uma a mais que o comprimento da palavra mais longa na fatia.

Neil
fonte
0

358 bytes de JS compactado:

function f(b){let d=[,,,],e=b.split(" ").sort(),g=[],h=[];for(var j in e){var k=Math.min(2,Math.floor(j/Math.floor(e.length/3)));d[k]||(d[k]=[],g[k]=e[j].length),d[k].push(e[j]),2==k&&h.push(""),g[k]=Math.max(e[j].length,g[k])}for(var o in g)for(var p=0;p<g[o]+1;p++)for(var q in h)h[q]+=q>=d[o].length||p>=d[o][q].length?" ":d[o][q][p];return h.join("\n")}

function f(b){let d=[,,,],e=b.split(" ").sort(),g=[],h=[];for(var j in e){var k=Math.min(2,Math.floor(j/Math.floor(e.length/3)));d[k]||(d[k]=[],g[k]=e[j].length),d[k].push(e[j]),2==k&&h.push(""),g[k]=Math.max(e[j].length,g[k])}for(var o in g)for(var p=0;p<g[o]+1;p++)for(var q in h)h[q]+=q>=d[o].length||p>=d[o][q].length?" ":d[o][q][p];return h.join("\n")}

console.log(f("cat caterpillar pie frog elephant pizza"));
console.log(f("a b c d e f g"));

jamespgilbert
fonte
@StephenLeppik np
jamespgilbert
0

GNU sed , 92 + 1 = 93 bytes

+1 bytes para -rsinalizador.

Ainda não joguei isso, mas acabou sendo muito mais simples do que eu esperava.

s/$/ /
s/(\S+ ){1,3}/:&\n/g
:
s/:(\S)/\1:/g
/:\S/!bZ
s/: / &/g
t
:Z
s/: / :/g
t
s/ *:.*$//gm

Experimente online!

Jordânia
fonte
-1

Shell Bourne, 172 bytes

F=/tmp/t
<$1 tr \  \\n|sort>$F
N=$(wc -w $F|awk '{print $1/3}')
for i in 0 1 2
do
awk 'NR%N==C {print}' N=$N C=$i $F 
done|awk '{printf "%s%s",$1,NR%3?" ":"\n"}'|column -t

É mais legível se formatado convencionalmente:

#! /bin/sh
F=/tmp/t
<$1 tr \  \\n | sort > $F
N=$(wc -w $F | awk '{print $1/3}')

for i in 0 1 2
do    
    awk -v N=$N -v C=$i 'NR % N == C {print}' $F 
done |
    awk '{printf "%s%s", $1, NR % 3 == 0? "\n" : " " }' | column -t

Ao preço da varredura da entrada uma vez por coluna, ela não usa matrizes. Um programa awk mais complexo pode abrir 3 arquivos (um para cada enésima palavra), processando a entrada em uma passagem. Eles poderiam ser concatenados e impressos usando a mesma última linha.

A variável Ntambém não é estritamente necessária; pelo preço de 4 bytes, economizamos a varredura da entrada mais 3 vezes.

James K. Lowden
fonte
2
Bem-vindo ao PPCG! Como este é um desafio para o código de golfe, precisamos de todas as respostas para fazer um esforço para minimizar o número de bytes. Você pode fazer isso exatamente da maneira mencionada - removendo espaços em branco, encurtando invocações etc. Depois de fazer isso, adicione um cabeçalho à sua resposta, indicando o idioma usado e o número de bytes. E fique à vontade para manter sua versão atual por baixo como uma solução "não-destruída".
DLosc
Por que você não está fazendo uma cena sobre o programa de 358 bytes também?
xyz123