ย้ำลำดับพี


13

ที่เกี่ยวข้อง: ซ้ำพี (n) ฟังก์ชั่น

ความท้าทายของคุณคือการคำนวณฟังก์ชั่นซ้ำซ้อน:

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

ที่ไหนφเป็นtotient ฟังก์ชันออยเลอร์

ที่เกี่ยวข้องOEIS

นี่คือกราฟของมัน:

ป้อนคำอธิบายรูปภาพที่นี่


กฎ:

เป้าหมายของคุณคือการส่งออกf(n)จากการn=2n=100

นี่คือรหัส - กอล์ฟดังนั้นรหัสที่สั้นที่สุดจึงชนะ

นี่คือค่าที่คุณสามารถตรวจสอบได้:

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 แก้ไขและเพิ่มกราฟ + ค่าเพื่อตรวจสอบ :-)
ศิลปะที่สวยงามเพียง

1
ฉันได้แก้ไขในแท็กkolmogorov-complexเนื่องจากนี่คือการแสดงผลค่าคงที่เป็นหลัก
caird coinheringaahing

1
@SimplyBeautifulArt ก่อนอื่นให้พิสูจน์ว่ามีค่ามากมายxเช่นphi(x)นี้ซึ่งเป็นจำนวนที่แน่นอน
user202729

2
นี่เป็นความท้าทายที่ดี แต่ฉันคิดว่ามันจะดีกว่าถ้าขอวิธีการแก้ปัญหาf(n)แทนที่จะใช้มันในช่วงของตัวเลขคงที่ นอกจากนี้ยังทำให้ความแตกต่างระหว่างภาษาที่มีความสามารถในการใช้ฟังก์ชั่นในช่วงที่มีไบต์น้อย (ส่วนหนึ่งเป็นความท้าทายกิ้งก่า?)
ยูเรียล

1
: P คุณหมายถึงว่าฉันควรเปลี่ยนความท้าทายเพื่อให้คุณได้เปรียบ? ไม่ว่ากฎเหล่านี้จะระบุไว้อย่างไรภาษาบางภาษาจะมีความได้เปรียบและบางภาษาก็จะไม่เป็นเช่นนั้น @Uriel
ศิลปะที่สวยงามเรียบง่าย

คำตอบ:


10

Haskell , 53 52 ไบต์

ขอบคุณ nimi สำหรับการบันทึก 1 ไบต์!

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

ลองออนไลน์!

sum[1|1<-gcd n<$>[1..n]]ให้φ(n)(นำมาจากข้อบกพร่องขอบคุณ!)

fเป็นฟังก์ชั่นวนซ้ำที่คำนวณได้1+φ(n)ถ้า n ไม่1และเอาท์พุท0ถ้าnเป็น1เช่นนั้นเนื่องจากไม่มีการวนซ้ำอีกต่อไป1

ในที่สุดก็f<$>[2..100]สร้างรายการที่fใช้กับแต่ละองค์ประกอบของ[2..100]


7

Haskell , 70 69 68 ไบต์

ฟังก์ชั่น(\n->sum[1|1<-gcd n<$>[1..n]])เป็นฟังก์ชั่นTotient ซึ่งเรานำไปใช้ซ้ำในฟังก์ชั่นที่ไม่ระบุชื่อ ขอบคุณ @laikoni สำหรับ -1 ไบต์!

แก้ไข: ฉันเพิ่งค้นพบ @xnor ใช้ totient ฟังก์ชันนี้แน่นอนในความท้าทายที่ก่อนหน้านี้

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

ลองออนไลน์!


1
นี่เป็นคำย่อที่ค่อนข้างสั้นสำหรับการไม่มีตัวโทเทิลในตัว!
Luis Mendo

1
@LuisMendo H.PWiz พบวิธีแก้ปัญหาที่สั้นกว่านี้ !
ข้อบกพร่อง

7

MATL , 16 15 ไบต์

99:Q"@`_Zptq}x@

ลองออนไลน์!

คำอธิบาย

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)

รุ่นเก่า 16 ไบต์

99:Qt"t_Zp]v&X<q

ลองออนไลน์!

คำอธิบาย

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
ค่าที่ส่งออกถูกปิดโดยหนึ่งฉันคิดว่าลองออนไลน์ แก้ไขที่ (แต่ฉันไม่เคยใช้ MATL มาก่อน ... )
caird coinheringaahing

ตรวจสอบจุดสิ้นสุดของโพสต์ของฉัน มันให้ผลผลิตที่คาดหวังซึ่งคุณจะปิดโดยหนึ่งในแต่ละ
ศิลปะที่สวยงามเพียง

ค่า 5 อันดับแรกที่แสดงโดยคำตอบปัจจุบันของคุณคือ2 3 3 4 3เมื่อความท้าทายบอกว่าควรเป็น1 2 2 3 2
caird coinheringaahing

@cairdcoinheringaahing และ SimplyBeautifulArt Ah ฉันเห็น ขอบคุณ! แก้ไขแล้ว
Luis Mendo

6

เจลลี่ , 12 11 10 9 ไบต์

³ḊÆṪÐĿ>1S

ลองออนไลน์!

-1 ไบต์ต้องขอบคุณ HyperNeutrino!

-1 ไบต์ขอบคุณ Mr. Xcoder!

-1 ไบต์ขอบคุณเดนนิส

มันทำงานอย่างไร

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

เมื่อสิ่งนี้ถูกสร้างขึ้นโดยเดนนิสฉัน (เข้าใจ) ก็ไม่รู้ว่าทำไมงานนี้ถึงเป็นแบบนั้น


1
@dylnan ทั้งสามคำตอบส่งออกรายการf(n)จาก2ถึง100และคำถามไม่ได้พูดถึงการป้อนข้อมูลดังนั้นฉันคิดว่านี่เป็นรุ่นที่ถูกต้อง
caird coinheringaahing

@dylnan ความท้าทายขอให้เอาท์พุทfสำหรับn=2การn=100ไม่ได้เป็นเพียงหนึ่งค่า
ศิลปะที่สวยงามเพียง

ถูกต้องฉันได้อ่านจุดเริ่มต้นของการท้าทายและไม่ได้อ่านกฎส่วนหนึ่งอย่างชัดเจน
dylnan

และในเรื่องของรหัสมันจะเป็นไปได้ไหมที่จะใช้#ในกรณีนี้? บางสิ่งเช่นนี้ (ซึ่งเห็นได้ชัดว่าใช้งานไม่ได้ แต่เขียนโดยคนที่เข้าใจไวยากรณ์อย่างชัดเจน!)
dylnan

@dylnan อาจเป็นไปได้ แต่ในขณะที่เรากำลังสร้างรายการคงที่จะนำไปใช้ในช่วงแต่ละองค์ประกอบมักจะดีกว่า #
caird coinheringaahing

6

APL (Dyalog) , 50 29 25 ไบต์

ดูสิไม่มีโทเทิลในตัว!

บันทึกได้ 4 ไบต์ด้วย @ H.PWiz

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

ลองออนไลน์!

อย่างไร?

เห็นได้ชัดว่าฉันไปสำหรับสูตร totient ที่ยาวขึ้น (และหนักกว่า) ก่อน ดูประวัติการแก้ไข

⍳⍵- 1ถึงn

⍵∨ - gcd ด้วย n

1= - เท่ากับ 1

+/ - ผลรวม 'em ทั้งหมด

นี่คือผลรวม ส่วนที่เหลือทั้งหมดเป็นเสื้อคลุมสำหรับการนับ ( 1+∇) และใช้กับช่วง2..100( ¨1+⍳99)



4

J REPL, 23 ไบต์

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

ฉันไม่ได้ตรวจสอบ แต่สิ่งนี้อาจใช้ได้ใน J ปกติถ้าคุณกำหนดเป็นคำนาม (ฉันเล่นกอล์ฟนี้ในโทรศัพท์ของฉันบน REPL)

บิวด์อิน, yo

ฉันจะบอกว่ามีอย่างน้อย 2-3 ไบต์ในการโกน (off-by-one เนื่องจากวิธีการa:ทำงานต้องใช้|เป็น noop ฯลฯ )


1
+/*<:5&p:^:a:2+i.99 for 19 bytes ลองออนไลน์!
Galen Ivanov

สำหรับการอ้างอิงในอนาคตคุณสามารถใช้"+แทนได้"0ดังนั้นมันจะกลายเป็นอย่างเท่าเทียมกัน<:#@(5&p:^:a:)"+i.99
Conor O'Brien

2
16 ไบต์ด้วย+/1<a:5&p:2+i.99
ไมล์

1
@ ไมล์: คุณอธิบายการใช้งานa:โค้ดของคุณได้ไหม? มันทำงาน^:อย่างไรแทน
Galen Ivanov

1
@ GalenIvanov (5&p:)^:a: mสามารถทำได้a: 5&p: mโดยใช้คำนิยามอื่น ๆ ของ&เมื่อ dyad ถูกผูกมัดกับคำนามแล้วเรียกว่า dyadically
ไมล์

4

JavaScript (ES6), 115 ... 104 99 ไบต์

การเข้ารหัสยากอาจสั้นกว่านี้ แต่ลองใช้วิธีการทางคณิตศาสตร์ล้วนๆ

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


การเข้ารหัสแบบฮาร์ดคือ 90 ไบต์ ( ลิงค์ pastebin )
Herman L

@HermanLauenstein ทำได้ดีมาก
Arnauld


3

Python 2 , 82 ไบต์

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

ลองออนไลน์!

สิ่งนี้ใช้การสังเกตที่:

  • f(a*b) = f(a) + f(b) - 1ยกเว้น-1เว้นไว้หากaและbมีทั้งคู่
  • f(p) = f(p-1) + 1เมื่อpเป็นนายกด้วยf(2)=1

เหล่านี้บ่งบอกว่าถ้าnมีตัวประกอบที่สำคัญn = 2**a * 3**b * 5**c * 7**d * 11**e * ...แล้วf(n) = max(a,1) + b + 2*c + 2*d + 3*e + ...ซึ่งแต่ละในก่อตีนเป็ดp>2f(p-1)

ผมไม่แน่ใจว่าถ้าเหล่านี้ยังคงถือที่ผ่านมาn=100แต่ถ้าพวกเขาทำพวกเขาให้วิธีการที่กำหนดและคำนวณโดยไม่ต้องใช้fφ



2

PowerShellขนาด 110 ไบต์

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

ลองออนไลน์!

วิธีการทางคณิตศาสตร์

ที่จริงแล้วการมองผ่านมันคล้ายกับคำตอบ Cแต่พัฒนาอย่างอิสระ สร้างอาร์เรย์ของ0s, ลูปจาก2ไปยัง100จากนั้นคำนวณphiโดยใช้gcdสูตร ส่วนใน parens ที่ส่วนท้ายทั้งคู่บันทึกผลลัพธ์ลงใน$aรอบถัดไปและวางสำเนาบนไพพ์ไลน์ซึ่งส่งผลให้เอาต์พุตโดยนัย


PowerShell, 112 ไบต์

"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"-split'(.)'

ลองออนไลน์!

กำหนดค่าตายตัว โฮครวญเพลง สั้นกว่าที่ฉันจะได้รับวิธีการทางคณิตศาสตร์ประมาณ 10-15 ไบต์


ฉันสงสัยว่าคุณจริงต้องแยกเป็นตัวเลขทั้งหมดเป็นตัวเลขหลักเดียว :)
flawr

1
คุณช่วยแสดงให้เห็นถึงวิธีการทางคณิตศาสตร์ของคุณได้ไหม? มันดูน่าสนใจยิ่งขึ้นอย่างแน่นอน: P
Conor O'Brien

2
@ ConorO'Brien โชคดีพอฉันสามารถมองด้วยตาที่สดใสในเช้านี้และเล่นกอล์ฟด้วยวิธีการทางคณิตศาสตร์ใต้วิธีการเขียนโค้ดแบบยาก
AdmBorkBork

2

Python 2 , 83 ไบต์

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

ลองออนไลน์!

รวมประมาณการการแก้ปัญหาที่มีความคงที่ hardcoded ที่แก้ไขแต่ละประมาณการเป็นอย่างใดอย่างหนึ่งหรือ-0-1


2

Husk , 10 17 ไบต์

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

ลองออนไลน์!

แก้ไข : +7 ไบต์สำหรับจริงการทำแผนที่การทำงานในช่วงที่ถูกถามหาก่อนที่มันจะเป็นเพียงฟังก์ชั่นการคำนวณA003434

คำอธิบาย

คำนวณ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

m(....)ḣ100ส่วนหนึ่งเพียง map ฟังก์ชั่นที่มากกว่าช่วง [2..100] ไม่แน่ใจว่าฉันพลาดส่วนหนึ่งที่มาก่อน: S


1

PHP, 98 ไบต์

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

ลองออนไลน์!

ฉันบรรจุตัวเลขทั้งหมดลงในสตริงไบนารี หลังจากแกะมันออกแล้วแปลงมันให้เป็นอาเรย์แล้วรวมอาเรย์อีกครั้งฉันเพียง แต่ต้องเติม 1,2 และต่อท้าย 6 เพราะมันไม่พอดีหรือทำให้รหัสควบคุมปรากฏขึ้น



1

05AB1E , 11 ไบต์

тL¦ε[DNs#sÕ

ลองออนไลน์!

คำอธิบาย

т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 ไบต์

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

ลองออนไลน์!


0

Alumin , 87 ไบต์

hhhhhdadtqdhcpkkmzyhqkhwzydqhhwdrdhhhwrysrshhwqdrybpkshehhhwrysrarhcpkksyhaydhehycpkkmr

ลองออนไลน์!

คำอธิบาย

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 ไบต์ (ไม่แข่งขัน)

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

ลองใช้กับ Pyth Herokuappเพราะมันใช้งานไม่ได้กับ TIO ไม่ว่าด้วยเหตุผลใด

ฉันไม่สงสัยเลยว่าวิธีการแก้ปัญหา Pyth อย่างชัดเจนนั้นเล็กลง แต่ฉันต้องการที่จะดูว่าฉันจะได้รับโค้ดขนาดเล็กเพียงใดโดยการบีบอัดลำดับและเรียนรู้ Pyth ที่ฉันเดา log2(n)+1นี้จะใช้ความจริงที่ว่าผูกไว้บนของลำดับคือ

คำอธิบาย

.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

ฉันได้สตริงที่บีบอัดผ่านCi_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3ซึ่งอยู่ตรงข้ามกับโค้ดด้านบนที่มีการแปลงประเภทน้อย


1
ทำไมไม่ใช่การแข่งขัน
ศิลปะที่สวยงามเพียง

@SimplyBeautifulArt ไม่ได้หมายถึงการไม่แข่งขันในแง่ที่เป็นทางการ แก้ไขชื่อที่จะทำให้มันชัดเจนมากขึ้น
stellatedHexahedron

0

โอห์ม v2 , 41 ไบต์

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

ลองออนไลน์!

ฮาร์ดโค้ดอย่างสมบูรณ์ตามตัวอักษร ... ฉันใช้ลำดับข้างต้นถอดทุกอย่างที่ไม่ใช่ตัวเลขตีความมันเป็นฐาน 8 จากนั้นเปลี่ยนมันให้เป็นฐาน 255 จำนวนในตัวของโอห์ม นั่นคือสิ่งที่คำพูดทำ จากนั้นโปรแกรมจะเปลี่ยนให้เป็นฐาน 8 อีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.