増え続けるグラフ


23

固定範囲内の数値の1次元シーケンスを考えます。つまり、

[1, 2, 4, 6, 8, 0, 2, 7, 3] in range [0, 10⟩

Ever-Increasing Graph * **は、このシーケンス内のすべてのポイントを左から右につないだ線であり、常に上向きになるか、水平になります。必要に応じて、線は上から下に折り返され、そこから上に向かって次のポイントに到達します。

この課題の目標は、シーケンスをすべて非減少の異なるサブシーケンスに分割することです。これにより、限られた垂直軸と一緒にプロットすると、増加するグラフが形成されます。これは、1つのサブシーケンスの終了点と次のサブシーケンスの開始点にポイントを追加することで行われます。これにより、上部の境界線を横切る線の角度が下部の境界線を横切る線と一致し、2つの交差点同じ水平座標を持ちます。上記の例では、次の出力が得られます。

[1, 2, 4, 6, 8, 10]
[-2, 0, 2, 7, 13]
[-3, 3]

そして、対応するグラフは次のようになります。さらに、 実際にEver Nondecreasing Graphと呼ばれるEver-Increasing Graph 見やすくするために軸を拡張します。 Ever-Increeasing Graphは、実際には拡張された垂直軸を持つEver Non-decreasing Graphと呼ばれるべきです。 必要な出力は、Ever-Increeasing Graphの部分を形成するサブシーケンスのリストです。プロットの作成は必須ではありませんが、ボーナスポイントを獲得できます;)。出力では、何らかの方法でサブシーケンスを明確に分離する必要があります。

ノート

  • 範囲の左(両端を含む)境界は常にゼロになり、右の境界は整数Nになります。
  • シーケンスには、範囲内にない値が含まれることはありません。
  • 最初のサブシーケンスには、最初に追加のポイントがありません。
  • 最後のサブシーケンスの最後に追加のポイントはありません。
  • サブシーケンスをプロットするために必要な開始インデックスを提供する必要はありません。

テストケース

Input: [0, 2, 4, 6, 1, 3, 5, 0], 7
Output: [0, 2, 4, 6, 8], [-1, 1, 3, 5, 7], [-2, 0]
Input: [1, 1, 2, 3, 5, 8, 3, 1], 10
Output: [1, 1, 2, 3, 5, 8, 13],[-2, 3, 11],[-7, 1]
Input: [5, 4, 3, 2, 1], 10
Output: [5, 14],[-5, 4, 13],[-6, 3, 12],[-7, 2, 11],[-8, 1]
Input: [0, 1, 4, 9, 16, 15, 0], 17
Output: [0, 1, 4, 9, 16, 32], [-1, 15, 17], [-2, 0]

得点

これはcode-golfで、バイト単位の最短コードが勝ちです。

*実際の専門用語ではない


7
PPCGへようこそ!素敵な最初の挑戦!
AdmBorkBork

1
挑戦の一部を誤解したように見えます。これはあなたが意図したものであるべきだと思います。
user202729

1
チャレンジを理解しやすくするために、サンプルグラフのy軸を0未満および10以上に拡張できますか?
JayCe

@JayCeはい、良い提案です。
RvdV

2
2番目のテストケースでは、シーケンスを増加させるのではなく、減少させないことをお勧めしますか?つまり、入力の繰り返し値はその現在のサブシーケンスを停止しません。サブシーケンスの最後の2つの値が「角度」と等しい場合、次のサブシーケンスを開始するのは0です(したがって、繰り返し値で開始します)同様に)?
ngm

回答:



8

R 179 158 151バイト

function(s,m){p=1;t=c(which(diff(s)<0),length(s));for(i in t){d=c(s[p]-m,s[(p+1):i],s[i+1]+m);if(p==1)d[1]=s[1];if(p==t[-1])d=head(d,-1);print(d);p=i}}

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

編集:コードは関数になり、入力を受け取ります。(それを冷静に指摘してくれたGiuseppe、user202729、JayCeに感謝します)
編集: Giuseppeが提案する-21バイト。
編集: -7バイトを削除してd=NULL;


1
PPCGへようこそ!この回答は、何らかの方法で入力を取得する必要があるため、現在無効です(現在、環境でハードコーディングされています)。さらに、Rでのゴルフのヒントが役立つ場合があります。十分な評判を得たら、ここまたはチャットでお気軽にご連絡ください!
ジュゼッペ

有効な提出内容を明確にするために、これはになります。ようこそ、ここであなたの時間をお楽しみください:)
JayCe

s[p+1]-((m+s[p+1])-s[p])簡素化すると思いs[p]-mますがd=c(c(...))d=c(...)必要なのはあなただけです。ゴルファー的な方法があると強く思うが、これはまだいい答えだ。
ジュゼッペ

1
@PA dも初期化する必要がありますか?
JayCe

1
@PAがお手伝いします!Rゴルフチャットルームを再開しばかりなので、特定の質問については私や他のすべてのRゴルファーに気軽に連絡してください:
ジュゼッペ

6

Python 2、60バイト

入力はNで、その後に個々の引数としてすべてのポイントが続きます。出力のサブシーケンスはで区切られ0.5ます。

f=lambda N,k,*l:(k,)+(l and(l[0]+N,.5,k-N)*(l[0]<k)+f(N,*l))

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


パイソン292の 77 68バイト

サブシーケンスはで区切られ[...]ます。

l,N=input();r=[];k=0
for a in l:r+=[a+N,r,k-N]*(a<k)+[a];k=a
print r

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


1
素敵なアンサー!項目を選択的に追加するための変数kの使用が本当に好きで、ここで新しいことを学びました!
RvdV




3

クリーン、92バイト

import StdEnv
@r n=foldr(\x[r=:[a:_]:s]|x>a=[[x,n+a]:[x-n:r]:s]=[[x:r]:s])[[last r]](init r)

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

演算子の引数foldrはガード付きのラムダです。次のように解析されます。

\x [r=:[a:_]:s]
    | x > a     = [[x,n+a]:[x-n:r]:s]
    | otherwise = [[x:run]:s]

これをHaskellに移植しました




1

JavaScript(Node.js)、98バイト

a=>m=>(r=[],b=[],a.map((e,i)=>e<a[--i]?(b[p](m+e),r[p](b),b=[a[i]-m,e]):b[p='push'](e)),r[p](b),r)

オンラインでお試しください!これは他のJSの回答よりもかなり長いですが、異なるアプローチを使用します。

簡単でわかりやすい説明

g=(a,m)=>{
    // r is the final array of arrays to return.
    // b is the current subset of only ascending numbers.
    r=[],b=[];

    a.map((e,i)=>{
        if(e<a[i-1]){
            // if the current value is less than the previous one,
            // then we're descending, so start a new array b.
            // add the proper value to b to match slopes with the next
            b.push(m+e);
            // add r to b, and restart b with the starter value and the current value in a
            r.push(b);
            b=[a[i-1]-m,e];
        } else{
            // otherwise, we're ascending, so just addd to to b.
            b.push(e);
        }
    });
    r.push(b); // add the final b to r, and return r
    return r;
}

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