スペースで垂直に区切られた3列を印刷します


15

仕事

  • スペースで区切られた入力文字列を取得します。
  • 単語をアルファベット順に並べ替えます。
  • スペースで区切られた3列で縦に印刷します。

チャレンジ

  • 3つの列の高さはすべて、可能な限り均等に重み付けする必要があります。
  • 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要件を削除することをお勧めします。つまり、入力を(回答者が望むように)任意の形式の文字列のリストとして、またリストを取るプログラムまたは関数として受け取ります。
ハイパーニュートリノ

最初の例でこれを出力することは許容されますか?
コアーリンガーアーイング

4
@Satendra「オフトピックとして保留...」について心配する必要はありません。質問が十分に良い場合/再開される場合です。| サンドボックスの使用を検討できます。
user202729

3
メインサイトに投稿する前に、今後サンドボックスを使用して課題に関するフィードバックを取得することを検討してください。
メゴ

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形式(G rid としてのフォーマット)に由来します。
エリックアウトゴルファー

ああ、ビルトインがあります。(なぜ私は驚きましたか?)それは多くを説明します。
DLosc


1

Mathematica、115バイト

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

Wolfram Sandboxで試してみてください

次のコードを貼り付けて、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κ→

オンラインでお試しください!リンクは、コードの詳細バージョンです。3ワード未満のケースを処理する必要がない場合は、2バイトを節約します。おそらく、使用する必要があるソート「評価」があります...説明:

≔⪪θ η

入力をスペースで分割します。

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

配列を並べ替えます。

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

配列のほぼ等しい3つのスライスをループします。(I1実際にあるはず¦¹です。)

P⪫ι¶

スライスを改行で結合し、カーソルを動かさずに印刷します。

¿ιM⊕⌈EιLκ→

スライスが空でない場合は、スライス内の最も長い単語の長さより1つ右に移動します。


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


-1

Bourneシェル、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

入力を列ごとに1回スキャンする代償として、配列は使用しません。より複雑なawkプログラムは、3つのファイル(N番目の単語ごとに1つ)を開き、1つのパスで入力を処理できます。次に、それらを連結して、同じ最終行を使用して印刷できます。

変数Nも厳密には必要ありません。4バイトの価格で、入力をさらに3回スキャンする必要がなくなります。


2
PPCGへようこそ!これはコードゴルフの課題であるため、バイトカウントを最小限に抑えるためにすべての回答が必要です。空白の削除、呼び出しの短縮など、前述のとおりの方法でそれを行うことができます。それが完了したら、使用する言語とバイト数を示すヘッダーを回答に追加します。また、現在のバージョンを「無料」ソリューションとして自由に保管してください。
DLosc

なぜ358バイトのプログラムのシーンも作らないのですか?
xyz123
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.