Trình tự phi lặp


13

Liên quan: Hàm phi (n) .

Thử thách của bạn là tính toán hàm phi lặp:

f(n) = number of iterations of φ for n to reach 1.

Trong trường hợp φPhi hàm Euler .

Liên quan đến OEIS .

Đây là biểu đồ của nó:

nhập mô tả hình ảnh ở đây


Quy tắc:

Mục tiêu của bạn là đầu ra f(n) từ n=2đến n=100.

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng.

Đây là các giá trị bạn có thể kiểm tra đối với:

1, 2, 2, 3, 2, 3, 3, 3, 3, 4, 3, 4, 3, 4, 4, 5, 3, 4, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 4, 5, 5, 5, 5, 5, 4, 5, 4, 5, 5, 6, 4, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 4, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 5, 6, 7, 5, 7, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 7, 5, 6, 6

@LuisMendo Đã sửa và cũng đã thêm biểu đồ + giá trị để kiểm tra. :-)
Đơn giản là nghệ thuật đẹp

1
Tôi đã chỉnh sửa trong thẻ độ phức tạp kolmogorov , vì về cơ bản, đây là giá trị cố định
caird coinheringaahing

1
@SimplyBeautitableArt Trước tiên hãy chứng minh rằng có nhiều giá trị chính xác xnhư vậy phi(x)là một số cố định cụ thể.
dùng202729

2
Đây là một thử thách thú vị, nhưng tôi nghĩ sẽ tốt hơn nếu chỉ yêu cầu một giải pháp để thực hiện f(n), thay vì chạy nó trên một loạt các số cố định. Điều này cũng tạo ra sự khác biệt giữa các ngôn ngữ có khả năng áp dụng các chức năng trên các phạm vi có ít byte hơn (thách thức một phần của tắc kè hoa?)
Uriel

1
: P Có phải bạn đang ám chỉ tôi nên thay đổi thử thách để mang lại lợi thế cho bạn? Bất kể các quy tắc này được nêu như thế nào, một số ngôn ngữ sẽ có lợi thế và một số ngôn ngữ sẽ không có. @Uriel
Đơn giản là nghệ thuật đẹp

Câu trả lời:


10

Haskell , 53 52 byte

Cảm ơn nimi vì đã tiết kiệm 1 byte!

f<$>[2..100]
f 1=0
f n=1+f(sum[1|1<-gcd n<$>[1..n]])

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

sum[1|1<-gcd n<$>[1..n]]cho φ(n)(Lấy từ flawr , cảm ơn!)

flà một hàm đệ quy tính toán 1+φ(n)nếu n không 1và đầu ra 0nếu n1 , vì không có nhiều lần lặp lại để đạt được1

Cuối cùng f<$>[2..100]tạo một danh sách fáp dụng cho từng yếu tố của[2..100]


7

Haskell , 70 69 68 byte

Hàm (\n->sum[1|1<-gcd n<$>[1..n]])này là hàm toàn phần, mà chúng ta liên tục áp dụng trong hàm ẩn danh. Cảm ơn @laikoni cho -1 byte!

EDIT: Tôi vừa phát hiện ra @xnor đã sử dụng hàm tổng số chính xác này trong một thử thách trước đó .

length.fst.span(>1).iterate(\n->sum[1|1<-gcd n<$>[1..n]])<$>[2..100]

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


1
Điều này là khá ngắn vì không có nội dung tổng hợp!
Luis Mendo

1
@LuisMendo H.PWiz tìm thấy một giải pháp thậm chí còn ngắn hơn !
flawr

7

MATL , 16 15 byte

99:Q"@`_Zptq}x@

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

Giải trình

99:       % Push [1 2 ... 99]
Q         % Add 1 element-wise: gives [2 3 ... 100]
"         % For each k in that array
  @       %   Push k
  `       %   Do...while
    _Zp   %     Euler's totient function
     tq   %     Duplicate, subtract 1. This is the loop condition
  }       %   Finally (execute on loop exit)
  x       %     Delete
  @       %     Push latest k
          %   End (implicit)
          % End (implicit)
          % Display stack (implicit)

Phiên bản cũ, 16 byte

99:Qt"t_Zp]v&X<q

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

Giải trình

99:       % Push [1 2 ... 99]
Q         % Add 1 element-wise: gives [1 2 ... 100]
t"        % Duplicate. For each (i.e. do the following 100 times)
  t       %   Duplicate
  _Zp     %   Euler's totient function, element-wise
]         % End
v         % Concatenate vertically. Gives a 100×100 matrix
&X<       % Row index of the first minimizing entry for each column.
          % The minimum is guaranteed to be 1, because the number of
          % iterations is more than sufficient.
q         % Subtract 1. Display stack (implicit)

1
Các giá trị xuất ra bị giảm đi bởi một, tôi nghĩ Hãy thử trực tuyến! sửa lỗi đó (nhưng tôi chưa bao giờ sử dụng MATL trước đó ...)
caird coinheringaahing

Kiểm tra cuối bài của tôi. Nó cung cấp đầu ra dự kiến, mà bạn sẽ tắt từng cái một.
Đơn giản là nghệ thuật đẹp

5 giá trị đầu tiên được đưa ra bởi câu trả lời hiện tại của bạn là 2 3 3 4 3, khi thử thách nói rằng chúng phải là1 2 2 3 2
caird coinheringaahing

@cairdcoinheringaahing và SimplyBeautitableArt À, tôi hiểu rồi. Cảm ơn! Đã sửa ngay
Luis Mendo

6

Thạch , 12 11 10 9 byte

³ḊÆṪÐĿ>1S

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

-1 byte nhờ HyperNeutrino!

-1 byte nhờ ông Xcoder!

-1 byte nhờ Dennis

Làm thế nào nó hoạt động

³ḊÆṪÐĿ>1S - Main link. No arguments
³         - Yield 100
 Ḋ        - Dequeue. Creates the list [2, 3 ... 99, 100]
    ÐĿ    - For each element, while the results of the next function
          - aren't unique, collect the results...
  ÆṪ      -   Next function: Totient
      >1  - Greater than one?
        S - Sum the columns

Vì điều này được tạo ra bởi Dennis, tôi (có thể hiểu được) không biết tại sao nó lại hoạt động, chỉ là nó làm được.


1
@dylnan Cả ba câu trả lời đều đưa ra danh sách f(n)từ 2đến 100và câu hỏi không đề cập đến đầu vào, vì vậy tôi nghĩ đây là phiên bản chính xác
caird coinheringaahing

@dylnan Thách thức yêu cầu đầu ra fcho n=2tới n=100, chứ không phải chỉ là một giá trị.
Đơn giản là nghệ thuật đẹp

Bạn nói đúng, tôi đã đọc phần đầu của thử thách và không đọc phần quy tắc một cách rõ ràng
dylnan

Và liên quan đến mã, nó có thể được sử dụng #trong trường hợp này không? Một cái gì đó như thế này (rõ ràng là không hoạt động nhưng được viết bởi một người hiểu rõ cú pháp!)
dylnan

@dylnan Có thể, nhưng khi chúng tôi tạo một danh sách cố định, để áp dụng cho từng yếu tố, thường tốt hơn #.
caird coinheringaahing

6

APL (Dyalog) , 50 29 25 byte

Nhìn này, không có tích hợp!

4 byte được lưu nhờ @ H.PWiz

{⍵=1:01+∇+/1=⍵∨⍳⍵}¨1+⍳99

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

Làm sao?

Rõ ràng tôi đã đi cho công thức tổng thể lâu hơn (và khó hơn) trước tiên. Xem lịch sử sửa đổi.

⍳⍵- 1đển

⍵∨ - gcd với n

1= - bằng 1?

+/ - tổng hợp tất cả

Đây là toàn bộ. Tất cả phần còn lại là trình bao bọc cho việc đếm ( 1+∇) và áp dụng trên phạm vi 2..100( ¨1+⍳99).



4

J REPL, 23 byte

<:#@(5&p:^:a:)"0|2+i.99

Tôi đã không kiểm tra, nhưng điều này có thể hoạt động trong J thông thường nếu bạn xác định nó là một danh từ (Tôi đã đánh gôn này trên điện thoại của tôi trên REPL).

Được xây dựng, yo.

Tôi muốn nói rằng có ít nhất 2-3 byte để tắt (từng cái một vì cách a:làm việc, phải sử dụng |như một noop, v.v.).


1
+/*<:5&p:^:a:2+i.99 cho 19 byte Hãy thử trực tuyến!
Galen Ivanov

Để tham khảo trong tương lai, bạn có thể sử dụng "+thay vì "0, vì vậy nó cũng có thể trở thành<:#@(5&p:^:a:)"+i.99
Conor O'Brien

2
16 byte với+/1<a:5&p:2+i.99
dặm

1
@ Dặm: Ông có thể giải thích việc sử dụng a:trong mã của bạn? Làm thế nào nó hoạt động thay vì ^:?
Galen Ivanov

1
@GalenIvanov (5&p:)^:a: mcó thể được thực hiện a: 5&p: mbằng cách sử dụng định nghĩa khác về thời &điểm một dyad được liên kết với một danh từ và sau đó được gọi là dyadally.
dặm

4

JavaScript (ES6), 115 ... 104 99 byte

Mã hóa cứng có thể ngắn hơn, nhưng hãy thử một cách tiếp cận toán học thuần túy.

f=n=>n>97?6:(P=(n,s=0)=>k--?P(n,s+(C=(a,b)=>b?C(b,a%b):a<2)(n,k)):s>1?1+P(k=s):1)(k=n+2)+' '+f(-~n)

console.log(f())


Mã hóa cứng là 90 byte ( liên kết pastebin )
Herman L

@HermanLauenstein Hoàn thành tốt.
Arnauld


3

Python 2 , 82 byte

l=0,1
exec"n=len(l);p=2\nwhile n%p:p+=1\nl+=l[p-1]+l[n/p]-n%4%3/2,;print l[n];"*99

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

Điều này sử dụng các quan sát rằng:

  • f(a*b) = f(a) + f(b) - 1, ngoại trừ -1được bỏ qua nếu abcả hai
  • f(p) = f(p-1) + 1khi nào plà số nguyên tốf(2)=1

Những điều này ngụ ý rằng nếu ncó thừa số nguyên tố n = 2**a * 3**b * 5**c * 7**d * 11**e * ..., thì f(n) = max(a,1) + b + 2*c + 2*d + 3*e + ..., trong đó mỗi p>2nhân tố đóng góp f(p-1).

Tôi không chắc chắn nếu những điều này tiếp tục giữ quá khứ n=100, nhưng nếu có, họ đưa ra một cách để xác định và tính toán fmà không cần sử dụng φ.


2

Bong bóng , 49 byte

00000000: 5d88 0511 0020 0003 ab2c 024e ff64 e8a3  ].... ...,.N.d..
00000010: 379f 956b f05d 206c 0545 7274 743a b876  7..k.] l.Ertt:.v
00000020: 2267 27f9 9f4d 9b9d fc85 e7e6 994d 6eb0  "g'..M.......Mn.
00000030: 2b                                       +

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


2

PowerShell , 110 byte

$a=,0*101;2..100|%{$i=$_;for($z=$j=0;++$j-lt$i;$z+=$k-eq1){for($k=$j;$j%$k-or$i%$k;$k--){}};($a[$i]=$a[$z]+1)}

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

Phương pháp toán học.

Trên thực tế, nhìn qua nó, rất giống với câu trả lời C , nhưng được phát triển độc lập. Tạo một mảng 0s, vòng lặp từ 2đến 100, sau đó tính toán phibằng cách sử dụng gcdcông thức. Phần parens ở cuối cả hai lưu kết quả vào $avòng tiếp theo và đặt một bản sao trên đường ống dẫn đến kết quả đầu ra ẩn.


PowerShell, 112 byte

"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"-split'(.)'

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

Mã hóa cứng. Hồ-hum. Ngắn hơn tôi có thể có được một cách tiếp cận toán học khoảng 10-15 byte.


Tôi tự hỏi liệu bạn có thực sự cần một dấu phân cách hay không, vì tất cả các số đều là một chữ số :)
flawr

1
Bạn có thể chỉ cho chúng tôi cách tiếp cận toán học của bạn? Có vẻ thú vị hơn nhiều chắc chắn: P
Conor O'Brien

2
@ ConorO'Brien May mắn thay, tôi đã có thể nhìn nó bằng con mắt mới sáng nay và chơi golf theo cách tiếp cận toán học bên dưới phương pháp mã hóa cứng.
admBorkBork

2

Python 2 , 83 byte

n=2
exec"print len(bin(n))-3+n%2-~n%9/8-(0x951a5fddc040419d4005<<19>>n&1);n+=1;"*99

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

Kết hợp một ước lượng heuristic với hằng số được mã hóa cứng để sửa từng ước tính là một -0hoặc -1.


2

Husk , 10 17 byte

mö←LU¡Sȯṁε⌋ḣtḣ100

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

Chỉnh sửa : +7 byte để thực sự ánh xạ hàm theo phạm vi được yêu cầu, trước khi nó chỉ là hàm tính toán A003434 .

Giải trình

Các tính toán sau A003434 :

←LU¡S(ṁ(ε⌋))ḣ -- takes a number as input, for example: 39
   ¡          -- iterate the following function on the input: [39,24,8,4,2,1,1,1..]
    S(     )ḣ --   with itself (x) and the range [1..x]..
      ṁ(  )   --   ..map and sum the following
        ε⌋    --     0 if gcd not 1 else 1
  U           -- longest unique prefix: [39,24,8,4,2,1]
 L            -- length: 6
←             -- decrement: 5

Phần m(....)ḣ100chỉ ánh xạ chức năng đó trong phạm vi [2..100], không chắc là tôi đã bỏ lỡ phần đó như thế nào trước đây: S


1

PHP, 98 byte

1,2,<?=join(',',str_split(unpack('H*','##3444E4DEEDEEUUEEVEUVUVVFUVVUfVfVVVVVegWVgVffgV')[1]))?>,6

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

Tôi đóng gói tất cả các chữ số thành một chuỗi nhị phân. Sau khi giải nén nó, chuyển đổi nó thành một mảng và sau đó hợp nhất lại mảng đó, tôi chỉ phải thêm 1,2 và nối thêm 6 vì chúng không phù hợp hoặc khiến mã điều khiển xuất hiện.



1

05AB1E , 11 byte

тL¦ε[DNs#sÕ

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

Giải trình

тL¦           # push range [2 ... 100]
   ε          # apply to each
    [         # start a loop
     D        # duplicate the current number
      N       # push the loop iteration counter
       s      # swap one copy of the current number to the top of the stack
        #     # if true, break the loop
         s    # swap the second copy of the current number to the top of the stack
          Õ   # calculate eulers totient

1

C, 112 byte

a[101];f(i,j,k,t){for(a[i=1]=0;i++<100;printf("%d ",a[i]=a[t]+1))for(t=j=0;++j<i;t+=k==1)for(k=j;j%k||i%k;k--);}

Ung dung:

a[101];
f(i,j,k,t){
    for(a[1]=0,i=2;i<=100;i++) {   // initialize
        for(t=j=0;++j<i;t+=k==1)   // count gcd(i, j) == 1 (t = phi(i))
            for(k=j;j%k||i%k;k--); // calculate k = gcd(i, j)
        printf("%d ",a[i]=a[t]+1); // print and store results
    }
}

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


0

Alumin , 87 byte

hhhhhdadtqdhcpkkmzyhqkhwzydqhhwdrdhhhwrysrshhwqdrybpkshehhhwrysrarhcpkksyhaydhehycpkkmr

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

Giải trình

hhhhhdadt      CONSTANT 100

RANGE FROM 100 to 0
q
  dhc
p

REMOVE 0 AND 1
kk

OVER EACH ELEMENT...
m
  zyh
  q
    kh
    wzyd
    q
      DUPLICATE TOP TWO ELEMENTS...
      hhwdrdhhhwrysrshhw
      GCD...
      qdryb
    p
    ks
    he
    hhhw
    ry
    s
    rarhc
  p
  IS IT ONE? IF SO TERMINATE (FIXPOINT)
  kksyhaydhehyc
p
kk
m
REVERSE THE VALUES
r

0

Pyth, 38 byte (không cạnh tranh)

.e-+1sl+1kb_jC"Éõ4ÕYHø\\uÊáÛ÷â¿"3

Hãy thử nó trên Herokuapp Pyth , vì nó không hoạt động trên TIO vì bất kỳ lý do gì.

Tôi không nghi ngờ gì về giải pháp Pyth rõ ràng nhỏ hơn, nhưng tôi muốn xem tôi có thể nhận được mã nhỏ như thế nào bằng cách nén chuỗi và tìm hiểu Pyth tôi đoán. Điều này sử dụng thực tế là giới hạn trên của chuỗi làlog2(n)+1 .

Giải trình

.e-+1sl+1kb_jC"Éõ4ÕYHø\\uÊáÛ÷â¿"3
             C"Éõ4ÕYHø\\uÊáÛ÷â¿"   interpret string as base 256 integer
            j                   3  convert to array of base 3 digits
           _                       invert sequence (original had leading 0s)
.e                                 map with enumeration (k=index, b=element)
       +1k                                   k+1
     sl                            floor(log(   ))
   +1                                             +1
  -       b                                         -b

Tôi đã nhận được chuỗi nén thông qua Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3, điều này trái ngược với mã ở trên với một vài chuyển đổi loại.


1
Tại sao không cấu hình?
Đơn giản là nghệ thuật đẹp

@SimplyBeautitableArt thực sự không có nghĩa là không thể hiểu theo nghĩa chính thức; chỉnh sửa tiêu đề để làm cho rõ ràng hơn
stellatedHexahedron

0

Ohm v2 , 41 byte

“ ‽W3>€þΣÌιZ§Á HgüυH§u·β}Bā€ΣNπáÂUõÚ,3“8B

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

Theo nghĩa đen hoàn toàn được mã hóa ... Tôi thực sự đã lấy chuỗi ở trên, tước bỏ mọi thứ không phải là số, giải thích nó là cơ sở 8, sau đó biến nó thành biểu diễn số 255 cơ sở tích hợp của Ohm. Đó là những gì các trích dẫn làm. Sau đó, chương trình chỉ đơn giản biến nó thành cơ sở 8 một lần nữa.

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.