Вывести три столбца вертикально разделенных пробелом

15

задача

  • Взять входную строку через пробел.
  • Сортировать слова по алфавиту.
  • Распечатайте их вертикально в 3 столбца, разделенных пробелами.

Вызов

  • Высоты всех трех столбцов должны быть максимально равномерно взвешены.
  • Все три столбца должны быть выровнены.

Это , поэтому выигрывает самый короткий код!

пример

Если ввод:

"cat caterpillar pie frog elephant pizza", 

Выход должен быть:

cat         elephant pie
caterpillar frog     pizza

Пожалуйста, остерегайтесь случаев, если ввод:

"a b c d e f g" 

Должно быть напечатано как:

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
источник
2
Кроме того, я бы порекомендовал вам удалить строгое требование ввода-вывода; то есть принимать входные данные как список строк в любой форме (как хочет ответчик) и как программу или функцию, принимающую список.
HyperNeutrino
Допустимо ли выводить это для первого примера?
Caird Coneheringaahing
4
@Satendra Не беспокойтесь о "отложено как не по теме ...", когда / если вопрос достаточно хороший, он будет вновь открыт. | Вы можете рассмотреть возможность использования песочницы.
user202729
3
Пожалуйста, рассмотрите возможность использования Песочницы в будущем, чтобы получить отзывы о своих проблемах, прежде чем публиковать их на главном сайте.
Mego
1
@Satendra Хороший первый вызов. Если столбцы должны быть разделены одним пробелом в самом узком промежутке, вы должны указать это.
Адам

Ответы:

4

Шелуха , 24 17 байт

TmoTT' §CȯmLTC3Ow

Попробуйте онлайн!

объяснение

Это была удивительно сложная задача, поскольку у Husk в настоящее время нет встроенного средства для разбиения списка на определенное количество частей.

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
источник
2

Желе , 6 байт

Ṣœs3ZG

Попробуйте онлайн!

Эрик Outgolfer
источник
@DLosc На самом a b c d e f gделе это тоже было проверено с делом, и я провел другие обширные тесты, потому что у меня тоже было это чувство первым. О, и его краткость исходит от встроенного G(Format as G rid.).
Эрик Outgolfer
Ах, есть встроенный (Почему я удивлен?) Это многое объясняет.
DLosc
2

Python 3 , 148 байт

-6 байт благодаря овс.

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)

Попробуйте онлайн!

Работаю над этим. Все, что я пробовал, делает вывод односторонним ...

totallyhuman
источник
1
148 байт с помощью Python 3.
овс
1

Mathematica, 115 байт

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

попробуйте на песочнице Вольфрама

вставьте следующий код и нажмите Shift + Enter

Grid[Transpose@PadRight@TakeList[#,Last@IntegerPartitions[Tr[1^#],3]]&@Sort@StringSplit@#/. 0->"",Alignment->Left]&["cat caterpillar pie frog elephant pizza"]
J42161217
источник
1
@HalvardHummel исправлено
J42161217
1

05AB1E , 8 байтов

#{.B3äζ»

Попробуйте онлайн!


#        | Split on spaces.
 {       | Sort aphabetically.
  .B     | Pad to max string length.
    3ä   | Split into columns.
      ζ  | Transpose.
       » | Print with newlines.
Урна волшебного осьминога
источник
1

Javascript 181 175 байт

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
источник
0

J , 73 байта

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

Я могу объяснить этот беспорядок позже, если кто-то заинтересован.

Попробуйте онлайн!

Гален Иванов
источник
0

Древесный уголь , 65 64 байта

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

Попробуйте онлайн! Ссылка на подробную версию кода. Сохраните 2 байта, если мне не нужно обрабатывать регистр менее 3 слов. Вероятно, я должен использовать сортировку "eval" ... Объяснение:

≔⪪θ η

Разделить ввод на пробелы.

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

Сортировать массив.

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

Обведите три примерно равных фрагмента массива. ( I1должно быть ¦¹.)

P⪫ι¶

Соедините фрагмент с новыми строками и напечатайте его, не перемещая курсор.

¿ιM⊕⌈EιLκ→

Если срез не пустой, двигайтесь вправо на единицу больше, чем длина самого длинного слова в срезе.

Нил
источник
0

358 байтов минимизированного 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
источник
@StephenLeppik
0

GNU sed , 92 + 1 = 93 байта

+1 байт за -rфлаг.

Я вообще не играл в гольф, но все оказалось намного проще, чем я ожидал.

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

Попробуйте онлайн!

Иордания
источник
-1

Оболочка Борна, 172 байта

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

Это более читабельно, если отформатировать условно:

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

Ценой сканирования входных данных один раз для каждого столбца он не использует массивы. Более сложная программа awk может открыть 3 файла (по одному на каждое N-е слово), обрабатывая ввод за один проход. Затем они могут быть объединены и напечатаны с использованием той же последней строки.

Переменная Nстрого не нужна; по цене 4 байта мы сохраняем сканирование ввода еще 3 раза.

Джеймс К. Лоуден
источник
2
Добро пожаловать в PPCG! Так как это сложная задача для игры в гольф, нам нужны все ответы, чтобы минимизировать количество пользователей. Вы можете сделать это точно так, как вы упомянули - удаление пробелов, сокращение вызовов и т. Д. Как только вы это сделаете, добавьте к ответу заголовок с указанием используемого языка и количества байтов. И не стесняйтесь держать свою текущую версию в качестве «не одураченного» решения.
DLosc
Почему вы не делаете сцену с 358-байтовой программой?
xyz123