이 숫자가 Fermat는 어떻습니까?


13

페르마 수 는 정수 x와 함께 2 2 x +1 로 표현 될 수있는 양의 정수입니다 .

이제 "Fermat-ness"라는 숫자의 속성을 정의하겠습니다.

  • 수의 Fermat-ness는 기본에서 시작하여 2의 power of chain의 길이보다 1이 적으며 fermat-ness를 최대화하기 위해 2의 power를 확장합니다.
  • Fermat 숫자가 아닌 숫자는 Fermat-ness가 0입니다.

따라서, 17 (2 = 2 2 2 0 +1하는) 세 페르마 네스있다.

도전

0이 아닌 양의 정수를 입력으로 받으면 숫자의 Fermat-ness를 출력합니다.

규칙

  • 이진수, 십진수, 16 진수, 큰 숫자로 입력하거나 골프를 가장 잘하는 형식으로 입력 할 수 있습니다.
  • 솔루션은 사용하는 표현이 64보다 큰 비트 길이의 숫자를 처리 할 수 ​​있어야합니다.
  • 음이 아닌 정수만 사용합니다.
  • 표준 허점 은 물론 금지되어 있습니다.
  • 입니다 , 그래서 짧은 대답 승리.

테스트 사례

이것들은 형식 input->output입니다. 공간을 절약하기 위해 입력은 16 진수입니다.

10000000000000000000000000000000000000000000000000000000000000001 -> 2
1000000000000BC00000000000000000000000000000000001000000000000001 ->0
1234567890ABCDEF -> 0
100000000000000000000000000000001 -> 1
5 -> 2
11 -> 3
10001 -> 4
101 -> 1

십진법에서 동일 :

115792089237316195423570985008687907853269984665640564039457584007913129639937 -> 2
115792089237316497527923305698859709742143344804209838213621568094470773145601 -> 0
1311768467294899695 -> 0
340282366920938463463374607431768211457 -> 1
5 ->2
17 -> 3
65537 -> 4
257 -> 1

샌드 박스에서 귀중한 입력을위한 geokavel 덕분 입니다.


1
1111을 입력하면 이진수, 십진수 또는 16 진수인지 어떻게 알 수 있습니까 ???
J42161217

1
@Jenny_mathy 나는 응답자가 원하는 형식의 입력을 결정하기 위해 의미했습니다.
HAEM

@ Mr.Xcoder 샌드 박스에서 실제로 64 비트 이하의 Fermat 수가 많지 않은 것으로 나타났습니다. 나는 그 질문이 본질적으로 bignum에 관한 것이라고 주장하고 있으므로 bignum 처리를 요구할 수 있습니다.
HAEM

2
@ HeikkiMäenpää 다른 사람들이 무엇을 추천 할지라도 도전은 당신의 것이며, 당신이 원하는 것을 만들 수 있다는 것을 기억하십시오.
isaacg

3
너무 이른 것 같아요. 보통 1-2 주 정도 기다립니다. 어떤 사람들은 결코 받아들이지 말라고 말합니다!
geokavel

답변:




0

RProgN 2 , 75 바이트

«\`n=1\]{1-\n*\]}:[»`^=«1-`n=001{]2\^2\^ne{2\^`n=1+0}{1+}?]2\^2\^n>¬}:[»`¤=

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

«»'¤=Fermatness 계산을 ¤캐릭터에 할당하는 것을 추가하지 않으면 70 바이트 입니다. 그렇게하면 지금처럼 바닥 글 대신 TIO의 머리글 섹션에 번호를 입력해야합니다.

이것은 내 파이썬 답변과 동일한 논리를 효과적으로 사용하므로 RProgN 2의 작동 방식에 신경 쓰지 않는다면 진행 상황에 대한 설명을 참조하십시오. 그렇지 않으면

코드 분석 :

«\`n=1\]{1-\n*\]}:[»`^=
«                  »`^=`                            # Create a local function and assign it to the ^ character (x y ^ is x to the power of y)
 \`n=                                               # Swap the top two values of the stack and assign the new top to the variable n
     1\]                                            # Push a 1 (our starting point for x to the y), swap with the y value, then duplicate y
        {       }:                                  # Start a while loop that pops the top stack value and loops if it is truthy
         1-                                         # Subtract 1 from y to keep a tally of how many multiplications we've done
           \n*                                      # Swap the counter with our current value and multiply it by n
              \]                                    # Swap this new value with the current value of y, and duplicate it to be used as the truthy value for the loop

«1-`n=001{]2\^2\^ne{2\^`n=1+0}{1+}?]2\^2\^n>¬}:[»`¤=# The main Fermatness function (x ¤ to get the Fermatness of x)
«                                               »`¤=# Create another local function for this calculation
 1-`n=                                              # Decrement the input by 1 and assign it to n
      001                                           # Push a counter for Fermatness, a counter for calculating 2^2^i, and an initial truthy value
         {                                   }:     # Start a while loop for calculating the Fermatness
          ]2\^2\^ne                                 # Duplicate i, calculate 2^2^i, and compare it to n
                   {         }{  }?                 # Start an if statement based on the equality of 2^2^i and n
                    2\^`n=                          # n==2^2^i, so set n to 2^i (same as saying n=log_2(n))
                          1+0                       # Increment the Fermatness counter and reset i
                               1+                   # n!=2^2^i, so just increment i
                                   ]2\^2\^n>¬       # Duplicate the counter and check if 2^2^i<=n, if true the loop continues, else it exits
                                               [    # Pop i from the stack, leaving us with just the Fermatness counter

불행히도 로그 함수 Š와 정규 지수 함수 ^는 기본적 으로이 작업을 수행 할 수있는 정밀도가 부족하므로 곱셈이 훨씬 더 정밀도를 가지기 때문에 지수가 어떻게 작동했는지 재정의해야했습니다. 다시 정의하지 않으면이 대답은 23 바이트 더 짧습니다.


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