茎葉図を作成する


14

関連:茎葉図の検証

入力

正の整数の空でないリスト。必要に応じて、文字列として使用できます。ソートされていると想定することはできません。

出力

幹葉プロット番号の。で数十によって、その幹に収まるすべての数字は、そのものが幹の中に置かれた値、およびすべてのソートされてい茎にこの幹葉プロット、番号は注文されています。この課題では、改行が茎を分離し、スペースが茎を葉から分離します。

空でないステムの間にあるすべての空のステムを含めるか除外することができます。

テストケース

(リストは言語のデフォルトのリストで取得できます。以下ではJSONを使用しました)

空の茎を含む:

[1, 2, 3, 3, 3, 3, 3, 10, 15, 15, 18, 1, 100]

0 11233333
1 0558
2
3
4
5
6
7
8
9
10 0

[55, 59, 49, 43, 58, 59, 54, 44, 49, 51, 44, 40, 50, 59, 59, 59]

4 034499
5 0145899999

[10000, 10100]

1000 0
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010 0

空の茎を除外する:

[1, 2, 3, 3, 3, 3, 3, 10, 15, 15, 18, 1, 100]

0 11233333
1 0558
10 0

[55, 59, 49, 43, 58, 59, 54, 44, 49, 51, 44, 40, 50, 59, 59, 59]

4 034499
5 0145899999

[10000, 10100]

1000 0
1010 0


入力順序をソートおよび/または保持する必要がありますか?
ロッド

定義により@Rodは、入力を10でソートし、次に1でソートします。入力順は関係ありません。
スティーブン

2
出力形式はそのようでなければなりませんか?で、私の答えは有効?
ロッド

1
@totallyhumanタプルはOKですが、はい、葉はパターンや分布を可視化するために、プロットの全体のポイントだと、ソートする必要がある
スティーブン

回答:


2

R、12バイト

stem(scan())

オンラインでお試しください!

説明:

s               # imports RAND's "Million Random Digits"
  e  )          # cooks a pound of spaghetti and places it on the stack
 t              # transposes the output 42 times
       can      # goes for a pee
   m(           # grows moustache, turns head to side and frowns
      s   (     # implicitly ignores all criticism
           )    # makes a stemplot of the input

stem入力として配列を受け取るので、それで十分だと思います。
ジュゼッペ

これが、TIOで実際に動作する例を得る唯一の方法でした。そして、私は「プログラムまたは機能」スタイルの回答に慣れており、他の形式については不明です。
ngm


@Giuseppeに同意し、答えはちょうどstem:)である必要があります
JayCe



3

網膜38 30バイト

2バイトを保存してくれたニールと、さらに6バイトを保存してくれたレオに感謝します。

バイトカウントはISO 8859-1エンコードを前提としています。

O#`
.\b
 $&
\B 
0 
D$`¶?.+ 
$*

入力は、改行で区切られた整数のリストです。出力では空のプレフィックスは省略されます。

オンラインでお試しください!


(?<=(\b.+ ).)¶\12バイト節約できます。
ニール

バイトを保存するには、最終ステージとして置換ステージの代わりに重複排除ステージを使用します(ただし、最初の行を処理する必要があります)tio.run/##K0otycxL/…
Leo

@Leoありがたいことに、主要な改行を持たないわずかなバリエーションを使用します。
マーティンエンダー

2

JavaScript(ES6)、89バイト

a=>a.sort((a,b)=>a-b).map(e=>r[d=e/10|0]=(r[d]||d+` `)+e%10,r=[])&&r.filter(e=>e).join`
`

2

パイソン2146 140 133 124 120 118 109 107 90 86 84 91 82 81 70 63バイト

Rodのおかげで-6バイト。ovsのおかげで-9バイト。

lambda l:{i/10:[j%10for j in sorted(l)if j/10==i/10]for i in l}

オンラインでお試しください!

さて、何かが少し不安定です。すべてのPythonプログラマーが知っているように、辞書は順序付けられていません。つまり、キーと値のペアの元の順序は保持されません。ただし、現在のコードでは、結果の辞書をまったく並べ替えていません。それでも、私は何度もテストし、毎回平等と秩序をチェックしてきましたが、口述は常に正しく出てきます。誰かがそれが常に正しいと反論するか、これがなぜ機能するかを知っているなら、私は知りたいです。

pythonリストとして入力し、dictとして出力します。例:

入力:

[1, 2, 3, 3, 3, 3, 3, 10, 15, 15, 18, 1, 100]

出力:

{0: [1, 1, 2, 3, 3, 3, 3, 3], 1: [0, 5, 5, 8], 10: [0]}


1
r[i/10]=r.get(i/10,'')+`i%10`82バイト
ovs

辞書はデフォルトでソートされていると思いますか?元の順序ではない
破壊可能なレモン

1

Mathematica、103バイト

@ user202729の削除された回答から取得したコード

Grid[Table[{Keys[#][[i]],""<>ToString/@#[[i]]},{i,Length@#}]]&@(GroupBy[Sort@#,⌊#/10⌋&]~Mod~10&@#)&

1

> <>、84バイト

1&0\n~a7+3.
 :}<$?)@:$@:v!?
r~&^?-l&:+1&/&:,a-%a::
&=?v~&1+:&ao>n" "o:?!;::a%:@-a,&:

オンライン試してみてください、または魚の遊び場で

入力番号がすでにスタック上にあると仮定します

説明:最初に、次のコードを使用して、バブルソートを使用してスタックをソートします。

1&0\
 :}<$?)@:$@:v!?
   ^?-l&:+1&/

次に、を使用して10でスタックの最初の整数の商を計算し、::a%-a,それをレジスタに入れて、最初の桁がレジスタと等しくなくなるまで数値の最後の桁を出力してスタックを調べます。その後、レジスタをインクリメントして続行します。のマークが付いたリストの最後に到達すると、0停止します。


1

PostgreSQL、53バイト

SELECT n/10,json_agg(n%10ORDER BY n)FROM t GROUP BY 1

整数のリストは、既存のテーブルのintegernに存在する必要がありますt。結果は2列のテーブルになります。各行は「幹」列と「葉」列で構成されます。「leaves」列はJSON配列形式です。(コメントに記載されているように、「テストケース」に示されている形式に厳密に従う必要はありません。)

ステムの順序は保証されていませんが(10バイトを節約するためORDER BY 1、クエリの最後から省略されています)、私のテストでは、ステムは正しい順序で終わるように見えました。

SQL Fiddleで結果を表示する

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