계속 증가하는 그래프


23

고정 된 범위 내에서 숫자의 1 차원 시퀀스를 고려하십시오.

[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]

해당 그래프는 다음과 같이 표시됩니다. 실제로 증가하지 않는 그래프라고하는 계속 증가하는 그래프 더 나은보기를 위해 축을 확장 한 경우 : 실제로는 수직 축이 확장 된 절대 비 감소 그래프라고하는 절대 증가 그래프입니다. 필요한 출력은 계속 증가하는 그래프의 일부를 형성하는 하위 시퀀스 목록입니다. 줄거리를 만들 필요는 없지만 보너스 포인트가 적립됩니다.). 결과는 어떤 식 으로든 하위 시퀀스를 명확하게 분리해야합니다.

노트

  • 범위는 항상 왼쪽 (포함) 경계로 0이되고 오른쪽 경계는 정수 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이 지적한 것처럼 실제로는 항상 비 감소 그래프라고해야하지만 그다지 인상적이지 않습니다.


7
PPCG에 오신 것을 환영합니다! 좋은 첫 도전!
AdmBorkBork

1
내가 도전의 일부를 오해 한 것 같습니다. 나는 이것이 당신이 의도 한 것이어야한다고 생각합니다.
user202729

1
챌린지를 이해하기 쉽도록 샘플 그래프에서 y 축을 0 미만 및 10 초과로 확장 할 수 있습니까?
JayCe

@JayCe 네, 좋은 제안입니다.
RvdV

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 golfing 채팅방을 다시 열었 으므로 나에게 질문이 있으시면 저와 다른 모든 R 골퍼들과 자유롭게 연락하십시오 :-)
Giuseppe

6

파이썬 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))

온라인으로 사용해보십시오!


파이썬 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를 선택적으로 추가하기 위해 변수 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

하스켈, 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

온라인으로 사용해보십시오!

Laikoni 덕분에 -1, -1


@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는 보호 기능이있는 람다입니다. 다음과 같이 구문 분석됩니다.

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

나는 이것을 하스켈 로 포팅 했다 .




1

자바 스크립트 (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.