รับขั้นตอนตามลำดับ


17

ท้าทาย

กำหนดลำดับของตัวเลขให้สร้างฟังก์ชั่นที่คืนค่าลำดับขั้นตอน

  • สมมติว่าลำดับจะเป็น N >= 3
  • ลำดับจะทำซ้ำขั้นตอนอย่างน้อยหนึ่งครั้ง
  • ลำดับจะมีตัวเลขตามธรรมชาติเท่านั้น
  • ฟังก์ชั่นหรือโปรแกรมของคุณควรกลับลำดับขั้นตอนที่สั้นที่สุดที่เป็นไปได้

ตัวอย่าง:

การป้อนข้อมูล: [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]

เอาท์พุท: [1, 1, 2]

คำอธิบาย:1 => 2 (1 step), 2 => 3 (1 step), 3 => 5 (2 steps)ลำดับเริ่มต้นไปจาก จากนั้นมันจะเกิดซ้ำ ผลลัพธ์ก็คือ[1 step, 1 step, 2 steps] => [1, 1, 2]

ตัวอย่างอื่น:

การป้อนข้อมูล: [2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]

เอาท์พุท: [3, 1, 1, 1]

[2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
 \  /\ /\ /\ / 
  3   1  1  1  Then it repeats...

กรณีทดสอบ

Input: [1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28] => Output: [3,4,1,1]

Input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] => Output: [5,2]

Input: [2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47] => Output: [4,4,3,4]

Input: [5, 6, 7] => Output: [1]


ชี้แจง

  • ความยาวอินพุต - 1 หารด้วยความยาวเอาต์พุต
  • สมมติว่าลำดับจะเพิ่มขึ้นเรื่อย ๆ

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


ความท้าทายที่เกี่ยวข้อง
AdmBorkBork

6
ฉันเคยเห็นความท้าทายสองสามข้อที่คุณโพสต์เมื่อเร็ว ๆ นี้พร้อมความเห็นที่กระจ่างชัดมากมายและคู่รักสองคนปิดตัวลงว่า "ไม่ชัดเจน" และเปิดอีกครั้งในภายหลังหลังจากที่คุณทำการแก้ไขที่เหมาะสม คุณคิดว่าจะโพสต์สิ่งเหล่านี้ในแซนด์บ็อกซ์สองสามวัน / สัปดาห์หรือไม่? ฉันสนุกกับความท้าทายของคุณเนื่องจากมันเข้าถึงได้ง่าย แต่ความท้าทายทั้งหมดไม่ว่าจะเรียบง่ายหรือโพสต์โดยใครก็ตามสามารถใช้การปรับแต่งได้
Giuseppe

2
@Giuseppe ขอบคุณสำหรับคำแนะนำของคุณ ฉันได้โพสต์ความท้าทายอื่น ๆ ในกล่องทราย (โดยปกติถ้าฉันไม่ได้รับวิธีที่ถูกต้องในการสร้างความท้าทายด้วยฉันลบมัน) สำหรับความท้าทายเหล่านี้ฉันคิดว่าพวกเขาชัดเจนเพียงพอและนั่นเป็นสาเหตุที่ฉันโพสต์ทันที แต่ฉันจะเริ่มโพสต์ไว้ในกล่องทรายก่อน ขอบคุณ
Luis felipe De jesus Munoz

2
@ LuisMendo นอกรีต! 0 คือจำนวนธรรมชาติ! Billy Joel มีอัลบั้มทั้งหมดที่อุทิศให้กับ Peano Man!
ngm

1
@AdmBorkBork สิ่งนี้เกี่ยวข้องมากขึ้นโดยอาศัยการจัดการกับรายการการดำเนินการที่มีความยาวตามอำเภอใจ
Peter Taylor

คำตอบ:


10

เยลลี่ , 9 7 ไบต์

IsJEƇḢḢ

ลองออนไลน์!

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

IsJEƇḢḢ  Main link. Argument: A (array)

I        Increment; compute D, the array of A's forward differences.
  J      Indices; yield [1, ..., len(A)].
 s       Split D into chunks of length k, for each k in [1, ..., len(A)].
   EƇ    Comb equal; keep only partitions of identical chunks.
     Ḣ   Head; extract the first matching parititon.
      Ḣ  Head; extract the first chunk.

9

JavaScript (ES6), 58 ไบต์

ส่งออกสตริงคั่นด้วยเครื่องหมายจุลภาค (พร้อมเครื่องหมายจุลภาคนำหน้า)

a=>(a.map(p=x=>-(p-(p=x)))+'').match(/N((,\d+)*?)\1*$/)[1]

ลองออนไลน์!

หรือ56 ไบต์ถ้าเราใช้,-เป็นตัวคั่นและเราคิดว่าลำดับนั้นเพิ่มขึ้นอย่างเคร่งครัดเสมอ

อย่างไร?

ก่อนอื่นเราจะแปลงอาร์เรย์อินพุท[]เป็นรายการความแตกต่างติดต่อกันด้วย:

a.map(p = x => -(p - (p = x)))

เพราะ หน้าเป็นชุดแรกเป็นค่าที่ไม่ใช่ตัวเลข (ฟังก์ชั่นการโทรกลับของแผนที่ () ) ซ้ำแรกผลตอบแทนถัวเฉลี่ยน่าน

ตัวอย่าง:

[6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41]
[ NaN, 5, 2, 5, 2, 5, 2, 5, 2, 5, 2 ]

จากนั้นเราจะบังคับผลลัพธ์ให้เป็นสตริง:

"NaN,5,2,5,2,5,2,5,2,5,2"

ในที่สุดเรามองหารูปแบบที่สั้นที่สุด1ของจำนวนเต็มคั่นด้วยเครื่องหมายจุลภาค (,\d+ ) เริ่มต้นทันทีหลังจาก "NaN" และทำซ้ำจนถึงจุดสิ้นสุดของสตริง:

match(/N((,\d+)*?)\1*$/)

1: การใช้ความโลภ *?


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

1
53 /(,.+?)\1*$/ไบต์:
Neil

6

Brachylogขนาด 11 ไบต์

s₂ᶠ-ᵐṅᵐ~j₍t

ลองออนไลน์!

จะเป็น 5 ไบต์หากมีในตัวสำหรับความแตกต่างติดต่อกัน

คำอธิบาย

Example input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] 

s₂ᶠ             Find all substrings of length 2: [[6,11],[11,13],…,[34,39],[39,41]]
   -ᵐ           Map subtraction: [-5,-2,-5,-2,-5,-2,-5,-2,-5,-2]
     ṅᵐ         Map negate: [5,2,5,2,5,2,5,2,5,2]
       ~j₍      Anti-juxtapose the list of differences; the shortest repeated list is found
                  first, with the biggest number of repetitions: [5,[5,2]]
            t   Tail: [5,2]

คุณสามารถปฏิเสธหลังจากหางเพื่อบันทึก byte?
ร็อด

@ ฉันจะยังคงต้องแมปแผนที่ดังนั้นมันจะมีความยาวเท่ากัน Negate เป็นเพรดิเคตระหว่างตัวเลขสองตัวมันไม่ vectorize โดยอัตโนมัติไปยังรายการเช่นภาษาอื่น ๆ (มิฉะนั้นมันจะทำงานได้ไม่ดีกับอินพุต / เอาท์พุตที่ไม่รู้จักซึ่งพบได้ทั่วไปในโปรแกรมที่ประกาศ)
Fatalize

5

Pyth, 11 ไบต์

<J.+Qf.<IJT

ลองที่นี่

คำอธิบาย

<J.+Qf.<IJT
 J.+Q          Call the sequence of differences in the input J.
     f         Find the first positive integer T...
      .<IJT    ... where rotating J by T doesn't change it.
<J             Take that many elements of J.


5

R , 49 46 ไบต์

โปรแกรมเต็มรูปแบบ:

d=diff(scan());while(any((s=d[1:T])-d))T=T+1;s

ลองออนไลน์!

R , 72 58 54 ไบต์

การส่งฟังก์ชั่นดั้งเดิมพร้อมเคสทดสอบทั้งหมดในที่เดียว:

function(a,d=diff(a)){while(any((s=d[1:T])-d))T=T+1;s}

ลองออนไลน์!

ขอบคุณ JayCe สำหรับการแนะนำเส้นทางโปรแกรมแบบเต็มและ -4 ไบต์บนฟังก์ชั่นและสำหรับ Giuseppe อีก -3



@JayCe ไม่ต้องการa<-ที่นี่ด้วย
Giuseppe

4

J , 22 19 ไบต์

บันทึก 3 ไบต์ด้วย FrownyFrog!

0{"1[:~./:|."{}.-}:

ลองออนไลน์!

[ลองออนไลน์!] [TIO-ji2uiwla]

อย่างไร?

                 -      find the successive differences by subtracting 
                  }:    the list with last element dropped
               }.       from the list with the first element dropped 
           |."{         rotate the list of differences
         /:             0..length-1 times (the input graded up)
     [:~.               remove duplicating rows
 0{"1                   take the first element of each row

หากคุณ/:แทนคุณ#\สามารถ0{"1[:~.บันทึก 1 ไบต์
FrownyFrog

และ"0 1เป็น"{
FrownyFrog

@FrownyFrog ขอบคุณอีกครั้ง!
Galen Ivanov

1
นี่คือรูปหล่อ
Jonah

@Jonah ใช่ขอบคุณ FrownyFrog!
Galen Ivanov

4

05AB1E , 8 ไบต์

ที่บันทึกไว้ 3 ไบต์ต้องขอบคุณเควิน Cruijssen

¥.œʒË}нн

ลองออนไลน์!


05AB1E , 11 ไบต์

āεI¥ô}ʒË}нн

ลองออนไลน์!

āεI¥ô} ʒË} ннโปรแกรมเต็มรูปแบบ
āช่วงความยาว กด [1 ... len (inp)]
 ε} สำหรับแต่ละ ...
  ฉัน ... ô ... สับเดลตาเป็นชิ้นขนาดเท่ากัน
      ʒË} รักษาเฉพาะผู้ที่มีองค์ประกอบทั้งหมดเท่ากัน
         ннและเรียกองค์ประกอบแรกขององค์ประกอบแรก

13 ไบต์

ทางเลือกที่น่ารัก IMO:

¥©ηʒDg®ôÙ˜Q}н

ลองออนไลน์!

¥©ηʒDg®ôÙ˜Q}н   Full program.
¥               Push the deltas.
 ©              Copy them to the register.
  ηʒ       }    And filter the prefixes by...
    D     Q     ... Is the prefix itself equal to...
     g®ô        ... The deltas, split into chunks of its length...
        Ù˜      ... Deduplicated and flattened?
            н   Head.

1
8 ไบต์โดยใช้
Kevin Cruijssen

3

Javascript, 49 56ไบต์

แก้ไขแล้วขอบคุณ 7 ไบต์บันทึก (เดาว่าใคร?) Arnauld

แนวคิด regex เดียวกันกับ Arnauld แต่มีความแตกต่างกันอย่างมากในการนำไปใช้ ...

การส่งคืนสตริงโดยคั่นด้วยเครื่องหมายจุลภาคตามขั้นตอน (และเครื่องหมายจุลภาคนำหน้า)

p=>/N(.+?)\1+$/.exec(p.map(p=v=>[v-p,p=v][0]))[1]

ทดสอบ

var F=
p=>/N(.+?)\1+$/.exec(p.map(p=v=>[v-p,p=v][0]))[1]

;[[1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]
,[1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28]
,[6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] 
,[2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47]
,[5, 6, 7]]
.forEach(x=>console.log(x + ' -> ' + F(x)))


การใช้matchเป็นการตัดสินใจที่ไม่ดีของฉัน คุณสามารถเอาชนะฉันได้มากกว่านี้อีกแล้ว :-)
Arnauld

3

MATL , 14 13 12 ไบต์

dt5YLFTF#Xu)

ลองออนไลน์!

เพิ่งค้นพบว่า MATL มีฟังก์ชั่นการไหลเวียนโลหิต!

คำอธิบาย

d - รับความแตกต่างระหว่างคำที่ต่อเนื่องกันเป็นอาร์เรย์

t5YL- ทำซ้ำนั้นจากนั้นเรียกใช้YLฟังก์ชัน ('แกลเลอรี') พร้อมด้วย5ตัวเลือก ('circulant') สร้างเมทริกซ์ที่มีเวกเตอร์ที่กำหนดเป็นแถวแรกจากนั้นแถวที่ต่อเนื่องกันจะเป็นเวกเตอร์เดียวกันเลื่อนเป็นวงกลมจนกว่ามันจะล้อมรอบ

FTF#Xu- ตรวจสอบแถวที่ไม่ซ้ำกันและรับหมายเลขแถวของพวกเขา (ไม่แน่ใจว่ามีวิธีที่สั้นกว่าในการทำเช่นนี้) เมื่อทำซ้ำขั้นตอนตามลำดับแถวที่เลื่อนเป็นวงกลมจะเหมือนกับแถวแรกและแถวที่ตามมาจะถูกทำซ้ำ นี่จะได้ดัชนีของการดำเนินการตามลำดับแรกก่อนที่จะเริ่มทำซ้ำ

) - ทำดัชนีโดยใช้สิ่งนั้นในอาร์เรย์ผลต่างเดิมเพื่อรับคำตอบ


เก่า:

d`tt@YS-a}@:)

ลองออนไลน์!

(-1 ไบต์ขอบคุณ Giuseppe)

คำอธิบาย:

d   % Get the differences between successive terms, as an array
`   % Start do-while loop
  tt  % duplicate the difference array twice
  @   % push the current loop index value
  YS  % circularly shift the difference array by that amount
  -   % subtract the shifted diffs from the original diffs
  a   % see if the subtraction resulted in any non-zeros
    % if it did, shifted differences were not equal to original differences, so continue loop 
}@ % if it didn't, then get loop index
:) % get the differences upto the loop index, before they started repeating
   % implicit loop end

2

Python 2 , 101 ไบต์

def f(l):d=[y-x for x,y in zip(l,l[1:])];g=len(l);print[d[:k]for k in range(1,g+1)if g/k*d[:k]==d][0]

ลองออนไลน์!

ขั้นแรกสร้าง deltas dจากนั้นค้นหาคำนำหน้าแรกpของdที่เมื่อซ้ำ⌊len (L) / len (p) ⌋คูณอัตราผลตอบแทนLโดยLคือLที่รายการอินพุต


2

ทับทิม , 62 ไบต์

อาศัยตรรกะ Regex ดัดแปลงมาจากคำตอบของ Arnauld

->a{i=-2;a.map{|x|(i+=1)>=0?x-a[i]:0}*?,=~/((,\d+)*?)\1*$/;$1}

ลองออนไลน์!

การพิจารณาทางเลือกของความแตกต่างของขั้นตอน 62 ไบต์เช่นกัน:

->a{[0,*a.each_cons(2).map{|x,y|y-x}]*?,=~/((,\d+)*?)\1*$/;$1}

ลองออนไลน์!


2

Java 10, 104 100 ไบต์

a->{var t="";for(int i=a.length;i-->1;t+=a[i]-a[i-1]+" ");return t.replaceAll("( ?.+?)\\1*$","$1");}

Regex ( ?.+?)\1*$สำหรับสตริงย่อยซ้ำที่สั้นที่สุดจาก@Neil 'แสดงความคิดเห็นเมื่อวันที่@Arnauld ' JavaScript (ES6) คำตอบของ

ลองออนไลน์

คำอธิบาย:

a->{                        // Method with integer-array parameter and String return-type
  var t="";                 //  Temp-String, starting empty
  for(int i=a.length;i-->1; //  Loop backward over the input-array, skipping the first item
    t+=a[i]-a[i-1]          //   Calculate the difference between two adjacent items
       +" ");               //   And append this with a space to the temp-String
  return t.replaceAll("( ?.+?)\\1*$", 
                            //  Find the shortest repeating substring
                     "$1");}//  And only keep one such substring

1

APL + WIN, 39 ไบต์

พรอมต์สำหรับอินพุต

(↑((⍴v)=+/¨(⊂v)=(⍳⍴v)⌽¨⊂v)/⍳⍴v)↑v←-2-/⎕

ลองออนไลน์! ความอนุเคราะห์จาก Dyalog Classic

คำอธิบาย:

v←-2-/⎕ Prompt for input and take successive differences

(⍳⍴v)⌽¨⊂v create a nested vector ans sequentially rotate by one to length of v

+/¨(⊂v)= compare to original v and sum positions where there is match

(⍴v)= identify where all elements match

(↑(....) identify number of rotations giving a first complete match

(↑(...)↑v take first number of elements from above from v as repeated sequence


1

เรติน่า 0.8.2 , 42 ไบต์

\d+
$*
(?<=(1+),)\1

1+(.+?)\1*$
$1
1+
$.&

ลองออนไลน์! ลิงค์รวมถึงกรณีทดสอบ เอาท์พุทรวมถึงจุลภาคชั้นนำ คำอธิบาย:

\d+
$*

แปลงเป็นเอก

(?<=(1+),)\1

คำนวณความแตกต่างไปข้างหน้ายกเว้นตัวเลขแรกที่เหลืออยู่

1+(.+?)\1*$
$1

ตรงกับความแตกต่างที่ทำซ้ำ

1+
$.&

แปลงเป็นทศนิยม


1

05AB1E , 14 13 ไบต์

¥DηvÐNƒÁ}QD—#

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

ฉันรู้ว่ามี05AB1E สั้นกว่าสองคำตอบที่โพสต์โดย@ Mr.Xcoderแต่ฉันต้องการลองวิธีทางเลือกนี้โดยใช้การหมุนและการตรวจสอบความเท่าเทียมกัน
อาจจะสามารถเล่นกอล์ฟได้สองสามไบต์โดยไม่ต้องวางÁอาจจะสามารถกอล์ฟมันลงไม่กี่ไบต์โดยไม่ต้องวาง

-1 ไบต์หลังส่วนปลายของ@Emignaเพื่อลบการลงทะเบียน global_variable ( ©และ 2x ®) และใช้ Duplicate ( D) และ Triplicate ( Ð) แทน

คำอธิบาย:

¥             # Calculate the deltas of the input-array
              #  i.e. [1,2,3,5,6,7,9] → [1,1,2,1,1,2]
 D            # Duplicate it
  η           # Push all its prefixes
              #  [1,1,2,1,1,2] → [[1],[1,1],[1,1,2],[1,1,2,1],[1,1,2,1,1],[1,1,2,1,1,2]]
v             # For-each over these prefixes
 Ð            #  Triplicate the (duplicated) deltas-list
  NƒÁ}        #  Rotate the deltas-list N+1 amount of times,
              #  where N is the prefix index (== prefix_length-1)
              #   i.e. [1,1,2] and [1,1,2,1,1,2] (rotate 3 times) → [1,1,2,1,1,2]
      Q       #  If the rotated deltas and initial deltas are equal
              #   [1,1,2,1,1,2] and [1,1,2,1,1,2] → 1
       D—#    #  Print the current prefix-list, and stop the for-each loop

1
นี่คือ 9 (คำตอบแยกต่างหากเนื่องจากมันเป็นสัญลักษณ์ที่แตกต่างกันมากแม้ว่ามันจะแบ่งปัน¥η)
Grimmy

@Grimy คุณจะทำตามคำตอบทั้งหมดของฉัน 05AB1E และเล่นกอล์ฟแต่ละคำใช่มั้ย? ; p คำตอบที่ดี แต่ (อีกครั้ง) +1 จากฉัน
Kevin Cruijssen

1
ไม่ใช่ทุกคนฉันแค่ผ่านสิ่งที่เชื่อมโยงในโพสต์นี้
Grimmy

@Grimy Ah ตกลงที่เหมาะสม :)
Kevin Cruijssen

1

Haskell, 107 ไบต์

let i=map(uncurry(-))$zip(tail x)(init x)in head$filter(\s->take(length i)(concat$repeat s)==i)(tail$inits i)

x คืออาร์เรย์อินพุต


ยินดีต้อนรับสู่การเล่น PPCG และ Haskell โดยเฉพาะ! คุณไม่สามารถสันนิษฐานได้ว่าการป้อนข้อมูลที่จะนำเสนอในตัวแปรบางอย่างแม้ว่าจะได้รับการแก้ไขได้อย่างง่ายดายโดย f x=prepending นอกจากนี้การใช้งานinitsต้องimport Data.Listไม่เป็นส่วนหนึ่งของโหมโรง: ลองออนไลน์!
Laikoni

อย่างไรก็ตามคุณสามารถบันทึกได้ไม่กี่ไบต์: (init x)อาจเป็นxเพราะการzipตัดโดยอัตโนมัติหากรายการใดรายการหนึ่งยาวกว่าอีกรายการหนึ่ง และสำหรับการอยู่แล้วสร้างใน:map(uncurry(-))$zip zipWith(-)แทนการที่คุณสามารถใช้ยามรูปแบบ:f x=let i=...inf x|i<-...=
Laikoni

นอกจากนี้คุณสามารถใช้ list comprehension แทนfilter, !!0แทนที่จะเป็น, headและลองcycleแทนconcat$repeat: ลองออนไลน์!
Laikoni

@Laikoni ขอบคุณมากสำหรับการปรับปรุงของคุณ! คุณถูกต้องรหัสของฉันต้องการการประกาศฟังก์ชั่นและการนำเข้าสำหรับ Data.List.inits แต่ฉันสงสัยว่าควรเพิ่มความยาวของรหัสหรือไม่ ฉันถามเพราะตัวอย่างโค้ดอื่น ๆ บางตัวอย่างก็ใช้โค้ดพิเศษเช่นกัน
misja111

ใช่มันเป็นฉันทามติทั่วไปที่ไบต์เหล่านั้นรวมอยู่ในคะแนน เรามีคำแนะนำเกี่ยวกับกฎการเล่นกอล์ฟใน Haskellซึ่งครอบคลุมถึงกรณีเหล่านี้ส่วนใหญ่
Laikoni

1

Stax , 8 6 ไบต์

░»F\☺»

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

ต่อไปนี้เป็นเวอร์ชันที่มีคำอธิบายประกอบที่ไม่ได้แยกไฟล์เพื่อแสดงวิธีการทำงาน

:-  pairwise differences
:(  all leftward rotations of array
u   keep only unique rotations
mh  output the first element from each unique rotation

เรียกใช้อันนี้


1

Perl 6 , 57 ไบต์

{~(.rotor(2=>-1).map:{.[1]-.[0]})~~/^(.+?){}" $0"+$/;~$0}

ทดสอบมัน

เอาท์พุทเป็นช่องว่างคั่น ("1 1 2" )

ขยาย:

{      # bare block lambda with implicit parameter $_

  ~(   # stringify (space separated)

    .rotor( 2 => -1 )     # from the input take 2 backup 1, repeat
    .map: { .[1] - .[0] } # subtract each pair to find the differences
  )

  ~~   # smartmatch

  /    # regex

    ^  # beginning of string

    ( .+? ) # match at least one character, but as few as possible
    {}      # make sure $0 is set (probably a compiler bug)
    " $0"+  # match $0 one or more times (with a leading space)

    $  # end of string
  /;

  ~$0  # return the stringified $0
}

ส่วนแรกทั้งหมดสามารถ~(.skip Z-$_)
Jo King

1

05AB1E , 9 ไบต์

¥©η.ΔÞ®Å?

คำอธิบาย:

          # take input implicitly
¥         # deltas, eg [4, 5, 7, 8, 10] -> [1, 2, 1, 2]
 ©        # save this to the global register
  η       # prefixes, eg [1, 2, 1, 2] -> [[1], [1, 2], ...]
   .Δ     # find the first one such that
     Þ    # cycled infinitely, eg [1, 2] -> [1, 2, 1, 2, ...]
       Å? # starts with
      ®   # the global register
          # and implicitly print the found element

ทางเลือก 9 ไบต์:

¥η.ΔÞ.¥-Ë

ชื่อเดียวกัน แต่แทนที่จะเปรียบเทียบกับรายการของ deltas (ซึ่งจำเป็นต้องได้รับการบันทึก / กู้คืน) การใช้นี้(undelta) จะเปรียบเทียบกับอินพุต (โดยนัย)

ลองออนไลน์!


0

K4 , 30 ไบต์

วิธีการแก้:

(*&d~/:c#'(!c:#d)#\:d)#d:1_-':

ตัวอย่าง:

q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20
3 1 1 1
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17
1 1 2
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28
3 4 1 1
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41
5 2
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47
4 4 3 4
q)k)(*&d~/:c#'(!c:#d)#\:d)#d:1_-':5 6 7
,1

คำอธิบาย:

ดูเหมือนว่าหนักสำหรับสิ่งที่เรากำลังพยายามแก้ไข รับ delta ของอินพุตจากนั้นสร้างลำดับและกำหนดสั้นที่สุดที่ตรงกับมัน

(*&d~/:c#'(!c:#d)#\:d)#d:1_-': / the solution
                           -': / deltas 
                         1_    / drop first
                       d:      / save as d
                      #        / take (#) from
(                    )         / do this together
                 #\:d          / take (#) each-left (\:) from d
          (     )              / do this together
              #d               / count length of d
            c:                 / save as c
           !                   / range 0..c-1
       c#'                     / take c copies of each
   d~/:                        / d equal (~) to each right (/:)
  &                            / where true
 *                             / first one


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