不断增长的图


23

考虑固定范围内的一维数字序列,即

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

不断增长的图形* **是一条线,该线从左到右连接此序列中的所有点,并且始终向上或保持水平。如有必要,该线从上到下环绕,并从那里继续向上到达下一个点。

这项挑战的目标是将序列分成所有不递减的不同子序列,以便与有限的垂直轴一起绘制时,它们将形成一个不断增加的图。这是通过在一个子序列的末尾和下一个子序列的末尾添加一个点来完成的,以便与顶部边界相交的线的角度与与底部边界相交的线的角度对齐,并且两个交叉点具有相同的水平坐标。上面的示例将给出以下输出:

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

相应的图将如下所示: 不断增加的图,实际上应称为不断增加的图 并延伸轴以获得更好的视图: 不断增加的图,实际上应称为具有扩展垂直轴的不断增加的图。 所需的输出是构成“不断增加的图”各部分的子序列的列表。进行绘图不是必需的,但是会为您赢得积分;)。输出必须以某种方式清楚地分隔子序列。

笔记

  • 范围的左边界(包括边界)始终为零,右边界为整数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]

计分

这是代码高尔夫球,以字节为单位的最短代码获胜。

*不是实际的行话**如@ngm所指出的,实际上应称为Ever Non-Decreasing Graph,但这听起来不那么令人印象深刻。


7
欢迎来到PPCG!不错的第一个挑战!
AdmBorkBork

1
看来我误解了部分挑战。我认为这应该是您想要的。
user202729

1
您能否将样本图中的y轴扩展到0以下和10以上,以使挑战更容易理解?
JayCe

@JayCe是的,很好的建议。
RvdV

2
第二个测试用例建议您打算使序列不增减,而不是增减?换句话说,输入中的重复值不会停止当前子序列,并且如果子序列中的最后两个值等于开始下一个子序列的“角度”,则该值为0(因此它将以重复值开头还有)?
ngm

Answers:



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中打高尔夫球的这些技巧有用。获得足够的声誉后,随时可以在这里或在聊天中ping我!
朱塞佩

只是要弄清楚什么是有效的提交内容:这是。欢迎光临,并在这里享受您的时间:)
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高尔夫选手联系,以解决您可能遇到的特定问题:-)
朱塞佩(Giuseppe)

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))

在线尝试!


Python 2中92 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

4

干净279个 269 258字节

import StdEnv
s=snd o unzip
$[]=[]
$l#(a,b)=span(uncurry(<))(zip2[-1:l]l)
=[s a: $(s b)]
?l n#[h:t]= $l
=[h:if(t>[])(?(map((+)n)(flatten t))n)t]
@l n#l= ?l n
=[[e-i*n\\e<-k]\\k<-[a++b++c\\a<-[[]:map(\u=[last u])l]&b<-l&c<-tl(map(\u=[hd u])l)++[[]]]&i<-[0..]]

在线尝试!



4

Haskell,82岁 81 80字节

这是我的“干净”答案的一部分

r!n|let f x(r@(a:_):s)|x>a=[x,n+a]:(x-n:r):s|y<-x:r=y:s=foldr f[[last r]]$init r

在线尝试!

-1,-1感谢Laikoni


@Laikoni,可惜我们不能f:模式周围加上括号,而无法在本地定义,如中所示let x<r@(a:_):s|...

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是带有警戒的lambda;它被解析为:

\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;
}

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.