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

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.


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


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

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!


O que isso significa?
xyz123


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`

*/


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!


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.


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


@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!


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.