สร้างลำดับตัวชี้


12

ช่วยให้กำหนดลำดับตัวชี้ไปเป็นลำดับใด ๆ ดังกล่าวที่A (n) = a ((n-1) - (หนึ่ง (n-1))) forall nมากกว่าจำนวน จำกัด บางอย่าง ตัวอย่างเช่นถ้าลำดับของเราเริ่มต้นด้วย

3 2 1 

เทอมถัดไปของเราจะเป็น2เพราะ(n-1) = 1 , (n-1) -1 = 1 , a (1) = 2 (ตัวอย่างนี้คือดัชนีศูนย์ แต่ไม่สำคัญว่าดัชนีใดที่คุณใช้การคำนวณจะ เหมือนเดิมเสมอ) ถ้าเราทำซ้ำกระบวนการเราจะได้ลำดับที่ไม่มีที่สิ้นสุด

3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2

งาน

เมื่อกำหนดจำนวนเต็มเริ่มต้นของจำนวนเต็มบวกให้ลำดับตัวชี้เริ่มต้นด้วยอาร์เรย์นั้น

ประเภทเอาท์พุท

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

คุณอาจเลือกที่จะรับอินพุตสองชุดคืออาร์เรย์เริ่มต้นและดัชนี หากคุณเลือกที่จะทำสิ่งนี้คุณจะต้องแสดงผลลัพธ์ของลำดับที่ดัชนีนั้นเท่านั้น


คุณจะไม่ได้รับลำดับที่ต้องมีการจัดทำดัชนีก่อนจุดเริ่มต้นของลำดับ ตัวอย่างเช่น3ไม่ใช่อินพุตที่ถูกต้องเนื่องจากคุณจะต้องมีข้อกำหนดก่อน3เพื่อแก้ไขคำถัดไป

นี่คือดังนั้นคะแนนของคุณจะเป็นจำนวนไบต์ในโปรแกรมของคุณโดยที่คะแนนต่ำกว่าจะดีกว่า

กรณีทดสอบ

กรณีทดสอบถูกตัดทอนเพื่อความเรียบง่าย

2 1   -> 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 ...
2 3 1 -> 2 3 1 3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 ...
3 3 1 -> 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 ...
4 3 1 -> 4 3 1 3 4 4 3 3 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 ...

มันได้รับอนุญาตให้ส่งออกnเงื่อนไขพิเศษนอกเหนือจากการเข้าแถวหรือไม่ หรือคำที่nเริ่มต้นหลังจากที่มีการป้อนข้อมูลหรือไม่
Luis Mendo

@LuisMendo แน่ใจว่าการจัดทำดัชนีใด ๆ ก็ดี
Ad Hoc Garf Hunter

คำตอบ:


8

JavaScript (ES6), 25 ไบต์

a=>f=n=>a[n]||f(--n-f(n))

ฟังก์ชั่นไม่ระบุชื่อที่เมื่อมีการเรียกสร้างฟังก์ชั่นfที่ให้รายการที่ดัชนีที่กำหนดในลำดับ

กรุณาแจ้งให้เราทราบหากฉันเข้าใจผิดอะไร ...


คุณโทรจากในf(n) f(n)ฉันไม่คิดว่ามันจะยุติลง แต่ฉันไม่รู้ JS
Ad Hoc Garf Hunter

@FunkyComputerMan เมื่อnได้รับต่ำพอที่a[n]จะส่งกลับค่าความจริงดังนั้น||จะสั้นลัดวงจรและป้องกันไม่ให้เกิดซ้ำ recursing
ETHproductions

ใช่ฉันได้รับ แต่nไม่ได้ลดลงทุกครั้งที่โทร ฉันค่อนข้างแน่ใจว่าถ้าnมากกว่าความยาวของaคุณจะไม่มีวันหยุด
Ad Hoc Garf Hunter

2
@FunkyComputerMan มันจะไปรับที่ต่ำกว่าด้วยการโทรแต่ละครั้ง--nกำหนดnไปn-1ดังนั้นการอ้างอิงต่อไปมันจะดูที่ ndecremented
Erik the Outgolfer

2
การ--nลด@FunkyComputerMan nซึ่งหมายความว่าf(--n-f(n))เหมือนกับf((n-1)-f(n-1))
ETHproductions

5

Husk , 7 6 ไบต์

¡S!o_L

ส่งคืนรายการที่ไม่มีที่สิ้นสุด ลองออนไลน์! โปรดทราบว่าใช้เวลาสักครู่หนึ่งสำหรับ TIO ในการตัดและพิมพ์ผลลัพธ์

คำอธิบาย

ผู้ประกอบการ¡มีความหมายหลายประการ ที่นี่ฉันใช้ "สร้างรายการที่ไม่มีที่สิ้นสุดโดยทำซ้ำฟังก์ชันที่คำนวณองค์ประกอบใหม่จากรายการที่มีอยู่" ได้รับรายชื่อของความยาวไม่มีองค์ประกอบใหม่จะมีดัชนีแบบ 1 N + 1 สิ่งที่เราต้องทำคือปฏิเสธองค์ประกอบสุดท้ายของรายการ (ซึ่งคือค่าก่อนหน้า) และดัชนีลงในรายการโดยใช้ผลลัพธ์

¡S!o_L  Implicit input.
¡       Construct infinite list by iterating this function on input:
 S!      Element at index
    →    last element
  o_     negated.

4

Haskell , 36 ไบต์

รับรายการและส่งคืนฟังก์ชันที่จัดทำดัชนีตามลำดับ

l!n|n<length l=l!!n|e<-n-1=l!(e-l!e)

ลองออนไลน์!

คำอธิบาย

ที่นี่เราจะกำหนดฟังก์ชั่น!ที่ใช้รายการและดัชนีl nถ้าnมีค่าน้อยกว่าความยาวของlเราจัดทำดัชนีlโดยมิฉะนั้นเราจะกลับn l!((n-1)-l!(n-1))นี่เป็นไปตามนิยามการเรียกซ้ำของฟังก์ชันที่ฉันให้ไว้ในคำถาม

นี่คือโปรแกรมเดียวกันที่ไม่ได้รับพร

a l n
 |n<length l = l!!n
 |otherwise = (a l) ((n-1) - (a l) (n-1))

ฉันใช้e<-n-1แทนวิธีอื่นเพื่อบันทึกไบต์ในขณะที่กำหนดn-1ให้eเพื่อใช้ในภายหลัง


4

MATL , 13 9 ไบต์

:"tt0)_)h

เอาต์พุตคำเริ่มต้นตามด้วยnคำเพิ่มเติม (อนุญาตโดยการท้าทาย) โดยที่nเป็นจำนวนเต็มบวกที่นำมาเป็นอินพุต

ลองออนไลน์!

คำอธิบาย

:"      % Implicitly input n. Do the following n times
  tt    %    Duplicate the sequence so far, twice. In the first iteration this
        %    implicitly inputs the array of initial terms
  0)    %    Get value of the last entry, say m
  _)    %    Get value of the entry which is m positions back from the last
  h     %    Append. This extends the array with the new entry
        % Implicit end. Implicitly display



2

ML มาตรฐาน (MLton) 58 ไบต์

fun a$n=if n<length$then List.nth($,n)else a$(n-1-a$(n-1))

ลองออนไลน์! ฟังก์ชั่นaใช้รายการเริ่มต้นและดัชนีและส่งกลับองค์ประกอบลำดับที่ดัชนีนั้น ตัวอย่างการใช้งาน: อัตราผลตอบแทนa [4,3,1] 54


2

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

NṪịṭµ¡

ใช้ลำดับSและจำนวนเต็มkและเพิ่มkแง่S

ลองออนไลน์!

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

NṪịṭµ¡  Main link. Left argument: S (sequence). Right argument: k (integer)

    µ¡  Combine the links to the left into a (variadic) chain and call it k times.
        The new chain started by µ is monadic, so the chain to the left will be
        called monadically.
N           Negate; multiply all elements in S by -1.
 Ṫ          Tail; retrieve the last element, i.e., -a(n-1).
  ị         At-index; retrieve the element of S at index -a(n-1).
            Since indexing is modular and the last element has indices n-1 and 0,
            this computes a( (n-1) - a(n-1) ).
   ṭ        Tack; append the result to S.


1

CJam, 10 ไบต์

{{(_j-j}j}

สำหรับ CJam สิ่งนี้ทำได้ดีมาก (แม้จะตี 05ab1e!)

นี่คือบล็อกแบบไม่ระบุชื่อที่คาดว่าจะมีการป้อนข้อมูลในแบบฟอร์มi nบนสแต็กซึ่งiเป็นดัชนีในลำดับและnเป็นอาร์เรย์ของตัวเลขเริ่มต้น

เหตุผลนี้ใช้งานได้ดีเนื่องจากjผู้ดำเนินการซึ่งให้การเรียกซ้ำแบบบันทึกช่วยจำจากชุดของค่าเริ่มต้น

คำอธิบาย:

{    Function j(n) with [j(0), j(1), j(2)] = [4, 3, 1], return j(6):
 (    Decrement:    5
 _    Duplicate:    5 5
 j    j(5):
  (    Decrement:   5 4
  _    Duplicate:   5 4 4
  j    j(4):
   (    Decrement:  5 4 3
   _    Duplicate:  5 4 3 3
   j    j(3):
    (    Decrement: 5 4 3 2
    _    Duplicate: 5 4 3 2 2
    j    j(2) = 1:  5 4 3 2 1
    -    Subtract:  5 4 3 1
    j    j(1) = 3:  5 4 3 3
   -    Subtract:   5 4 0
   j    j(0) = 4:   5 4 4
  -    Subtract:    5 0
  j    j(0) = 4:    5 4
 -    Subtract:     1
 j    j(1) = 3:     3
}j   End:           3

1

Java (8), 60 ไบต์

int a(int[]a,int n){return n<a.length?a[n]:a(a,--n-a(a,n));}

รับสองอินพุต (จำนวนเต็มอาร์เรย์aและจำนวนเต็มn) และส่งออกค่าn'th ของลำดับ

คำอธิบาย:

ลองที่นี่ (อาจใช้เวลาสองสามวินาที)

int a(int[]a,int n){        // Method with int[] and int parameters and int return-type
  return n<a.length?        //  If input `n` is smaller than the length of the array:
          a[n]              //   Output the `n`'th item of the array
         :                  //  Else:
          a(a,--n-a(a,n));  //   Recursive call with `n-1-a(n-1)`
}                           // End of method

0

Perl, 38 +3 (-anl) ไบต์

{print;push@F,$_=$F[$#F-$F[$#F]];redo}

ลองใช้ออนไลน์


ลิงก์ TIO ของคุณไปที่โปรแกรมอื่น
Xcali

@ Xcali ฉันแก้ไขลิงก์ แต่ไม่สามารถดำเนินการได้เพราะไม่สามารถสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ได้
Nahuel Fouilleul

0

05AB1E , 20 ไบต์

#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼

คาดว่าอินพุตเป็นสตริงที่คั่นด้วยช่องว่างทำให้เอาต์พุตไม่สิ้นสุด ใช้งานง่ายตรงไปตรงมา

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

$ 05ab1e -e '#`r[=ˆŽ¼}[¯¾¯¾è-è=ˆ¼' <<< '3 2 1'
3
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2
2
1
2

0

Java (OpenJDK 8) , 95 93 91 90 ไบต์

a->i->{int j=0,b[]=new int[++i];for(;j<i;j++)b[j]=j<a.length?a[j]:b[~-j-b[j-1]];return b;}

ลองออนไลน์!


ไม่b[(j-1)-...]เทียบเท่ากับb[~-j-...]?
Jonathan Frech

คุณสามารถกลับ ternary จากj>=a.lengthการที่จะบันทึกไบต์:j<a.length j<a.length?a[j]:b[~-j-b[j-1]]ฉันก็อยากรู้อยากเห็น: ทำไมคุณถึงใช้วิธีวนรอบเมื่อแนวทางแบบวนซ้ำที่ถูกอธิบายในคำอธิบายการท้าทายนั้นมีขนาดเพียง 60 ไบต์?
Kevin Cruijssen

ฉันไม่ชอบที่จะตอบด้วยวิธีการและ AFAIK ฟังก์ชั่นอ้างอิงตนเองต้องการคำตอบของโปรแกรมแบบเต็ม
Roberto Graham

@RobertoGraham ไม่วิธีการแบบเรียกซ้ำไม่สามารถเป็นแลมบ์ดาได้ดังนั้นต้องเป็นวิธีแบบ Java 7 แต่ก็ยังอนุญาตให้โพสต์วิธี (Java 7 สไตล์) แทนโปรแกรมเต็มรูปแบบ
Kevin Cruijssen

@KevinCruijssen ฉันได้ตอบคำถามของคุณใน BiFunction แล้วลองใช้งานออนไลน์! . เป็นไปได้ แต่คุณต้องโพสต์โปรแกรมทั้งหมดเพราะมันอ้างอิง Main
Roberto Graham

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