드래곤 커브 시퀀스


23

용 곡선 시퀀스 (또는 일반 용지 접는 순서) 이진 시퀀스이다. a(n)의 최하위 1의 왼쪽 비트를 부정함으로써 주어진다 n. 예를 들어 계산 a(2136)하려면 먼저 이진으로 변환하십시오.

100001011000

우리는 가장 중요한 비트를 찾습니다

100001011000
        ^

비트를 왼쪽으로

100001011000
       ^

그리고 그 부정을 반환

0

태스크

입력으로 양의 정수가 주어지면 output a(n). 정수 또는 부울로 출력 할 수 있습니다. 바이트 단위로 코드를 최대한 작게 만드는 것이 목표입니다.

테스트 사례

순서대로 처음 100 개의 항목이 있습니다.

1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1


9
최하위 비트는 100001011000입니다 0. 가장 중요하지 1않습니까?
산란

답변:


16

매스 매 티카 25 바이트

1/2+JacobiSymbol[-1,#]/2&

이를 수행하는 다른 방법 :

56 바이트

(v:=1-IntegerDigits[#,2,i][[1]];For[i=1,v>0,i++];i++;v)&

58 바이트

1-Nest[Join[#,{0},Reverse[1-#]]&,{0},Floor@Log[2,#]][[#]]&

3
와우! 수학 답변과 내장되지 않습니다. 공감하다!
KeyWeeUsr

2
이 답변을 더 좋게 만들 수있는 유일한 방법은 이유와 작동 방식에 대한 설명입니다. : P
Martin Ender

2
@MartinEnder arxiv.org/pdf/1408.5770.pdf 예제 13 이후의 설명을 참조하십시오.
alephalpha

7

파이썬 3 , 22 21 바이트

ETH 프로덕션 덕분에 1 바이트.

lambda n:n&2*(n&-n)<1

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

비트 산술 ftw.


2
내가 추측 그래서 "당신은 정수하거나 부울로 출력 할 수있다"당신은 필요하지 않습니다 0+(...)?
Martin Ender

여기의 작업 순서는 실제로 혼란 스럽습니다. n&1괄호 안에 넣을 수 있습니까? 아니면 1+(n^~-n)<1괄호 안에 넣을 수 있습니까? 아니면입니다 1+(n^~-n)...
ETHproductions

오 신 이시여 이것은 내가 찾고 있던 것입니다 : o nice!
HyperNeutrino

&우선 순위가 가장 낮으므로1+(n^~-n)
Leaky Nun

아, 우선 순위 표를 찾았습니다. 이제 모든 것이 합리적입니다 : P
ETHproductions

6

망막 ,38 34 29 바이트

\d+
$*
+`^(1+)\1$|1111
$1
^1$

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

Martin과 Leaky는 본질적으로 5 바이트를 더 절약하기 위해이 아이디어를 생각해 냈습니다!

입력을 단항으로 변환 한 다음 점진적으로 숫자를 2로 나눕니다. 더 이상 고르게 할 수 없으면 (즉, 숫자가 홀수 인 경우) 입력에서 4의 패치를 제거하고 마지막 작업 모드 4의 결과를 계산합니다. 마지막으로 결과가 1인지 확인하여 최하위 1 비트 왼쪽의 숫자가 0임을 의미합니다. 이것이 참이면 최종 결과는 1이고, 그렇지 않으면 0입니다.


31 바이트 (내가 직접 게시해야합니까?)
Leaky Nun

전체 이진 변환을 피하고 대신 2의 요소를 나누고 1 (mod 4)과 같은지 확인하는 방법을 찾았습니다. tio.run/##K0otycxL/…
Martin Ender

@MartinEnder 본질적으로 내 알고리즘 ... 2 바이트 꺼짐
Leaky Nun

@LeakyNun 오 예, 둘 다 같은 생각입니다. 좋은 마음과 물건 ...;)
Martin Ender

나는 그에서 편집 하겠지만, 중 하나를 게시하고자하는 경우 아마 자신이 생각하지 않았을으로 나는 되돌아 갈 수 있습니다)
FryAmTheEggman

6

젤리 , 5 바이트

&N&HṆ

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

작동 원리

&N&HṆ  Main link. Argument: n

 N     Negate; yield -n.
&      Bitwise AND; compute n&-n.
       This yields the highest power of 2 that divides n evenly.
   H   Halve; yield n/2.
  &    Bitwise AND; compute n&-n&n/2. This rounds n/2 down if n is odd.
    Ṇ  Take the logical NOT of the result.

4

Alice , 8 바이트

I2z1xnO@

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

입력 을 유니 코드 문자의 코드 포인트로 사용하고 그에 따라 결과를 0x00 또는 0x01 바이트로 출력합니다.

테스트를 위해 12 바이트의 10 진 I / O 버전은 정확히 동일한 알고리즘을 사용합니다 (I / O 만 다름).

/o
\i@/2z1xn

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

Alice가 골프 언어이고 명시적인 I / O 및 프로그램 종료가 필요하지 않은 경우 2z1xn이는 05AB1E와 Jelly를 모두 치는 5 바이트에 불과 합니다.

설명

I    Read input.
2z   Drop all factors of 2 from the input, i.e. divide it by 2 as long
     as its even. This shifts the binary representation to the right
     until there are no more trailing zeros.
1x   Extract the second-least significant bit.
n    Negate it.
O    Output it.
@    Terminate the program.


3

와이즈 , 28 20 16 바이트

::-~^~-&:[?>]~-^

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

설명

이것은 Leaky Nun의 Python 답변 포트입니다. 불행히도 TIO의 인터프리터 버전이 약간 구식이기 때문에 TIO에서는 작동하지 않습니다.

입력을 3 부로 시작 ::하여 윗부분을 1 씩 줄입니다. 이렇게하면 모든 비트가 처음 1까지 뒤집 힙니다. 그런 다음 입력의 다른 사본으로이를 조정합니다. 입력의 첫 번째 1까지 모든 비트가 뒤집어지기 때문에 모든 비트가 결과에서 1이됩니다. 그런 다음 ~-결과 에 1 을 더하면 가장 중요도가 가장 낮은 1 의 왼쪽에 1을 얻게됩니다. 이제 0비트가 꺼져 있고 비트가 켜져있는 2iff의 힘을 가지게 됩니다 . 이것을 단일 1또는 로 바꿀 수 있습니다 . 이 작업이 완료되면 비트를 부정하기 만하면 됩니다.0:[?>]~-^



3

하스켈 , 45 43 39 바이트

nimi 덕분에 6 바이트 절약

f x|d<-div x 2=[f d,mod(1+d)2]!!mod x 2

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


div대신 사용할 수 있습니다 quot.
nimi

더 나은 : divMod:f x|(d,m)<-divMod x 2=[mod(1+d)2,f d]!!m
nimi

@nimi 나는 그것이 어떻게 작동하는지 이해조차하지 못합니다. 아마 직접 게시해야합니다.
밀 마법사

그것은 여전히 같은 알고리즘,하지만 지점을 선택하는 단지 다른 방법입니다. 그래서 편집 그것에 주시기 바랍니다, (재귀 기본 케이스 대 다시 f를 호출) |(d,m)<-divMod x 2A는 패턴 가드 바인드로는 ddiv x 2mmod x 2. 우리 m는 두 요소 목록을 색인하는 데 사용 합니다 [...,...]!!m. 경우의 m==0우리는 반환 mod(1+d)2및시 m==1 f d.
nimi 2016 년

1
죄송합니다 [f d,mod(1+d)2]. 목록 요소를 뒤집어 야합니다 . 온라인으로 사용해보십시오! .
nimi 2016 년

3

x86 머신 코드, 17 16 15 바이트 :

매개 변수가 스택에서 푸시되고 리턴 값이 AL레지스터 에있는 ABI를 가정합니다 .

8B 44 24 04 0F BC C8 41 0F BB C8 0F 93 C0 C3

다음과 같이 분해됩니다.

_dragoncurve:
  00000000: 8B 44 24 04        mov         eax,dword ptr [esp+4]
  00000004: 0F BC C8           bsf         ecx,eax
  00000007: 41                 inc         ecx
  00000008: 0F BB C8           btc         eax,ecx
  0000000B: 0F 93 C0           setae       al
  0000000E: C3                 ret

1
@PeterTaylor 내 대답에 대한 CPU 명령의 크기를 바이트 단위로 계산합니다. 그것은 PPCG에서 어셈블리 답변에 대한 일반적인 관행입니다.
Govind Parmar

1
나는 그것이 얼마나 흔한 지 말할 수 없었지만, 확실히 틀렸다
Peter Taylor

1
그것은 단지 pedantic 일뿐만 아니라 의미도 없습니다. 컴퓨터와 관련하여 "기계 코드"와 "조립 코드"는 구별되지 않습니다. 차이점은 단지 해석의 하나 일뿐입니다. 인간이 쉽게 읽을 수 있도록 니모닉을 기계 코드 바이트에 할당합니다. 다시 말해, 이해하기 쉽도록 바이트의 압축을 해제 합니다.
코디 그레이

3
@Peter와는 관련이 없습니다. 어셈블리 코드는 사람이 읽을 수있는 기계어 코드 번역입니다. 그것들은 두 가지 다른 형태 / 표현으로 정확히 같은 언어입니다. TI BASIC과 다르지 않습니다 . 시스템에서 내부적으로 저장하는 방식이기 때문에 문자 바이트 대신 토큰 을 계산 하는 것이 일반적으로 허용 됩니다. 어셈블리 언어에서도 마찬가지입니다. 명령어 니모닉은 개별 문자로 저장되지 않고 동등한 기계 코드 바이트로 표시됩니다.
코디 그레이

2
게다가, 실질적으로 말하기, 사람이 왜 것 이제까지 코드 골프 대회에서 어셈블리 언어 니모닉을 확장 입력, 그들은 항목이 무료로 짧게 보장 100 % 해당하는 기계어 코드로 번역 수있을 때? 그것만으로도 터무니없는 것은 아니지만 두 무의미한 것을 구별합니다.
코디 그레이

3

자바 스크립트 (ES6), 17 14 바이트

f=
n=>!(n&-n&n/2)
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

편집 : 부울 출력이 허용되는 것을 알게되면 @Dennis의 답변을 이식하여 3 바이트를 절약했습니다.


3

C (gcc) , 20 바이트

f(n){n=!(n&-n&n/2);}

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


이것은 실제로 "작동"하지 않습니다; 하나의 특정 아키텍처를 대상으로하는 하나의 특정 버전의 컴파일러에 대해 코드 생성기의 문제에 의존합니다. 여기서 중간 계산은 반환 값에 사용되는 동일한 레지스터에서 수행됩니다. 모든 유형의 최적화를 활성화하거나 대상 아키텍처를 변경하거나 다른 버전의 GCC를 사용하면 문제가 발생합니다. "10 월 13 일에 보름달이있을 때 내 스택의 쓰레기에 올바른 출력물이 포함되어 있습니다"라고 말할 수도 있습니다.
코디 그레이

여러분이 말하는 모든 것이 사실이며 이와 같은 코드는 프로덕션 코드에서 절대 사용되지 않지만, 코드 골프 목적을 위해 구현에 의해 언어를 정의합니다. 추가 플래그가 없으면 모든 최신 버전의 gcc 및 tcc에서 작동하며 유효한 것으로 간주 되려면 버전 에서만 작동 해야합니다.
데니스

"우리는 코드 골프 목적으로 구현에 의해 언어를 정의합니다" 잠깐만 요? 모든 컴파일러 플래그와 모든 버전의 GCC는 다른 언어를 정의합니까? 그게 미친거 알아? C 언어 표준은 언어를 정의하는 것입니다.
코디 그레이

여기 없어 C 표준이 있지만 구현은 없으면 언어로 간주하지도 않습니다. 앞에서 말했듯 이 컴파일러는 언어를 정의합니다 . 결과적 으로 정의되지 않은 동작에 의존하는 것이 허용 됩니다. 다른 플래그 집합은 다른 언어로 간주되지 않지만 바이트 수에 추가하지 않으면 모든 답변은 표준 컴파일 플래그를 사용합니다.
Dennis

와우. 그건 견과류 야 나는 당신이 말하는한다면 내가 이해할 수있는, 의미 구현 정의 행동이 허용되지만 정의되지 않은 동작이되어 있지 구현에 의해 정의했다. 문자 그대로 정의되어 있지 않습니다. 구현은 매번 임의의 작업을 수행 할 수 있습니다. 그리고 "표준 컴파일 플래그"라는 개념은 방금 발명 한 것입니다. 표준 컴파일 플래그에는 코드를 손상시키는 몇 가지가 포함되어 있습니다. 그리고 나는 옵티마이 저가 비표준이라고 생각하지 않습니다. 글쎄, 분명히이 사이트는 나를위한 것이 아닙니다.
코디 그레이

3

INTERCAL , 50 바이트

DOWRITEIN.1DO.1<-!?1~.1'~#1DOREADOUT.1PLEASEGIVEUP

INTERCAL 단항 연산자는 이에 적합하므로 첫 번째 게시물을 작성하기로 결정했습니다.

DO WRITE IN .1
DO .1 <- !?1~.1'~#1
DO READ OUT .1
PLEASE GIVE UP



2

,,, , 10 9 바이트

::0-&2*&¬

설명

예를 들어 3을 입력하십시오.

::0-&2*&1≥
               implicitly push command line argument       [3]
::             duplicate twice                             [3, 3, 3]
  0            push 0 on to the stack                      [3, 3, 3, 0]
   -           pop 0 and 3 and push 0 - 3                  [3, 3, -3]
    &          pop -3 and 3 and push -3 & 3 (bitwise AND)  [3, 1]
     2         push 2 on to the stack                      [3, 1, 2]
      *        pop 2 and 1 and push 2 * 1                  [3, 2]
       &       pop 2 and 3 and push 2 & 3                  [2]
        ¬      pop 2 and push ¬ 2 (logical NOT)            [0]
               implicit output                             []


2

옥타브 , 34 바이트

@(x)~(k=[de2bi(x),0])(find(k,1)+1)

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

설명:

@(x)                               % Anonymous function taking a decimal number as input
    ~....                          % Negate whatever comes next
     (   de2bi(x)   )              % Convert x to a binary array that's conveniently 
                                   % ordered with the least significant bits first
        [de2bi(x),0]               % Append a zero to the end, to avoid out of bound index
     (k=[de2bi(x),0])              % Store the vector as a variable 'k'
                     (find(k,1)    % Find the first '1' in k (the least significant 1-bit)
                               +1  % Add 1 to the index to get the next bit
     (k=[de2bi(x),0])(find(k,1)+1) % Use as index to the vector k to get the correct bit

내가 어떻게 de2bi에 대해 들어 본 적이 ... : O
Sanchises

1

제출:

파이썬 2 , 41 39 바이트

x=input()
while~-x&1:x/=2
print 1-x/2%2

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

FryAmTheEggman 덕분에 -2 바이트

초기 해결책 :

파이썬 2 , 43 바이트

lambda x:1-int(bin(x)[bin(x).rfind('1')-1])

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


그렇다면 어느 것이 제출입니까?
Leaky Nun

@LeakyNun 더 짧기 때문에 첫 번째; 두 번째는 내 원래의 제출이었다. 별도로 게시해야합니까?
HyperNeutrino 2016 년

~-x&1대신 조건을 위해 작동한다고 생각합니다.
FryAmTheEggman 2016 년

(사용자 이름을 잊어 버렸습니다); PPCG에서 다른 사람의 코드를 수정하지 않는 것이 좋습니다. 제안을 게시 할 수 있지만 (btw, @FryAmTheEggman 덕분에) 골프 편집은하지 마십시오. 감사!
HyperNeutrino 2016 년

@StewieGriffin 아 그래, 고마워. 불행히도 편집이 거부되어 사용자를 핑할 수 없습니다.
HyperNeutrino 2016 년

1

MATL , 11 10 바이트

t4*YF1)Z.~

온라인으로 사용해보십시오! 또는 처음 100 개의 출력을 참조하십시오 .

설명

t    % Implicit input. Duplicate
4*   % Multiply by 4. This ensures that the input is a multiple of 2, and
     % takes into account that bit positions are 1 based
YF   % Exponents of prime factorization
1)   % Get first exponent, which is that of factor 2
Z.   % Get bit of input at that (1-based) position
~    % Negate. Implicit display


1

Befunge-98 , 19 바이트

&#;:2%\2/\#;_;@.!%2

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

&#                       Initial input: Read a number an skip the next command
  ;:2%\2/\#;_;           Main loop: (Direction: East)
   :2%                    Duplicate the current number and read the last bit
      \2/                 Swap the first two items on stack (last bit and number)
                          and divide the number by two => remove last bit
         \                swap last bit and number again
          #;_;            If the last bit is 0, keep going East and jump to the beginning of the loop
                          If the last bit is 1, turn West and jump to the beginning of the loop, but in a different direction.
&#;           @.!%2      End: (Direction: West)
&#                        Jump over the input, wrap around
                 %2       Take the number mod 2 => read the last bit
               .!         Negate the bit and print as a number
              @          Terminate

1

SCALA, 99 (78?) 자, 99 (78?) 바이트

if(i==0)print(1)else
print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

i입력은 어디에 있습니까 ?

보시다시피, 필자가 테스트 케이스에서했던 것처럼 0을 돌보지 않으면 21 바이트를 절약합니다.

print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

이것은 내 첫 번째 코드 골프이므로 잘했으면 좋겠습니다. :)

온라인으로 사용해보십시오! lol을 계산하는 것은 꽤 길지만.


사이트에 오신 것을 환영합니다!
DJMcMayhem


1

자바 8, 17 바이트

n->(n&2*(n&-n))<1

LeakyNun의 Python 3 answer의 간단한 포트 . 더 짧은 솔루션을 볼 수있는 비트 단위 연산 및 연산자 우선 순위에 익숙하지 않습니다. 여분의 괄호를 피할 수있는 방법이 있습니까?


0

Japt , 10 8 9 바이트

!+¢g¢a1 É

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

설명

!+¢   g    a1 É
!+Us2 gUs2 a1 -1 # Implicit input (U) as number
!+               # Return the boolean NOT of
      g          #   the character at index
       Us2       #     the input converted to binary
           a1    #     the index of its last 1
              -1 #     minus 1
      g          #   in string
  Us2            #     the input converted to binary

false문자 (0 또는 1)가 항상 문자열이므로 모든 것을 반환 합니다.
얽히고 설킨

죄송합니다. 지금 수정되었습니다
Luke

지금은 실패한1 것 같습니다 .
얽히고 설킨

0

자바 스크립트 (ES6), 53 34 바이트

a=>eval("for(;~a&1;a/=2);~a>>1&1")

42 바이트 :a=>!+(a=a.toString(2))[a.lastIndexOf(1)-1]
Shaggy

나는 더 짧은 (수학적) 해결책을 이미 발견했습니다 ...
Luke

Nice :) 그 42 바이트를 게시해도 될까요?
얽히고 설킨

@Shaggy, 전혀 아님
Luke



0

, 93 바이트

HZABCDEFG,t
 ))))))))^~S
H\\\\\\\/v~a
G\\\\\\/v'
F\\\\\/v'
E\\\\/v'
D\\\/v'
C\\/v'
B\/v'
A/-'

작은 엔디안 바이트로 입력을받습니다. (TIO에는 약간의 파이썬이 있습니다.) 출력을 0x0또는 로 제공합니다 0x1. TIO는 xxd를 사용하여 값을 검사합니다.

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

어떻게합니까?

칩은 한 번에 한 바이트 씩 입력을 보므로 멀티 바이트 입력을 처리하면 대량이 추가되지만 내가 생각했던 것만 큼 가까이 있지는 않습니다.

들어가 보자 :

HZABCDEFG

이들은 HZ이전 바이트의 높은 비트 (있는 경우), 그리고 A- G, 현재의 바이트의 일곱 하위 비트. 이들은 숫자의 가장 낮은 설정 비트를 찾는 데 사용됩니다.

        ,t
))))))))^~S

가장 낮은 설정 비트가 발견되면 몇 가지 조치를 취해야합니다. 이 첫 번째 청크는 "우리가 세트 비트 ( )들)를 가지고 있다면 S출력을 억제하는 것을 멈추고 t답을 인쇄 한 후에 종료합니다.

H\\\\\\\/v~a
G\\\\\\/v'
...
A/-'

(어느 쪽이 현재의 바이트의 비트 A- H) 그런 다음에야 제로의 무리 중 하나가 앞에 ( \/: 직접 북쪽 그들의 비트에서 이러한 모습, 우리는 이전의 모든 비트가 제로라고 믿을 수)에 전선을 통과 오른쪽 ( v,, '...)을 입력 한 값이 반전되고 출력의 낮은 비트 ( ~a)로 제공됩니다.

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