สร้างลำดับของRecamán


20

ลำดับของRecamán ( A005132 ) เป็นลำดับทางคณิตศาสตร์ที่กำหนดดังนี้:

A(0) = 0
A(n) = A(n-1) - n if A(n-1) - n > 0 and is new, else
A(n) = A(n-1) + n

เวอร์ชัน LaTex ด้านบน (อาจอ่านได้มากกว่า):

A(n)={0if n=0A(n1)nif A(n1)n is positive and not already in the sequenceA(n1)+notherwise

คำศัพท์สองสามคำแรกคือ 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11

ในการชี้แจงis newหมายถึงจำนวนที่อยู่ในลำดับนั้นอยู่แล้วหรือไม่

รับค่าจำนวนเต็มnผ่านฟังก์ชันอาร์กิวเมนต์หรือ STDIN ส่งคืนnเงื่อนไขแรกของลำดับRecamán


นี่คือความท้าทายของรหัส - กอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ


'ใหม่' หมายถึงอะไร?
สลายตัวเบต้า

หากตัวเลขเป็นตัวเลขใหม่แสดงว่ายังไม่อยู่ในลำดับ เพิ่งรู้ว่าฉันพิมพ์ลำดับผิดให้ฉันหนึ่งนาทีเพื่อแก้ไข
James Williams

แก้ไขลำดับ
James Williams

1
คุณสามารถเพิ่มค่าแรกของลำดับได้หรือไม่
ภูมิใจ haskeller

เพิ่มตัวเลขสองสามตัวแรก! (และลิงก์ไปยังหน้า OEIS)
James Williams

คำตอบ:


9

CJam, 34 33 ไบต์

0ali{_W=_I-__0<4$@#)|@I+@?+}fI1>`

ลองออนไลน์

ตัวอย่างการวิ่ง

$ cjam <(echo '0ali{_W=_I-__0<4$@#)|@I+@?+}fI1>`') <<< 33
[0 1 3 6 2 7 13 20 12 21 11 22 10 23 9 24 8 25 43 62 42 63 41 18 42 17 43 16 44 15 45 14 46]

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

0ali                               " Push S := [ 0 ] and read an integer N from STDIN.    ";
    {                      }fI     " For each I in [ 0 ... (N - 1) ]:                     ";
     _W=                           "   X := S[-1].                                        ";
        _I-                        "   Y := X - I                                         ";
            _0<                    "   A := (Y < 0)                                       ";
           _   4$@#)               "   B := (Y ∊ S)                                       ";
                     @I+           "   Z := X + I                                         ";
                    |   @?         "   C := (A || B) ? Z : Y                              ";
                          +        "   S += [C]                                           ";
                              1>`  " Push str(S[1:]).                                     ";

คุณเปลี่ยนแปลงอะไร
Soham Chowdhury

A(i) - i > 0วิธีการแรกของฉันใช้ได้ตัวเลขติดลบลำดับดังนั้นฉันไม่ได้มีการตรวจสอบว่าอย่างชัดเจน อย่างไรก็ตามฉันไม่ได้เตรียมจำนวนที่เพียงพอสำหรับค่าnเล็กน้อย ตอนนี้ฉันเพียงแค่ทำสิ่งที่สเป็คพูด
เดนนิส

33 กับ 45. ใกล้เข้ามาแล้ว :)
Ingo Bürk

ว้าวแสดงความคิดเห็นโดยไม่ต้องe#อยู่ใน Cjam ... เชอร์รี่แสนอร่อย
Chromium

8

Haskell, 74

l=0:0#1
a§v|a<0||a`elem`r v=v|1<2=0-v
a#b=a+(a-bb:l!!b#(b+1)
r=(`take`l)

ตัวอย่างการใช้งาน:

λ> r 20
[0,1,3,6,2,7,13,20,12,21,11,22,10,23,9,24,8,25,43,62]

6

Ruby, 71 70 ไบต์

f=->n{a=[0];(n-1).times{|i|a+=[[b=a[-1]-i-1]-a!=[]&&b>0?b:b+2*i+2]};a}

การประยุกต์ใช้คำจำกัดความของคำต่อคำ


5

Python 2, 78 75 73 69 Bytes

รุ่งโรจน์ถึง xnor และ flornquake
ตอนนี้เกือบ 10 ไบต์สั้นกว่าคำตอบเริ่มต้น

m=p,=0,
exec"p+=1;k=m[-1]-p;m+=k+2*p*(k*(k>0)in m),;"*input()
print m

คุณสามารถร่นไป[k,k+2*p][bool] k+2*p*(bool)
xnor

@xnor ขอบคุณบันทึก 3 ไบต์
Markuz

นอกจากนี้ยังk in m or k<0สามารถเป็นk*(k>=0)in mเพราะถ้าk<0ผลิตภัณฑ์ที่เป็นที่อยู่ใน0 m
xnor

@xnor ยอดเยี่ยม! ขอขอบคุณอีกครั้ง
Markuz

คุณสามารถเขียนแทน-1 p-1แก้ไข: คุณยังสามารถทำmสิ่งอันดับและการเขียนและm=0, m+=k+2*p*(k*(k>0)in m),
flornquake

4

Golfscript (41 45 )

ลองออนไลน์ได้ที่นี่ :

(,1,\{:~1$=~)-:^1<\.^?)!!@|^\{~)2*+}*+}/

คำอธิบาย

นี่เป็นโซลูชัน 45 ไบต์ดั้งเดิม แต่ก็ยังคงเหมือนเดิม:

(,              # push array [0 .. n-1]
[0]\            # push sequence elements as [0] and reverse stack
{               # foreach element in [0 .. n-1] do:
  :m;           # store current element in m and discard
  .m=           # get the previous sequence element
  m)-:^         # subtract the current index from it and store in ^
  0>            # is that number greater than 0?
  \.^?)!        # is that number new to our sequence?
  @&            # logically and both checks
  {^}           # if true, push ^
  {^m)2*+}      # otherwise, add the index twice and push
  if
  +             # add new element to our sequence
}/
`               # make output pretty

แก้ไข # 1:ขอบคุณ Dennis ที่โกนหนวดออกมา 4 ไบต์


4

dc , 46 ไบต์

sn[z+z+d0r:a]sF0[pz-d1>Fd;a0<Fddd:azln!<M]dsMx

ลองออนไลน์!

โปรแกรมนี้รับอินพุตจากสแต็กและเอาต์พุตที่ว่างเปล่าไปยัง stdout (คั่นด้วยบรรทัดใหม่)

ฉันภูมิใจในสิ่งนี้มาก - มันเป็นการตีทุกอย่างที่ไม่ใช่ภาษาการเล่นกอล์ฟโดยเฉพาะและนำเสนอเทคนิคการเล่นกอล์ฟ dc ที่ฉันโปรดปราน:

  • ขนาดสแต็กที่ใช้เป็นตัวแปรดัชนี
  • การปรับโครงสร้าง "ถ้า A จากนั้น B อื่น C" เป็น "C โดยไม่มีเงื่อนไขและถ้า A นั้น D" โดยที่ C และ D รวมกันเพื่อให้ B
  • คุณลักษณะการเข้าถึงอาร์เรย์แบบสุ่มที่ใช้น้อยเพื่อแก้ไขข้อ จำกัด ที่เป็นเอกลักษณ์

คำอธิบาย

sn             Stores the input in register n
[z+z+0r:a]sF   Defines the macro F, which: 
    z+z+         adds twice the stack size/index variable
    0r:a         resets the "uniqueness" flag to 0 in the array a
               In context, F is the "D" in my description above, 
               changing A(z-1)-z to A(z-1)+z
0              The main loop starts with the previous sequence member on top of 
               the stack and total stack depth equal to the next index. 
               Pushing a zero accomplishes both of these things.
[              Start of the main loop M
  p               Print the previous sequence member, with newline (no pop)
  z-             Calculate A(z-1)-z
  d1>F           If that's nonpositive, (F)ix it to be A(z-1)+z
  d;a            a is my array of flags to see if we've hit this value before
  0<F            If we have, (F)ix it! (nonzero = flag, since ;a is zero by
                 default, and also zero if we just (F)ixed and therefore 
                 don't care about uniqueness right now)
  ddd            Make one copy to keep and two to eat
  :a             Flag this entry as "used" in the uniqueness array a
  zln!<M         If our "index variable" is n or less, repeat!
]dsMx          End of main loop - store it and execute

นั่นเป็นเรื่องป่าฉันไม่รู้ว่ามีตัวตนอยู่จริง ๆ
ดอนจ้า

3

JavaScript - 81 80 79 70

ความรุ่งโรจน์ถึง edc65 ที่ช่วยฉันประหยัด 9 ไบต์

f=n=>{for(a=[x=i=0];++i<n;)a[i]=x+=x>i&a.indexOf(x-i)<0?-i:i;return a}

-9: g = n => {สำหรับ (a = [x = i = 0]; ++ i <n;) a [i] = x + = x> i & a.indexOf (xi) <0? -i: i ; return a}
edc65

@ edc65 Grazie mille :)
William Barbosa

3

JavaScript, ES6, 74 69 ตัวอักษร

เรียกใช้รหัสด้านล่างในเว็บคอนโซลของ Firefox ล่าสุด

G=n=>(i=>{for(r=[t=0];++i<n;)r[i]=t+=i>t|~r.indexOf(t-i)?i:-i})(0)||r

จะพยายามตีกอล์ฟเพิ่มในภายหลัง

ตัวอย่างการใช้งาน:

G(11) -> 0,1,3,6,2,7,13,20,12,21,11

3

MATLAB, 83 78 ไบต์

บันทึกด้านล่างเป็นf.m(73 ไบต์)

A=0;for i=1:n-1 b=A(i)-i;A(i+1)=b+2*i;if b>0&&~any(A==b) A(i+1)=b;end;end

เรียกใช้จากหน้าต่างคำสั่ง (5 ไบต์)

n=9;f

หากข้อมูลด้านบนไม่ถูกกฎหมายจะต้องใช้ 90 ไบต์

function A=f(n) 
A=0;for i=1:n-1 b=A(i)-i;A(i+1)=b+2*i;if b>0&&~any(A==b) A(i+1)=b;end;end

3

R: 96 ตัวอักษร

แข็งแรงเล่นกอล์ฟ:

A=function(s,n,m,i){if(m==n){return(s)}else{t=i-m;if(t%in%s||t<0){t=i+m};s=c(s,t);A(s,n,m+1,t)}}

Ungolfed:

A = function(s,n,m,i) {
    if(m==n){return(s)}
    else{
        t=i-m
        if(t%in%s||t<0){t=i+m}
        s=c(s,t)
        A(s,n,m+1,t)
    }
}

เรียกใช้ตัวอย่าง:

> An(0,34,1)
[1]   0   1   3   6   2   7  13  20  12  21  11  22  10  23   9  24   8
[18]  25  43  62  42  63  41  18  42  17  43  16  44  15  45  14  46  79


3

Perl 6 , 62 57 ไบต์

{(0, {$ - @ + @ * 2 * ($ !> @ || $ - @ ∈ @ ) ที่ได้รับ @ [* -1]} ... *) [^ $ ]}

{(0,{($!=@_[*-1])+@_-@_*2*($!>@_&&$!-@_∉@_)}...*)[^$_]}

-5 ไบต์ขอบคุณ Jo King

ลองออนไลน์!


ช่างวิเศษจริงๆ ... ดูเหมือนว่าแมวของฉันกำลังเดินข้ามแป้นคีย์บอร์ด
ดอนสดใส

3

05AB1E , 19 ไบต์

¾ˆG¯¤N-DŠD0›*åN·*+ˆ

ลองออนไลน์!

คำอธิบาย

¾ˆ                    # Initialize the global list with 0
  G                   # for N in [1, input-1] do:
   ¯                  # push the global list
    ¤N-               # subtract N from the last item in the list
       D              # duplicate
        Š             # move the copy down 2 spots on the stack
         D            # duplicate again
          0›          # check if it is positive
            *         # multiply, turning negative results to zero
             å        # is the result already present in the list?
              N·*     # multiply by N*2
                 +    # add to the result
                  ˆ   # add this to the list

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

@lirtosiast: มานานแล้วตั้งแต่ฉันได้ทำสิ่งที่ท้าทายนี่คือคำอธิบายที่ดีที่สุดที่ฉันสามารถทำได้จากการสังเกตสั้น ๆ หวังว่ามันจะเพียงพอ
Emigna

3

K (oK) , 53 ไบต์

วิธีการแก้:

{$[y>c:#x;o[x,(r;*|x+c)(r in x)|0>r:*|x-c;y];x]}[,0;]

ลองออนไลน์!

คำอธิบาย:

โซลูชันแบบเรียกซ้ำ

{$[y>c:#x;o[x,(r;*|x+c)(r in x)|0>r:*|x-c;y];x]}[,0;] / the solution
{                                              }[,0;] / lambda with first arg set as list containing 0
 $[      ;                                  ; ]       / if[condition;true;false]
       #x                                             / length of x
     c:                                               / save as c
   y>                                                 / y greater than? (ie have we produced enough results?)
                                             x        / return x if we are done
          o[                             ;y]          / recurse with new x and existing y
                                      x-c             / subtract c from x
                                    *|                / reverse first, aka last
                                  r:                  / save result as r
                                0>                    / 0 greater than?
                               |                      / or
                       (      )                       / do together
                        r in x                        / r in x?
              ( ;     )                               / use result to index into this 2-item list
                   x+c                                / add c to x
                 *|                                   / reverse first, aka last 
               r                                      / result
            x,                                        / append to x

2

Java, 144

int[]f(int n){int[]a=new int[n];a[0]=0;int i,j,k,m;for(i=0;i<n-1;){k=a[i++]-i;m=0;for(j=0;j<i;)if(k==a[j++])m=1;a[i]=m<1&k>0?k:k+2*i;}return a;}

2

Lua - 141 135 139 135

function s(n)a,b={1},{[0]=0}for i=1,n do k=b[i-1]-i c=k+i+i if(k>0)and(a[k]==nil)then b[i],a[k]=k,1 else b[i],a[c]=c,1 end end return b end

รุ่นที่อ่านได้:

function s(n)
a,b={1},{[0]=0}
for i=1,n do 
   k=b[i-1]-i 
   c=k+i+i
   if (k>0) and (a[k]==nil) then 
      b[i],a[k]=k,1 
   else 
      b[i],a[c]=c,1
   end 
end 
return b 
end

ฉันใช้ 2 ตารางอันแรกเรียกว่าaและมันถูกสร้างขึ้นเพื่อให้ [i] = 1 iff iปรากฏขึ้นแล้วตามลำดับไม่มีอย่างอื่นในขณะที่ตารางที่สองเก็บลำดับจริง ๆ


ลำดับของคุณควรเริ่มต้นด้วย 0 แม้ว่า
William Barbosa

1
คุณพูดถูกฉันไม่ได้ดูคำถามอย่างรอบคอบและคิดว่ามันมีความหมายเดียวกันกับ mathworld (เริ่มต้นที่ 1) ฉันคิดว่าจะไม่เสียค่าใช้จ่ายเพิ่มเติมอีกต่อไปฉันจะทดสอบและแก้ไขในภายหลัง ตอนนี้ฉันกำลังเขียนจากโทรศัพท์ของฉัน!

2

Python 73

def f(x,t=0):
 if x:t=f(x-1);t+=2*x*(t*(t>0)in map(f,range(x)))
 return t

แก้ไข 1: ขอบคุณคำแนะนำของ @ xnor ในคำตอบ Python อื่น ๆ ! (ฉันเพิ่งรู้ว่าทั้งคู่ดูคล้ายกันมาก)

แก้ไข 2: ขอขอบคุณอีกครั้ง @xnor


นี่เป็นการวนซ้ำไม่สิ้นสุด คุณต้องเรียงลำดับของการควบคุมการไหลบางอย่างเพื่อที่ไม่เคยโทรหาทันทีf(x) f(x-1)
xnor

@xnor แก้ไขรหัส
Soham Chowdhury

1
ดูเหมือนว่าจะส่งคืนคำที่ n ไม่ใช่คำศัพท์แรก
เดนนิส

บางเล็ก ๆ น้อย ๆ จะช่วยประหยัด: t=0สามารถไปเป็นพารามิเตอร์ตัวเลือกที่จะfและสามารถt=t+ t+=
xnor

2

Groovy: 122 118 111 ตัวอักษร

แข็งแรงเล่นกอล์ฟ:

m=args[0] as int
a=[0]
(1..m-1).each{n->b=a[n-1];x=b-n;(x>0&!(x in a))?a[n]=x:(a[n]=b+n)}
a.each{print "$it "}

Ungolfed:

m = args[0] as int
a = [0]
(1..m-1).each { n->
    b = a[n-1]
    x = b-n
    ( x>0 & !(x in a) ) ? a[n] = x : (a[n] = b+n) 
}
a.each{print "$it "}

เรียกใช้ตัวอย่าง:

bash$ groovy Rec.groovy 14
0 1 3 6 2 7 13 20 12 21 11 22 10 23

2

Clojure: 174 ตัวอักษร

แข็งแรงเล่นกอล์ฟ:

(defn f[m a](let[n(count a)b(last a)x(- b n)y(if(and(> x 0)(not(.contains a x)))x(+ b n))](if(= m n)a(f m(conj a y)))))(println(f(read-string(first *command-line-args*))[0]))

Ungolfed:

(defn f[m a]
  (let [n (count a) 
        b (last a) 
        x (- b n) 
        y (if (and (> x 0) (not (.contains a x))) x (+ b n)) ]
    (if (= m n) a (f m (conj a y))) ) )

(println (f (read-string (first *command-line-args*)) [0]) )

วิ่งตัวอย่าง:

bash$ java -jar clojure-1.6.0.jar rec.clj 14 
[0 1 3 6 2 7 13 20 12 21 11 22 10 23]

1
ฉันขอแนะนำให้คุณอย่าอ่านจาก STDIN แต่เพียงนำอาร์กิวเมนต์จำนวนเต็มไปใช้กับฟังก์ชัน :) นอกจากนี้คุณไม่ได้รับประโยชน์ใด ๆ จากการกำหนดyบนletแบบฟอร์มคุณสามารถใช้นิพจน์โดยตรงในที่ที่ต้องการค่า
NikoNyrh

2

Mathcad, 54 "ไบต์"

enter image description here


จากมุมมองของผู้ใช้ Mathcad เป็นไวท์บอร์ด 2D ได้อย่างมีประสิทธิภาพโดยมีนิพจน์ที่ประเมินจากซ้ายไปขวาบนลงล่าง Mathcad ไม่รองรับอินพุต "text" ทั่วไป แต่ใช้การผสมผสานระหว่างข้อความและปุ่มพิเศษ / แถบเครื่องมือ / รายการเมนูเพื่อแทรกนิพจน์ข้อความพล็อตหรือส่วนประกอบ ตัวอย่างเช่นพิมพ์ ":" เพื่อป้อนตัวดำเนินการคำจำกัดความ (แสดงบนหน้าจอเป็น ": =") หรือ "ctl-shft- #" เพื่อป้อนตัวดำเนินการลูป (รวมตัวยึดสำหรับตัวแปรการวนซ้ำค่าการวนซ้ำและหนึ่งเนื้อหา การแสดงออก) สิ่งที่คุณเห็นในภาพด้านบนคือสิ่งที่ปรากฏบนส่วนต่อประสานผู้ใช้และเหมือนกับ "พิมพ์"

เพื่อวัตถุประสงค์ในการเล่นกอล์ฟการนับ "ไบต์" คือจำนวนการใช้แป้นพิมพ์ที่เทียบเท่ากับการป้อนนิพจน์


นั่นคือทั้งหมดที่ดีและดีแต่สิ่งที่มีความกดแป้นพิมพ์ที่เกิดขึ้นจริง?
Jo King


2

Stax , 19 ไบต์

É╖C8½ΔL▄░▬L+≡ΩSa⌂¼╧

เรียกใช้และแก้ไขข้อบกพร่อง

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้ มันเก็บลำดับไว้บนกองซ้อนและจดจำได้A(n - 1)ในการลงทะเบียน X nดัชนีย้ำจะใช้สำหรับการ ครั้งแรกที่ผ่านเป็น 0 แต่ในการทำซ้ำนั้นจะสร้าง 0 โดยไม่มีกรณีพิเศษใด ๆ ดังนั้นจึงไม่จำเป็นต้องปรับเปลี่ยนสำหรับดัชนีแบบ off-by-1

0X      push 0 to main stack and store it in X register, which will store A(n - 1)
z       push an empty array that will be used to store the sequence
,D      pop input from input stack, execute the rest of the program that many times
  xi-Y  push (x-register - iteration-index) and store it in the Y register
        this is (A(n - 1) - n)
  0>    test if (A(n - 1) - n) is greater than 0 (a)
  ny#   count number of times (A(n - 1) - n) occurs in the sequence so far (b)
  >     test if (a) > (b)
    y   (A(n - 1) - n)
    xi+ A(n - 1) + n
  ?     if/else;  choose between the two values based on the condition
  X     store the result in the X register
  Q     print without popping
  +     append to sequence array

เรียกใช้และแก้ไขข้อบกพร่องนี้


น่าสนใจ มันทำงานอย่างไร
ดอนสดใส

1
@donbright: เพิ่มคำอธิบายประกอบและคำอธิบาย
เรียกซ้ำ

2

Pyth, 31 ไบต์

VQ=+Y?Y?|>NeYhxY-eYN+eYN-eYNZ)Y

ยินดีต้อนรับสู่เว็บไซต์!
ตัวช่วยสร้างข้าวสาลี

ยินดีต้อนรับ คำตอบที่เป็นรหัสเท่านั้นจะหมดกำลังใจเพราะพวกเขามักจะถูกตั้งค่าสถานะเป็นคุณภาพต่ำโดยอัตโนมัติ เพิ่มคำอธิบายและพิจารณาเพิ่มลิงก์ไปยังล่ามออนไลน์เช่นนี้: tio.run/##K6gsyfj/PyzQVjvSPtK@xs4vNTKjIlI3NdJPG4hBdJRm5P//hoYA
mbomb007

2

Pyth , 24 ไบต์

tu+G-eG_W|g0J-eGH}JGHQ]0

ลองออนไลน์!

tu+G-eG_W|g0J-eGH}JGHQ]0   Implicit: Q=eval(input())
 u                   Q     Reduce [0-Q)...
                      ]0   ... with initial value G=[0], next value as H:
              eG             Last value of G (sequence so far)
             -  H            Take H from the above
            J                Store in J
          g0J                0 >= J
                 }JG         Is J in G?
         |                   Logical OR of two previous results
       _W           H        If the above is true, negate H, otherwise leave as positive
    -eG                      Subtract the above from last value in G
  +G                         Append the above to G
                           The result of the reduction is the sequence with an extra leading 0
t                          Remove a leading 0, implicit print

1

พาวเวอร์เชล (103)

$n=Read-Host;$a=@(0);$n-=1;1..$n|%{$x=$a[-1]-$_;if($x-gt0-and!($a-like$x)){$a+=$x}else{$a+=$x+2*$_}};$a

การใช้คำต่อคำอีกอันหนึ่งอยู่ที่นี่เช่นกัน น่าแปลกใจที่สามารถอ่านได้สำหรับ PowerShell ด้วย

ลำดับจะถูกเก็บไว้ในอาร์เรย์ $ a และพิมพ์ออกมาหนึ่งคำต่อบรรทัด

สำหรับ $ n = 20 ถ้าเราเรียกใช้คำสั่งที่$a-join","เราได้รับ

0,1,3,6,2,7,13,20,12,21,11,22,10,23,9,24,8,25,43,62


1

C ++: 180 ตัวอักษร (158 โดยไม่มีคำสั่ง cin และ cout)

int a[5000000][2]={0},i,k,l;a[0][0]=0;a[0][1]=1;cin>>k;for(i=1;i<=k;i++){l=a[i-1][0];if(l-i>0&&a[l-i][1]!=1){ a[i][0]=l-i;a[l-i][1]=1;}else{ a[i][0]=l+i;a[l+i][1]=1;}cout<<a[i][0]<<endl;

ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนา & รหัสแลกเปลี่ยนกองกอล์ฟ! โปรดแก้ไขจำนวนตัวอักษร / ไบต์ของการแก้ปัญหาของคุณในส่วนหัวของคุณดังแสดงในคำตอบอื่น ๆ ที่นี่ นอกจากนี้โปรดใส่รหัสของคุณ (เช่นลบช่องว่างเพื่อลดจำนวนตัวอักษร) ให้มากที่สุด ขอบคุณ!
Doorknob

แน่นอนฉันจะทำอย่างนั้น
Abhay Jain

1

Mathematica - 81 ไบต์

Fold[#~Append~(#[[-1]]+If[#[[-1]]>#2&&FreeQ[#,#[[-1]]-#2],-#2,#2])&,{0},Range@#]&

การใช้

Fold[#~Append~(#[[-1]]+If[#[[-1]]>#2&&FreeQ[#,#[[-1]]-#2],-#2,#2])&,{0},Range@#]&[30]
{0,1,3,6,2,7,13,20,12,21,11,22,10,23,9,24,8,25,43,62,42,63,41,18,42,17,43,16,44,15,45}

1

PHP , 89 ไบต์

$f=function($n){for(;$i<$n;$s[$r[$i++]=$p=$m]=1)if($s[$m=$p-$i]|0>$m)$m=$p+$i;return$r;};

ลองออนไลน์!

Ungolfed:

$f = function ($n) {
    for (; $i < $n; $s[$r[$i++] = $p = $m] = 1) {
        if ($s[$m = $p - $i] | 0 > $m) {
            $m = $p + $i;
        }
    }

    return $r;
};
  • $r สำหรับผลลัพธ์ของฉัน
  • $s สำหรับการติดตาม seens
  • $p ค่าก่อนหน้า
  • $m ค่าm ext

1

LISP ทั่วไป (139 ไบต์)

(defun r(n)(do*(s(i 0(1+ i))(a 0(car s))(b 0(- a i)))((> i n)(nreverse s))(push(cond((= 0 i)0)((and(> b 0)(not(find b s)))b)(t(+ a i)))s)))

Ungolfed:

(defun recaman (n)
  (do*
   (series               ; starts as empty list
    (i 0 (1+ i))         ; index variable
    (last 0 (car s))     ; last number in the series
    (low 0 (- last i)))

   ((> i n)              ; exit condition
    (nreverse series))   ; return value

    (push                ; loop body
     (cond
       ((= 0 i) 0)       ; first pass
       ((and
         (> low 0) (not (find low s)))
        low)
       (t (+ last i)))
     series)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.