새 주문 # 2 : 내 길을 돌려


15

소개 (무시 될 수 있음)

모든 양수를 규칙적인 순서 (1, 2, 3, ...)로 넣는 것은 약간 지루하지 않습니까? 그래서 여기 모든 양수의 순열 (순환)에 관한 일련의 도전이 있습니다. 이것이이 시리즈의 두 번째 과제입니다. 첫 번째 도전은 여기 에서 찾을 수 있습니다 .

이 과제에서 그레이 코드를 사용하여 자연수를 근절합니다. 그레이 코드 또는 "반사 된 이진 코드"는 두 개의 연속 값이 하나의 비트에서만 다른 방식으로 이진 인코딩입니다. 이 인코딩의 실제 적용은이를 로터리 엔코더 에 사용하는 것이므로 "Turn My Way"를 참조하십시오 .

3 비트 바이너리로 표시된 각도 측정 장치 용 로터리 엔코더.

이 인코딩은 어느 정도의 자유를 남깁니다. 예를 들어, 이진 1100 다음에는 다음과 같은 네 가지 가능한 코드가 있습니다. 1101, 1110, 1000 및 0100. 따라서 이진 인코딩에서 한 문자 만 다른 이전에 사용되지 않은 가장 작은 값으로 을 정의 . 이 순서는 A163252에 해당 합니다.a()

이것은 "순수한 시퀀스"문제이므로, 주어진 대한 a 을 입력 으로 출력 것이 좋습니다 . 여기서 은 A163252 입니다.()( N )()

직무

정수 입력 주어지면 을 정수 형식 ( 2 진 형식이 아닌 으로 출력 .()

()a ( n - 1 ) a ( n ) 은 이진수로 기록 될 때 과 이 단지 1 비트 만 다르 도록 시퀀스에서 일찍 발생하지 않는 최소 양의 정수로 정의됩니다 .(1)()

참고 : 여기서는 1 기반 색인 작성이 가정됩니다. 0 기반 인덱싱을 사용할 수 있으므로 등이 있습니다. 이것을 사용하기로 선택한 경우 답에 언급하십시오.(0)=1;(1)=

테스트 사례

Input | Output
--------------
1     | 1
5     | 4
20    | 18
50    | 48
123   | 121
1234  | 1333
3000  | 3030
9999  | 9997

규칙

  • 입력 및 출력은 정수입니다 (프로그램은 1에서 32767까지의 입력 및 출력을 지원해야합니다).
  • 유효하지 않은 입력 (0, 부동, 문자열, 음수 값 등)으로 인해 예기치 않은 출력, 오류 또는 (정의되지 않은) 동작이 발생할 수 있습니다. 에서 A163252 , 이 도전 0으로 정의되며,이 무시된다.(0)
  • 기본 I / O 규칙이 적용됩니다.
  • 기본 허점 은 금지되어 있습니다.
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.

최종 메모

다음과 같은 PP & CG 관련 질문을 참조하십시오.

답변:


1

Stax , 19 17 바이트

êÑ{╚α8è╙mc┼σ▀»É▲ü

실행 및 디버깅

하드 코드 된 비트 인덱스 반복으로 인해 지정된 도메인 이후 어느 시점에서 작동이 중지됩니다. (32767)

포장을 풀고 포장을 풀고 주석을 달았습니다.

z0,         push an empty array, literal zero, and the input, in that order
             - the zero represents the last calculated value in the sequence
             - the array contains all the previous ones
D           repeat the rest of the program n times (from input)
  +         append the last calculated value to the array
  17r       [0 .. 16] (these are the bit indices necessary to cover the input range)
  {|2nH|^m  calculate candidate values; previous value with each of these bits toggled 
  n-        remove all values previously calculated
  |m        keep the minimum candidate remaining

이것을 실행


가장 짧은 05AB1E 답변보다 1 바이트 빠릅니다. 이를 더욱 최적화 할 계획입니까? 그렇지 않으면 나는 Kevin의 대답을 받아 들일 것이다 ...
agtoever

1
기회가 있다면 오늘 14 시간 안에 작업 할 것입니다.
재귀

괜찮아. 하루 더 열어 두겠습니다. 행운을 빕니다!
agtoever

@agtoever : 감사합니다. 이제 끝났습니다.
재귀

잘 했어! 네가 이겼다! 축하합니다!
agtoever

4

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

1- 색인.

n=>{for(o=p=[k=1];o[k]|~-(i=p^k)&i?k++:k=o[p=k]=!!n--;);return p}

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

댓글

n => {                  // n = index of requested term
  for(                  // for loop:
    o =                 //   o = storage object for the terms of the sequence
    p =                 //   p = last term found in the sequence
      [k = 1];          //   k = current term
    o[k] |              //   if k was already encountered
    ~-(i = p ^ k) & i ? //   or (p XOR k) has more than 1 bit set:
      k++               //     increment k
    :                   //   else:
      k = o[p = k]      //     set o[k], set p to k
        = !!n--;        //     stop if n is equal to 0 or set k to 1; decrement n
  );                    // end of for()
  return p              // return p
}                       // end

TIO에서 n> ~ 1024에 대한 스택 오버플로가 발생합니다. 아부 다른 환경에서 그것을 다루는 방법에 대한 제안? 규칙 : " 프로그램은 이론적으로 1에서 3232까지의 이론 범위에서 입력 및 출력을 지원해야합니다. "
agtoever

1
@agtoever 비 재귀 버전으로 업데이트했습니다.
Arnauld

4

젤리 , 26 20 바이트

ṀBLŻ2*^1ị$ḟ⁸Ṃ;
0Ç⁸¡Ḣ

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

n을 단일 인수로 취하는 전체 프로그램. 모든 테스트 사례에서 작동합니다. 또한 필수는 아니지만 n = 0을 처리합니다.

설명

도우미 링크 : 다음 용어 찾기 및 접두사

Ṁ              | maximum of list so far
 B             | convert to binary
  L            | number of binary digits
   Ż           | 0..above number
    2*         | 2 to the power of each of the above
      ^        | exclusive or with...
       1ị$     | ... the most recent term in the list so far
          ḟ⁸   | filter out anything used already
            Ṃ  | find the minimum
             ; | prepend to existing list

메인 링크

0              | start with zero
 Ç             | call the above link
  ⁸¡           | and repeat n times
    Ḣ          | take the last term added

3

자바 (JDK) , 142 (138) 124 (123) 132 (130) 98 바이트

n->{int s[]=new int[9*n],j,k=0;for(;n-->0;s[k=j]++)for(j=0;s[++j]>0|n.bitCount(j^k)>1;);return k;}

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


1
수입품이 바이트 수에 포함되어야한다고 두려워합니다. 그러나 import java.util.*;+ Set s=new HashSet();를 골프로 사용할 수 있습니다 var s=new java.util.HashSet();. 또한 나머지는 다음 위치로 골프를 타실 수 있습니다 Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;. 그럼에도 불구하고 좋은 대답이므로 +1하십시오. :)
Kevin Cruijssen

1
더 2 저장된 사용하여 바이트 Stack보다는 HashSet. 훨씬 느리지 만 작동합니다!
Daniel Widdis 2013 년

1
영형()영형()

2
첫 번째 의견에서 제안한 두 번째 골프 로 여전히 126 바이트 로 골프를 수 있습니다 . :)
Kevin Cruijssen 10


2

파이썬 2 , 81 바이트

1 기반 인덱싱

l=[0];p=0
exec"n=0\nwhile(p^n)&(p^n)-1or n in l:n+=1\np=n;l+=p,;"*input()
print p

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


파이썬 2 , 79 바이트

시간이 오래 걸립니다 (7 분 동안 로컬에서 실행 한 후 9999가 완료되지 않았습니다)

l={0};p=0;n=input()
exec'p=min({p^2**k for k in range(n)}-l);l|={p};'*n
print p

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


1
최대 입력 32767은 지원되지 않습니다 (기본 재귀 수준은 시스템에 따라 다름).
Outgolfer Erik

주어진 테스트 사례 9999조차 지원되지 않습니다. :)
Daniel Widdis 2013 년

@EriktheOutgolfer 반복적 인 접근 방식으로 변경했는데, 아마도 TIO에서 제 시간에 끝나지 않지만 로컬에서 정상적으로 실행됩니다.
ovs

@ovs 아, 시간 제한 만 중요하지 않습니다.
Outgolfer Erik

멋있는! 방금 n = 9999로 시도했으며 약 1 시간 후에 성공적으로 완료되었습니다. +1. 예이! ;-)
agtoever



1

, 65 바이트

≔⁰θFN«⊞υθ≔¹ηW¬‹θ⊗η≦⊗ηW∧›η¹∨¬&θη№υ⁻θη≧÷²ηW№υ⁻|θη&θη≦⊗η≔⁻|θη&θηθ»Iθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔⁰θ

결과를 0으로 초기화하십시오.

FN«

루프 n타임.

⊞υθ

이전 결과를 다시 사용하지 않도록 저장하십시오.

≔¹ηW¬‹θ⊗η≦⊗η

이전 결과에서 가장 높은 비트를 찾으십시오.

W∧›η¹∨¬&θη№υ⁻θη≧÷²η

해당 비트가 1보다 크지 만 이전 결과에서 비트가 설정된 경우 해당 비트를 빼서 결과가 보이지 않는 결과인지 확인하십시오. 이를 통해 잠재적 인 결과가 오름차순으로 시도됩니다.

W№υ⁻|θη&θη≦⊗η

이제 보이지 않는 결과가 발견 될 때까지 비트를 두 배로 늘리면서 이전 결과로 해당 비트를 XORing하십시오. 비트를 다시 값의 오름차순으로 설정해야하는 경우와 가장 중요한 비트를 전환해야하는 경우를 처리합니다 (이전 루프는 테스트를 귀찮게하기 때문에 골퍼가 아니기 때문에) 여기). 이전 루프에서 보이지 않는 결과가 발견되면이 루프는 절대 실행되지 않습니다. 그렇지 않으면이 루프는 쓸모없는 결과를 다시 테스트합니다.

≔⁻|θη&θηθ

실제로 비트를 XOR하여 결과를 업데이트하십시오.

»Iθ

루프 끝에서 최종 결과를 출력합니다.


1

05AB1E , 21 20 18 바이트

ÎFˆ∞.Δ¯θy^bSO¯yå_*

비효율적이므로 입력이 클수록 결과를 얻는 데 시간이 더 걸립니다. 0그래도 입력 을 위해 작동합니다 .

설명:

Î                # Push 0 and the input
 F               # Loop the input amount of times:
  ˆ              #  Pop the current number and add it to the global_array
  ∞.Δ            #  Inner loop starting at 1 to find the first number which is truthy for:
     ¯θy^        #   XOR the last number of the global_array with the loop-number `y`
         b       #   Convert it to binary
          SO     #   Sum it's binary digits
     ¯yå_        #   Check if the loop-number `y` is NOT in the global_array yet
            *    #   Multiply both (only if this is 1 (truthy), the inner loop will stop)
                 # (after the loops, output the top of the stack implicitly)

1

하스켈 , 101 바이트

import Data.Bits
(u!n)0=n
(u!n)m|q<-minimum[x|r<-[0..62],x<-[xor(2^r)n],notElem x u]=(n:u)!q$m-1
[]!0

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

에 대한 수입 만 발생하는 것은 수치스러운 xor일이지만 아직 좋은 해결 방법을 찾지 못했습니다. 루프를 표현하는 더 좋은 방법이 있는지 궁금합니다.


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