앞뒤 시퀀스


18

으로 구성 경로 상상 <>및 끝나는 @, 예를

><>@

가장 왼쪽 셀에서 워커가 시작됩니다. 그는 다음과 같이 길을 가로 질러 갈 것이다 :

  • 워커가 @셀 에 있으면 목표에 도달하고 완료됩니다.
  • 워커가 >셀 에있는 경우, 전체 경로 는 워커를 가지고 주기적으로 오른쪽으로 한 단계 오른쪽으로 이동 합니다 .
  • 워커가 <셀 에있는 경우, 전체 경로 는 워커를 가지고 주기적으로 왼쪽으로 한 단계 이동 합니다 .
  • 그 후, 워커는 한 걸음 내딛습니다. 그가 길의 한쪽 끝에 있다면, 그는 끝에서 멀어집니다. 그렇지 않으면 마지막 단계에서 이동 한 방향으로 계속 회전하면서 (회전 무시) 처음에 바로 걷는다.

위의 예제를 통해 살펴 보겠습니다. 보행기의 위치는 다음과 ^같이 표시됩니다 .

><>@   --rotate-->  @><>
^                    ^
step right (first step):
@><>   --rotate-->  ><>@
  ^                  ^
step right:
><>@   --rotate-->  @><>
  ^                    ^
step left (dead end):
@><>   --rotate-->  ><>@
  ^                  ^
step left:
><>@   --rotate-->  @><>
^                    ^
step left:
@><>   Goal reached!
^

워커 는 프로세스에서 6 개의 셀을 방문했습니다 (시작 셀 과을 포함하여 방문한 @횟수만큼 각 셀을 계산).

다음은 워커가 회전을 통해 가장자리를 가로 질러 운반되는 작은 예입니다.

>>@   --rotate-->  @>>
^                   ^
step right (first step):
@>>   --rotate-->  >@>
  ^                ^
step right (dead end):
>@>   Goal reached!
 ^

이번에는 워커가 3 개의 세포를 방문했습니다 .

이것을 정수 시퀀스로 쉽게 바꿀 수 있습니다.

  • 예를 들어 양의 정수 N 이 제공 9됩니다.
  • 이 정수의 이진 표현을 계산합니다 (예 :) 1001.
  • 그런 다음 설정 1>0<과를 추가 @: ><<>@.
  • 우리는 이러한 방식으로 구성된 수로 워커가 방문한 셀 수 를 N 과 연관시킵니다 .

결과 시퀀스의 처음 몇 가지 요소는 다음과 같습니다.

2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7

이것은 상당히 임의적 인 것처럼 보일 수 있지만 결과 시퀀스는 실제로 많은 구조를 갖는 것으로 판명되었습니다.

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

참고 로이 pastebin 에서 시퀀스의 처음 2048 번호를 찾을 수 있습니다 .

도전

당신은 그것을 추측했다 : 당신은 위의 시퀀스를 계산해야합니다. 세 가지 방법 중 하나를 수행 할 수 있습니다.

  • 숫자가 아닌 문자로 분리 된 값을 지속적으로 출력하거나 값을 지원하는 언어로 어떤 형태의 무한 생성기를 사용하여 무한한 시퀀스 (메모리 허용 중)를 생성 할 수 있습니다. STDOUT에 무한 스트림을 인쇄하는 경우 숫자를 하나씩 인쇄 할 필요는 없지만 모든 시간이 유한 시간이 지나고 순서대로 인쇄되는지 확인하십시오. 이 옵션을 사용하면 입력하지 않아야합니다.
  • 정수 N 을 입력으로 취하여 시퀀스 의 N 번째 항을 생성 할 수 있습니다 .
  • 정수 N 을 입력으로 사용하고 명확한 구분자를 사용하여 시퀀스 의 N 번째 항 까지 모든 것을 목록 또는 문자열로 생성 할 수 있습니다.

정수 N 대신베이스간에 쉽게 변환 할 수없는 언어를 처벌하고 싶지 않기 때문에 정수 N 대신에 s와 s를 평소처럼 (목록 또는 문자열로) 사용하여 N 의 이진 표현을 취할 수 있습니다. -중요한 비트부터.01

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.

표준 규칙이 적용됩니다.

배경

이것은 실제로 난해한 프로그래밍 언어 Labyrinth 의 간단한 해석기 인 "틱"의 수를 계산하여 "경로"를 소스 코드로 해석해야합니다. 이 경우, "워커"(위치 및 방향을 갖는다), 명령 포인터는 단순히 @명령 프로그램을 종료하고, <그리고 >소스 코드 수정 명령이다.


어느 것이 필요합니까? 1, 2 또는 3 그리고 우리의 제출물은 어떻게
평가됩니까

@ Agawa001 "당신은 세 가지 방법 중 하나를 수행 할 수 있습니다."당신이 사용하고자하는 접근 방식과 언어에 가장 쉬운 방법 중 하나를 선택하십시오.
Martin Ender

왜 모든 반복되는 숫자가 오늘!?! codegolf.stackexchange.com/questions/78787/… : D
cat

답변:


6

젤리 , 10 바이트

ð+\ḤiḤoµL‘

이 함수는 2 진 숫자 목록 형식의 단일 정수를 입력으로 허용합니다.

이 알고리즘은 @ Agawa001 's answer 의 알고리즘과 동일합니다 .

온라인으로 사용해보십시오!또는 처음 2048 숫자를 생성하십시오 .

배경

경로 아래의 위치를 0 에서 L 까지 열거하여 총 L + 1 위치를 지정하십시오. L 은 경로를 인코딩하는 숫자 N 의 이진수 자릿수와 일치합니다 . 이 표기법으로 워커는 위치 L 에서 목표 0 위치에서 시작합니다 .

보행자가 걸을 때마다 목표에 한 걸음 더 가까이 다가갑니다 (현재 걷고있는 방향으로). 또한, 각 변속 단계마다 변속 방향으로 걸을 때 또는 반대 방향으로 걷는 지에 따라 그는 자신의 위치를 2 modulo L + 1 씩 증가 또는 감소 시키거나 현재 위치에 머무 릅니다.

방향을 바꾸려면 L-1 위치 ( L ) 또는 1 위치 ( 0 ) 에 착륙 한 다음 방향으로 이동해야합니다. 그가 취한 다음 단계는 그를 반대 방향으로 향하게하여 이전 위치로 되돌릴 것입니다.

  • 경우 L은 짝수, L - 1은 그의 초기 위치에서에 진출 할 수 있도록 홀수 1 - L 직접. 도달하는 유일한 방법은 L 을 통과 하여 0으로 이동 하여 다음 단계를 1 에 착륙 한 다음 오른쪽으로 진행하는 것입니다. 이를 위해서는 2L 위치를 전진해야 하며 L 단계 이상으로 수행 할 수 있습니다 .

    그러나 방향을 바꾸지 않고 L 계단을 밟은 후 그는 목표에 도달했을 것입니다. 시작 셀에 하나를 추가하면 이 경우 총 L + 1 방문 셀을 얻습니다 .

  • 경우 L은 홀수, L - 1은 자신이 이동하기에 의해 그 위치에 도달 할 수 있도록, 짝수 / 2 - (1 L) 오른쪽으로 시간을. 위치하면 L - 1 아래 인 그 시간에, 그는 위치로 이동 얻을 것이다 L 돌아서,, 위치에 단계 L - 1 (마주 왼쪽으로)를.

    그가 목표에 도달하기 전에 발생할 수도 있고 그렇지 않을 수도 있으므로 분석해야 할 두 가지 경우가 있습니다.

    • 이하이있는 경우 (L + 1) / 2 의 발생 (1) 의 진 팽창 N은 복용 L의 단계 방향은 좌회전 충분하지 않을 것이다. 이 L 단계는 워커를 목표로 삼고 시작 셀에 하나를 추가하므로 총 L + 1 방문 셀을 .

    • 이상이있는 경우 (L + 1) / 2 의 발생 (1) 의 진 팽창 N 받는 발전, ((L + 1) / 2) 번째의 발생이 필요로 곳 단계 I는 그 발생의 초기 위치이며 의 하나 .

      따라서, I 스텝 을 취한 후 , 워커는 왼쪽을 향하여 L-1 위치에있다 . 방향을 다시 돌리려면 왼쪽으로 1을 이동해야 합니다. 그러나 짝수의 경우와 마찬가지로 (L-1)-1 이 홀수이므로 0을 통과해야합니다. L 단계 를 더 이상 .

      왼쪽 방향으로 목표에 대한 초기 거리이기 때문에 1 , 복용 후 나는 단계, 워커는 거리에서 자신을 발견 I + 1 방향을 변경 한 후 목표에서. 이후 나는 <L , 우리가 그 I + 1 ≤ L , 다음 그래서 나는 + 1 단계 목표에 그를 가져올 것이다.

      이것은 총 I + I + 1 = 2I + 1 걸음 수를 제공합니다. 시작 셀에 하나를 추가하면이 경우 총 2I + 1 + 1 = 2 (I + 1) 방문 셀을 얻습니다 .

작동 원리

ð+\ḤiḤoµL‘  Main link. Argument: x (list of binary digits of N)

       µ    Monadic chain. Argument: x
        L   Compute L, the length of x.
         ‘  Increment to yield L + 1.

ð           Dyadic chain. Left argument: x. Right argument: L + 1
 +\         Compute the cumulative sum of x.
            This replaces the k-th one (and all zeroes to its right) with k.
   Ḥ        Unhalve; multiply all partial sums by 2.
    i       Find the first index of L + 1.
            This either gives I + 1, the 1-based index of the ((L + 1) / 2)-th one
            or 0 if the list doesn't contain L + 1.
            The result will be 0 if x contains less than (L + 1) / 2 ones
            or if L + 1 is an odd integer.
     Ḥ      Unhalve; yield either 2(I + 1) or 0.
      o     Logical OR with L + 1; if the previous operation returned a falsy
            value (i.e., if it yielded 0), replace that value with L + 1.

9

Matlab (점수 = 230, n = inf)

function w(s,f),b=[];e=0;for i=s:f,a=dec2bin(i);c=find(a=='1');g=numel(a)+1;if numel(c)>=g/2;if mod(g,2)==1,fprintf('%d ',g);else,d=c(g/2);fprintf('%d ',2*d);end,else,fprintf('%d ',g);end,e=e+1;if(e==100),e=0;fprintf('\n');end;end
  • 이 함수는 s를 시작 색인으로, f를 끝으로 사용합니다 ( inf무한하게 유지하려는 경우 유형 ).
  • 이 기능은 두 출력 유형 사이에 현저한 시간 지연없이 영원히 지속될 수 있습니다 h=1000000000000000000000000000000000000000000000000000;w(h,h+1).
  • 이 알고리즘은 나중에 설명 할 수학적 접근 방식을 따르며이 프로그램을 기반으로 Martin의 참조 목록을 확인합니다.

    stored=[2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 14, 8, 8, 8, 14, 8, 14, 12, 12, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13];
    b=[];for i=1:numel(stored)
    a=dec2bin(i);
    c=find(a=='1');
    if numel(c)>=(numel(a)+1)/2
    if mod(numel(a)+1,2)==1
    b=[b numel(a)+1];
    else
    d=c((numel(a)+1)/2);
    b=[b 2*d];
    end
    else
    b=[b numel(a)+1];
    end
    end
    for i=1:numel(stored)
    if (b(i))
    if b(i)~=stored(i)
    'error',
    end
    end
    end
    
  • 이 알고리즘은 2048 개의 첫 테스트 케이스를 검증하므로 모든 테스트 케이스에 대해 맹목적으로 가정하므로, 알고리즘은 포인터를 움직이거나 움직이지 않고도이 프로세스에서 발견 한 몇 가지 속성에 대해 작동합니다.

    1-이진 변환에서 1의 두 배가 시퀀스의 길이를 초과 L하지 않으면 출력은 다음과 같습니다.L+1

    2- 시퀀스 길이가 짝수이고 이전 조건이 설정되지 않아 출력이 같을 경우 L+1

    3- 그렇지 않으면, 출력은 L/21의 인덱스의 2 배 입니다.


"출력은 L / 2 인덱스 1의 두 배 입니다 " 라는 의미를 명확하게 알 수 있습니까? ? 엄청나게 불분명합니다.
orlp

이 순서 10010001에서 @orlp는 1의 두 번째 발생은 4이며, 2는 8입니다.
Abr001am

1
이것은 89 바이트 이상으로 축소 될 수 있으며 a=dec2bin(input(''));c=find(a=='1');g=nnz(a)+1;if nnz(c)<g/2|mod(g,2);g,else,2*c(g/2),end, 이는 시퀀스의 단일 요소 만 제공합니다.
David

8

파이썬 122 119 113 110 108 107 103 바이트

def l(b):
 p=e=w=len(b);d=i=1
 while e:p+=1-2*b[w-e];d*=2*(1!=d-p>~w)-1;p-=d;e=(e-d)%-~w;i+=1
 return i

입력을 이진수의 목록으로 가져옵니다. 테스트 할 도우미 기능 :

b = lambda n: [int(d) for d in bin(n)[2:]]

7 바이트를 절약 한 Lynn의 공로입니다.


4
퓨 퓨 퓨 : D
AdmBorkBork

많지는 않지만… p-d-1in[-2,w]1 바이트를 절약 한다고 가정 합니다.
Lynn

명세서를 변경 d*=2*(1!=d-p>~w)-1하면 4 개가 더 절약됩니다! ° v °
Lynn

@Lynn de Morgan의 법칙을 잘 사용했습니다!
orlp

U와 비교할 수있는 넓은 출력 범위를 제공 할 수 있습니까? 고맙습니다
Abr001am

3

파이썬 2, 99 바이트

def l(b):l=len(b);return(l>=sum(b)*2or l%2<1)and-~l or[i+1for i,c in enumerate(b)if b[i]][l/2]*2

Agawa001의 훌륭한 답변의 파이썬 포트.

읽을 수있는 버전 :

def l(b):
    if len(b) >= 2*sum(b) or len(b)%2 == 0:
        return len(b) + 1

    return 2*[i+1 for i, c in enumerate(b) if b[i]][len(b)//2]

@ Agawa001 아직 귀하의 알고리즘을 이해하지 못했지만 실험적으로 최대 1 천만 건까지 검증했습니다.
orlp

3

MATL, 31 , 25 바이트

BXHnQtHsy2/<w2\+~?2/Hfw)E

이것은 정수 입력 N을 취하고 시퀀스에서 N 번째 항을 반환한다는 점을 제외하고는 Agawa001 알고리즘의 MATL 버전입니다. 스택의 모든 요소를 ​​따라 잡는 것은 까다로 웠습니다! 나는 미쳐가는 것을 피하기 위해 클립 보드를 사용해야했습니다. 온라인으로 사용해 볼 수 있습니다!

:"@코드 ]D앞뒤 에 추가하여 첫 번째 N 용어를 루프 인쇄 할 수 있습니다 .

6 바이트 전체를 절약 한 Luis Mendo에게 감사합니다!


2

Julia 0.4, 4̷4̷ 42 바이트

x->(k=endof(x)+1;try k=2find(x)[k/2]end;k)

이 함수는 2 진 숫자 목록 형식의 단일 정수를 입력으로 허용합니다.

이 알고리즘은 @ Agawa001의 답변Jelly 답변 의 알고리즘과 동일합니다 .

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

작동 원리

find(x)x의 0이 아닌 모든 요소의 1부터 시작하는 인덱스를 반환합니다 . 인덱스 k / 2 에서 결과 배열에 액세스하려고 시도하고 성공 하면 선택한 인덱스의 두 배로 k 를 덮어 씁니다 .

다음 중 하나에 해당하는 경우에만 실패합니다.

  • k / 2 는 비 적분 플로트이므로 InexactError 가 발생합니다.

  • 인덱스 배열의 요소 가 k / 2 보다 작으므로 BoundsError 가 발생합니다.

두 경우 모두 k 덮어 쓰기에 실패하므로 원래 값이 반환됩니다.


1

자바 스크립트 (ES6), 65 바이트

s=>(l=s.length+1)%2|!(m=s.match(`(0*1){$l/2}}`))?l:m[0].length*2

이진 문자열을 허용합니다. 다양한 다른 답변에서 바운스 확인을 사용합니다.


1

파이썬 2, 74 바이트

def f(x):k=len(x)+1;print next((i*2for i in range(k)if k==2*sum(x[:i])),k)

이 함수는 2 진 숫자 목록 형식의 단일 정수를 입력으로 허용합니다.

이 알고리즘은 @ Agawa001의 답변 과 동일합니다.Jelly 답변.

Ideone에서 테스트 .

작동 원리

nexttrue 를 리턴 하는 첫 번째 정수 2i 를 찾으려고 시도 k==2*sum(x[:i])합니다. i 요소를 x[:i]포함 하므로 (k / 2) 번째 1의 1 기반 인덱스를 제공합니다. .

nextk / 2 가 정수가 아니거나 xk / 2 보다 작은 것이 포함되어 있으면 실패 합니다. 이 경우 기본값 k 가 반환됩니다.


0

> <> , 63 바이트

2r11&>}:?v{1->:l2-%?vr{{$>1+$}$:2=$@&101.
 +&?!^&n;>{1+^ .0+bf<

이 과제에서 예제 패턴을 본 순간부터 어떤 언어를 사용해야하는지 알았습니다. :)

N 을 사용 하여 N 번째 항 을 얻습니다 .

스택에서 입력이 이진 인 것으로 가정합니다. 이 솔루션은 보행기를 움직이지 않고 보행기 아래에서 테이프를 이동시키는 데 주로 의존합니다.

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

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