配列を自動ネストする


12

誰もがネストされたリストを愛しています!ただし、ネストされたリストを作成するのが難しい場合があります。深くネストするか、浅くネストするかを決定する必要があります。したがって、あなたの挑戦のために、リストを「自動ネスト」する必要があります。リストを自動ネストするには、リスト内のアイテムのすべてのペアを比較します。

  • 2番目の項目が小さい場合は、次のように2つの要素の間に閉じ括弧と開き括弧を挿入して、2つの要素を分離します。

      } {
    {2 , 1}
    

    たとえば、に{2, 1}なり{2}, {1}、に{3, 2, 1}なります{3}, {2}, {1}

  • 2番目の項目が同じ場合、何も変更しません。たとえば{1, 1, 1}、同じままでに{2, 1, 1, 1}なり{2}, {1, 1, 1}ます。

  • 2番目の項目が大きい場合、次のすべての項目を1レベル深くネストします。例えば、{1, 2}なる{1, {2}}{1, 2, 3}なります{1, {2, {3}}}

チャレンジ

数値のリストを受け取り、自動ネスト後に同じリストを返すプログラムまたは関数を作成する必要があります。ご使用の言語のネイティブリスト形式(または最も近い代替形式)または文字列として、この入力を取得してください。私の例のように中括弧を使用する必要はありません。一貫性がある限り、言語で最も自然な括弧を使用できます。リストには整数のみが含まれると仮定しても安全です。また、リストには少なくとも2つの数字が含まれると想定することもできます。サンプルIOを次に示します。

{1, 3, 2}                         -->   {1, {3}, {2}}
{1, 2, 3, 4, 5, 6}                -->   {1, {2, {3, {4, {5, {6}}}}}}
{6, 5, 4, 3, 2, 1}                -->   {6}, {5}, {4}, {3}, {2}, {1}
{7, 3, 3, 2, 6, 4}                -->   {7}, {3, 3}, {2, {6}, {4}}
{7, 3, 1, -8, 4, 8, 2, -9, 2, 8}  -->   {7}, {3}, {1}, {-8, {4, {8}, {2}, {-9, {2, {8}}}}}

標準的な抜け穴が適用され、バイト単位の最短回答が勝ちます!


2
言語の文字列形式で入力を取得できますか?
ダウンゴート

整数の最大サイズは?
thepiercingarrow

@thepiercingarrowあまり気にしません。ばかげたことはありません。少なくとも処理できるはず[-100, 100]ですが、巨大な入力を行うつもりはありません。
ジェームズ

「2番目の項目が小さい場合、巣はすべて閉じ括弧を挿入することにより、1つ上位の要素を以下に示します。その後、必ずすべての括弧が一致したままにするために、開口部ブラケットを挿入します。たとえば、{2, 1}となり{2}, {1}」どのように1つのレベルが高いです?1つ上のレベルになります{2}, 1。あなたが持っているものは同じレベルです。
msh210

@ msh210ええ、それは不十分な説明でした。現在のフレージングは​​改善されていますか?
ジェームズ

回答:


1

MATL48 43バイト

YY_XKx"@K<?93]44@K-?91]@XKV]v93Gd0>sQY"h4L)

これは、入力と出力に角括弧を使用します。出力には、区切り文字としてスペースなしのコンマが含まれています。

出力はMATLのネストされたリストとして解釈されないことに注意してください。それは他の言語で行われ、チャレンジの出力仕様を満たします。

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

説明

YY_XKx   % Push -inf. Copy to clipboard K (represents previous input entry). Delete
"        % Take numerical array implicitly. For each entry:
  @K<    %   Is current entry less than the previous one?
  ?93]   %   If so, push 93 (ASCII for ']')
  44     %   Push 44 (ASCII for comma)
  @K-    %   Is current entry different from the previous one?
  ?91]   %   If so, push 91 (ASCII for '[')
  @XKV   %   Push current entry, copy into clipboard K, convert to string
]        % End for each
v        % Concat vertically all stack contents, converting to char
93       % Push 93 (ASCII for ']') (to be repeated the appropriate number of times)
Gd0>sQ   % Determine how many times the input increases, plus 1
Y"       % Repeat 93 that many times
h        % Concat horizontally with previous string. Gives a row array, i.e. string
4L)      % Remove first char, which is an unwanted comma. Display implicitly

3

Haskell、96バイト

a#b|a<b=",{"|a>b="},{"|1<2=","
f(a:b:c)=show a++a#b++f(b:c)++['}'|a<b]
f[x]=show x++"}"
('{':).f

使用例:('{':).f $ [7,3,3,2,6,4]-> "{7},{3,3},{2,{6},{4}}"

Haskellにはネストされたリストがないため、結果を文字列として返します。ネストアルゴリズムは簡単です。a)番号を印刷する、b)次の番号が大きい場合(より小さい、等しい)、印刷する,{},{,)、c)リストの残りで再帰呼び出しを行う、d)}番号がある場合に印刷する次のものよりも少ない、e){およびですべてを囲む}


申し訳ありませんが、私はミスカウント
Akangka

3

Python 3、98バイト

p,*i=eval(input())
c=[p]
a=b=[c]
for x in i:
 if x>p:b=c
 if x!=p:c=[];b+=[c]
 c+=[x];p=x
print(a)

例:

$ python3 autonest.py <<< "[7, 3, 1, -8, 4, 8, 2, -9, 2, 8]"
[[7], [3], [1], [-8, [4, [8], [2], [-9, [2, [8]]]]]]

2

Java 8 197187193192バイト


この怪物について私と協力してくれたすべてのコメンターに感謝します。コストのかかるバグを見つけるまで、187バイトまでゴルフされました。ただし、Black Magicのパワーにより、「runs down」演算子「->」はバイトカウントが正常な192バイトです。


String a(int[]b){int l=b.length,d=1,i=0;String c="{";for(;i<l-1;i++)if(b[i]>b[i+1])c+=b[i]+"},{";else if(b[i]<b[i+1]){d++;c+=b[i]+",{";}else c+=b[i]+",";c+=b[l-1];while(d-->0)c+="}";return c;}

申し訳ありませんが、すぐに@Blueにアクセスします
Rohan Jhunjhunwala

また、いくつかのヒント:1.シーケンスではなく配列として入力を取得できます:(int [] b)2.コンマを使用して同時に複数のintを定義できます(int l = b.length、 d = 1、i = 0)。3.できるだけ多くの白人ペースを削除する必要があります(変数の割り当て間など)。お役に立てれば!
ブルー

こんにちは、PPCGへようこそ!スニペットは、チャレンジ送信ではなく、ブラウザで実行されることを意図したjavascriptコード用です。また、スペースを忘れてしまったlength,
Maltysen

申し訳ありませんが、@ Maltysenにおfullび申し上げます。それを完全なJavaプログラムに組み込みます。私は「戻る」という「関数またはプログラム」という発言をやめました。だから、私は出力を印刷するために、これをリファクタリングする必要があり
ロハンJhunjhunwala

1
@RohanJhunjhunwala申し訳ありませんが、もっと明確にすべきでした。「スニペット」と言ったとき、私はあなたのコードについてではなく、あなたのフォーマットについて話していました。投稿にコードを入れようとするときは、「スニペット」ボタンをクリックせず、代わりにコードブロック(4スペースまたはctrl-k)に入れてください。
Maltysen

2

C、145の 138バイト

7バイトのGiacomoに感謝します!

#define P printf(
n;main(c,v,p,t)char**v;{p=-101;for(v++;*v;v++){t=atoi(*v);if(t<p)P"}{");if(t>p)P"{",n++);P"%d ",p=t);}for(;n--;)P"}");}

入力はコマンドライン引数を介して取得され、出力はstdoutを通じて提供されます。

サンプル実行:

$ ./autonest 7 3 1 -8 4 8 2 -9 2 8
{7 }{3 }{1 }{-8 {4 {8 }{2 }{-9 {2 {8 }}}}}

1
Sourcet=atoi(*v);sscanf(*v,"%d",&t);
Giacomo Garabelloの

for(;*++v;)最初の4つを保存するためにif(t<p)P"}{");if(t>p)P"{",n++);使用しt>p?P"}{"):P"{",n++);、さらに10 の使用を要求します。
ジャコモガラベッロ16

1

CJam、51 49 48 46バイト

最後のブラケットの数が、配列で増加している隣接ペアの数よりも1つ多いという事実を利用します。

そして、私はew再実装しなければならなかった前に演算子を知りません。

入力は、角括弧で区切られたスペース区切りのリストです。

'[q~_W=\2ew_{~\_@-g)["["S"]["]=}%@@{~>M']?}%']

説明

'[q~_W=\2ew_{~\_@-g)["["S"]["]=}%@@{~>M']?}%']
'[                                             e# Opening bracket
  q~                                           e# Read the input
    _W=\2ew                                    e# Save the last item and turn array into array of pair of next item and the item itself.
            _                                  e# We need two copies of that item                                       
             {~\_@-g)["["S"]["]=}%             e# Build the "body" that consist of the item and the suitable delimiter, space if equal, opening brace if the first item is the smallest, otherwise, closing bracket and opening bracket.
                                  @@           e# Put in the last item. (It was omitted in previous phase)
                                    {~<']""?}% e# Create the closing bracket as many as the number of increasing adjacent pair
                                               '] e# And one more bracket.

prettyprintingに頼る代わりに、実際のネストされた配列でこれを行う方法を見つけます。

最後に、打ち負かされたMATLの答えと同等


最後に、MATLの答え殴ら今ではありません:-P
ルイスMendo

@LuisMendoうーん。
-Akangka

1

網膜、71 70バイト

リストはスペースで区切られ、中括弧で区切られます:{1 2 3}。負の数はサポートされていないため、それが問題になる場合は、答えを削除します。網膜+負の数=価値はありません。

\d+
$*
+`\b(1+) (1+\1\b.*)
$1 {$2}
+`\b(1(1+)1*) (\2)\b
$1} {$2
1+
$.0

オンラインで試す


0

JavaScript(ES6)、73バイト

a=>a.map(r=>l-r?(n=l<r?m:n).push(m=[l=r]):m.push(l),l=a[0],o=n=[m=[]])&&o

説明:連続する等しいアイテムの場合は簡単です。アイテムは一番内側の配列に追加されます(ここではm変数で表されます; nm最後の要素として含まれる配列ですoが、出力です)。異なるアイテムの場合、アイテムは常に新しい最も内側の配列に入ります。唯一の違いは、その配列が前の最も内側の配列の兄弟であるか子であるかです。余分なゴルフィネスのために、最初のアイテムが連続した等しいアイテムとしてカウントされるように配列を設定しました。

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