Наскільки Ферма це число?


13

Числа Ферма - це додатні цілі числа, які можна виразити як 2 2 x +1 цілим числом x.

Давайте тепер визначимо атрибут числа під назвою "Fermat-ness":

  • Ферма-ність числа на одиницю менше, ніж довжина ланцюга сил двох, починаючи від основи, з двома розширеними потужностями, щоб максимально збільшити ферментативність.
  • Число, яке не є числом Ферма, має нульову Fermat-ність.

Отже, 17 (= 2 2 2 2 0 +1) має Fermat-ність три.

Виклик

Давши позитивне ненулеве ціле число як вхід, виведіть Fermat-ність числа.

Правила

  • Ви можете приймати дані у двійковій, десятковій, шістнадцятковій формі, як бінгум, або будь-який формат, який дозволяє найкраще займатися гольфом
  • У вашому рішенні має бути можливість обробляти номери з бітовою довжиною понад 64, яке б представлення ви не використовували.
  • Тільки негативні цілісні повноваження.
  • Стандартні лазівки , звичайно, заборонені.
  • Це , тому найкоротша відповідь виграє.

Тестові справи

Вони є у форматі input->output. Вхід у шістнадцять разів для економії місця.

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, то як ви знаєте, що це у двійковій, десятковій чи шістнадцятковій формі ???
J42161217

1
@Jenny_mathy Я мав на меті відповісти вирішити, який формат введення вони хочуть.
HAEM

@ Mr.Xcoder У пісочниці з'ясувалося, що насправді не так багато чисел у Fermat 64 біт або менше. Я стверджую, що питання суттєво стосується бінтумів, тому я можу вимагати обробки бінтуму.
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>¬}:[»`¤=

Спробуйте в Інтернеті!

Це лише 70 байт, якщо не додати те, «»'¤=що призначає символу обчислення Fermatness ¤. Якщо ви це зробите, вам потрібно буде ввести номер у розділі заголовка TIO замість Footer, як зараз.

Це ефективно використовує ту саму логіку, що і моя відповідь Python, тому якщо вам не байдуже, як працює 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 байти коротшою.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.