다음 1- 분의 이진수 찾기


27

이진 표현에서 임의의 두 연속 1 사이 에 최소한 K 0 이있는 경우 양의 정수 N은 K- 스파 스 입니다.

따라서 숫자 1010101은 1- 스파 스이지만 101101은 그렇지 않습니다.

당신의 임무는 주어진 입력 번호에 대한 다음 1- 스파 스 번호를 찾는 것입니다. 예를 들어, 입력이 12 ( 0b1100) 이면 출력은 16 ( 0b10000) 이어야 하고 입력이 18 ( 0b10010) 이면 출력은 20 ( 0b10100) 이어야합니다 .

가장 작은 프로그램 또는 함수 (바이트)가 이깁니다! 표준 허점은 허용되지 않습니다.


“다음 최고”또는“최소 절대 차이”와 같은“다음”?
FUZxxl

"다음"과 같이 "다음".
articuno

어떤 범위의 입력을 처리해야합니까?
mbomb007

음수 일 필요는 없다고 가정하겠습니다.
mbomb007

@articuno 함수를 만들 수 있습니까? 아니면 전체 프로그램이어야합니까? 기능은 꽤 표준입니다.
mbomb007 2

답변:



9

CJam, 14 11 바이트

DigitalTrauma 덕분에 3 바이트가 절약되었습니다.

l~{)___+&}g

여기에서 테스트하십시오.

설명

l~          "Read and eval input.";
  {      }g "Do while...";
   )_       "Increment and duplicate (call this x).";
     __+    "Get two more copies and add them to get x and 2x on the stack.";
        &   "Take their bitwise AND. This is non-zero is as long as x's base-2
             representation contains '11'.";

이것은 프로그램의 마지막에 자동으로 인쇄되는 스택에 마지막 숫자를 남깁니다.


8

파이썬 2, 44 바이트

이것은 n을 읽고 답을 인쇄하는 완전한 파이썬 프로그램입니다. 나는 가독성 하위 경쟁에서 꽤 잘한다고 생각합니다.

n=input()+1
while'11'in bin(n):n+=1
print n

테스트 결과 :

$ echo 12 | python soln.py 
16
$ echo 18 | python soln.py 
20

6

Pyth, 12 11 바이트

f!}`11.BThQ

온라인으로 사용해보십시오 : Pyth Compiler / Executor .

               implicit: Q = input()            
f        hQ    find the first integer T >= Q + 1, 
               that satisfies the condition:
 !}`11.BT         "11" is not in the binary representation of T

1
당신은 돌려 문자를 저장할 수 있습니다 "11"`11.
orlp

@orlp 감사합니다.
Jakube

5

Mathematica, 41 30 바이트

Martin Büttner 덕분에 11 바이트를 절약했습니다.

#+1//.i_/;BitAnd[i,2i]>0:>i+1&

3
설명을 추가해 주시겠습니까?
mbomb007

4

펄, 31

#!perl -p
sprintf("%b",++$_)=~/11/&&redo

또는 명령 행에서 :

 perl -pe'sprintf("%b",++$_)=~/11/&&redo' <<<"18"

4

APL, 18 바이트

1∘+⍣{~∨/2∧/⍺⊤⍨⍺⍴2}

이것은 모나 딕 함수로 평가됩니다. 여기에서 시도하십시오. 용법:

   1∘+⍣{~∨/2∧/⍺⊤⍨⍺⍴2} 12
16

설명

1∘+                    ⍝ Increment the input ⍺
   ⍣{            }     ⍝ until
     ~∨/               ⍝ none of
        2∧/            ⍝ the adjacent coordinates contain 1 1 in
           ⍺⊤⍨⍺⍴2      ⍝ the length-⍺ binary representation of ⍺.

4

J, 20 자

모나 딕 동사. 규칙을 준수하도록 수정되었습니다.

(+1 1+./@E.#:)^:_@>:

설명

첫째, 이것은 공백이있는 동사이며 약간 덜 골프입니다.

(+ 1 1 +./@E. #:)^:_@>:
[: (] + [: +./ 1 1 E. #:)^:_ >:

독서:

    ]                             The argument
      +                           plus
        [: +./                    the or-reduction of
               1 1 E.             the 1 1 interval membership in
                      #:          the base-2 representation of the argument,
[: (                    )^:_      that to the power limit of
                             >:   the incremented argument

이 인수는 인수 1 1의 밑이 2 인 표현에서 구간 멤버쉽 의 증가 또는 감소 , 증가 된 인수에 적용되는 검정력 한계에 해당합니다.

기본적으로 1 1입력의 2 차 표현에서 발생 하는지 계산합니다 . 그렇다면 입력을 증가시킵니다. 이것은 전력 제한 아래에 있으므로 결과가 더 이상 변경되지 않을 때까지 적용됩니다.


좋은 알고리즘! APL에서 길이는 동일합니다 : {⍵+∨/2∧/⍵⊤⍨⍵⍴2}⍣=.
Zgarb

@randomra 아, 알겠습니다.
FUZxxl

4

자바 스크립트, 25 19

1- 스파 스 이진수의 경우 x&2*x == 0:

f=x=>x++&2*x?f(x):x

3

자바 스크립트 (ES6), 39 43

정규 표현식, 문자열, 재귀 없음 :

R=(n,x=3)=>x%4>2?R(++n,n):x?R(n,x>>1):n

반복 버전 :

F=n=>{for(x=3;x%4>2?x=++n:x>>=1;);return n}

오른쪽 시프트를 사용하여 시퀀스 11을 찾는 것은 매우 간단합니다. 찾을 때 다음 숫자로 건너 뜁니다. 재귀 버전은 반복 버전에서 직접 파생됩니다.

언 골프 하고 더 분명합니다. 골프를하기 위해 가장 까다로운 부분은 내부 및 외부 루프를 병합하는 것입니다 (시작시 x를 3으로 초기화)

F = n=>{
  do {
    ++n; // next number
    for(x = n; x != 0; x >>= 1) {
      // loop to find 11 in any position
      if ((x & 3) == 3) { // least 2 bits == 11
        break;
      }
    }
  } while (x != 0) // if 11 was found,early exit from inner loop and x != 0
  return n
}

이것은 %4>2Number Theory의 마법처럼 보입니다. || 링크를 제공 하시겠습니까?
Jacob

@Jacob (x % 4> 2)는 단순히 ((x & 3) == 3)이지만, 연산자 우선 순위는 JS
이므로

생각보다 간단합니다. 이제 ungolfed 버전으로 명확합니다. 감사!
Jacob

3

파이썬 2, 37 바이트

f=input()+1
while f&2*f:f+=1
print f

x & 2*x == 01 스파 스 숫자에 대한 논리 를 사용했습니다 .
@Nick과 @CarpetPython에게 감사합니다.


왜 공감해야합니까? 이것은 완벽하게 잘 작동하며 골프를 잘합니다.
ETHproductions

PPCG, btw 및 멋진 첫 답변에 오신 것을 환영합니다! 나는 당신이 사이트에 도전에 계속 응답하는 것이 좋습니다 :-)
ETHproductions

2

자바 스크립트, 75 66 62 바이트

9 바이트를 절약 한 Martin Büttner와 4 바이트를위한 Pietu1998에 감사드립니다!

function n(a){for(a++;/11/.test(a.toString(2));a++);return a;}

작동 방식 : 현재 숫자가 1- 스파 스가 아닌 한 for시작 루프를 실행 a + 1하고 루프가 중단되면 루프가 중단되고 현재 숫자를 반환합니다. 숫자가 1- 스파 스인지 여부를 확인하기 위해 숫자를 이진수로 변환하고 포함하지 않는지 여부를 확인합니다 11.

골프 용 코드 :

function nextOneSparseNumber(num) {
    for (num++; /11/.test(num.toString(2)); num++);
    return num;
}

2

줄리아, 40 바이트

n->(while contains(bin(n+=1),"11")end;n)

이것은 단일 정수를 입력으로 받아들이고 그 다음으로 높은 1- 스파 스 정수를 리턴하는 익명 함수를 작성합니다. 를 호출하려면, 그것을 예를 들면 한 이름을 지정 f=n->...하고, 할 f(12).

언 골프 + 설명 :

function f(n)

    # While the string representation of n+1 in binary contains "11",
    # increment n. Once it doesn't, we've got the answer!

    while contains(bin(n += 1), "11")
    end

    return(n)
end

예 :

julia> f(12)
16

julia> f(16)
20

제안이나 질문은 언제나 환영합니다!


2

> <> (물고기) , 31 + 3 = 34 바이트

1+:>:  4%:3(?v~~
;n~^?-1:,2-%2<

용법:

>python fish.py onesparse.fish -v 12
16

-v플래그에 3 바이트가 추가되었습니다 .


1

자바 스크립트 (ECMAScript 6), 40

재귀로 :

g=x=>/11/.test((++x).toString(2))?g(x):x

자바 스크립트, 56

화살표 기능없이 동일합니다.

function f(x){return/11/.test((++x).toString(2))?f(x):x}

1

스칼라, 65 바이트

(n:Int)=>{var m=n+1;while(m.toBinaryString.contains("11"))m+=1;m}

(명명 된 함수가 필요한 경우 솔루션은 69 바이트입니다)


1

파이썬, 39 33 바이트

여기에서보십시오 : http://repl.it/gpu/2

람다 형식 (골프를위한 xnor 덕분) :

f=lambda x:1+x&x/2and f(x+1)or-~x

표준 함수 구문 은 람다보다 한 번 짧았습니다!

def f(x):x+=1;return x*(x&x*2<1)or f(x)

람다를 1에서 33 바이트로 줄일 수 있습니다 f=lambda x:1+x&x/2and f(x+1)or-~x. 차이가 항상 0 비트이기 때문에 x/2대신 왼쪽 대신 오른쪽으로 비트 시프트 합니다. 사양은 프로그램을 요구합니다. (x+1)/2x+1
xnor

나는 물었고 그는 우리가 기능을 할 수 있다고 말했다. 대부분의 답변은 이미 있습니다.
mbomb007


0

루비, 44

->(i){loop{i+=1;break if i.to_s(2)!~/11/};i}

꽤 기본입니다. 이진 표현을 테스트하기 위해 무한 루프와 정규 표현식이있는 람다. loop수율과 색인 번호를 원합니다 .


@ mbomb007 완료. 팁 고마워.
Max

0

MATLAB ( 77 74 바이트)

m=input('');for N=m+1:2*m
if ~any(regexp(dec2bin(N),'11'))
break
end
end
N

노트:

  • 이 테스트 번호에 충분 m+12*m어디에 m입력합니다.
  • ~any(x)true경우 x모두 0을 포함 하거나 하는 경우가 x비어 있습니다

0

C (32 바이트)

f(int x){return 2*++x&x?f(x):x;}

다른 많은 답변과 동일한 알고리즘을 반복적으로 구현합니다.


0

펄, 16 바이트

을 결합하여 x&2*x다양한 답변에서 (내가 생각하는 닉의 에 처음) nutki의 redo 수율 :

perl -pe'++$_&2*$_&&redo'

딸기에서 테스트 5.26.



0

젤리 , 7 바이트

‘&Ḥ¬Ɗ1#

양의 정수를 인쇄하는 음이 아닌 단일 정수를 받아들이는 전체 프로그램 (모나드 링크로서 단일 양의 정수를 포함하는 목록을 생성 함).

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

방법?

에서 시작하여 v=n+1증분하면 두 배씩 증가 v하여 모든 비트를 한 자리 위로 비트 단위 로 이동 v한 다음 논리 NOT을 수행하여 v하나의 숫자가 발견 될 때까지 1- 스파 스 인지 테스트합니다 .

‘&Ḥ¬Ɗ1# - Main Link: n   e.g. 12
‘       - increment           13
     1# - 1-find (start with that as v and increment until 1 match is found) using:
    Ɗ   -   last three links as a dyad:
  Ḥ     -   double v
 &      -   (v) bit-wise AND (with that)
   ¬    -   logical NOT (0->1 else 1)
        - implicit print (a single item list prints as just the item would)

0

Stax , 5 바이트

╦>ù╤x

실행 및 디버깅

이 절차를 사용하여 작동합니다. 입력은 스택 위에서 시작됩니다.

  • 증가 및 복사 두 번.
  • 스택 상단을 반으로 줄입니다.
  • 스택에서 비트 단위 및 최상위 두 요소
  • 결과가 진실 (0이 아닌)이면 전체 프로그램을 반복하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.