거리 계산 모드 N


13

Advanced Collecting Device Controller ™ 에서 오랫동안 데이터를 수집했습니다 . 당신은 로그를 확인하고 공포에 뭔가 잘못되었다는 것을 발견합니다. 데이터에는 숫자의 마지막 비트 만 포함됩니다!

운 좋게도 시작 값을 알고 값이 빠르게 변하지 않습니다. 즉, 시작부터 거리를 찾아서 나머지를 복구 할 수 있습니다.

도전

모듈러스 N와 중간 값리스트 modulo가 주어지면 값이 변경된 양을 계산하는 프로그램이나 함수를 작성할 것 N입니다.

모든 숫자 쌍 사이의 변경 은 항상보다 작N/2 으므로 각 테스트 사례에 대해 하나의 유효한 답변 만 있습니다.

N선택한 형식으로 정수 > 2 및 값 목록이 입력으로 제공됩니다 . 입력은 STDIN 또는 명령 행 또는 함수 인수를 통해 제공 될 수 있습니다.

원래 값이 변경된 양의 단일 정수를 출력합니다. 출력은 STDOUT으로 인쇄되거나 리턴 될 수 있습니다.

규칙

  • 프로그램은 거리와 모듈러스가 작을 때 작동해야합니다 2^20.
  • 다음과 같이 가정 할 수 있습니다.
    • N적어도 3입니다.
    • 이 목록에는 2 개 이상의 값이 있습니다.
    • 목록의 모든 값은 0 이상이고보다 작습니다 N.
    • 숫자의 모든 변경 사항이보다 적습니다 N/2.
  • 다른 것은 유효하지 않은 입력이며 프로그램은 원하는 것을 할 수 있습니다.
  • 이 정확한 목적을위한 표준 허점, 비표준 라이브러리 및 내장 기능은 금지되어 있습니다.
  • 이것은 이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.

테스트 사례 예

입력:

3
0 1 2 2 0 1 0 2 1 2 0 1 2 1 1

산출:

4

설명 (예시 값) :

Value mod 3: 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Value:       0 1 2 2 3 4 3 2 1 2 3 4 5 4 4

입력:

10
5 2 8 9 5

산출:

-10

설명 (예시 값) :

Value mod 10:  5  2  8  9  5
Value:        15 12  8  9  5

유효하지 않은 입력 :

2
0 0 0 0 0

(너무 작은 계수)

6
2 5 4 2

(2와 5 사이의 너무 큰 변화)


선택한 형식은 미끄러운 경사입니다. 내 GolfScript 솔루션이 다음과 같은 입력 목록을 사용할 수 :^;[5 2 8 9 5](\ 있습니까?
Lynn

3
@Mauris 일반적으로, "선택한 형식"은 일반적으로 "선택한 언어의 일반적인 표현"을 의미하는 것으로 간주됩니다.
마틴 엔더

그러나 "10 5 2 8 9 5"또는 "10,5 2 8 9 5"또는 "10 5,2,8,9,5"와 같은 입력 목록을 사용할 수 있습니다.
Sparr

답변:


2

TI-BASIC, 15 바이트

Input N
sum(N/πtan⁻¹(tan(ΔList(πAns/N

에서 목록 소요 Ans와의 계수 Input.

                       πAns/N    ; Normalize the list to [0,π)
                 ΔList(          ; Take differences, which are in the range (-π,π)
       tan⁻¹(tan(                ; Modulo, but shorter. Now elements are in (-π/2,π/2)
    N/π                          ; Multiply by N/π. These are displacements at each step.
sum(                             ; Add up all the displacements

9

파이썬 2, 53 바이트

lambda n,l:sum((b-a+n/2)%n-n/2for a,b in zip(l,l[1:]))

매우 빠른 답변. 더 짧은 방법이 있는지 궁금합니다.


나는 그 비트를 놓쳤다. 감사.
Lynn

@Jakube 나는 이미 그것을했다-나는 .:_2당신의 대답을 볼 때까지 쌍을 생성하는 것을 알지 못했습니다 -지퍼를 사용하고있었습니다.
orlp

1
@Jakube 나는 그것을 19로 떨어
뜨렸다

7

Mathematica, 30 바이트

Tr@Mod[Differences@#2,#,-#/2]&

이것은 두 가지 인수를 취하는 익명 함수입니다. 사용법 예 :

Tr@Mod[Differences@#2,#,-#/2]&[3, {0, 1, 2, 2, 0, 1, 0, 2, 1, 2, 0, 1, 2, 1, 1}]
(* 4 *)
Tr@Mod[Differences@#2,#,-#/2]&[10, {5, 2, 8, 9, 5}]
(* -10 *)

이것은 Differences연속적인 요소 사이 를 가져 와서 범위 와 오프셋 매개 변수 -n/2로 래핑 한 다음 총계 (매트릭스 추적, 대각선 요소의 합) 를 취하여 작동합니다 .+n/2ModTr


ungolfed조차도 단지 43 바이트입니다!

f[n_, l_] := Total[Mod[Differences[l], n, -n/2]]

@대괄호로 함수를 이미 호출 할 때는 불필요합니다. 둘 다 갖는 것은 구문 오류입니다.
David Zhang

@DavidZhang Whoops, 내가 무슨 생각을했는지 모르겠다. Mathematica를 열지 않고 대답하려고 노력합니다.
2012rcampion 12


4

Pyth, 20 19 바이트

sm-J/Q2%+-FdJQ.:vw2

.:_2Jakube의 스톨 , Mauris의 아이디어.


3

R, 38 바이트

function(n,v)sum((diff(v)+n/2)%%n-n/2)

이것은 정수와 벡터를 입력으로 받아 단일 정수를 반환하는 명명되지 않은 함수를 만듭니다. 호출하려면 이름을 지정하십시오 (예 :) f=function(n,v)....

언 골프 + 설명 :

f <- function(n, v) {
    # Compute the differences between sequential elements of v
    d <- diff(v)

    # Add n/2 to the differences and get the result modulo n
    m <- (d + n/2) %% n

    # Subtract n/2 then sum the vector
    sum(m - n/2)
}

예 :

> f(3, c(0, 1, 2, 2, 0, 1, 0, 2, 1, 2, 0, 1, 2, 1, 1))
[1] 4

> f(10, c(5, 2, 8, 9, 5))
[1] -10

3

MatLab, 33 바이트

@(x,y)sum(mod(diff(y)+x/2,x)-x/2)

사과드립니다.이 웹 사이트의 첫 번째 답변입니다. 이 값을 MatLab에 입력 한 다음 입력을 사용하면 ans(modulus_value, [intermediate_values])요청 된 값이 반환됩니다. 여기서 'modulus_value'는 모듈러스 값이고 'intermediate_values'는 공백 또는 쉼표로 구분 된 중간 값 목록입니다.

예:

ans(3, [0 1 2 2 0 1 0 2 1 2 0 1 2 1 1])

익명 함수는 매트랩의 활용 mod,diff 그리고 sum답을 계산하는 기능을합니다. 먼저, 각각의 중간 값 사이의 차이가 계산된다. 결과는 모듈러스를 2로 나눈 값으로 오프셋되어 [-모듈러스 / 2 모듈러스 / 2]로 묶인 차이 값 세트가됩니다. 그런 다음 결과가 오프셋되고 다시 합산됩니다.

나는 이것이 더 골프를 칠 수 있다고 생각한다. 나는 업데이트와 함께 곧 돌아올 것이다. 아이디어에 대한 @ 2012rcampion에게 특별한 감사의 말을 전합니다.

편집 : Matlab의 unwrap기능은 거의 여기에서 작동하지만 골프하기는 어렵습니다. 다음 코드는 마지막 값이 첫 번째 값이 변경된 양인 배열을 반환합니다. @(x,y)unwrap(y/x*2*pi)/2/pi*x-y(1)

중간 값은 [-pi pi]의 범위로 스케일링 된 후 연속적인 값이 pi만큼 크지 않도록 "래핑 해제"됩니다. 그런 다음이 값의 크기가 조정되고 이동되어 시작 값과 거리가 배열됩니다.

이 도전에 흥미롭지 만 실용적이지는 않습니다. : D


2

Pyth, 29 바이트

+sm**._K-Fdvz>y.aKvz.:Q2-eQhQ

온라인 사용해보기 : Pyth Compiler / Executor


입력은 공백으로 구분되고 쉼표로 구분되지 않습니다. 귀하의 프로그램이 이것을 처리하지 못하는 것 같습니다.
Lynn

2
@Mauris "원하는 형식으로 값 목록"
Jakube

오, 내 나쁜! 나는 사양의 그 부분을 완전히 놓쳤다.
Lynn


2

, 39 바이트

Qn$+({a>n/2?a-na<-n/2?a+na}Mg@>1-g@<-1)

명령 행 인수로서의 데이터 목록과 STDIN의 계수가 필요합니다. 이것이 너무 많은 경우 5 바이트 동안 두 개의 명령 줄 인수를 취하는 버전이 있습니다.

설명:

                                         g is list of cmdline args (implicit)
Qn                                       Read n from stdin
                            g@>1         All but the first of the cmdline args
                                -g@<-1   ...minus all but the last of the cmdline args
                                         (i.e. a list of the differences of adjacent items)
     {                    }M             ...to which, map the following function:
      a>n/2?a-n                            If diff is too big, subtract n;
               a<-n/2?a+n                  else if too small, add n;
                         a                 else return unchanged
  $+(                                 )  Sum; print (implicit)

그리고이 경쟁적이지 않은 점수가 내 언어보다 골프 기술에 더 반영되어 있음을 증명하기 위해 30 바이트 의 Mauris Python 솔루션 포트가 있습니다 .

Qn$+({(n/2-$-a)%n-n/2}MgZg@>1)

2

비경쟁 젤리

6 바이트이 대답은 경쟁이 아닌데, 이는 챌린지가 젤리를 만들기 전에 시작되기 때문입니다.

Iæ%H}S

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

작동 원리

Iæ%H}S    Main link. Left input: A (list). Right input: N (integer).

I         Compute the increments (deltas of consecutive elements) of A.
   H}     Halve the right input (N).
 æ%       Mod the increments into (-N/2, N/2].
     S    Take the sum of all results.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.