Wydrukuj trzy kolumny oddzielone pionowo spacjami

15

Zadanie

  • Weź łańcuch wejściowy oddzielony spacją.
  • Posortuj słowa alfabetycznie.
  • Wydrukuj je pionowo w 3 kolumnach oddzielonych spacjami.

Wyzwanie

  • Wszystkie trzy wysokości kolumn powinny być możliwie równomiernie wyważone.
  • Wszystkie trzy kolumny powinny być wyrównane do lewej.

To jest , więc wygrywa najkrótszy kod!

Przykład

Jeśli dane wejściowe to:

"cat caterpillar pie frog elephant pizza", 

Dane wyjściowe powinny być:

cat         elephant pie
caterpillar frog     pizza

Uważaj na przypadki, jeśli dane wejściowe to:

"a b c d e f g" 

Powinny być drukowane jako:

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
źródło
2
Ponadto zaleciłbym usunięcie ścisłego wymogu we / wy; to znaczy, weź dane wejściowe jako listę ciągów znaków w dowolnej formie (zgodnie z życzeniem osoby odpowiadającej) oraz jako program lub funkcję pobierającą listę.
HyperNeutrino,
Czy dopuszczalne jest wyjście tego na pierwszy przykład?
caird coinheringaahing
4
@Satendra Nie martw się o „zawieszone jako nie na temat ...”, gdy / jeśli pytanie będzie wystarczająco dobre, zostanie ponownie otwarte. | Możesz rozważyć użycie piaskownicy.
user202729,
3
Rozważ skorzystanie z piaskownicy w przyszłości, aby uzyskać opinie na temat swoich wyzwań przed opublikowaniem ich na głównej stronie.
Mego
1
@Satendra Nice pierwsze wyzwanie. Jeśli kolumny muszą być oddzielone pojedynczą spacją w najwęższej szczelinie, należy to zaznaczyć.
Adám

Odpowiedzi:

4

Łuska , 24 17 bajtów

TmoTT' §CȯmLTC3Ow

Wypróbuj online!

Wyjaśnienie

Było to zaskakująco trudne wyzwanie, ponieważ Huskowi brakuje obecnie wbudowanej funkcji dzielenia listy na określoną liczbę części.

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
źródło
2

Galaretka , 6 bajtów

Ṣœs3ZG

Wypróbuj online!

Erik the Outgolfer
źródło
@DLosc To faktycznie zostało przetestowane z tą a b c d e f gskrzynką i zrobiłem inne obszerne testy, ponieważ najpierw miałem to uczucie. Aha, a jego skrót pochodzi od wbudowanego G(Format as G rid.).
Erik the Outgolfer,
Ach, jest wbudowany. (Dlaczego jestem zaskoczony?) To wiele wyjaśnia.
DLosc
2

Python 3 , 148 bajtów

-6 bajtów dzięki 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)

Wypróbuj online!

Pracuję nad tym. Wszystko , co próbowałem, powoduje, że wydruk jest przekrzywiony ...

całkowicie ludzki
źródło
1
148 bajtów za pomocą pytona 3.
ovs
1

Mathematica, 115 bajtów

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

spróbuj na piaskownicy wolfram

wklej następujący kod i naciśnij shift + enter

Grid[Transpose@PadRight@TakeList[#,Last@IntegerPartitions[Tr[1^#],3]]&@Sort@StringSplit@#/. 0->"",Alignment->Left]&["cat caterpillar pie frog elephant pizza"]
J42161217
źródło
1
@HalvardHummel naprawiono
J42161217
1

Perl 5 , 134 + 1 (-a ) = 135 bajtów

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

Wypróbuj online!

Xcali
źródło
Co to znaczy?
xyz123
1

05AB1E , 8 bajtów

#{.B3äζ»

Wypróbuj online!


#        | Split on spaces.
 {       | Sort aphabetically.
  .B     | Pad to max string length.
    3ä   | Split into columns.
      ζ  | Transpose.
       » | Print with newlines.
Urna Magicznej Ośmiornicy
źródło
1

JavaScript 181 175 bajtów

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
źródło
0

J , 73 bajty

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

Mogę wyjaśnić ten bałagan później, jeśli ktoś jest zainteresowany.

Wypróbuj online!

Galen Iwanow
źródło
0

Węgiel drzewny , 65 64 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Zaoszczędź 2 bajty, jeśli nie będę musiał obsługiwać wielkości mniejszej niż 3 słowa. Prawdopodobnie jest to „eval” sortujące, którego powinienem użyć ... Objaśnienie:

≔⪪θ η

Podziel dane wejściowe na spacje.

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

Posortuj tablicę.

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

Zapętlić trzy mniej więcej równe wycinki tablicy. ( I1powinno być ¦¹.)

P⪫ι¶

Połącz plasterek z nowymi liniami i wydrukuj go bez przesuwania kursora.

¿ιM⊕⌈EιLκ→

Jeśli plasterek nie jest pusty, przesuń w prawo o jeden więcej niż długość najdłuższego słowa w plasterku.

Neil
źródło
0

358 bajtów zminimalizowanego JS:

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
źródło
@StephenLeppik np
jamespgilbert
0

GNU sed , 92 + 1 = 93 bajty

+1 bajty dla -rflagi.

W ogóle nie grałem w golfa, ale okazało się to o wiele prostsze, niż się spodziewałem.

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

Wypróbuj online!

Jordania
źródło
-1

Powłoka Bourne'a, 172 bajty

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

Bardziej czytelny, jeśli sformatowany konwencjonalnie:

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

Za cenę skanowania danych wejściowych raz na kolumnę nie używa tablic. Bardziej złożony program awk może otworzyć 3 pliki (jeden na każde N-te słowo), przetwarzając dane wejściowe w jednym przebiegu. Następnie można je połączyć i wydrukować przy użyciu tej samej ostatniej linii.

Zmienna również Nnie jest bezwzględnie potrzebna; w cenie 4 bajtów oszczędzamy skanowanie wejścia jeszcze 3 razy.

James K. Lowden
źródło
2
Witamy w PPCG! Ponieważ jest to wyzwanie związane z golfem, potrzebujemy wszystkich odpowiedzi, aby zminimalizować liczbę bajtów. Możesz to zrobić dokładnie tak, jak wspomniałeś - usuwając białe znaki, skracając wywołania itp. Gdy to zrobisz, dodaj nagłówek do swojej odpowiedzi, podając używany język i liczbę bajtów. Zachowaj bieżącą wersję pod spodem jako rozwiązanie „bez golfa”.
DLosc
Dlaczego nie robisz też sceny o programie 358 bajtów?
xyz123