สร้างn TH นารายณ์-Zidek-Capellจำนวนที่กำหนดอินพุตn ไบต์ที่น้อยที่สุดจะชนะ
f (1) = 1, f (n) คือผลรวมของชั้นก่อนหน้า (n / 2) ข้อกำหนดของ Narayana-Zidek-Capell
กรณีทดสอบ:
f(1)=1
f(9)=42
f(14)=1308
f(15)=2605
f(23)=664299
สร้างn TH นารายณ์-Zidek-Capellจำนวนที่กำหนดอินพุตn ไบต์ที่น้อยที่สุดจะชนะ
f (1) = 1, f (n) คือผลรวมของชั้นก่อนหน้า (n / 2) ข้อกำหนดของ Narayana-Zidek-Capell
กรณีทดสอบ:
f(1)=1
f(9)=42
f(14)=1308
f(15)=2605
f(23)=664299
คำตอบ:
HĊrµṖ߀Sȯ1
ใช้n
เป็นอาร์กิวเมนต์และพิมพ์ผลลัพธ์
H divide input by 2
Ċ round up to get first n to recurse
r inclusive range from that to n
µ (chain separator)
Ṗ remove n itself from the range
߀ call self recursively on each value in the range
S sum results
ȯ1 if sum was zero, return one
นี้ใช้สูตรจากหน้า OEIS สำหรับตัวเลขนารายณ์-Zidek-Cappell
แก้ไข:กำจัดวงเล็บโดยใช้ตัวดำเนินการที่มีความสำคัญด้วย feersum และ Neil
f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}
x%2
?
x%2*
อย่างน้อย
x<2?
... ทำให้ชัดเจนยิ่งขึ้นขอบคุณมาก!
อัลกอริทึมที่นำมาจากหน้า OEIS n<3
อาจเปลี่ยนเป็นn<4
ไม่มีผล ส่งคืนn
หมายเลข th โดยที่n
เป็นจำนวนเต็มบวก
a=lambda n:n<3or 2*a(n-1)-n%2*a(n/2)
วิธีการแก้ซ้ำเนื่องจาก 05AB1E ไม่มีฟังก์ชั่น
X¸sGDN>;ï£Os‚˜}¬
X¸ # initialize a list with 1
sG } # input-1 number of times do
D # duplicate current list
N>;ï£ # take n/2 elements from the list
O # sum those elements
s‚˜ # add at the start of the list
¬ # get the first element and implicitly print
การแปลของอัลกอริทึม OEIS มีรหัส C ไม่เพียงพอที่นี่!
f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}
n<3?:(...)
ทำงานหรือไม่
def f(n):
x=1,
for i in range(n):x+=sum(x[-i//2:]),
print(x[-1])
ฟังก์ชันที่รับอินพุตผ่านอาร์กิวเมนต์และพิมพ์ไปยัง STDOUT นี่คือการดำเนินการตามคำนิยามโดยตรง
มันทำงานอย่างไร
def f(n): Function with input target term index n
x=1, Initialise term list x as tuple (1)
for i in range(n):... For all term indices in [0,n-1]...
x[-i//2:] ..yield the previous floor(i/2) terms...
x+=sum(...) ...and append their sum to x
print(x[-1]) Print the last term in x, which is the nth term
L|syM>/b2Ub1
กำหนดฟังก์ชั่นy(n)
ที่ส่งกลับหมายเลขn
Narayana-Zidek-Capell-number
If[#<4,1,2#0[#-1]-#~Mod~2#0[(#-1)/2]]&
ฟังก์ชั่นไม่ระบุชื่อ ใช้𝑛เป็นอินพุตและส่งคืน𝑓 (𝑛) เป็นเอาต์พุต อ้างอิงจากโซลูชัน Ruby
f 1=1
f n=sum$f<$>[n-div n 2..n-1]
ตัวอย่างการใช้งาน: ->f 14
1308
การนำไปใช้โดยตรงของคำจำกัดความ
int z(int n){return n<3?1:n%2>0?(2*z(n-1)-z(n/2)):(2*z(n-1));}
func f(i int) int{if(i<4){return 1};return 2*f(i-1)-i%2*f(i/2)}
ค่อนข้างพอร์ตโดยตรงจากคำตอบ C
นี่เป็นโปรแกรมเต็มรูปแบบโดยไม่มีการเรียกซ้ำ ฟังก์ชั่นวนซ้ำสามารถกำหนดได้ 52 ไบต์ (อาจเป็นไปได้ที่จะเอาชนะได้) แต่นั่นเป็นเพียงคำตอบของ sherlock9 ที่น่าเบื่อพอสมควร (และเป็นข้อผิดพลาดถ้าคุณถามหา f (100) หรือมากกว่า) รุ่นที่ยาวขึ้นและน่าสนใจยิ่งขึ้น
<?php for($i=$argv[1];$j=$i;$i--)for(;--$j*2>=$i;)$a[$j]+=$a[$i]?:1;echo$a[1]?:1;
ทำให้มีการประกาศ (O [n]) หลายรายการ แต่ไม่เป็นไร
O(n)
ประกาศ? ฮะ?
x[1]=1;for(i in 2:10){x[i]=sum(x[i-1:floor(i/2)])};x[9]
การเปลี่ยนแปลง10
ในfor
วงและx[9]
จะได้รับดัชนีแล้วแต่จำนวนใดที่ผู้ใช้ต้องการ
f=function(n)ifelse(n<4,1,2*f(n-1)-n%%2*f(floor(n/2)))
f=n=>Math.round(n<3?1:2*f(n-1)-n%2*f(parseInt(n/2)))
ขึ้นอยู่กับCคำตอบ
parseInt
แทนMath.floor
`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)))
การใช้งาน:
> f:=n->`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)));
> seq( f(i), i = 1..10 );
1, 1, 1, 2, 3, 6, 11, 22, 42, 84
f=function(n,a=0)if(n<2)1 else{for(i in n-1:(n%/%2))a=a+f(i);a}
a=0
ถูกเพิ่มเป็นค่าเริ่มต้นเพราะมันช่วยให้ฉันสองวงเล็บปีกกา ฟังก์ชั่นเรียกซ้ำตัวเองตามความจำเป็น