หมายเลขนารายานา - ไซเดค - คาเปลล์


17

สร้าง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

12
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! นี่เป็นความท้าทายครั้งแรกที่ดี แม้ว่าในที่สุดมันก็ขึ้นอยู่กับคุณ แต่โดยทั่วไปเราแนะนำให้รออย่างน้อยหนึ่งสัปดาห์เพื่อรับคำตอบ การมีคำตอบที่ได้รับการยอมรับก่อนหน้านี้สามารถส่งสัญญาณไปยังผู้ใช้รายอื่นว่าความท้าทายมีมากกว่าหรือน้อยกว่า
Alex A.

คำตอบ:


6

เยลลี่11 10 ไบต์

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

7

Ruby, 34 32 ไบต์

นี้ใช้สูตรจากหน้า OEIS สำหรับตัวเลขนารายณ์-Zidek-Cappell

แก้ไข:กำจัดวงเล็บโดยใช้ตัวดำเนินการที่มีความสำคัญด้วย feersum และ Neil

f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}

แน่นอนคุณไม่จำเป็นต้องวงเล็บสำหรับx%2?
feersum

ไม่ใช่ถ้าคุณใส่x%2*อย่างน้อย
Neil

@feersum และ Neil ขอบคุณทั้งคู่
Sherlock9

การแก้ไขคำถามก่อนหน้าแนะนำว่าสูตรคือx<2?... ทำให้ชัดเจนยิ่งขึ้นขอบคุณมาก!
Neil

6

Python 2, 48 42 38 36 ไบต์

อัลกอริทึมที่นำมาจากหน้า OEIS n<3อาจเปลี่ยนเป็นn<4ไม่มีผล ส่งคืนnหมายเลข th โดยที่nเป็นจำนวนเต็มบวก

a=lambda n:n<3or 2*a(n-1)-n%2*a(n/2)

ลองออนไลน์


5

05AB1E, 16 ไบต์

วิธีการแก้ซ้ำเนื่องจาก 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

ลองออนไลน์


5

C, 38

การแปลของอัลกอริทึม OEIS มีรหัส C ไม่เพียงพอที่นี่!

f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}

วิธีการn<3?:(...)ทำงานหรือไม่
LegionMammal978

2
มันเป็นส่วนขยาย GCC (ดูเหมือนว่าจะทำงานในเสียงดังกราวเกินไป) ที่ประเมินให้กับตัวเองตามเงื่อนไขหากการแสดงออกกลางหายไป ดูหน้า GCC ที่เกี่ยวข้องและคำถาม SO นี้เพื่อดูรายละเอียดเพิ่มเติม
owacoder

4

Python 3, 67 ไบต์

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

ลองใช้กับ Ideone



3

Mathematica, 38 ไบต์

If[#<4,1,2#0[#-1]-#~Mod~2#0[(#-1)/2]]&

ฟังก์ชั่นไม่ระบุชื่อ ใช้𝑛เป็นอินพุตและส่งคืน𝑓 (𝑛) เป็นเอาต์พุต อ้างอิงจากโซลูชัน Ruby


ไม่มีอะไรในตัว?
บ้า

@Insane ไม่ไม่มีในตัว
LegionMammal978

น่าอัศจรรย์เพียง!
Insane

2

Haskell, 34 ไบต์

f 1=1
f n=sum$f<$>[n-div n 2..n-1]

ตัวอย่างการใช้งาน: ->f 141308

การนำไปใช้โดยตรงของคำจำกัดความ



1

ไป 63 ไบต์

func f(i int) int{if(i<4){return 1};return 2*f(i-1)-i%2*f(i/2)}

ค่อนข้างพอร์ตโดยตรงจากคำตอบ C


0

PHP, 81 ไบต์

นี่เป็นโปรแกรมเต็มรูปแบบโดยไม่มีการเรียกซ้ำ ฟังก์ชั่นวนซ้ำสามารถกำหนดได้ 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)ประกาศ? ฮะ?
แมว

ประกาศเป็นประเภทข้อผิดพลาดที่ไม่ร้ายแรงที่ไม่หยุดดำเนินการและมักถูกปิดเสียงในสภาพแวดล้อมการผลิต เมื่อใดก็ตามที่คุณพยายามรับค่าของตัวแปรที่ไม่ได้ประกาศหรือออฟเซตที่ไม่ได้กำหนดในอาร์เรย์ที่คุณได้รับการแจ้งเตือน โปรแกรมนี้พยายามรับค่าของ O [n] ที่ไม่ได้กำหนดออฟเซ็ต (และตัวแปรที่ไม่ได้ประกาศเช่นกัน) เพื่อให้คุณได้รับการแจ้งเตือน O [n]
user55641

0

R, 55 ไบต์

x[1]=1;for(i in 2:10){x[i]=sum(x[i-1:floor(i/2)])};x[9]

การเปลี่ยนแปลง10ในforวงและx[9]จะได้รับดัชนีแล้วแต่จำนวนใดที่ผู้ใช้ต้องการ


นี่คือรุ่นเรียกซ้ำที่มีความยาว 54 ไบต์: f=function(n)ifelse(n<4,1,2*f(n-1)-n%%2*f(floor(n/2)))
DSkoog

0

JavaScript, 54 52

f=n=>Math.round(n<3?1:2*f(n-1)-n%2*f(parseInt(n/2)))

ขึ้นอยู่กับCคำตอบ

  • บันทึก 2 ไบต์โดยใช้parseIntแทนMath.floor

0

เมเปิ้ล, 46 44 ไบต์

`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

0

R, 63 ไบต์

f=function(n,a=0)if(n<2)1 else{for(i in n-1:(n%/%2))a=a+f(i);a}

a=0ถูกเพิ่มเป็นค่าเริ่มต้นเพราะมันช่วยให้ฉันสองวงเล็บปีกกา ฟังก์ชั่นเรียกซ้ำตัวเองตามความจำเป็น

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