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


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

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.

2

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

Ах, есть встроенный (Почему я удивлен?) Это многое объясняет.
DLosc


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

1
@HalvardHummel исправлено
J42161217



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`

*/



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




-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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.