번갈아가는 번짐


12

소개

이 문제를 해결하려면 정수 이진 표현의 후행 0을로 설정해야합니다 010101….이 예는 다음과 같이 가장 잘 설명됩니다.

integer가 주어지면 400첫 번째 단계는 이진수로 변환하는 것입니다.

110010000

우리가 볼 수 있듯이 다섯 번째 비트는 최하위 1비트이므로 거기에서 시작하여 하위 0을 0101다음과 같이 바꿉니다 .

110010101

마지막으로 우리는 이것을 십진수로 다시 변환합니다 : 405

도전

양의 정수 리턴 / 출력이 주어지면 위에 정의 된 프로세스의 해당 결과 값이 제공됩니다.

규칙

  • 이 시퀀스는 하나 이상의 1비트 가있는 정수에만 정의 되므로 입력은 항상 1 이상입니다.
  • 대신 문자열, 숫자 목록 (10 진수)으로 입력 할 수 있습니다.
  • 유효하지 않은 입력을 처리 할 필요가 없습니다

테스트 케이스

다음은 중개 단계가 포함 된 몇 가지 테스트 사례입니다 (인쇄 / 반환 할 필요는 없음).

In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298

32 비트 정수로 가정 할 수 있습니까?
Arnauld

@Arnauld : 물론입니다!
ბიმო

9
골프 아이디어 : n입력을 나누는 최대 2의 거듭 제곱이면 답은 간단합니다.(input) + ceil((2^n - 2)/3)
JungHwan Min

답변:


12

파이썬 3 , 20 바이트

lambda n:(n&-n)//3+n

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

설명

가지고 192예를 들어. 이진 형식은 입니다. 11000000로 변환해야합니다 11010101.

우리 10101는 숫자 를 더해야한다는 것에 주목한다 . 이것은 기하 계열 ( 4^0 + 4^1 + 4^2)이며로 닫힌 형태를 갖습니다 (4^3-1)/(4-1). 이것은 정수 나누기를 나타내는 4^3//3곳 과 같습니다 //.

인 경우 위와 같은 이유로 101010기하 급수 ( 2×4^0 + 2×4^1 + 2×4^2)가 2×4^3//3됩니다.

어쨌든, 4^3그리고 2×4^3단지 우리가에 의해 얻을 최하위 비트를 것입니다 n&-n:

우리는의 보완이 n입니다 00111111. 하나를 추가하면이 값이 01000000이고 n=11000000가장 작은 유효 숫자 와 만 겹칩니다 . "보완 및 추가"는 단지 부정입니다.


6
@ Mr.Xcoder 멋진 스포츠맨
Leaky Nun

1
아마도 lambda n:(n&-n)//3+n작동합니까? 모든 샘플 테스트 사례를 통과 하지만 직감에 따르면 유효하지 않아야합니다.
Mr. Xcoder

@ Mr.Xcoder 실제로 유효합니다.
Leaky Nun

1
왜 파이썬 2를 사용하여 바이트를 저장하지 않습니까? TIO
FlipTack

4
@FlipTack 나는 파이썬 2를 싫어한다
Leaky Nun

8

젤리 , 5 바이트

&N:3+

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

이번에는 Leaky Nun의 접근 방식의 포트 (적어도 골프를 조금 돕습니다 : P)

젤리 , 7 바이트

^N+4:6ạ

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

Martin Ender의 간접적 인 도움으로 JungHwan Min의 환상적인 접근 방식을 사용합니다 .


Dennis는 편집 후 바로 유사한 5 바이트 솔루션을 게시하고 삭제했습니다 . 같은 것 &N:3|. 축하합니다; 젤리에서 데니스를 이겼어! (그러나 상당히 아웃 골프되지는 않았습니다.)
wizzwizz4

@ wizzwizz4 Leaky의 접근 방식에 작은 골프를 제안하고 포팅하는 것 외에는별로 많은 것을하지 않았습니다. 그러나 eh :-)
Mr. Xcoder

이것은 내가 본 첫 ASCII 전용 젤리 답변입니다.
MD XF

6

Wolfram Language (Mathematica) , 36 28 26 24 바이트

@MartinEnder 덕분에 -8 바이트, @ Mr.Xcoder 덕분에 -2 바이트

#+⌊(#~BitAnd~-#)/3⌋&

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

입력에서 후행 0의 수만 찾고 길이가 1보다 작은 0s 및 1s가 교대로있는 숫자를 찾아 입력에 추가하면됩니다.

그래서, 400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405

s와 s가 n번갈아 나타나는 숫자에 대한 명시 적 공식은 OEIS의 A000975 에 나와 있습니다. 이진수에서는 길이가 같고 숫자가 교대로 두 개의 다른 숫자가 없으므로 th 숫자를 사용할 수 있습니다 .10n


1
2^#~IntegerExponent~2이다(BitXor[#,#-1]+1)/2
마틴 청산

@MartinEnder 와우! 그런 다음 분수를 결합하여 더 많은 바이트를 줄일 수 있습니다.
JungHwan Min

1
24 바이트 . #+⌊(#~BitAnd~-#)/3⌋&대신 사용할 수 있습니다 .
Mr. Xcoder

@ Mr.Xcoder 편집 :)
JungHwan Min

5

J , 19 18 바이트

+(2|-.i.@#.-.)&.#:

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

빠른 설명

이것은 오래된 답변이지만 현재 답변과 매우 유사하며 후행 0을 다르게 계산합니다. 작동 방식을 설명하는 링크는 주석을 참조하십시오.

+(2|i.@i.&1@|.)&.#:
                 #:  Convert to binary list
       i.&1@|.       Index of last 1 from right
            |.         Reverse
       i.&1            Index of first 1
    i.               Range [0, index of last 1 from right)
  2|                 That range mod 2
               &.    Convert back to decimal number
+                    Add to the input

다른 답변 :

이전 답변 (19 바이트)

+(2|i.@i.&1@|.)&.#:

\오른쪽에서 왼쪽으로 이동 하기 때문에 이보다 길어야합니다 .

+(2|#*-.#.-.)\&.(|.@#:)

1
18 바이트+(2|-.i.@#.-.)&.#:
마일

@miles 마음에 기본 전환이 어떻게 진행되고 있는지 설명해 주시겠습니까? 나는 그것이 제로와 관련이 있다고 생각하지만 확실하지 않습니다.
cole

#.~ 카운트 후행 진리의 수는 , 그래서 우리가 필요로하는 무엇인가 #.~ -. #:제로 후행의 수 계산
마일을

@ 마일리지 아! 매우 영리합니다.
cole

4

이것은 효율적인 방법처럼 보입니다. 연산자 우선 순위를 설명 할 수 있습니까? 예를 들어, ((!n=(n|n))&-n)/3또는 !n=(((n|n)&(-n))/3)등 으로 평가되는지 알 수 없습니다 .
MD XF

줄리아에서, 비트 연산자는 그래서 자신의 산술 대응과 같은 우선 순위를 가지고있는 |것과 같습니다 +&같다 *. 따라서 n|n&-n÷3로 해석됩니다 n | ((n&-n) ÷3).
Dennis

3

자바 스크립트 (ES6), 40 39 바이트

입력을 32 비트 정수로 사용합니다.

n=>n|((n&=-n)&(m=0xAAAAAAAA)?m:m/2)&--n

테스트 사례


2

05AB1E , 13 8 5 바이트

Xcoder정환 민의 깔끔한 공식 덕분에 5 바이트 절약 Xcoder 덕분에 3 바이트
절약

(&3÷+

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

설명

(      # negate input
 &     # AND with input
  3÷   # integer divide by 3
    +  # add to input

1
아마도 Mathematica 답변을 포팅하면 8 바이트를
Mr. Xcoder

@ Mr.Xcoder : 오, 그것은 깔끔한 공식입니다.
Emigna

1
05ab1e에 비트 AND가 있습니까? 그렇다면 (<bitwise and here>3÷+~ 5 바이트 동안 작동해야합니다.
Mr. Xcoder

2

R , 71 58 바이트

-6 바이트에 대한 NofP 덕분에

function(n){n=n%/%(x=2^(0:31))%%2
n[!cumsum(n)]=1:0
n%*%x}

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

입력이 32 비트 정수라고 가정합니다. R은 double어쨌든 32 비트 정수 ( 정수 오버플 로 시 캐스팅 )와 부호있는 정수 또는 부호없는 정수 만 서명했습니다.


당신은 변환 할 수 which.max(n):1-1!cumsum(n)의 GET에 65 바이트 솔루션
NofP

@NofP 감사합니다! 좋은 아이디어야.
Giuseppe

2

brainfuck , 120 바이트

>+<[[>-]++>[[>]>]<[>+>]<[<]>-]>[-<+>[-<[<]<]>]>[>]<[>+<[->+<]<[->+<]<]>>[<]+>[-[-<[->+<<+>]>[-<+>]]<[->++<]<[->+<]>>>]<<

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

현재 셀의 값으로 시작하여 출력 값으로 셀에서 끝납니다. 255 이상의 숫자에서는 일반적인 brainfuck에 대한 셀 제한이므로 분명히 작동하지 않지만 무한한 셀 크기를 가정하면 작동합니다.


1

PowerShell , 168 바이트

param($n)$a=($c=[convert])::ToString($n,2);if(($x=[regex]::Match($a,'0+$').index)-gt0){$c::ToInt32(-join($a[0..($x-1)]+($a[$x..$a.length]|%{(0,1)[$i++%2]})),2)}else{$n}

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

아야. 이진 및 배열 슬라이싱으로 /에서 변환하는 것이 실제로 PowerShell의 강력한 장점은 아닙니다.

입력 $n을 숫자로 취합니다 . 우리는 즉시 convert이진 기반 2으로 저장합니다 $a. 다음은 if / else 구문입니다. if 절 은 문자열 ( ) 끝에있는 하나 이상의에 대한 위치 가 이진 문자열의 시작 보다 큰 위치 regex Match에 있는지 여부를 테스트합니다 . 그렇다면, 우리는 작업 할 무언가가 있고, 단지 숫자를 출력합니다.0'0+$'index0else

내부에서 if우리는 x첫 번째 숫자를 슬라이스 +하고 나머지 숫자를 가진 배열을 배열 합니다. 그러나 나머지 자릿수의 경우 숫자를 반복하여 선택 0하거나 1를 사용하여 대신 a 또는 출력 $i++%2을 선택합니다. 이것은 우리에게 마지막 010101...0s 대신 패턴을 얻습니다 . 그런 다음 -join다시 문자열로 $c묶고 Int32from base 로 되돌립니다 2.

두 경우 모두 파이프 라인에 숫자가 남고 출력은 암시 적입니다.


1

APL + WIN, 43 바이트

p←+/^\⌽~n←((⌊1+2⍟n)⍴2)⊤n←⎕⋄2⊥((-p)↓n),p⍴0 1

화면 입력을위한 프롬프트









1

자바 스크립트 ES6, 13 바이트

n=>(n&-n)/3|n

f = 
n=>(n&-n)/3|n
;
console.log (f(8));
console.log (f(243));
console.log (f(1048576));
console.log (f(33554432));


1

C, 56 바이트

i,k;f(n){for(k=i=1;n>>i<<i==n;k+=++i&1)k*=2;return n|k;}

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

C (gcc), 50 바이트

i,k;f(n){for(k=i=1;n>>i<<i==n;k+=++i&1)k*=2;k|=n;}

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

Arnauld의 솔루션을 사용하는  51  48 바이트 :

3 바이트를 절약 한 @ l4m2에 감사합니다!

m;f(n){return n|((n&-n)&(m=-1u/3*2)?m:m/2)&n-1;}

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

gcc를 가진 43 :

m;f(n){m=n|((n&-n)&(m=-1u/3*2)?m:m/2)&n-1;}

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


0xAAAAAAAA=>-1u/3*2
l4m2


0

젤리 , 13 바이트

BŒgṪµ2Ḷṁ×CḄ+³

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

설명

예제 입력으로 24를 사용하십시오.

BŒgṪµ2Ḷṁ×CḄ+³
B                Binary representation of the input → 11000
 Œg              Group runs of equal length → [[1,1],[0,0,0]]
   Ṫ             Tail → [0,0,0]
    µ            New monadic link
     2Ḷ          [0,1] constant
       ṁ         Mold [0,1] to the shape of [0,0,0] → [0,1,0]
        ×        Multiply [0,1,0] by...
         C       1-[0,0,0]. If last bit(s) of the original input are 1 this will add nothing to the original input
          Ḅ      Convert to decimal from binary → 2
           +³    Add this with the original input → 26
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.