변동 범위


19

숫자가있는 목록이 있으면 다음과 같이 범위를 출력하십시오.

입력 : [0, 5, 0]될 것 [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0]입니다.

우리가 먼저 범위를 만들어야합니다, 그래서 이것은 배열을 통해 범위를 매핑 [0, 5]입니다 [0, 1, 2, 3, 4, 5]. 그런 다음를 사용 5하여 범위를 만듭니다 [5, 0]. 이전 범위에 추가하면 다음과 같은 이점이 있습니다.

[0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0]

서로 동일한 두 자리 숫자가있는 테스트 사례를 살펴 보겠습니다.

[3, 5, 5, 3], ranges:

[3, 5] = 3, 4, 5
[5, 5] = 5 (actually [5, 5] due to overlapping)
[5, 3] = 5, 4, 3

그래서 이것은 우리에게 줄 것 [3, 4, 5, 5, 4, 3]입니다.

다른 테스트 사례 :

[1, 9] > [1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, -10] > [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10]
[3, 0, 0, -3] > [3, 2, 1, 0, 0, -1, -2, -3]
[1, 3, 5, 7, 5, 3, 1, -1, -3] > [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3]

입력은 항상 최소 2 개의 정수를 갖습니다.

최단 답변이 승리합니다!



1
입력과 출력은 어떤 방식으로 관련되어 있습니까? 유효한 입력은 무엇입니까?
flawr

답변:


21

05AB1E, 1 바이트

Ÿ

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

작동 원리

내장되어 있습니다.


18
당신은 당신의 머리에있는 모든 esolangs에 모든 내장의 사전을 가지고 있습니까? ;)
ETHproductions

2
osabie를 사용해 주셔서 감사합니다 : P
Adnan

7
왜 내장되어 있습니까?
Neil

작업을 수행하는 0 바이트 및 1 바이트 (아마도 2 바이트) 프로그램을 모두 컴파일해야합니다.
CalculatorFeline

2
@Neil 기본적으로 포괄적 인 범위 함수이며 실제로 그렇게 훌륭하지는 않습니다.
Adnan

5

자바 스크립트, 99 95 93 바이트

@Neil 덕분에 4 6 바이트를 줄 였습니다.

a=>a.reduce((x,y)=>x.concat(b.map?b=y:[...Array(y<b?b-y:y-b||1)].map(_=>b+=y<b?-1:y>b)),b=[])

f=
a=>a.reduce(
    (x,y)=>
        x.concat(
            b.map?b=y
            :[...Array(y<b?b-y:y-b||1)]
                .map(_=>b+=y<b?-1:y>b)
        )
    ,b=[])


G.addEventListener('click',_=>O.innerHTML=f(JSON.parse(I.value)));
<input id=I value="[3,5,5,3]"><button id=G>Go</button><pre id=O>


1
을 사용하여 3 바이트를 저장하십시오 y<b?b-y:y-b||1. 를 사용하여 다른 바이트를 저장하십시오 y>b||y-b&&-1.
Neil

@ 닐. 좋은 것 !! 감사합니다 :)
제거

1
사실 y<b?-1:y>b은 여전히 ​​낫습니다.
Neil

5

자바 스크립트 (SpiderMonkey 30+), 81 76 바이트

([n,...a])=>[n,...[for(i of a)for(j of Array(i<n?n-i:i-n||1))n+=i<n?-1:i>n]]

Firefox 44에서 테스트되었습니다. ES6의 훌륭한 인수 파기 기능과 ES7의 어레이 이해 기능을 사용합니다 (ES7 사양에서 슬프게 제거됨).


에서 작동하지 않습니다 [3, 0, 0, -3]. RangeError를 수정하고 10 바이트를 저장했지만 여전히 작동하지 않습니다.([n,...a],z=[n])=>z.concat([for(i of a)for(j of[...Array((r=n<i)?i-n-1:n-i-1),0])i=r?++n:--n])
Neil

미안합니다 ([n,...a])=>[n].concat([for(i of a)for(j of[...Array((r=n<i)?i-n:n-i)])i=r?++n:--n]). 물론 이죠.
Neil

@Neil Fixed, 프로세스에서 더 많은 골프를 쳤다
ETHproductions

4

자바 스크립트 (ES6) 66 72

배열 내에 값을 반복적으로 추가하여 근사값 사이의 간격을 채우는 재귀 함수

f=l=>l.some((x,i)=>(z=l[i-1]-x)*z>1&&l.splice(i,0,x+z/2|0))?f(l):l

테스트

f=l=>l.some((x,i)=>(z=l[i-1]-x)*z>1&&l.splice(i,0,x+z/2|0))?f(l):l

console.log=x=>O.textContent+=x+'\n'

;[[1,9],[10,-10],[3,0,0,-3],[1, 3, 5, 7, 5, 3, 1, -1, -3]]
.forEach(t=>console.log(t+' -> ' +f(t)))
<pre id=O></pre>


3

C, 120 + 12 = 132 바이트

i,j,k;f(a,n)int*a;{a[0]--;for(i=0;i<n-1;i++)for(k=0,j=a[i]-a[i+1]?a[i]:a[i]-1;j-a[i+1];)printf("%i ",j+=a[i+1]>j?1:-1);}

호출 예 :

f(a,sizeof(a)/4);        // I've added 12 bytes because of ",sizeof(a)/4"

ideone에서 라이브 테스트 .


3

파이썬 2, 77 바이트

lambda n:n[0:1]+sum([range(x,y,2*(y>x)-1)[1:]+[y]for(x,y)in zip(n,n[1:])],[])

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

내가 놓친 개선점을 지적한 Neil, DenkerAffe 및 Erwan에게 감사합니다.


반드시 +1불필요합니까?
Neil

왜 안가 lambda n:n[0:1]+sum([range(x,y,[1,-1][y+1<x])[1:]+[y]for(x,y)in zip(n,n[1:])],[])? 바이트를 절약합니다.
Denker

나는 이것을 쓰는 동안 매우 피곤했다.
Mego

난 당신이 바꿀 수 있다고 생각 [1,-1][y+1<x]하여 2*(y>x)-1(당신이 사용하는 이유도 이해가 안 y<=x 간단하지 y<x)
유안

n[0:1]와 같습니다 n[:1].
Jonathan Frech

3

펄, 47 바이트

에 +3 포함 -p(코드에 $'공간이 포함 되어 있으며 -셀 수 있음)

STDIN의 숫자 목록을 제공하십시오.

fluctuating.pl <<< "3 5 5 3"

fluctuating.pl:

#!/usr/bin/perl -p
($n=$&+($'<=>$&))-$'&&s/\G/$n / while/\S+ /g

임시 변수와 이러한 모든 괄호는 차선책입니다.


것을이 작동하지 않는 것과 : 그것은 당신이 잘못된 답을 게시처럼 보이는 $' 당신은 ... 코드에없는 언급
다다

@Dada : 예, 다시 고정되지 않은 코드의 테스트되지 않은 이전 버전을 붙여 넣습니다. 감사 및 수정
Ton Hospel

2

하스켈, 63 55 바이트

g(a:b:r)=[a|a==b]++[a..b-1]++[a,a-1..b+1]++g(b:r)
g x=x

사용 예 : g [3,5,5,3]-> [3,4,5,5,4,3].

그것은의 수정의 내 대답 A와 관련된 도전 . 다시 한 번, 주요 작업은 목록을 a위쪽 b-1에서 a아래쪽으로 b+1(하나의 목록이 비어있는 곳) 연결하고 재귀 호출을 수행하여 수행됩니다 . a==b두 목록이 모두 비어 있는 경우 를 처리하기 [a|a==b]위해 [a]if a==b[]그렇지 않은 것으로 평가합니다 .


2

R, 86 82 75 바이트

function(x)rep((y<-rle(unlist(Map(seq,head(x,-1),x[-1]))))$v,pmax(1,y$l-1))

rep not rep.int (code golf not performance!)를 사용하여 4 바이트를 저장했습니다. 사용 할 때 내장 부분 일치를 사용하여 추가 7 바이트를 저장했습니다 $(함수 정의를 1 줄로 축소)


나는 (y=...)오히려 (y<-...)유효한 것보다 1 바이트 적 다고 생각 합니다.
Giuseppe

2

루비, 116 82 바이트

->n{o,*m=n;o=[o];m.zip(n).map{|t,u|o+=[[u],[*u+1..t],[*t..u-1].reverse][t<=>u]};o}

내 최초의 골프.

편집 : 멋진 제안에 감사드립니다.


변수에 할당 할 필요가 없으며 익명의 proc이면 충분합니다. 공식 매개 변수 주위에 괄호를 넣을 필요가 없습니다. 병렬 할당 및 표시와 함께 배열의 첫 번째 요소를 제거하는 것이 더 짧습니다. map의 코드 블록은 배열을 여러 매개 변수로 사용할 수 있습니다 ->n{o,*m=n;o=[o];m.zip(n).map{|t,u|o+=u==t ?[u]:(u<t ?[*u+1..t]:[*t..u-1].reverse)};o}. 그렇지 않으면 좋은 첫 골프.
manatwork

우주선 연산자로 3 요소 배열에서 선택하는 것이 2 삼항 연산자보다 짧습니다 [[u],[*u+1..t],[*t..u-1].reverse][t<=>u].
manatwork


1

펄 6, 94 바이트

나는 지금 이것에 대해 너무 행복하지 않다. 아마도 나중에 다시 촬영 할 것이다.

{reduce {|@^a[0..*-2],|@^b},map {@_[0]!= @_[1]??(@_[0]...@_[1])!!(@_[0],@_[1])},.rotor(2=>-1)}

1

PHP 5.4, 86 바이트

이것은 포함 된 파일로 사용되어 결과를 반환합니다.

값은 명령 줄 매개 변수로 전달됩니다.

<?for($i=1;$i<$argc-1;$R=array_merge($R?:[],range($argv[$i++],$argv[$i++])));return$R;

정확히 예쁘거나 아무것도 아니지만 일을합니다.


1

파이썬 3 , 76 바이트

먼저 파이썬 답변을 시도하십시오. 기본 아이디어는 차이가 단계보다 큰 시퀀스에서 쌍을 반복적으로 식별하고 하나의 추가 요소를 삽입하여 올바른 방향으로 시퀀스를 완료하는 것입니다. 연속 요소 간의 모든 차이가 +1과 -1 사이가 될 때까지 반복하십시오.

d=diff
while any(d(x)**2>1):i=argmax(d(x)**2);x[:i+1]+=[x[i]+sign(d(x)[i])]

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


0

루아, 156 바이트

매개 변수에 배열을 가져와 확장 배열을 반환하는 함수입니다.

function f(t)r={}for i=2,#t
do x,y=t[i-1],t[i]r[#r+1]=x==y and x or nil
z=x>y and-1or 1
x=x==r[#r]and x+z or x
for j=x,y,z
do r[#r+1]=j end end
return r end

언 골프 및 설명

function f(t)
  r={}                        -- Initialise an empty array
  for i=2,#t                  -- Iterate over the parameter array
  do
    x,y=t[i-1],t[i]           -- x and y are shorter names than t[i-1]
    r[#r+1]=                  -- when there's a range like [5,5]
      x==y and x or nil       -- put this number once in the array
    z=x>y and-1or 1         -- determine the step value
    x= x==r[#r]               -- prevent repeating the last value of r
          and x+z or x        -- by incrementing/decrementing x
    for j=x,y,z               -- iterate from t[i-1] to t[i] by step z (-1 or 1)
    do
      r[#r+1]=j               -- put j into the array r
    end
  end
  return r                    -- return the extended array
end

사용하기 쉽도록 다음 함수를 사용하여에서 반환 된 배열을 인쇄 할 수 있습니다 f().

function printArray(t)
  print("["..table.concat(t,",").."]")
end

이 제출물을 테스트 할 때 다음과 같이 호출 할 수 있습니다.

printArray(f( {0,5,0,3,4,4,7,3,-3} ))
> [0,1,2,3,4,5,4,3,2,1,0,1,2,3,4,4,5,6,7,6,5,4,3,2,1,0,-1,-2,-3]

0

Mathcad, 62 "바이트"

여기에 이미지 설명을 입력하십시오

Mathcad는 2D "화이트 보드"및 특수 연산자 (예 : 합산 연산자, 정수 연산자)를 사용하고 XML 형식으로 저장하므로 실제 워크 시트에는 수백 개 이상의 문자가 포함될 수 있습니다. Code Golf의 목적을 위해 Mathcad "바이트 수"를 사용자가 워크 시트를 만들기 위해 입력해야하는 문자 또는 연산자의 수로 사용했습니다.

함수 정의를 일반 프로그램으로 변환하고 변수 lst를 단일 문자 이름으로 바꾸면 총 62 바이트가됩니다. 이 기능을 사용하면 전체 이름이 아닌 단일 문자를 사용하여 정의에 대해 65 "바이트"로 증가하고 각 호출에 대해 추가로 4 "바이트"로 증가합니다 (목록 자체 작성이 전체 바이트에 포함되지 않은 것으로 가정) count (Mathcad의 내장 테이블을 사용하는 것이 목록을 입력하는 또 다른 방법입니다).


0

PHP, 144 바이트

function f($r){$m=[];for($i=0;++$i<count($r);){$d=array_pop($m);$n=$r[$i];$p=$r[$i-1];$m=array_merge($m,$p==$n?[$p,$n]:range($p,$n));}return$m;}
분해도
function f($r) {
  $m = [];
  for ($i=0; ++$i < count($r); ) {
    $d = array_pop($m);
    $n = $r[$i];
    $p = $r[$i-1];
    $m = array_merge($m, $p==$n ? [$p,$n]
                                : range($p,$n));
  }
  return $m;
}
입력 / 함수 호출
f([ bound1, bound2, bound3, ... ]);
산출
[int, int, int, int, ...]

지저분하고 두껍습니다. 나중에 최적화하려고합니다. 그것은을 생성 range()한 다음 (후 이들을 함께 스티치 인접한 값 쌍들의 각 쌍으로부터 pop이전 누적의 끝을 보내고 Array).


0

펄 6, 21

.join은 $ _. join의 약자입니다.

say EVAL .join: "..."

시험 (라쿠도)

perl6 -MMONKEY-SEE-NO-EVAL -e'say EVAL @*ARGS.join: "..."' 1 3 5 7 5 3 1 -1 -3

산출

(1 2 3 4 5 6 7 6 5 4 3 2 1 0 -1 -2 -3)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.