Imprimer trois colonnes séparées verticalement par des espaces

15

Tâche

  • Prenez la chaîne d'entrée séparée par un espace.
  • Triez les mots par ordre alphabétique.
  • Imprimez-les verticalement en 3 colonnes séparées par des espaces.

Défi

  • Les hauteurs des trois colonnes doivent être pondérées aussi uniformément que possible.
  • Les trois colonnes doivent être alignées à gauche.

C'est le , donc le code le plus court gagne!

Exemple

Si l'entrée est:

"cat caterpillar pie frog elephant pizza", 

La sortie doit être:

cat         elephant pie
caterpillar frog     pizza

Veuillez vous méfier des cas, si la saisie est:

"a b c d e f g" 

Doit être imprimé comme:

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
la source
2
De plus, je vous recommande de supprimer l'exigence stricte d'E / S; c'est-à-dire, prenez l'entrée comme une liste de chaînes sous n'importe quelle forme (comme le répondeur le souhaite) et comme un programme ou une fonction prenant la liste.
HyperNeutrino
Est-il acceptable de produire ceci pour le premier exemple?
caird coinheringaahing
4
@Satendra Ne vous inquiétez pas de la "mise en attente comme hors sujet ...", lorsque / si la question est suffisamment bonne, elle sera rouverte. | Vous pouvez envisager d'utiliser le bac à sable.
user202729
3
Veuillez envisager d'utiliser le bac à sable à l'avenir pour obtenir des commentaires sur vos défis avant de les publier sur le site principal.
Mego
1
@Satendra Beau premier défi. Si les colonnes doivent être séparées par un seul espace à l'écart le plus étroit, vous devez l'indiquer.
Adám

Réponses:

4

Husk , 24 17 octets

TmoTT' §CȯmLTC3Ow

Essayez-le en ligne!

Explication

C'était un défi étonnamment délicat, car Husk n'a actuellement pas de fonction intégrée pour diviser une liste en un certain nombre de pièces.

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
la source
2

Gelée , 6 octets

Ṣœs3ZG

Essayez-le en ligne!

Erik le Outgolfer
la source
@DLosc Il a également été testé avec le a b c d e f gboîtier, et j'ai fait d'autres tests approfondis parce que j'avais ce sentiment aussi en premier. Oh, et sa brièveté vient du G(Format as G rid.) Intégré.
Erik the Outgolfer
Ah, il y a un intégré. (Pourquoi suis-je surpris?) Cela explique beaucoup de choses.
DLosc
2

Python 3 , 148 octets

-6 octets grâce aux 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)

Essayez-le en ligne!

Je travaille dessus. Tout ce que j'ai essayé rend la sortie déséquilibrée ...

totalement humain
la source
1
148 octets en utilisant python 3.
ovs
1

Mathematica, 115 octets

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

essayez-le sur wolfram sandbox

collez le code suivant et appuyez sur Maj + Entrée

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

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

$.=(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

Essayez-le en ligne!

Xcali
la source
Qu'est-ce que ça veut dire?
xyz123
1

05AB1E , 8 octets

#{.B3äζ»

Essayez-le en ligne!


#        | Split on spaces.
 {       | Sort aphabetically.
  .B     | Pad to max string length.
    3ä   | Split into columns.
      ζ  | Transpose.
       » | Print with newlines.
Urne de poulpe magique
la source
1

Javascript 181 175 octets

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
la source
0

J , 73 octets

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

Je peux expliquer ce gâchis plus tard si quelqu'un est intéressé.

Essayez-le en ligne!

Galen Ivanov
la source
0

Charbon de bois , 65 64 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Économisez 2 octets si je n'ai pas à gérer le cas de moins de 3 mots. Il y a probablement un "eval" de tri que je devrais utiliser ... Explication:

≔⪪θ η

Divisez l'entrée sur les espaces.

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

Triez le tableau.

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

Faites une boucle sur trois tranches approximativement égales du tableau. ( I1devrait vraiment l'être ¦¹.)

P⪫ι¶

Joignez la tranche avec des nouvelles lignes et imprimez-la sans déplacer le curseur.

¿ιM⊕⌈EιLκ→

Si la tranche n'est pas vide, déplacez-vous d'un cran vers la droite de la longueur du mot le plus long de la tranche.

Neil
la source
0

358 octets de JS minifié:

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
la source
@StephenLeppik np
jamespgilbert
0

GNU sed , 92 + 1 = 93 octets

+1 octet pour l' -rindicateur.

Je n'ai pas joué au golf du tout, mais cela s'est avéré beaucoup plus simple que ce à quoi je m'attendais.

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

Essayez-le en ligne!

Jordan
la source
-1

Shell Bourne, 172 octets

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

Il est plus lisible s'il est formaté de manière conventionnelle:

#! /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

Au prix de l'analyse de l'entrée une fois par colonne, elle n'utilise aucun tableau. Un programme awk plus complexe pourrait ouvrir 3 fichiers (un pour chaque Nième mot), traitant l'entrée en une seule passe. Ensuite, ils pourraient être concaténés et imprimés en utilisant la même dernière ligne.

La variable Nn'est pas strictement nécessaire non plus; pour le prix de 4 octets, nous économisons l'analyse de l'entrée 3 fois de plus.

James K. Lowden
la source
2
Bienvenue chez PPCG! Comme il s'agit d'un défi de golf de code, nous avons besoin de toutes les réponses pour faire un effort pour minimiser le bytecount. Vous pouvez le faire exactement de la manière que vous avez mentionnée - supprimer les espaces blancs, raccourcir les invocations, etc. Une fois que vous avez fait cela, ajoutez un en-tête à votre réponse en indiquant la langue utilisée et le nombre d'octets. Et n'hésitez pas à garder votre version actuelle en dessous comme une solution "non golfée".
DLosc
Pourquoi ne faites-vous pas aussi une scène sur le programme de 358 octets?
xyz123