Stampa tre colonne separate verticalmente da uno o più spazi


15

Compito

  • Prendi la stringa di input separata dallo spazio.
  • Ordina le parole in ordine alfabetico.
  • Stampali verticalmente in 3 colonne separate da spazi.

Sfida

  • Tutte e tre le altezze delle colonne dovrebbero essere ponderate il più uniformemente possibile.
  • Tutte e tre le colonne dovrebbero essere allineate a sinistra.

Questo è , quindi vince il codice più corto!

Esempio

Se l'input è:

"cat caterpillar pie frog elephant pizza", 

L'output dovrebbe essere:

cat         elephant pie
caterpillar frog     pizza

Prestare attenzione ai casi, se l'input è:

"a b c d e f g" 

Dovrebbe essere stampato come:

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
Inoltre, ti consiglio di rimuovere il requisito I / O rigoroso; vale a dire, prendere input come un elenco di stringhe in qualsiasi forma (come vuole il risponditore) e come un programma o una funzione che prende l'elenco.
HyperNeutrino,

È accettabile produrre questo per il primo esempio?
caird coinheringaahing

4
@Satendra Non preoccuparti di "mettere in attesa come fuori tema ...", quando / se la domanda è sufficientemente buona verrà riaperta. | Puoi prendere in considerazione l'utilizzo della sandbox.
user202729

3
Ti consigliamo di utilizzare Sandbox in futuro per ottenere feedback sulle tue sfide prima di pubblicarle sul sito principale.
Mego

1
@Satendra Bella prima sfida. Se le colonne devono essere separate da un singolo spazio nel divario più stretto, è necessario dichiararlo.
Adám,

Risposte:


4

Buccia , 24 17 byte

TmoTT' §CȯmLTC3Ow

Provalo online!

Spiegazione

Questa è stata una sfida sorprendentemente complicata, dal momento che Husk attualmente non ha una funzione integrata per spezzare un elenco in un determinato numero di parti.

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

Gelatina , 6 byte

Ṣœs3ZG

Provalo online!


@DLosc In realtà è stato testato anche con il a b c d e f gcaso, e ho fatto altri test approfonditi perché prima ho avuto quella sensazione. Oh, e la sua mancanza deriva dall'integrato G(Format as G rid.).
Erik the Outgolfer,

Ah, c'è un builtin. (Perché sono sorpreso?) Questo spiega molto.
DLosc,

2

Python 3 , 148 byte

-6 byte grazie agli 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)

Provalo online!

Ci stiamo lavorando. Tutto ciò che ho provato rende l'output sbilenco ...


1
148 byte usando python 3.
ovs

1

Mathematica, 115 byte

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

provalo sulla sandbox di wolfram

incolla il seguente codice e premi maiusc + invio

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

1
@HalvardHummel fixed
J42161217

1

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

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

Provalo online!


Cosa significa?
xyz123,


1

Javascript 181 175 byte

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 byte

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

Posso spiegare questo casino in seguito se qualcuno è interessato.

Provalo online!


0

Carbone di legna , 65 64 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Salva 2 byte se non devo gestire il caso di meno di 3 parole. Probabilmente c'è un "eval" di ordinamento che dovrei usare ... Spiegazione:

≔⪪θ η

Dividi l'input sugli spazi.

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

Ordina l'array.

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

Passa sopra tre sezioni approssimativamente uguali dell'array. ( I1dovrebbe essere davvero ¦¹.)

P⪫ι¶

Unisci la fetta con le nuove linee e stampala senza spostare il cursore.

¿ιM⊕⌈EιLκ→

Se la sezione non è vuota, spostati a destra di uno in più rispetto alla lunghezza della parola più lunga nella sezione.


0

358 byte di JS minimizzato:

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 byte

+1 byte per -r bandiera.

Non l'ho mai giocato a golf, ma si è rivelato molto più semplice di quanto mi aspettassi.

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

Provalo online!


-1

Bourne shell, 172 byte

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

È più leggibile se formattato in modo convenzionale:

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

Al prezzo della scansione dell'input una volta per colonna, non utilizza array. Un programma awk più complesso potrebbe aprire 3 file (uno per ogni ennesima parola), elaborando l'input in un unico passaggio. Quindi potrebbero essere concatenati e stampati usando la stessa ultima riga.

Neanche la variabile Nè strettamente necessaria; per il prezzo di 4 byte, salviamo la scansione dell'input altre 3 volte.


2
Benvenuti in PPCG! Poiché si tratta di una sfida del codice golf, abbiamo bisogno di tutte le risposte per fare uno sforzo per ridurre al minimo il numero di byte. Puoi farlo esattamente come hai menzionato - rimuovendo gli spazi bianchi, accorciando le invocazioni, ecc. Dopo averlo fatto, aggiungi un'intestazione alla tua risposta fornendo la lingua utilizzata e il numero di byte. E sentiti libero di mantenere la tua versione attuale come una soluzione "non golfata".
DLosc,

Perché non stai creando anche una scena sul programma a 358 byte?
xyz123,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.