XOR 더블


20

정수 n> 0에 대해 함수 gg (n) = n XOR (n * 2) 로 정의합니다 .

감안할 때 x> 0 , 작은 정수 찾는 Y>을 0 이되도록 g의 K (Y) = X 일부 K> 0 .

x = 549

549 = 483 XOR (483 * 2)     (as binary: 1000100101 = 111100011 XOR 1111000110)
483 = 161 XOR (161 * 2)     (as binary:  111100011 =  10100001 XOR  101000010)

이는 g 2 (161) = 549 입니다. g (n) = 161 과 같은 n 이 없으므로 더 이상 갈 수 없습니다 . 따라서 x = 549 의 예상 출력 은 y = 161 입니다.

규칙

  • 유효하지 않은 항목을 지원하지 않아야합니다. 입력 값 x에 대해 쌍 (y, k) 이 존재하도록 보장됩니다 .
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다!

테스트 사례

     3 -->     1
     5 -->     1
     6 -->     2
     9 -->     7
    10 -->     2
    23 -->    13
    85 -->     1
   549 -->   161
   960 -->    64
  1023 -->   341
  1155 -->   213
  1542 -->     2
  9999 -->  2819
 57308 --> 19124
 57311 -->   223
983055 -->     1

3
관련 OEIS : A048274 시퀀스a(n) = g(n)
Giuseppe

답변:


5

자바 8, 68 57 53 52 바이트

n->{for(int i=0;i<n;)i-=(i*2^i)==n?n=i:-1;return n;}

@ OlivierGrégoire 덕분에 -5 바이트 .

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

설명:

n->{                 // Method with integer as both parameter and return-type
  for(int i=0;i<n;)  //  Loop `i` in the range (1,n)
    i-=(i*2^i)==n?   //   If `i*2` XOR-ed with `i` equals `n`
        n=i          //    Set `n` to `i`, and set `i` to 0 to reset the loop
       :             //   Else:
        -1;          //    Increase `i` by 1 to go to the next iteration
  return n;}         //  Return `n` after the entire loop

1
n->{for(int i=0;i<n;)i-=(i*2^i)==n?n=i:-1;return n;}(52 바이트). 죄송합니다 ^^ '
Olivier Grégoire

@ OlivierGrégoire 더 똑똑하고 감사합니다!
Kevin Cruijssen

for(int i=0;n>i-=i+i^i^n?-1:n=i;);?
Titus

@Titus Java에서 작동하지 않을까 걱정됩니다 ( 반복적 인 JavaScript 답변에 해당 접근 방식을 사용했지만 ). Java에서는 i+i^i^n?부울이 아니므로 컴파일조차되지 않습니다. 또한 n>i-=...괄호 ( n>(i-=...)) 가 필요 n=i하며 삼항 if의 else 절에서는 허용되지 않으며 if 절에서만 허용됩니다 (이 마지막 이유는 모르겠지만 불행히도 Java는 무엇입니까? ).
Kevin Cruijssen

1
@KevinCruijssen " n=i3 항 -if 의 else 절에서는 허용되지 않습니다". Java (i-=(i*2^i)!=n?-1:n)=i가 불법 으로 파싱하기 때문 입니다.
Olivier Grégoire 2016 년


3

자바 스크립트, 53 바이트

f=x=>(i=0,y=(G=x=>x&&(i^=x&1)+2*G(x>>1))(x),i?x:f(y))

G이다 g^-1설정하는 i0설정하면 성공 i1실패했을 경우.


1
이것은 50 바이트 버전을 생각해 냈지만 사용하려고 시도한 방법이었습니다 f=n=>(g=n=>n<2?0/!n:n%2+2*g(n/2^n%2))(n)?f(g(n)):n. 안타깝게도 지루한 접근 방식은 12 바이트 더 짧습니다.
Neil

3

Pyth , 13 12 10 바이트

@MrXcoder 덕분에 1 바이트를 절약하고 제안에 따라 2 바이트 더 절약했습니다.

fqQ.W<HQxy

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

설명:

fqQ.W<HQxyZZT   Implicit: Q=eval(input()), trailing ZZT inferred

f               Return the first T in [1,2,3...] where the following is truthy
   .W       T     Functional while - loop until condition is true, starting value T
     <HQ            Condition: continue while iteration value (H) less than input
        xyZZ        Body: xor iteration value (Z) with double (y) iteration value (Z)
 qQ               Is the result of the above equal to input?

1
후행 T을 12 바이트 동안 삭제할 수 있습니다 .
Mr. Xcoder 2016

3

R , 73 65 바이트

f=function(x){for(i in 1:x)if(x==bitwXor(i,i*2)){i=f(i);break};i}

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

간단하지만 매우 효과적인 조정으로 인해 많은 주세페 (-8) 에게 감사드립니다.


1
당신의 이전 대답 반대로이 함수는 재귀 있기 때문에, 당신은 을 필요로 f=하는 기능의 요구가 바인딩 할 수 있기 때문에 f제대로 작동 할 수 있습니다. 그것은 좋은 일이었고, 나에게서 +1을 가져 왔습니다!
주세페

2
당신은 또한 당신의 논리를 약간 재조정하고 이것을 65 바이트로 만들 수 있습니다
Giuseppe

2

자바 스크립트, 38 36 바이트

f=(n,x=n)=>x?x^x+x^n?f(n,--x):f(x):n

온라인 시도 - 9999& 사이 어딘가에 오버플로 오류가 발생하기 시작합니다 57308.



2

C (gcc) , 57 56 55 51 바이트

  • ceilingcat 덕분에 바이트를 절약했습니다 . !=-.
  • 저장된 바이트 다섯 덕분에 바이트 Rogem ; 삼항 표현과 gcc 요점을 사용합니다.
X(O,R){for(R=1;R;O=R?R:O)for(R=O;--R&&(R^2*R)-O;);}

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


1
X(O,R)
JayCe

@ceilingcat 좋은 제안, 감사합니다.
Jonathan Frech

for(R=1;R;O=R?R:O)바이트를 저장합니다.

R=O;마지막에 불필요한 것처럼 보이므로 다른 4 바이트를 절약 할 수 있습니다.

@Rogem, 감사합니다.
Jonathan Frech 2016 년

2

Z80Golf , 22 바이트

00000000: 1600 1803 4216 007a b830 097a 82aa b828  ....B..z.0.z...(
00000010: f314 18f3 78c9                           ....x.

@KevinCruijssen의 Java 답변 포트

9- 입력 온라인 예!

85의 입력 예-온라인으로 사용해보십시오!

어셈블리:

;d=loop counter
;b=input and output
f:
	ld d,0
	jr loop
	begin:
	ld b,d
	ld d,0
	loop:
		ld a,d
		cp b
		jr nc,end	; if d==b end
		ld a,d
		add d		; mul by 2
		xor d
		cp b
		jr z,begin	; if (d*2)^d==b set b to d
		inc d
		jr loop
	end:
	ld a,b
	ret

함수를 호출하고 결과를 인쇄하기위한 어셈블리 예제 :

ld b,9 ; input to the function, in this case 9
call f
add 30h ; ASCII char '0'
call 8000h ; putchar
halt

a대신 루프 카운터 를 만들면 명령을 두 번 d대체하여 두 바이트를 절약 할 수 있습니다 . ld d,0xor a
Misha Lavrov


1

자바 스크립트 (Node.js), 48 45 38 바이트

f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n

@Neil 덕분에 -7 바이트 덕분에 아래 반복 버전의 재귀 버전을 만듭니다. 큰 테스트 사례에서는 작동하지 않습니다.

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


모든 테스트 사례에서 작동하는 반복 45 바이트 버전 :

n=>{for(i=0;i<n;)i-=i*2^i^n?-1:n=i;return n;}

내 자바 답변의 포트. @Arnauld
덕분에 -3 바이트 .

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


1
당신은 할 수 있습니다 i-=i*2^i^n?-1:n=i(그러나 불행히도 Java에서는 아닙니다).
Arnauld

@Arnauld Java의 부울 1이 JS 에서만 가능하다고 생각 했습니다. 감사!
Kevin Cruijssen

1
재귀 적으로 작성된 38 바이트 (더 큰 입력에서는 작동하지 않음) :f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n
Neil


1

젤리 , 11 9 바이트

BÄḂṛḄß$Ṫ?

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

팁 : 루프 대신 재귀 함수를 사용하십시오.


불행히도 매우 빠르고 무차별 대입 접근 방식을 잃습니다.

참고 :

  • 들면 x> 0 , F (X)> X .
  • popcount (f (x)) 는 짝수입니다. 여기서 popcount (n)n에 설정된 비트 수입니다 .
  • n 에 popcount가 있으면 f (x) = n 과 같은 x 가 존재합니다. .
  • 하자 B (X)는 이진 표현 될 XP (L)는 리스트 될 L 제거 마지막 요소. 그러면 B (x)Ṗ (B (f (x))) 의 누적 XOR입니다 .

그래서 우리는 반복적으로 :

  • 이진 표현 계산 ( B)
  • 그런 다음 누적 XOR을 사용하십시오 ( ^\또는 사용 ÄḂ, 그들은 동일한 효과가 있습니다).
  • 누적 된 XOR ?의 꼬리 (마지막 요소) ( )가 0이 아닌지 확인 (홀수 팝 카운트)
    • 그렇다면 이진 목록을 다시 십진수로 변환하고 재귀하십시오.
    • 그렇지 않은 경우 입력 ( )을 반환합니다 .

9 바이트 :B^\⁸Ḅß$Ṫ?
Leaky Nun

1

넷째 (gforth) , 71 바이트

: f 0 begin 2dup dup 2* xor = if nip 0 else 1+ then 2dup < until drop ;

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

설명

0                 \ add an index variable to the top of the stack
begin             \ start an indefinite loop
  2dup            \ duplicate the top two stack items (n and i)
  dup 2* xor =    \ calculate i xor 2i and check if equal to n
  if nip 0        \ if equal, drop n (making i the new n) and use 0 as the new i
  else 1+         \ otherwise just increment i by 1
  then            \ end the if-statement
  2dup <          \ duplicate the top two stack items and check if n < i
until             \ if previous statement is true, end the loop
drop              \ drop i, leaving n on top of the stack

1

펄 6 , 44 바이트

{({first {($^a+^2*$a)==$_},^$_}...^!*).tail}

시도 해봐

넓히는:

{  # bare block lambda with implicit parameter $_

  (
    # generate a sequence

    # no need to seed the sequence with $_, as the following block will
    # default to using the outer $_
    # $_, 

    { # parameter $_

      first
        {  # block with placeholder parameter $a

          ( $^a +^ 2 * $a ) # double (numeric) xor
          == $_             # is it equal to the previous value
        },

        ^$_  # Range up to and excluding the previous value ( 0..^$_ )
    }

    ...^  # keep doing that until: (and throw away last value)

    !*    # it doesn't return a trueish value

  ).tail  # return the last generated value
}



1

F #, 92 바이트

let rec o i=
 let r=Seq.tryFind(fun x->x^^^x*2=i){1..i-1}
 if r.IsNone then i else o r.Value

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

1부터 사이의 숫자를 재귀 적으로 확인합니다 i-1. 일치하는 항목이 있으면 해당 숫자가 작은 지 확인하십시오. 일치하지 않으면 입력 번호를 반환하십시오.


1

자바 스크립트 (Node.js) , 40 바이트

f=n=>g(n)%2?n:f(g(n)/2)
g=x=>x&&x^g(x/2)

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

-1 바이트를위한 Shaggy에게 감사합니다.

젤리 포트 .

마지막으로이 접근법이 더 짧은 언어가 있습니다 ( oops ). (나는 파이썬과 자바를 시도했다. 작동하지 않습니다)

아무도 내가 /2대신 사용할 수있는 이유를 설명 할 수 있습니까 >>1?


1
x/2산술 언더 플로로 인해 작동합니다. IEEE 754 숫자는 2로 충분히 나눌 때 결국 0 으로 평가됩니다 . (그리고 XOR 할 때는 소수 부분이 무시되므로 결과에 영향을 미치지 않습니다.)
Arnauld


@Shaggy 작동한다는 사실에 놀랐습니다. 파이썬과 루아 등에서는 작동하지만 Javascript에서는 작동하지 않습니다.
user202729

false마지막 반복에 반환 암시 적으로 캐스팅되는 0비트 단위 XOR 연산자에 의해.
얽히고 설킨

@Shaggy에서 사실은, 아무 false관련 없습니다 . JS &&는 Python / Lua와 거의 동일하게 작동합니다 and.
user202729

1

K (ngn / k) , 32 26 바이트

{$[*|a:2!+\2\x;x;2/-1_a]}/

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

{ } 인수가있는 함수입니다 x

/ 수렴까지 적용

$[ ; ; ] 그렇지 않은 경우

2\x이진수 x(ngn / k에만 해당)

+\ 부분 합계

2! 모드 2

a: 할당하다 a

*|마지막-뒤로 ( |) 먼저 가져 오기 ( *)

위의 1이면 x반환됩니다

그렇지 않으면:

-1_a 마지막 요소를 삭제 a

2/ 이진 해독


0

C, 62 바이트

Kevin Cruijssen의 Java를 기반으로합니다.

int n(int j){for(int i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}

테스트하려면 :

#include <stdio.h>
int n(int j);
#define p(i) printf("%6d --> %5d\n", i, n(i))
int main(void)
{
    p(3);
    p(5);
    p(6);
    p(9);
    p(10);
    p(23);
    p(85);
    p(549);
    p(960);
    p(1023);
    p(1155);
    p(1542);
    p(9999);
    p(57308);
    p(57311);
    p(983055);
}

테스트 프로그램이 실행되면 다음이 출력됩니다.

     3 -->     1
     5 -->     1
     6 -->     2
     9 -->     7
    10 -->     2
    23 -->    13
    85 -->     1
   549 -->   161
   960 -->    64
  1023 -->   341
  1155 -->   213
  1542 -->     2
  9999 -->  2819
 57308 --> 19124
 57311 -->   223
983055 -->     1

C, 54 바이트

C89 또는 K & R C에서만 작동합니다.

n(j){for(i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}


int n(int j){for(int i=0;j>i-=i*2^i^j?-1:j=i;);return j;}이 57 바이트가 작동합니까?
Titus

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