약간의 비트를 토글하고 사각형을 얻으십시오. 100003<N<100003 < N < 10000 이것은 코드

정수을 감안할 때 , 당신은 필요가 반전 될 수 있다는 비트의 최소 수를 찾을 수있다 로를 설정하는 사각형 번호 . 가장 중요한 비트 이하 로만 비트를 반전시킬 수 있습니다 .N

N>3

N

  • 2 2 0
    N=4

    이미 제곱 수 ( )이므로 예상 출력은 입니다. 22

    0

  • 11000 1100 1 25 = 5 2 1
    N=24

    는 1 비트 ( ( )) 를 반전하여 제곱 숫자로 바뀔 수 있으므로 예상 출력은 입니다. 11000→11001

    25=52

    1

  • 23 20 18 30 10110 10 0 0 0 16 = 4 2 2
    N=22

    는 단일 비트를 뒤집어서 제곱 숫자로 바꿀 수 없지만 (가능한 결과는 , , 및 ) 2 비트를 으면됩니다 : ( )이므로 예상 출력은 입니다. 23

    20

    18

    30

    10110→10000

    16=42

    2

규칙

  • 코드가 너무 느리거나 더 큰 테스트 사례에 대해 오류가 발생해도 괜찮지 만 1 분 이내에 이상을 지원해야합니다 .
    3<N<10000

  • 이것은 !

테스트 사례

    Input | Output
----------+--------
        4 | 0
       22 | 2
       24 | 1
       30 | 3
       94 | 4
      831 | 5
      832 | 1
     1055 | 4
     6495 | 6
     9999 | 4
    40063 | 6
   247614 | 7        (smallest N for which the answer is 7)
  1049310 | 7        (clear them all!)
  7361278 | 8        (smallest N for which the answer is 8)
100048606 | 8        (a bigger "8")

또는 복사 / 붙여 넣기 형식으로 :

[4,22,24,30,94,831,832,1055,6495,9999,40063,247614,1049310,7361278,100048606]


답변

루비, 74 바이트

->n{(1..n).map{|x|a=(n^x*x).to_s 2;a.size>Math.log2(n)?n:a.count(?1)}.min}

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

이것은 단순히 시퀀스 생성 (훨씬 충분하다)와 배타적 논리합을 연산하여 다음과는 이진수 1의 두 수를 얻어 비트 수가 보다 작거나 같으면 , 그렇지 않으면그런 다음 플립 된 최소 비트 수를 사용합니다. 최상위 비트 플립이 보다 클 때 플립 된 비트 수 대신 을 반환 하면 이 항상 비트 수보다 크므 로 이러한 경우가 최소값으로 선택되지 않습니다 . n log 2 nnn log 2 nn

[12,22,…,n2]

n

log2⁡n

n

n

log2⁡n

n

바이트를 저장 해준 Piccolo 에게 감사합니다 .


답변

젤리 , 12 바이트

²,BẈEðƇ²^B§Ṃ

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

테스트 스위트를 확인하십시오!

모나 딕 링크. 골프를 타야합니다. 그러나 나는 ³s를 제거하는 방법을 생각하기에는 너무 바보 입니다. 그것은 일반적으로 가변 체인 \ o /와 함께 필터링 / 매핑 / 루핑을 성공적으로 사용하는 첫 번째 대답입니다.

설명

², BẈEðƇ² ^ B§Ṃ – 전체 프로그램 / Monadic 링크. 인수 N을 부릅니다.
     ðƇ – 다음과 같은 2 차원 체인으로 필터 유지 [1 ... N] :
², BẈE – 현재 항목의 제곱은 비트 길이가 N과 같습니다.
² – 정사각형.
 – N과 페어링합니다.
  B – 둘 다 이진으로 변환합니다.
   Ẉ – 길이를 검색합니다.
    E – 그리고 그들이 일치하는지 확인하십시오.
       ² ^ – 필터링 후 결과를 제곱하고 N으로 XOR합니다.
         B – 각각의 이진 표현.
          § – 각각의 합. 이진수로 1의 수를 셉니다.
           Ṃ – 최소.

답변

껍질 , 20 바이트

▼mΣfo¬→S↑(Mo¤ż≠↔ḋİ□ḋ

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

설명

▼mΣf(¬→)S↑(M(¤ż≠↔ḋ)İ□ḋ) -- example input n=4
        S↑(           ) -- take n from n applied to (..)
                     ḋ  -- | convert to binary: [1,0,0]
                   İ□   -- | squares: [1,4,9,16,...]
           M(     )     -- | map with argument ([1,0,0]; example with 1)
                 ḋ      -- | | convert to binary: [1]
             ¤  ↔       -- | | reverse both arguments of: [1] [0,0,1]
              ż≠        -- | | | zip with inequality (absolute difference) keeping longer elements: [1,0,1]
                        -- | : [[1,0,1],[0,0,0],[1,0,1,1],[0,0,1,0,1],[1,0,1,1,1],....
                        -- : [[1,0,1],[0,0,0],[1,0,1,1],[0,0,1,0,1]]
    f(  )               -- filter elements where
       →                -- | last element
      ¬                 -- | is zero
                        -- : [[0,0,0]]
 mΣ                     -- sum each: [0]
▼                       -- minimum: 0

답변

펄 6 , 65 바이트

{min map {+$^a.base(2).comb(~1) if sqrt($a+^$_)!~~/\./},^2**.msb}

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

숫자의 제곱근의 문자열 표현에서 마침표를 찾아서 완벽한 제곱을 테스트하기에는 약간 더러운 느낌이 들지만 바이트를 삭감해야 할 것은 아무것도 없습니다.


답변

05AB1E , 20 15 바이트

Lnʒ‚b€gË}^b€SOß

그의 Jelly 응답 포트를 사용하는 @ Mr.Xcoder 덕분에 -5 바이트 .

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 (60 초 후에 시간 초과되어 최대 3 개의 테스트 사례가 제거되지만 다른 테스트 사례와 함께 35-45 초 정도 걸립니다).

설명:

L            # Create a list in the range [1, input]
             #  i.e. 22 → [0,1,2,...,20,21,22]
 n           # Take the square of each
             #  i.e. [0,1,2,...,20,21,22] → [0,1,4,...,400,441,484]
  ʒ     }    # Filter this list by:
   ,         #  Pair the current value with the input
             #   i.e. 0 and 22 → [0,22]
             #   i.e. 25 and 22 → [25,22]
    b        #  Convert both to binary strings
             #   i.e. [0,22] → ['0','10110']
             #   i.e. [25,22] →  ['10000','11001']
     g      #  Take the length of both
             #   i.e. ['0','10110'] → [1,5]
             #   ['10000','11001'] → [5,5]
       Ë     #  Check if both are equal
             #   i.e. [1,5] → 0 (falsey)
             #   i.e. [5,5] → 1 (truthy)
^            # After we've filtered, Bitwise-XOR each with the input
             #  i.e. [16,25] and 22 → [6,15]
 b           # Convert each to a binary string again
             #  i.e. [6,15] → ['110','1111']
  S         # Change the binary strings to a list of digits
             #  i.e. ['110','1111'] → [['1','1','0'],['1','1','1','1']]
    O        # Take the sum of each
             #  i.e. [['1','1','0'],['1','1','1','1']] → [2,4]
ß            # And then take the lowest value in the list
             #  i.e. [2,4] → 2

답변

자바 (JDK 10) , 110 바이트

n->{int i=1,s=1,b,m=99,h=n.highestOneBit(n);for(;s<h*2;s=++i*i)m=(s^n)<h&&(b=n.bitCount(s^n))<m?b:m;return m;}

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


답변

가이아 , 18 바이트

내 젤리 답변 근처 포트 .

s¦⟪,b¦l¦y⟫⁇⟪^bΣ⟫¦⌋

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

고장

s¦⟪, b¦l¦y⟫⁇ ⟪^ bΣ⟫¦⌋ – 전체 프로그램. 입력 N을 호출합시다.
– [1 ... N] 범위에서 각 정수를 제곱합니다.
  ⟪⟫⁇ – 통과 할 때 특정 조건을 충족하는 것을 선택합니다
                     이차원 블록. Dyadic 블록을 사용하면 1 바이트가 절약됩니다.
                     입력 N은 다른 인수로 내재적으로 사용됩니다.
   , – 현재 요소와 목록에서 N을 쌍으로 만듭니다.
    b¦ – 이진수로 변환합니다.
      l – 그들의 길이를 가져옵니다.
        y – 그런 다음 동일한 지 확인하십시오.
           ya ⟫¦ – 이진 블록을 통해 유효한 모든 정수를 실행합니다.
            ^ – 각각 N과 XOR.
             bΣ – 이진수와 합계로 변환 (1을 이진수로 계산)
                 ⌋ – 최소.