Bagaimana Fermat nomor ini?

13

Angka kulit adalah bilangan bulat positif yang dapat dinyatakan sebagai 2 2 x +1 dengan bilangan x.

Sekarang mari kita mendefinisikan atribut nomor yang disebut "Fermat-ness":

  • Fermat-ness dari nomor tersebut adalah satu kurang dari panjang rantai kekuatan dua, mulai dari pangkalan, dengan kekuatan dua diperluas untuk memaksimalkan fermat-ness.
  • Angka yang bukan nomor Fermat memiliki Fermat-ness nol.

Jadi, 17 (= 2 2 2 2 0 +1) memiliki Fermat-ness three.

Tantangan

Diberikan bilangan bulat bukan-nol yang positif sebagai input, menampilkan Kelembaban nomor tersebut.

Aturan

  • Anda dapat mengambil input dalam biner, desimal, heksadesimal, sebagai bignum, atau format apa pun yang memungkinkan Anda bermain golf terbaik
  • Solusi Anda harus dapat memproses angka dengan panjang bit lebih dari 64 representasi mana pun yang Anda gunakan.
  • Hanya kekuatan bilangan bulat negatif.
  • Celah standar tentu saja dilarang.
  • Ini , jadi jawaban tersingkat menang.

Uji kasus

Ini dalam format input->output. Input dalam heksadesimal untuk menghemat ruang.

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

Sama dalam desimal:

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

Berkat geokavel untuk input yang sangat berharga di kotak pasir.

HAEM
sumber
1
Jika saya input 1111, bagaimana Anda tahu itu dalam biner, desimal atau heksadesimal ???
J42161217
1
@ Jenny_mathy saya maksudkan untuk penjawab untuk memutuskan format input apa yang mereka inginkan.
HAEM
@ Mr.Xcoder Muncul di kotak pasir bahwa sebenarnya tidak ada banyak jumlah Fermat 64 bit atau kurang. Saya mengklaim pertanyaannya secara intrinsik tentang bignum sehingga saya dapat meminta pemrosesan bignum.
HAEM
2
@ HeikkiMäenpää Ingat, tidak peduli apa yang orang lain sarankan, tantangannya ada di tangan Anda, dan Anda bisa membuatnya menjadi apa yang Anda inginkan.
isaacg
3
Saya pikir terlalu dini juga menerima. Biasanya menunggu 1 atau 2 minggu. Ada yang bilang jangan pernah terima!
geokavel

Jawaban:

7

Jelly , 15 14 byte

Terima kasih 1 byte untuk Jonathan Allan.

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

Cobalah online!

Biarawati Bocor
sumber
2
Simpan satu byte dengan: BḊCL⁸Ạ?->BḊ⁸LṀ?
Jonathan Allan
1

Python 2 , 103 81 byte

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

Cobalah online!

Saya menyadari bahwa tidak bodoh akan membantu menurunkan jumlah byte saya, jadi saya melakukan itu. Juga eksponensial yang bertentangan dengan logaritma.

Arnold Palmer
sumber
0

RProgN 2 , 75 byte

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

Cobalah online!

Ini hanya 70 byte jika Anda tidak menambahkan «»'¤=yang menetapkan perhitungan Fermatness ke ¤karakter. Jika Anda melakukannya, Anda harus meletakkan nomor di bagian Header TIO daripada di Footer seperti sekarang.

Ini secara efektif menggunakan logika yang sama dengan jawaban Python saya, jadi jika Anda tidak peduli tentang cara kerja RProgN 2, lihat saja yang itu untuk penjelasan tentang apa yang terjadi. Jika tidak

Rincian kode:

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

Sayangnya fungsi log Šdan fungsi eksponensial normal ^tidak memiliki presisi untuk melakukan ini secara native, jadi saya harus mendefinisikan kembali bagaimana eksponensial bekerja karena multiplikasi membawa jauh lebih presisi. Tanpa redefine itu, jawaban ini akan lebih pendek 23 byte.

Arnold Palmer
sumber
0

Perl 6 , 62 byte

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

Cobalah online!

Sean
sumber