คำที่ N ลำดับของ Van Eck


41

เอาต์พุตคำที่ N ของลำดับ Van Eck

ลำดับ Van Eck ถูกกำหนดเป็น:

  • เริ่มต้นด้วย 0
  • หากคำสุดท้ายคือการเกิดขึ้นครั้งแรกของคำนั้นคำถัดไปคือ 0
  • หากคำศัพท์สุดท้ายเกิดขึ้นก่อนหน้านี้คำศัพท์ถัดไปคือจำนวนขั้นตอนหลังเป็นเหตุการณ์ล่าสุด

https://oeis.org/A181391

https://www.youtube.com/watch?v=etMJxB-igrc

https://www.youtube.com/watch?v=8VrnqRU7BVU

ลำดับ: 0,0,1,0,2,0,2,2,1,6,0,,,5,0,2, ...

แบบทดสอบ:

อินพุต | เอาท์พุต

  • 1 | 0
  • 8 | 2
  • 19 | 5
  • 27 | 9
  • 52 | 42
  • 64 | 0

แก้ไข

ต้องการดัชนี 1 ดัชนี 0 ยอมรับได้; ที่อาจเปลี่ยนโซลูชันที่ส่งไปแล้วบางส่วน

ขอแค่เทอมที่ N

เหมือนกัน (ยกเว้นสำหรับการเห็นมันโพสต์แล้ว) ดูเหมือนว่านักกอล์ฟและนักดูเบอร์มีความซ้ำซ้อน


9
ดูวิดีโอ numpherphile ในที่ทำงานและกำลังจะโพสต์สิ่งนี้เมื่อฉันกลับถึงบ้าน สาปแช่งคุณที่มาที่นี่ก่อน : P
Draco18s

17
จะต้องมีการจัดทำดัชนี 1 ครั้งหรือเราอาจใช้การจัดทำดัชนี 0 หรือไม่?
Robin Ryder

6
เราจะคืนหรือส่งลำดับที่ไม่สิ้นสุดแทนได้หรือไม่
โจคิง

2
... หรือnคำแรก?
Shaggy

@ Draco18s เหมือนกันฉันมาที่นี่เพื่อโพสต์หลังจากดูวิดีโอ Numberphile เมื่อฉันเห็นสิ่งนี้
Geza Kerecsenyi

คำตอบ:


25

JavaScript (ES6),  46 41  37 ไบต์

n=>(g=p=>--n?g(g[p]-n|0,g[p]=n):p)(0)

ลองออนไลน์!

อย่างไร?

เราไม่จำเป็นต้องเก็บลำดับแบบเต็ม เราจำเป็นต้องติดตามตำแหน่งสุดท้ายของแต่ละจำนวนเต็มที่ปรากฏในลำดับ เราใช้วัตถุพื้นฐานของฟังก์ชั่น recursiveสำหรับวัตถุประสงค์ที่g

สำหรับระยะที่ได้รับเราไม่จำเป็นต้องมีทั้งชุดไปยังตำแหน่งที่แน่นอนที่เกิดขึ้นจริงในลำดับเพราะเรากำลังสนใจเฉพาะในระยะที่มีตำแหน่งปัจจุบัน นั่นเป็นเหตุผลที่เราสามารถเก็บค่าปัจจุบันของอินพุตซึ่งใช้เป็นตัวนับการลดจำนวนลงในโค้ดpg[p]n

ดังนั้นระยะทางที่จะได้รับจากกรัมสะดวกประเมินนี้เพื่อน่านว่านี้เป็นเกิดขึ้นครั้งแรกของซึ่งสามารถเปิดได้อย่างง่ายดายในที่คาดว่าจะ0g[p]np 0p0

แสดงความคิดเห็น

n => (             // n = input
  g = p =>         // g = recursive function taking p = previous term of the sequence
                   //     g is also used as an object to store the last position of
                   //     each integer found in the sequence
    --n ?          // decrement n; if it's not equal to 0:
      g(           //   do a recursive call:
        g[p] - n   //     subtract n from the last position of p
                   //     if g[p] is undefined, the above expression evaluates to NaN
        | 0,       //     in which case we coerce it to 0 instead
        g[p] = n   //     update g[p] to n
      )            //   end of recursive call
    :              // else:
      p            //   we've reached the requested term: stop recursion and return it
)(0)               // initial call to g with p = 0

18

Python 3 , 69 63 62 ไบต์

f=lambda n,l=0,*s:f(n-1,l in s and~s.index(l),l,*s)if n else-l

ลองออนไลน์!

หมายเหตุ: ดังที่ Erik the Outgolfer พูดถึงรหัสนี้ทำงานได้ดีใน Python 2 เช่นกัน

ดัชนี 0 (แม้ว่าจะผิดปกติมากที่สุดคุณสามารถทำให้ดัชนี -1 โดยเปลี่ยนif nเป็นif~n: P)

ใช้ประโยชน์จาก "ผู้ดำเนินการดาว" ของไพ ธ อนเพื่อแกะสลักซีรีส์ซ้ำ ๆ จนกว่าจะnถึงศูนย์

ฟังก์ชั่นสร้างชุดในลำดับย้อนกลับเพื่อหลีกเลี่ยงการกลับรายการสำหรับการค้นหา นอกจากนี้มันจริงเก็บ negations ขององค์ประกอบทั้งหมดเพราะการแปลงพวกเขากลับมาในตอนท้ายได้ฟรี (อื่น-จะต้องมีช่องว่าง) และมันจะช่วยประหยัดเราไบต์พร้อมกันโดยใช้แทน~s.index(l)-~s.index(l)

อาจเป็น 51 ไบต์หาก Python tuples มีfindฟังก์ชั่นเดียวกันกับสตริง (ส่งคืน -1 หากไม่พบแทนที่จะยกข้อผิดพลาด) แต่ไม่มีโชคเช่นนั้น ...


3
ที่จริงแล้วผู้ดำเนินการ "ดาว" ที่คุณใช้ไม่ใช่ผู้ดำเนินการแกะกล่องของ Python 3 แต่เป็นผู้ดำเนินการ vararg ซึ่งมีอยู่ใน Python 2 ด้วยเช่นกัน
Erik the Outgolfer

3
คนแรกคือ แต่คนที่สองไม่เปิดกล่องsสำหรับการโทรซ้ำหรือไม่
ArBo

1
ฉันทดสอบใน Python 2 แล้วและใช้งานได้
Erik the Outgolfer

@EriktheOutgolfer อืม แต่ใช้ครั้งที่สองไม่ได้เปิดออกมาใช่มั้ย ฟังก์ชันไม่จำเป็นต้องสนับสนุน varargs เพื่อใช้ไวยากรณ์ดังกล่าว
ArBo

@ArBo: มันไม่แตกต่างกว่าdef func(f, *args): f(*args); การเปิดฟังก์ชั่นการเปิดออกภายในเป็น py2 ที่ถูกต้อง อะไร py3 เท่านั้นจะเอาออกภายใน / รายการ comprehensions Dict (คือ[1, 2, *s]) a, *b = [1,2,3,4]หรือตัวแปรเอาออก:
Ehsan Kia

9

R , 62 ไบต์

function(n){while(sum(F|1)<n)F=c(match(F[1],F[-1],0),F)
+F[1]}

ลองออนไลน์!

สร้างรายการในสิ่งที่ตรงกันข้าม; matchส่งคืนดัชนีแรกของF[1](ค่าก่อนหน้า) ในF[-1](ส่วนที่เหลือของรายการ) ส่งคืน0หากไม่พบรายการที่ตรงกัน

Fถูกเตรียมใช้งานFALSEและถูกบังคับให้0ผ่านในwhileรอบแรกของการวนซ้ำ


2
ฉันรู้สึกกลัวว่าmatchปัญหานี้จะดีแค่ไหนเมื่อคุณสร้างมันขึ้นมา สะอาดจริงๆ
อาชญากรคน

เครื่องหมายบวกบนบรรทัดที่สองทำอะไรที่นี่หรือไม่? ฉันคิดว่ามันคงเป็นกรณีขอบ แต่ฉันไม่สามารถหามันได้
อาชญากร

1
@CriminallyVulgar ก็ควรบีบบังคับFไป0เมื่ออื่นมันก็จะกลับมาn==1 FALSE
จูเซปเป้

อ่าฉันเข้าใจแล้ว ทำให้รู้สึกฉันพยายามหลายช่วง แต่ไม่ใช่ค่าเดียว
อาชญากรคน

9

Perl 6 , 47 42 ไบต์

-5 ไบต์ขอบคุณ nwellnhof

{({+grep(@_[*-1],:k,[R,] @_)[1]}...*)[$_]}

ลองออนไลน์!

codeblock บล็อกที่ไม่ระบุชื่อที่ส่งออกองค์ประกอบ 0 ดัชนีในลำดับ

คำอธิบาย:

{                                            } # Anonymous codeblock
 (                                      )[$_]  # Return the nth element
                                    ...*       # Of the infinite sequence
  {                            }  # Where each element is
    grep(        :k        )[1]   # The key of the second occurrence
         @_[*-1],                 # Of the most recent element
                   ,[R,] @_       # In the reversed sequence so far
   +     # And numify the Nil to 0 if the element is not found



6

J , 29 23 ไบต์

1{(,~#|1+}.i.{.)@]^:[&0

ลองออนไลน์!

การทำงานจริงทำในกริยาการวนซ้ำของกริยากำลัง^:ซึ่งซ้ำหลาย ๆ ครั้งเป็นอาร์กิวเมนต์[เริ่มต้นการวนซ้ำด้วยค่าคงที่ 0 &0...

  • (#|1+}.i.{.)นี่คือสิ่งที่ทำซ้ำ ทำลายมันลง ...
  • }.i.{.ค้นหาดัชนีของi.ของหัวของรายการภายในหางของรายการ{. }.นี่จะส่งคืนดัชนีที่อิง 0 ดังนั้นหากพบรายการปัจจุบัน 1 ก่อนหน้าจะส่งคืน 0 หากไม่พบจะส่งคืนความยาวของรายการเช่นความยาวของหาง
  • 1+เพิ่มหนึ่งค่าเพื่อแก้ไขสำหรับการจัดทำดัชนีแบบ 0 เนื่องจาก Ven Eck's "ไกลแค่ไหน" นั้นเป็นแบบ 1 โปรดทราบว่าหากไม่พบค่าจะเป็นความยาวของรายการทั้งหมด
  • #|ส่งคืนส่วนที่เหลือของค่าที่คำนวณในขั้นตอนก่อนหน้าเมื่อหารด้วยความยาวของรายการทั้งหมด โปรดทราบว่าสิ่งนี้จะเปลี่ยน "ไม่พบ" เป็น 0 แต่จะไม่เปลี่ยนแปลงค่าอื่นทั้งหมด
  • ,~ผนวกค่าใหม่ที่ด้านหน้าของรายการ เราใช้ด้านหน้าแทนที่จะใช้เพื่อความสะดวกเท่านั้น
  • 1{ ส่งคืนรายการที่ 2 ในรายการเนื่องจากเราคำนวณหนึ่งครั้งมากเกินไปเพราะสั้นกว่านั้น

6

Pythonขนาด 51 ไบต์

f=lambda n,i=1:n>i and[f(n,i+1),i][f(n-1)==f(n+~i)]

ลองออนไลน์!

ขาออกสำหรับFalse 0การดำเนินการข้อมูลจำเพาะสวยอักษรมองหาจำนวนเต็มบวกที่ต่ำสุดดังกล่าวว่าi f(n-1)==f(n-i-1)ถ้าเช่นนำไปสู่การค้นหาเพื่อองค์ประกอบที่ก่อนหน้านี้ไม่เคยปรากฏมาก่อนและเราผลิตi>=n0

แทนที่จะทำสิ่งที่สมเหตุสมผลเช่นจัดเก็บค่าก่อนหน้าในรายการฟังก์ชั่นจะคำนวณใหม่ซ้ำตั้งแต่เริ่มต้นทุกครั้งที่ต้องการและบางครั้งเมื่อไม่ต้องการ ทำให้ฟังก์ชั่นทำงานช้ามากสำหรับอินพุตที่สูงกว่า 10 หรือมากกว่านั้น


5

APL (Dyalog Unicode) , 19 17 ไบต์SBCS

ขอบคุณมากสำหรับ ngn, Adám, Richard Park และ H.PWiz สำหรับความช่วยเหลือในการเขียนและเล่นกอล์ฟคำตอบนี้ในThe APL Orchardสถานที่อันยอดเยี่ยมสำหรับการเรียนรู้ APL และรับความช่วยเหลือจาก APL

แก้ไข: -2 ไบต์จากAdám

⊃(⊢,⍨≢|1∘↓⍳⊃)⍣⎕-1

ลองออนไลน์!

คำอธิบาย

⊃(⊢,⍨≢|1∘↓⍳⊃)⍣⎕-1

                 -1  We initialize our array of results with -1.
 (           )⍣⎕     repeats the train (in parentheses) our input, ⎕, times.
        1∘↓⍳⊃        We take the index of the head (our last element in the sequence).
                     To signify "element not found", this returns the length of the array.
      ≢|             We take our index modulo the length of the array.
                     This turns our "element not found" from the length of the array to 0.
  ⊢,⍨                And we prepend to our array.
                    Finally, we return the first element of the array,
                     which is the most recently-generated.
                     This is the ⍵-th element of the Van Eck sequence.


4

05AB1E , 8 ไบต์

F¯Rćk>Dˆ

n

คำอธิบาย:

F         # Loop the (implicit) input amount of times:
 ¯        #  Push the global array
  R       #  Reverse it
   ć      #  Extract the head; push the remainder and the head to the stack
    k     #  Get the 0-based index of the head in the remainder (-1 if not found)
     >    #  Increase it by 1 to make it 1-indexed (or 0 if not found)
      Dˆ  #  Add a copy to the global array
          # (after the loop, output the top of the stack implicitly as result,
          #  which is why we need the `D`/duplicate)

1
นั่นเป็นวิธีที่แปลกในการหยาบคายเซ็นเซอร์!
ลบเจ็ด

1
@negativeseven ฮ่า ๆ ผมใช้เวลาไม่กี่นาทีที่จะรู้ว่าสิ่งที่คุณหมาย แต่ผมคิดว่าคุณหมายถึงF¯Rćk? ;)
Kevin Cruijssen

4

Java, 96 80 76 ไบต์

n->{int i,v=0,m[]=new int[n];for(;--n>0;m[v]=n,v=i<1?0:i-n)i=m[v];return v;}

ไม่งง:

Function<Integer, Integer> vanEck =
n -> {

    int i;                  // i is the value of n when v was previously encountered
    int v = 0;              // v is the current element of vanEck sequence
    int[] m = new int[n];   // m[v] is the value of n when v was previously encountered

    while (--n > 0) {       // n is used as a decrementing counter

        i = m[v];
        m[v] = n;
        v = i == 0 ? 0 : i - n;
    }

    return v;
};

2
คุณควรจะสามารถลบไม่กี่ไบต์โดยการเปลี่ยนห่วงขณะที่เป็นห่วง
MegaTom

1
สวัสดีคุณสามารถกอล์ฟมากขึ้นโดย inlining ประกาศของint[]ในintการประกาศและยังใช้แทน<1 ==0ตัวอย่าง:int f(int n){int l[]=new int[n],i=0,j,v=0;while(++i<n){j=l[v];l[v]=i;v=j<1?0:i-j;}return v;}
Olivier Grégoire

2
และตอนนี้แลมบ์ดารวมถึงสนามกอล์ฟที่ @MegaTom กล่าวถึงทั้งหมด 80 ไบต์:n->{int l[]=new int[n],i=0,j,v=0;for(;++i<n;l[v]=i,v=j<1?0:i-j)j=l[v];return v;}
Olivier Grégoire

1
สุดท้ายคุณก็สามารถตรวจสอบเคล็ดลับสำหรับการเล่นกอล์ฟในชวา
Olivier Grégoire

3

ถ่าน 23 ไบต์

≔⁰θF⊖N«≔⊕⌕⮌υθη⊞υθ≔ηθ»Iθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⁰θ

ตั้งค่าคำแรกเป็น 0

F⊖N«

วนn-1ครั้ง (หากการจัดทำดัชนี 0 เป็นที่ยอมรับสามารถลบออกได้สำหรับการบันทึกแบบ 1 ไบต์)

≔⊕⌕⮌υθη

คำต่อไปคือดัชนีที่เพิ่มขึ้นของคำปัจจุบันในรายการย้อนกลับของคำก่อนหน้า

⊞υθ

เพิ่มคำปัจจุบันลงในรายการคำก่อนหน้า

≔ηθ

ตั้งค่าคำปัจจุบันเป็นคำถัดไป

»Iθ

พิมพ์คำปัจจุบันที่ท้ายวง



2

เยลลี่ขนาด 8 ไบต์

ẎiḢ$;µ¡Ḣ

nnth

ลองออนไลน์!

อย่างไร?

ẎiḢ$;µ¡Ḣ - Link: n
     µ¡  - repeat this monadic link n times - i.e. f(f(...f(n)...)):
         - (call the current argument L)
Ẏ        -   tighten (ensures we have a copy of L, so that Ḣ doesn't alter it)
   $     -   last two links as a monad:
  Ḣ      -     head (pop off & yield leftmost of the copy)
 i       -     first index (of that in the rest) or 0 if not found
    ;    -   concatenate with L
       Ḣ - head

โปรดทราบว่าหากไม่มีการรวบรวมขั้นสุดท้ายเราได้รวบรวมจริง[a(n), a(n-1), ..., a(2), a(1), n]







2

Python 3 , 128 114 111 102 99 ไบต์

102 -> 99 ไบต์ขอบคุณ Jonathan Frech

f=lambda n,i=1,l=[0]:f(n,i+1,l+[l[i-2::-1].index(l[-1])+1if l[-1]in l[:-1]else 0])if n>i else l[-1]

ลองออนไลน์!


คุณสามารถปฏิเสธเงื่อนไขของคุณและใช้-แทน!=การบันทึกไบต์
Jonathan Frech

นอกจากนี้เนื่องจากสนามกอล์ฟของคุณมีผลข้างเคียงน้อยคุณสามารถใช้รายการแทนสิ่งอันดับ
Jonathan Frech

@JonathanFrech แต่ถ้าฉันมีรายการเป็นอาร์กิวเมนต์เริ่มต้นมันจะไม่ทำงานอย่างถูกต้องสำหรับการโทรติดต่อกัน?
ruohola

ทำไมมันไม่ควร?
Jonathan Frech

1
ส่วนใหญ่มีแนวโน้มเพราะสคริปต์ก่อนหน้านี้มีการปรับเปลี่ยนรายการคือไม่ได้เป็นผลข้างเคียงน้อยกว่า: ตัวอย่างเช่น
Jonathan Frech


1

Python 3 , 112 ไบต์

a=[0]
for _ in a*int(input()):k=a[-1];a+=k in a[:-1]and[a[::-1].index(k)+~a[-2::-1].index(k)]or[0]
print(-a[-2])

ลองออนไลน์!

-3 ไบต์ขอบคุณ mypetlion


บรรทัดที่สองสามารถfor _ in a*int(input()):k=a[-1];a+=k in a[:-1]and[a[::-1].index(k)+~a[-2::-1].index(k)]or[0]บันทึกได้ 3 ไบต์
mypetlion

@mypetlion ขอบคุณ
HyperNeutrino


1

CJam (15 ไบต์)

0a{_(#)\+}qi*0=

สาธิตออนไลน์ นี่คือโปรแกรมเต็มและดัชนี 0

การผ่า

0a      e# Push the array [0]
{       e# Loop...
  _(#   e#   Copy the array, pop the first element, and find its index in the array
  )\+   e#   Increment and prepend
}qi*    e# ... n times, where n is read from stdin
0=      e# Take the first element of the array

0

Clojure, 69 ไบต์

#((fn f[i c t](if(= i 1)t(f(dec i)(assoc c t i)(-(or(c t)i)i))))%{}0)

น่าเศร้าที่แนวทางการใช้งานที่มากขึ้นดูเหมือนจะนาน


0

DC, 94 91 90 ไบต์

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

[st1si0swlbxltlwlu1-sulu0!=m]sm[dlt=qSsli1+siz0!=b0siLs]sb[0pq]sf[lisw2Q]sq?2-dsu1>f0dlmxp

Main control macro
[st                         ]sm   save top value as target
[  1si0sw                   ]sm   reset i to 1 and w to 0
[        lbx                ]sm   execute macro b to get next value in w
[           ltlw            ]sm   restore target to the stack and add w to the stack
[               lu1-su      ]sm   decrement the user inputted variable
[                     lu0!=m]sm   if the user inputted variable is not 0 recurse

Next value finder macro
[dlt=q                  ]sb     if the value on the stack is the target, quit
[     Ss                ]sb     save top value to s register
[       li1+si          ]sb     increment i register
[             z0!=b     ]sb     recurse if still more values            
[                  0si  ]sb     set i to 0 (will be saved to w if relevant)
[                     Ls]sb     move top value of s register to stack

[lisw2Q]sq   Load i, save it to w, and then quit this macro and the one that called it

[0pq]sf print 0 and quit the program
```


0

Pyth , 18 ไบต์

VQ=Y+?YhxtYhY0Y;hY

ลองออนไลน์!

สร้างลำดับในสิ่งที่ตรงกันข้ามและพิมพ์องค์ประกอบแรก (เทอมสุดท้ายของลำดับ)

VQ                 # for N in range(Q) (Q=input)
  =Y+         Y    # Y.prepend(
        xtY        #   Y[1:].index(    )
           hY      #               Y[0]
       h           #                     +1
     ?Y      0     #                        if Y else 0)
               ;hY # end for loop and print Y[0]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.