정수 나누기, 뒤집기 및 재결합


16

배경

수학에서 정수는 정수 쌍과 일대일로 대응 될 수 있다는 것은 잘 알려져 있습니다. 이 작업을 수행하는 방법에는 여러 가지가 있으며이 과제에서는 그 중 하나를 구현 하고 그 그 반대 작업을 합니다.

작업

입력은 양의 정수 n > 0입니다. a, b ≥ 0와 같은 고유의 음이 아닌 정수가 존재하는 것으로 알려져있다 . 출력은의 "플립 버전"이며 양의 정수 입니다.n == 2a * (2*b + 1)n2b * (2*a + 1)

입력 및 출력이 언어의 표준 부호없는 정수 데이터 유형에 맞는 것으로 가정 할 수 있습니다.

규칙과 득점

전체 프로그램이나 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점이 허용되지 않습니다.

테스트 사례

in <-> out구현할 함수는 자체 역수이므로 형식으로 제공됩니다. 출력을 다시 피드백하면 원래 입력을 가져와야합니다.

1 <-> 1
2 <-> 3
4 <-> 5
6 <-> 6
7 <-> 8
9 <-> 16
10 <-> 12
11 <-> 32
13 <-> 64
14 <-> 24
15 <-> 128
17 <-> 256
18 <-> 48
19 <-> 512
20 <-> 20
28 <-> 40
30 <-> 384
56 <-> 56
88 <-> 224
89 <-> 17592186044416

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다. 답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

## Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

## Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
웃긴,이 문제는 지난주 무정부 골프
feersum

@feersum 아, 몰랐어요. 이런 우연이.
Zgarb

2

답변:


11

젤리 , 17 16 15 바이트

BUi1µ2*³:2*×Ḥ’$

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

작동 원리

BUi1µ2*³:2*×Ḥ’$    Main link. Input: n

B                  Convert n to base 2.
 U                 Reverse the array of binary digits.
  i1               Get the first index (1-based) of 1.
                   This yields a + 1.
    µ              Begin a new, monadic chain. Argument: a + 1
     2*            Compute 2 ** (a+1).
       ³:          Divide n (input) by 2 ** (a+1).
                   : performs integer division, so this yields b.
         2*        Compute 2 ** b.
              $    Combine the two preceding atoms.
            Ḥ      Double; yield 2a + 2.
             ’     Decrement to yield 2a + 1.
           ×       Fork; multiply the results to the left and to the right.

잠깐, Jelly에서 문제를 해결하기 위해 연산자를 구현하고 있습니까? 이 경우 LOL
Alexander Torstling

나는 아니다. 이 챌린지가 게시 된 후 젤리에 대한 유일한 약속 은 문서의 업데이트였으며이 답변에 사용 된 모든 운영자는 적어도 한 달 동안 구현되었습니다. 부담없이 확인하십시오
Dennis

걱정하지 마세요. 규칙이나 그 어떤 것에도 익숙하지 않습니다. 골프는 자신의 언어를 발명 한 사람들에게 온 것이 멋지다고 생각했습니다.
Alexander Torstling

2
그리고 그것들이 많이 있습니다. 확인 프로그래밍 언어가 PPCG 사용자가 생성 한 무엇? .
Dennis

10

Pyth, 16 15 바이트

*hyJ/PQ2^2.>QhJ

Dennis 덕분에 1 바이트

테스트 스위트

설명:

*hyJ/PQ2^2.>QhJ
                    Implicit: Q = eval(input())
     PQ             Take the prime factorization of Q.
    /  2            Count how many 2s appear. This is a.
   J                Save it to J.
  y                 Double.
 h                  +1.
          .>QhJ     Shift Q right by J + 1, giving b.
        ^2          Compute 2 ** b.
*                   Multiply the above together, and print implicitly.

7

MATL , 22 바이트

Yft2=XK~)pq2/2w^Ks2*Q*

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

설명

Yf      % factor
t       % duplicate
2=      % compare to 2 (yields a logical array)
XK      % save a copy of that to variable K
~)      % keep only values != 2 in the factors array
p       % multiply that factors
q2/     % product - 1 / 2
2w^     % 2^x

K       % load variable K (the logical array)
s       % sum (yields the number of 2s)
2*Q     % count * 2 + 1

*       % multiply both values

아주 좋아요! Qfor 1+(이것은 최근에 소개되었습니다)와 qfor에 사용할 수 있습니다 1-. 또한 공간을 절약 할 수 있습니다 ( H어쨌든 절약 할 수 있음 ). 여기를
Luis Mendo

@LuisMendo 감사합니다. 그 기능을 몰랐다.
Rainer P.

5
MATL을 사용하여 Luis를 구타했습니다!
Stewie Griffin

6

파이썬 2, 39 바이트

lambda n:2*len(bin(n&-n))-5<<n/2/(n&-n)

n & -n나누는 2의 최대 힘을 ​​제공합니다 n. 2의 보수 산술에서 작동하기 때문에 작동합니다 -n == ~n + 1. 경우 nK 후행 0을, 그것의 보완을 복용하는 것은이 원인이됩니다 K 후행 것들. 그런 다음 1을 추가하면 모든 후행 1을 0으로 변경하고 2 ^ k 비트를 0에서 1로 변경합니다 . 따라서 -n1로 끝나고 k 0 's (와 마찬가지로 n)이 끝나고 n모든 높은 위치에서 반대 비트를 갖습니다.


어떻게 n&-n작동 하는지 간단히 설명해 주 시겠습니까? 나는이 속임수가 무엇을하는지 어떻게하는지 안다 :(
Erwan

n&-n나눈 2의 최대 거듭 제곱을 반환합니다 n.
Neil

@ Erwan 나는 그것에 대해 설명했다 n & -n.
feersum

나는 Anarchy golf에 해당하는 프로그램을 얻었 n=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100지만 최고의 솔루션 뒤에는 두 개의 문자가 있습니다.
xnor

@ xnor 힌트 : 59 바이트 솔루션 (적어도 적어도 광산)은의 모든 값에 작동하지 않습니다 n.
feersum

6

MATL , 25 26 바이트

:qt2w^w!2*Q*G=2#f2*q2bq^*

이것은 사용 현재 릴리스 (10.2.1) 언어 / 컴파일러를.

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

설명

무차별 대입에 기초하여 매우 간단합니다. ab 의 모든 조합을 시도 하고 적절한 것을 선택하고 필요한 계산을 수행합니다.

:q          % implicit input "n". Generate row vector [0,1,...,n-1], say "x"
t2w^        % duplicate and compute 2^x element-wise
w!2*Q       % swap, transpose to column vector, compute 2*x+1
*           % compute all combinations of products. Gives 2D array
G=2#f       % find indices where that array equals n
2*q2bq^*    % apply operation to flipped values

1
하! :-P 모국어로 구타 ... 처음으로?
Stewie Griffin

@StewieGriffin 네! 좋은 이정표 :-)
Luis Mendo

5

줄리아, 41 바이트

n->2^(n>>(a=get(factor(n),2,0)+1))*(2a-1)

이것은 정수를 받아들이고 정수를 반환하는 익명 함수입니다. 호출하려면 변수에 지정하십시오.

a의 소인수 분해에서 1 + 2의 지수로 정의 n합니다. factora를 반환 하므로 소수 인수 분해에 2가 포함되지 않은 경우 기본값 0을 Dict사용할 수 get있습니다. 우리는 비트를 오른쪽으로 시프트 n하고 a2를이 거듭 제곱합니다. 2a-1결과를 얻기 위해 곱합니다 .


4

펄 5, 40 바이트

38 바이트 + 2 -p

$i++,$_/=2until$_%2;$_=2*$i+1<<$_/2-.5

-p변수에 STDIN을 읽습니다 $_.

$i++,$_/=2until$_%2단위 $i(여기서 0에서 시작) 및 반 $_까지 $_그 후 2 개조 제로 이외는 $_원래 숫자의 홀수 요소이고, $i2의 지수이다.

$_=2*$i+1<<$_/2-.5—의 오른쪽 =은 구한 수에 대한 공식입니다. {2의 지수의 두 배 이상인 {1 곱하기 {2의 거듭 제곱은-홀수 인자에서 1/2을 뺀}}입니다. 그러나 "시간 {2의 힘을…}}"은 "왼쪽으로 조금씩 이동 한 것으로…"로 골프화됩니다. 그리고 그 오른쪽은$_ 있습니다.

그리고 -p인쇄합니다 $_.



2

자바 스크립트 ES6, 36 33 바이트

n=>63-2*Math.clz32(b=n&-n)<<n/b/2

내 이해는로 Math.clz32둘러싼 것보다 짧을 것입니다 toString(2).length.

편집 : @ user81655 덕분에 3 바이트가 절약되었습니다.


좋은. n&-n변수 로 설정 하여 몇 바이트를 절약 할 수도 있습니다 .n=>63-2*Math.clz32(x=n&-n)<<n/x/2
user81655

@ user81655 감사합니다; 나는 내가 사용할 수 있었으면 좋겠다 n&=-n. 그러나 n다시 필요하다 .
Neil

1

PARI / GP , 38 바이트

f(n)=k=valuation(n,2);(2*k+1)<<(n>>k\2)

참고 그 >>\같은 우선 순위를 가지고 있습니다 계산 왼쪽에서 오른쪽으로, 마지막 부분이 될 수 있도록 n>>k\2보다는 (n>>k)\2. ungolfed 버전은 다음 kmy같이 어휘 적으로 만듭니다 .

f(n)=
{
  my(k=valuation(n,2));
  (2*k+1) << ((n>>k)\2);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.