打印垂直隔开三列的三列


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
另外,我建议您删除严格的I / O要求;也就是说,将输入作为任何形式的字符串列表(根据应答者的需要),以及作为采用该列表的程序或函数。
HyperNeutrino

对于第一个示例,是否可以输出此信息
caird coinheringaahing

4
@Satendra不必担心“搁置为偏离主题...”,当/如果问题足够好,它将重新打开。| 您可以考虑使用沙盒。
user202729 '17

3
在将挑战发布到主站点之前,请考虑将来使用沙盒以获取有关您挑战的反馈。
Mego

1
@Satendra尼斯的第一个挑战。如果列之间必须以最窄的间距隔开一个空格,则应声明。
亚当

Answers:


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

果冻,6个字节

Ṣœs3ZG

在线尝试!


@DLosc实际上也已经通过了a b c d e f g案例测试,我做了其他广泛的测试,因为我也首先有了这种感觉。哦,它的短处来自内置的G(格式为G.格式)。
Erik the Outgolfer

啊,有一个内置的。(为什么我会感到惊讶?)这解释了很多。
DLosc

2

Python 3,148字节

-6字节感谢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)

在线尝试!

工作吧。 我尝试过的所有事情都会使输出出现偏差...


1
使用python 3的148个字节
。– ovs

1

Mathematica,115个字节

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

Wolfram沙箱上尝试

粘贴以下代码,然后按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 '17

1

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

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

在线尝试!


这是什么意思?
xyz123

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 181175字节

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κ→

在线尝试!链接是详细版本的代码。如果我不必处理少于3个字的情况,请节省2个字节。我应该使用排序“ 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"));


@StephenLeppik np
jamespgilbert

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

Bourne Shell,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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.