Jaka jest liczba Fermat?

13

Liczby Fermata są dodatnimi liczbami całkowitymi, które można wyrazić jako 2 2 x +1 za pomocą liczby całkowitej x.

Zdefiniujmy teraz atrybut liczby o nazwie „Fermat-ness”:

  • Płodność liczby jest o jeden mniejsza niż długość łańcucha potęg dwóch, zaczynając od podstawy, z potęgami dwóch rozszerzonymi, aby zmaksymalizować płodność.
  • Liczba, która nie jest liczbą Fermata, ma wartość Fermata równą zero.

Tak więc 17 (= 2 2 2 2 0 +1) ma Fermata trzy.

Wyzwanie

Biorąc pod uwagę dodatnią niezerową liczbę całkowitą jako dane wejściowe, wypisz Fermat-ness liczby.

Zasady

  • Możesz wziąć dane wejściowe w postaci binarnej, dziesiętnej, szesnastkowej, jako bignum lub w dowolnym innym formacie, który pozwala ci najlepiej grać w golfa
  • Twoje rozwiązanie musi być w stanie przetwarzać liczby o długościach bitów powyżej 64, niezależnie od tego, jakiej reprezentacji używasz.
  • Tylko nieujemne liczby całkowite.
  • Standardowe luki są oczywiście zabronione.
  • To jest , więc wygrywa najkrótsza odpowiedź.

Przypadki testowe

Są w formacie input->output. Dane wejściowe są w systemie szesnastkowym, aby zaoszczędzić miejsce.

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

To samo w systemie dziesiętnym:

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

Dzięki geokavel za bezcenne dane wejściowe w piaskownicy.

HAEM
źródło
1
Jeśli wprowadzę 1111, to skąd wiesz, że jest to liczba binarna, dziesiętna lub szesnastkowa?
J42161217,
1
@Jenny_mathy Chciałem, aby odpowiadający zdecydował, jakiego formatu danych wejściowych chcą.
HAEM
@ Mr.Xcoder W piaskownicy pojawiło się, że tak naprawdę nie ma zbyt wielu liczb Fermata o długości 64 bitów lub mniej. Twierdzę, że pytanie jest nieodłącznie związane z bignami, więc mogę zażądać ich przetwarzania.
HAEM
2
@ HeikkiMäenpää Pamiętaj, bez względu na to, co inni mogą polecić, wyzwanie należy do Ciebie i możesz zrobić to, co chcesz.
isaacg
3
Myślę, że jest zbyt wcześnie, aby zaakceptować. Zwykle odczekaj 1 lub 2 tygodnie. Niektórzy twierdzą, że nigdy nie akceptują!
geokavel

Odpowiedzi:

7

Galaretka , 15 14 bajtów

1 bajt dzięki Jonathan Allan.

’µBḊ⁸LṀ?µÐĿḊḊL

Wypróbuj online!

Leaky Nun
źródło
2
Zapisz bajt za pomocą: BḊCL⁸Ạ?->BḊ⁸LṀ?
Jonathan Allan
1

Python 2 , 103 81 bajtów

n=input()-1
i=l=0
while 2**2**i<=n:
 if n==2**2**i:n=2**i;i=-1;l+=1
 i+=1
print l

Wypróbuj online!

Uświadomiłem sobie, że nie jestem głupi, pomógłbym obniżyć liczbę bajtów, więc to zrobiłem. Również potęgowanie w przeciwieństwie do logarytmów.

Arnold Palmer
źródło
0

RProgN 2 , 75 bajtów

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

Wypróbuj online!

Ma tylko 70 bajtów, jeśli nie dodasz «»'¤=znaku przypisującego obliczenia Fermatnessa do ¤znaku. Jeśli to zrobisz, musisz umieścić numer w sekcji Nagłówek TIO zamiast w Stopce, tak jak jest teraz.

To efektywnie wykorzystuje tę samą logikę, co moja odpowiedź w Pythonie, więc jeśli nie obchodzi cię, jak działa RProgN 2, po prostu spójrz na to, aby wyjaśnić, co się dzieje. Inaczej

Podział kodu:

«\`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

Niestety funkcja log Ši normalna funkcja potęgowania ^nie mają precyzji, aby zrobić to natywnie, więc musiałem przedefiniować sposób działania potęgowania, ponieważ mnożenie niesie ze sobą znacznie większą precyzję. Bez tego redefiniowania odpowiedź ta byłaby o 23 bajty krótsza.

Arnold Palmer
źródło
0

Perl 6 , 62 bajtów

{my@a=first :kv,*>=0,(^∞).map(2**2** *+1-$_);++@a[0]*!@a[1]}

Wypróbuj online!

Sean
źródło