Yinelenen phi dizisi


13

İlgili: Yinelenen phi (n) işlevi .

Zorluğunuz yinelenen phi işlevini hesaplamaktır:

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

Nerede φolduğunu totient .

İlgili OEIS .

İşte grafiği:

resim açıklamasını buraya girin


Kurallar:

Amacınız çıkışına olduğu f(n)gelen n=2etmek n=100.

Bu kod golf, bu yüzden en kısa kod kazanır.

Kontrol edebileceğiniz değerler şunlardır:

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 Düzeltildi ve ayrıca kontrol etmek için grafik + değerler ekledi. :-)
Simply Beautiful Art

1
Kolmogorov-karmaşıklık etiketinde düzenledim , çünkü bu aslında sabit bir değer
veriyor

1
@SimplyBeautifulArt Öncelikle belirli bir sabit sayı xgibi sonlu birçok değer olduğunu kanıtlayın phi(x).
user202729

2
Bu güzel bir meydan okuma, ama f(n)bir dizi sabit sayı üzerinde çalıştırmak yerine, sadece bir çözüm uygulamak istemenin daha iyi olacağını düşünüyorum . Bu ayrıca, daha az baytlı aralıklara işlev uygulama yeteneği olan diller arasında da bir fark yaratır (kısmen bukalemun mücadelesi?)
Uriel

1
: P Size bir avantaj sağlamak için mücadeleyi değiştirmem gerektiğini mi ima ediyorsunuz? Bu kuralların nasıl belirtildiğine bakılmaksızın, bazı diller avantajlı olacak, bazıları olmayacak. Uriel
Simply Beautiful Art

Yanıtlar:


10

Haskell , 53 52 bayt

1 bayt kaydettiğiniz için teşekkürler nimi!

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

Çevrimiçi deneyin!

sum[1|1<-gcd n<$>[1..n]]verir φ(n)( Kusurdan alındı , teşekkürler!)

fözyinelemeli fonksiyonu olduğu hesaplar 1+φ(n), n değilse 1ve çıkışları 0ise nolan 1daha yineleme var gibi, ulaşılabilecek alınacak1

Sonunda her öğeye uygulanan f<$>[2..100]bir liste oluştururf[2..100]


7

Haskell , 70 69 68 bayt

Fonksiyon (\n->sum[1|1<-gcd n<$>[1..n]])biz defalarca anonim işlevinde uygulamak totient fonksiyonudur. -1 byte için @laikoni teşekkürler!

EDIT: Az önce @xnor bu tam totient işlevi önceki bir meydan okuma kullandığını öğrendim .

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

Çevrimiçi deneyin!


1
Bu, totient bir yerleşik olmamak için oldukça kısa!
Luis Mendo

1
@LuisMendo H.PWiz daha da kısa bir çözüm buldu !
Kusur

7

MATL , 16 15 bayt

99:Q"@`_Zptq}x@

Çevrimiçi deneyin!

açıklama

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)

Eski sürüm, 16 bayt

99:Qt"t_Zp]v&X<q

Çevrimiçi deneyin!

açıklama

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
Çıkarılan değerler birer birer kapalı, Sanırım çevrimiçi deneyin! düzeltir (ama daha önce hiç MATL kullanmadım ...)
caird coinheringaahing

Yazımın sonunu kontrol et. Her birinde birer birer kapalı olduğunuz beklenen çıktıyı sağlar.
Simply Beautiful Art

Mevcut cevabınız tarafından verilen ilk 5 değer 2 3 3 4 3, zorunluluk olması gerektiğini söylediğinde1 2 2 3 2
caird coinheringaahing

@cairdcoinheringaahing ve SimplyBeautifulArt Ah, anlıyorum. Teşekkürler! Şimdi düzeltildi
Luis Mendo

6

Jöle , 12 11 10 9 bayt

³ḊÆṪÐĿ>1S

Çevrimiçi deneyin!

HyperNeutrino sayesinde -1 bayt!

Bay Xcoder sayesinde -1 bayt!

Dennis sayesinde -1 bayt

Nasıl çalışır

³ḊÆṪÐĿ>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

Bu Dennis tarafından yapıldığı için, bunun neden işe yaradığına dair hiçbir fikrim yok.


1
Her üç cevaplar çıktı üretmesi listesini @dylnan f(n)gelen 2etmek 100ve bu doğru versiyonu olduğunu düşünüyorum bu yüzden soru, giriş söz etmez
Caird coinheringaahing

@dylnan meydan çıkışına sorar fiçin n=2için n=100sadece bir değer.
Simply Beautiful Art

Haklısın, mücadelenin başlangıcını okumuştum ve kurallar bölümünü net bir şekilde
okumadım

Ve kod ile ilgili olarak, #bu durumda kullanmak mümkün müdür ? Gibi bir şey bu (açıkça çalışmak ama açıkça sözdizimi anlayan birisi tarafından yazılmış değil!)
dylnan

@dylnan Muhtemelen, ancak sabit bir liste oluştururken, her bir öğeye uygulamak genellikle daha iyidir #.
caird coinheringaahing

6

APL (Dyalog) , 50 29 25 bayt

Bakın, yerleşik totient yok!

@ H.PWiz sayesinde 4 bayt kaydedildi

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

Çevrimiçi deneyin!

Nasıl?

Görünüşe göre önce daha uzun (ve daha zor) totient formülü için gittim. Düzeltme geçmişine bakın.

⍳⍵- 1içinn

⍵∨ - ile gcd n

1= - 1'e eşit mi?

+/ - hepsini topla

Bu totient. Geri kalan her şey sayma ( 1+∇) için sarıcıdır ve aralık 2..100( ¨1+⍳99) üzerine uygulanır .



4

J REPL, 23 bayt

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

Kontrol etmedim, ancak bir isim olarak tanımlarsanız bu muhtemelen normal J'de çalışır (REPL'deki telefonumda golf oynadım).

Yerleşik, yo.

Tıraş olmak için en az 2-3 bayt olduğunu söyleyebilirim ( a:çalışma şekli nedeniyle birer birer , |bir noop olarak kullanmak zorunda kalmak vb.).


1
+/*<:5&p:^:a:2+i.99 19 bayt için Çevrimiçi deneyin!
Galen Ivanov

Gelecekte başvurmak için, "+bunun yerine de kullanabilirsiniz "0, böylece aynı şekilde olabilir<:#@(5&p:^:a:)"+i.99
Conor O'Brien

2
16 bayt+/1<a:5&p:2+i.99
mil

1
@ miles: a:Kodunuzdaki kullanımını açıklayabilir misiniz ? Bunun yerine nasıl çalışır ^:?
Galen Ivanov

1
@ GalenIvanov (5&p:)^:a: m, bir adın bir isimle bağlandığı ve daha sonra ikili olarak adlandırıldığı zamanın a: 5&p: mdiğer tanımını kullanarak yapılabilir &.
mil

4

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

Sabit kodlama daha kısa olabilir, ancak tamamen matematiksel bir yaklaşımı deneyelim.

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())


Sabit kodlama 90 bayttır ( pastebin bağlantısı )
Herman L

@HermanLauenstein İyi iş çıkardın.
Arnauld


3

Python 2 , 82 bayt

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

Çevrimiçi deneyin!

Bu gözlemleri kullanır:

  • f(a*b) = f(a) + f(b) - 1, Hariç -1halinde atlanmıştır ave bhem de daha vardır
  • f(p) = f(p-1) + 1pasal ne zaman , ilef(2)=1

Bunlar ima ki eğer nasal çarpanlarına sahip n = 2**a * 3**b * 5**c * 7**d * 11**e * ..., o zaman f(n) = max(a,1) + b + 2*c + 2*d + 3*e + ..., nerede her p>2çarpanlara katkıda içinde f(p-1).

Bunları tutma geçmişe devam değilim emin eğer n=100, ancak isterlerse, onlar tanımlamak için bir yol ve hesaplamak vermek fkullanmadan φ.


2

Sakız , 49 bayt

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                                       +

Çevrimiçi deneyin!


2

PowerShell , 110 bayt

$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)}

Çevrimiçi deneyin!

Matematiksel yaklaşım.

Aslında, C cevabına çok benzer , ama bağımsız olarak gelişti. Bir 0s dizisi oluşturur , ile arasında 2geçiş yapar 100, ardından formülasyonu phikullanarak hesaplar gcd. Sondaki parens içindeki parça hem sonucu bir $asonraki gidiş için kaydeder hem de boru hattına örtülü çıktı ile sonuçlanan bir kopya yerleştirir.


PowerShell, 112 bayt

"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"-split'(.)'

Çevrimiçi deneyin!

Sabit kodlanmış. Ho-hum. Yaklaşık 10-15 bayt kadar matematiksel bir yaklaşım elde edebileceğimden daha kısa.


Tüm sayılar tek haneli olduğu için gerçekten bir ayırıcıya ihtiyacınız olup olmadığını merak ediyorum :)
flawr

1
Bize matematiksel yaklaşımınızı gösterebilir misiniz? Kesinlikle çok daha ilginç görünüyor: P
Conor O'Brien

2
@ ConorO'Brien Neyse ki, bu sabah taze gözlerle bakabildim ve sabit kodlu yaklaşımın altındaki matematiksel yaklaşımı golf oynadım.
AdmBorkBork

2

Python 2 , 83 bayt

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

Çevrimiçi deneyin!

Sezgisel bir tahmini, her bir tahmini ya -0da olarak düzelten sabit kodlu bir sabitle birleştirir -1.


2

Kabuk , 10 17 bayt

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

Çevrimiçi deneyin!

Düzenleme : +7 bayt aslında sadece A003434 hesaplama fonksiyonu olmadan önce istenen aralık üzerinde fonksiyonu eşlemek için .

açıklama

Aşağıdaki A003434 hesaplar :

←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

m(....)ḣ100Bölüm sadece ben önce o bölümü cevapsız emin nasıl, menzil [2..100] üzerinde bu işlevi map: S


1

PHP, 98 bayt

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

Çevrimiçi deneyin!

Tüm rakamları ikili bir dizeye koydum. Paketi açtıktan sonra, bir diziye dönüştürüp diziyi tekrar birleştirdikten sonra, yalnızca 1,2'nin başına geçmeli ve 6'yı ekleyecek veya bir kontrol kodunun görünmesine neden olacak şekilde eklemeliydim.



1

05AB1E , 11 bayt

тL¦ε[DNs#sÕ

Çevrimiçi deneyin!

açıklama

т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 bayt

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--);}

Ungolfed:

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
    }
}

Çevrimiçi deneyin!


0

Alumin , 87 bayt

hhhhhdadtqdhcpkkmzyhqkhwzydqhhwdrdhhhwrysrshhwqdrybpkshehhhwrysrarhcpkksyhaydhehycpkkmr

Çevrimiçi deneyin!

açıklama

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 bayt (rekabetçi değil)

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

Pyth Herokuapp üzerinde deneyin , çünkü TIO üzerinde herhangi bir nedenle çalışmıyor.

Açık Pyth çözümü daha küçük olduğundan hiç şüphem yok, ama diziyi sıkıştırarak kodu alabileceğimi ve sanırım Pyth'i öğrenebileceğimi görmek istedim. Bu, dizinin üst sınırının olduğu gerçeğini kullanır log2(n)+1.

açıklama

.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

Ben Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3birkaç tür dönüşümleri ile yukarıdaki kodun tam tersi olan, sıkıştırılmış dize var .


1
Neden rekabet etmiyor?
Simply Beautiful Art

@SimplyBeautifulArt, resmi anlamda rekabet etmemek anlamına gelmiyordu; Bunu daha açık hale getirmek için başlığı düzenledi
stellatedHexahedron

0

Ohm v2 , 41 bayt

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

Çevrimiçi deneyin!

Kelimenin tam anlamıyla tamamen kodlanmış ... Aslında yukarıdaki diziyi aldım, sayı olmayan her şeyi soydum, taban 8 olarak yorumladım, sonra Ohm'un yerleşik taban 255 numara temsiline dönüştürdüm. Tırnak işaretleri bunu yapıyor. Ardından, program bunu tekrar 8 tabanına dönüştürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.