Làm thế nào Fermat là số này?


13

Số fermat là số nguyên dương có thể được biểu thị là 2 2 x +1 với số nguyên x.

Bây giờ chúng ta hãy định nghĩa một thuộc tính của một số gọi là "Fermat-ness":

  • Fermat-ness của số là một ít hơn chiều dài của chuỗi sức mạnh của hai, bắt đầu từ cơ sở, với sức mạnh của hai được mở rộng để tối đa hóa fermat-ness.
  • Một số không phải là số Fermat có số Fermat bằng 0.

Vì vậy, 17 (= 2 2 2 2 0 +1) có Fermat-ness ba.

Thử thách

Cho một số nguyên khác không dương làm đầu vào, xuất Fermat-ness của số.

Quy tắc

  • Bạn có thể lấy đầu vào ở dạng nhị phân, thập phân, thập lục phân, dưới dạng bignum hoặc bất kỳ định dạng nào cho phép bạn chơi golf tốt nhất
  • Giải pháp của bạn phải có khả năng xử lý các số có độ dài bit trên 64 bất kỳ đại diện nào bạn sử dụng.
  • Quyền hạn nguyên không âm.
  • Tất cả các sơ hở tiêu chuẩn là bị cấm.
  • Đây là , vì vậy câu trả lời ngắn nhất sẽ thắng.

Các trường hợp thử nghiệm

Đây là trong định dạng input->output. Đầu vào là thập lục phân để tiết kiệm không gian.

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

Giống nhau ở dạng thập phân:

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

Cảm ơn geokavel cho đầu vào vô giá trong hộp cát.


1
Nếu tôi nhập 1111, làm sao bạn biết nó ở dạng nhị phân, thập phân hoặc thập lục phân ???
J42161217

1
@Jenny_mathy Tôi muốn người trả lời quyết định định dạng đầu vào họ muốn.
HAEM

@ Mr.Xcoder Nó xuất hiện trong hộp cát rằng thực sự không có nhiều số Fermat từ 64 bit trở xuống. Tôi đang khẳng định câu hỏi về bản chất là về bignums để tôi có thể yêu cầu xử lý bignum.
HAEM

2
@ HeikkiMäenpää Hãy nhớ rằng, bất kể người khác có thể đề nghị gì, thử thách là của bạn và bạn có thể thực hiện điều mình muốn.
isaacg

3
Tôi nghĩ rằng đó là quá sớm để chấp nhận. Thường đợi 1 hoặc 2 tuần. Một số người nói không bao giờ chấp nhận!
geokavel

Câu trả lời:



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

Hãy thử trực tuyến!

Tôi nhận ra rằng không ngu ngốc sẽ giúp giảm số byte của tôi, vì vậy tôi đã làm điều đó. Cũng lũy ​​thừa trái ngược với logarit.


0

RProgN 2 , 75 byte

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

Hãy thử trực tuyến!

Chỉ có 70 byte nếu bạn không thêm «»'¤=phép gán phép tính Fermatness cho ¤ký tự. Nếu bạn làm điều đó, bạn sẽ cần phải đặt số vào phần Tiêu đề của TIO thay vì trong Footer như bây giờ.

Điều này thực sự sử dụng logic giống như câu trả lời Python của tôi, vì vậy nếu bạn không quan tâm đến cách RProgN 2 hoạt động, chỉ cần nhìn vào đó để biết giải thích về những gì đang diễn ra. Nếu không thì

Mã lỗi:

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

Thật không may, hàm log Švà hàm lũy thừa thông thường ^thiếu độ chính xác để thực hiện điều này một cách tự nhiên, vì vậy tôi phải xác định lại cách thức lũy thừa hoạt động vì phép nhân mang độ chính xác cao hơn nhiều. Nếu không xác định lại, câu trả lời này sẽ ngắn hơn 23 byte.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.