สร้างลำดับเลขคณิตอีกครั้ง


23

ให้ลำดับเลขคณิตของจำนวนเต็มบวกที่มีเงื่อนไขบางอย่างถูกลบออกจากตรงกลางสร้างลำดับใหม่ทั้งหมด

งาน

พิจารณาลำดับเลขคณิต: รายการของจำนวนเต็มบวกที่ความแตกต่างระหว่างองค์ประกอบต่อเนื่องสองค่าเท่ากัน

2 5 8 11 14 17

ตอนนี้สมมติว่าหนึ่งหรือมากกว่าจำนวนเต็มถูกลบออกจากลำดับภายใต้ข้อ จำกัด ดังต่อไปนี้:

  • จำนวนเต็มที่ถูกลบออกจะเป็นเงื่อนไขลำดับที่ต่อเนื่องกัน
  • จำนวนเต็มแรกและสุดท้ายในลำดับจะไม่ถูกลบ
  • อย่างน้อยสามจำนวนเต็มจะยังคงอยู่ในลำดับ

สำหรับลำดับข้างต้นการลบที่เป็นไปได้รวมถึง:

2 5 8 14 17  (removed 11)
2 5 17       (removed 8 11 14)
2 14 17      (removed 5 8 11)

งานของคุณ: กำหนดหนึ่งในลำดับบางส่วนเหล่านี้ให้สร้างลำดับเต็มต้นฉบับใหม่

รายละเอียด

คุณอาจสมมติว่าอินพุตถูกต้อง (มีวิธีแก้ไข) และขาดอย่างน้อยหนึ่งคำ ตัวเลขทั้งหมดในลำดับจะเป็นจำนวนเต็มบวก (> 0) ลำดับอาจมีความแตกต่างในเชิงบวกหรือเชิงลบระหว่างคำ (เช่นมันอาจจะเพิ่มขึ้นหรือลดลง) มันจะไม่เป็นลำดับคงที่ (เช่น5 5 5)

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

อินพุตและเอาต์พุตของคุณอาจเป็นสตริง (พร้อมตัวคั่นที่เหมาะสม) รายการสตริงหรือรายการตัวเลข คุณอาจแสดงตัวเลขในฐานใดก็ได้ที่สะดวกสำหรับภาษาของคุณ

โปรดพูดถึงวิธี / รูปแบบ I / O ที่ผิดปกติใด ๆ ในการส่งของคุณดังนั้นผู้อื่นจะสามารถทดสอบโค้ดของคุณได้ง่ายขึ้น

กรณีทดสอบ

In: 2 5 8 14 17
Out: 2 5 8 11 14 17
In: 2 5 17
Out: 2 5 8 11 14 17
In: 2 14 17
Out: 2 5 8 11 14 17
In: 21 9 6 3
Out: 21 18 15 12 9 6 3
In: 10 9 5
Out: 10 9 8 7 6 5
In: 1 10 91 100
Out: 1 10 19 28 37 46 55 64 73 82 91 100

นี่คือ ; คำตอบที่สั้นที่สุดในแต่ละภาษาชนะ



จะน่าสนใจที่จะมีการป้อนข้อมูลในรูปแบบ2 5 ... 17
schnaader

คำตอบ:


9

Haskell , 63 ไบต์

f(a:b:c)|s<-[a,b..last c],all(`elem`s)c=s
f a=r$f$r a
r=reverse

ลองออนไลน์!

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

แก้ไข: ขอบคุณ @xnor สำหรับการชี้จุดบกพร่องและให้บริการโซลูชั่น!


5
แต่นี้เป็นสวยก็ดูเหมือนว่ามันไม่เคยทำงาน: ช่วยให้[1,3,4,5] [1,3,5]
xnor

1
และฉันคิดว่าall(`elem`s)cควรแก้ไขด้วยจำนวนไบต์เดียวกัน
xnor

6

05AB1E , 9 8 ไบต์

Ÿs¥¿Äô€н

ลองออนไลน์!

คำอธิบาย

  • สร้างช่วง [แรก, ... , สุดท้าย] ด้วยความแตกต่างของ +/- 1
  • คำนวณ delta ของอินพุต
  • รับค่าสัมบูรณ์ของ gcd ของ deltas
  • แยกช่วงเต็มเป็นส่วน ๆ ของขนาดนั้น
  • รับองค์ประกอบแรกของแต่ละอัน

บันทึก 1 ไบต์โดยใช้gcd of deltasแทนที่จะเป็นmin deltaแรงบันดาลใจจากuser202729


5

Brachylog v2, 9 ไบต์

⊆.s₂ᵇ-ᵐ=∧

ลองออนไลน์!

นี่คือการส่งฟังก์ชั่น Brachylog interpreter สามารถประเมินฟังก์ชั่นราวกับว่ามันเป็นโปรแกรมเต็มรูปแบบโดยให้มันZเป็นอาร์กิวเมนต์บรรทัดคำสั่ง; ในกรณีนี้การป้อนข้อมูลที่ระบุไว้ในรูปแบบเช่นและผลผลิตจะถูกส่งกลับในรูปแบบที่คล้ายกันเช่น[1, 2, 4] Z = [1, 2, 3, 4](แน่นอนสำหรับการส่งฟังก์ชั่นอินพุทและเอาท์พุทไม่ได้อยู่ในรูปแบบใด ๆ เลยมันเป็นแค่รายการ)

สิ่งนี้แก้ปัญหาได้ยากกว่าที่ OP ต้องการ: มันทำงานตามลำดับเลขคณิตที่สั้นที่สุดของจำนวนเต็มที่มีค่าที่ระบุในลำดับที่ระบุโดยไม่คำนึงว่าการลบนั้นจะต่อเนื่องกันหรือไม่ เนื่องจากใช้แรงเดรัจฉานมันอาจช้ามากหากลบค่าจำนวนมาก

คำอธิบาย

โปรแกรมมีสามส่วนหลัก

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

.... ใช้เพื่อส่งออกค่าที่เห็นเป็นอินพุต (เช่น supersequence ในกรณีนี้) แต่ยังยืนยันว่ามีเงื่อนไขที่เฉพาะเจาะจงถืออยู่ กล่าวอีกนัยหนึ่งเรากำลังแสดงผลการแสดงภาพซ้อนสั้นที่สุดที่เป็นไปตามเงื่อนไขที่ระบุ (และไม่สนใจผลลัพธ์ระดับกลางใด ๆ ที่ใช้เพื่อดูว่าเป็นไปตามเงื่อนไขหรือไม่)

ในที่สุดเรามีs₂ᵇ-ᵐ =คือ "เดลต้าทั้งหมดของลำดับที่เท่ากัน" เงื่อนไขที่เราใช้กับการส่งออก (ค่าส่งคืนจากสิ่งนี้คือรายการของ deltas มากกว่า supersequence เองซึ่งเป็นสาเหตุที่เราต้องการ.... เพื่อให้แน่ใจว่าสิ่งที่ถูกต้องคือผลลัพธ์)

Brachylog ถูกระงับไว้ที่นี่โดยไม่มีบิวอินใด ๆ ที่สามารถจัดการการคำนวณของเดลตาการใช้การดำเนินการกับคู่ที่ทับซ้อนกันจากรายการหรือสิ่งที่คล้ายกัน แต่เราจะต้องพูดในสิ่งที่เราหมายถึงอย่างชัดเจน: s₂ᵇพบทั้งหมด ( ) สตริง ( s) ความยาว 2 ( ) (ใช้จะต้องให้การเชื่อมโยงระหว่างราชวงศ์ในสตริงและใน supersequence นั้นมากขึ้นที่ใช้กันทั่วไปจะทำลายนี้ link) จากนั้น-ᵐทำการลบแต่ละคู่เหล่านี้เพื่อสร้างเดลต้า มันน่ารำคาญที่ต้องเขียนออกมาห้าไบต์s₂ᵇ-ᵐสำหรับบางสิ่งที่ภาษาการเล่นกอล์ฟที่ทันสมัยส่วนใหญ่มี builtin สำหรับ แต่นั่นเป็นวิธีที่ codegolf ไปบางครั้งฉันเดา


4

Python 2, 104 97 89 83 71 67 60 ไบต์

ขอบคุณChas Brownสำหรับการบันทึก 4 ไบต์
ขอบคุณovsสำหรับการบันทึก 7 ไบต์

ป้อนรายการตามอาร์กิวเมนต์

lambda a,b,*c:range(a,c[-1],min(b-a,c[0]-b,key=abs))+[c[-1]]

ลองออนไลน์!

คำอธิบาย:

เนื่องจากการลบนั้นต่อเนื่องกันมันก็เพียงพอที่จะตรวจสอบความแตกต่างระหว่างสององค์ประกอบต่อเนื่องกัน


คุณสามารถบันทึก 3 ไบต์โดยการแทนที่ด้วยb if b%c else c [c,b][b%c>0]
Chas Brown

@ChasBrown ขอบคุณแม้ว่าฉันจะมาด้วยวิธีที่ดีกว่า
Colera Su

1
ยินดีด้วยkey=abs! ดูเหมือนว่าที่นี่ประชาชนมักจะละเว้นf=ส่วนนี้เว้นแต่จะใช้ฟังก์ชั่นวนซ้ำ เพื่อให้คุณสามารถบันทึก 2 ไบต์ด้วยวิธีนี้
Chas Brown

1
นอกจากนี้ให้แทนที่a[-1]-a[-2]ด้วยa[2]-a[1]- ตรรกะนั้นเหมือนกันและคุณจะได้รับอีก 2 ไบต์
Chas Brown


4

Pyth , 11 ไบต์

%hS.+SQ}hQe

ลองที่นี่!

ขอบคุณSteven H.สำหรับการบันทึกไบต์!

Pyth , 12 ไบต์

%.aiF.+Q}hQe

ลองที่นี่!

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

%. aai. + Q} hQe ~ โปรแกรมเต็มรูปแบบ

     . + Q ~ รับ delta
   iF ~ ลดขนาดด้วย GCD
 .a ~ ค่าสัมบูรณ์
% ~ Modular รับทุกองค์ประกอบที่ n ของ ...
        } ~ ช่วงตัวเลขรวมระหว่าง ...
         hQ ~ องค์ประกอบแรกและ ...
           e ~ องค์ประกอบสุดท้าย

Qเรียงลำดับล่วงหน้าเพื่อให้คุณสามารถเรียงลำดับและใช้องค์ประกอบแรกแทนabs(GCD(Q))เป็น%hS.+SQ}hQe11 ไบต์ ชุดทดสอบ
Steven H.

3

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

ṂrṀmIg/$

ลองออนไลน์!

หมายเหตุ:

  • ใช้งานได้กับเจลลี่เวอร์ชันเก่าเท่านั้น ( สิ่งนี้คอมมิทตัวอย่าง) (โดยการgใช้fractions.gcd, ซึ่งมีเครื่องหมายผลลัพธ์เหมือนกับสัญญาณอินพุต, แทนที่จะmath.gcd, ซึ่งส่งคืนค่าบวกเสมอ)

  • ลิงก์ TIO ด้านบนคือลิงค์ Python 3 TIO รหัส Python ประกอบด้วย Jelly source code จากคอมมิทที่กล่าวถึงข้างต้นยกเว้นทุกอย่าง (3 ไฟล์) ที่บรรจุในไฟล์เดียวกัน (เพื่อให้ TIO ทำงาน) และdictionary.pyลดลงเป็น มีเพียงบางบรรทัด อย่างไรก็ตามdictionary.pyไม่เกี่ยวข้องกับคำตอบนี้เนื่องจากไม่ได้ใช้สตริงที่บีบอัด ( “...»โครงสร้าง)

คำอธิบาย:

ข้อแรกเนื่องจากส่วนที่ต่อเนื่องจะถูกลบและยังคงมีองค์ประกอบอย่างน้อย 3 รายการมีหมายเลขติดต่อกันสองรายการในรายการเก่าที่ยังคงอยู่และส่วนที่เหลือจะเป็นทวีคูณของขั้นตอน ดังนั้นรายการgcdความแตกต่าง ( Iเพิ่มขึ้น) จะเป็นค่าสัมบูรณ์ของขั้นตอน

โชคดีที่gcdมีการลงนาม (ดูหมายเหตุด้านบน)

ดังนั้นโปรแกรมทำ:

ṂrṀ

ช่วงจำนวนเต็มเพิ่มขึ้นจากinimum เป็นaximum

m

แบบแยกส่วนเลือกทุกองค์ประกอบ

Ig/$

การรวม Monadic ( $) chain I(การเพิ่มขึ้น, ผลต่าง) และg/(ลดgcdองค์ประกอบของรายการ) หากการเพิ่มขึ้นเป็นบวกgcdจะเป็นบวกและรายการที่ส่งคืนจะเป็นจากซ้ายไปขวา (เพิ่มขึ้น) และในทางกลับกัน


เย้! เอาชนะคำตอบที่ 05AB1E โดย 1 ไบต์!
user202729

ใช้gcdแทนminทำให้เราผูก น่าเสียดายที่ฉันได้รับ gcd ที่มีสัญลักษณ์มิฉะนั้นฉันจะอยู่ที่ 7;)
Emigna

3

MATL , 13 ไบต์

1)0GdYkG0)3$:

ลองออนไลน์!

คำอธิบาย:

Consider the example input [2 14 17]:
           # implicit input, STACK: [[2 14 17]]
1)         # push 1, index, STACK: [2]
0G         # push 0, duplicate input, STACK: [2, 0, [2 14 17]]
d          # take differences, STACK: [2, 0, [12, 3]]
Yk         # get value in [12, 3] nearest to 0, STACK: [2, 3]
G0)        # get last element in input, STACK: [2, 3, 17]
3$:        # 3-input :, computes 2:3:17, the range from 2 to 17 by 3
           # STACK: [[2 5 8 11 14 17]], implicit output.


3

JavaScript (ES6), 92 90

แก้ไข 2 ไบต์บันทึก thx Arnauld

ง่ายเพราะมันเพียงพอที่จะตรวจสอบความแตกต่างระหว่างสองคนแรกและสองคนสุดท้าย แต่ก็ยังคงยาวอย่างไม่น่าเชื่อ

s=>(e=(z=s.pop(a=s[0]))-s.pop(d=s[1]-a),[...Array((z-(a-=d=e*e>d*d?d:e))/d)].map(_=>a+=d))

น้อย golfed

s=>{
  a =s[0]
  b =s[1]
  z = s.pop()
  y = s.pop()
  d = b-a
  e = z-y
  d = e*e>d*d?d:e  
  n = (z-a)/d+1
  return [...Array(n)].map((_,i) => a + i*d)
}

ทดสอบ

var F=
s=>(e=(z=s.pop(a=s[0]))-s.pop(d=s[1]-a),[...Array((z-(a-=d=e*e>d*d?d:e))/d)].map(_=>a+=d))

var test=`In: 2 5 8 14 17 Out: 2 5 8 11 14 17
In: 2 5 17 Out: 2 5 8 11 14 17
In: 2 14 17 Out: 2 5 8 11 14 17
In: 21 9 6 3 Out: 21 18 15 12 9 6 3
In: 10 9 5 Out: 10 9 8 7 6 5
In: 1 10 91 100 Out: 1 10 19 28 37 46 55 64 73 82 91 100`.split`\n`
.map(r=>r.split`Out`.map(x=>x.match(/\d+/g)))

test.forEach(([i,k])=>{
  var o=F(i.slice(0))
  var ok = o+''==k
  console.log(ok?'OK':'KO',i+' => '+o)
})


a-=d=e*e>d*d?d:eควรทำงานและบันทึก 2 ไบต์
Arnauld

@Arnauld ใช้งานได้จริงขอบคุณ
edc65

2

ภาษา Wolfram (Mathematica) , 50 ไบต์

Range[#&@@#,#[[-1]],#&@@Differences@#~SortBy~Abs]&

ลองออนไลน์!


"รายการตัวเลข" รวมถึงการมีตัวเลขเป็นอาร์กิวเมนต์แต่ละตัวหรือไม่? ถ้าเป็นเช่นนั้นดูเหมือนว่าคุณสามารถบันทึกจำนวนไบต์ได้ดี
numbermaniac

@numbermaniac ฉันไม่คิดอย่างนั้นเนื่องจากไม่มี builtin ที่เรียกอินพุตสุดท้าย ...
JungHwan Min

อ่า ... จริง ลืมเรื่องนั้นไป
numbermaniac

คุณสามารถใช้{##}และLast@{##}แต่ที่ดีที่สุดที่ฉันจะได้รับด้วยนั่นก็คือ 51 ไบต์
numbermaniac


1

Haskell , 73 69 ไบต์

f(h:t)=do(#)<-[(-),(+)];[h,h#minimum(abs<$>zipWith(-)t(h:t))..last t]

ลองออนไลน์!


1
ฉันพบโซลูชัน 63 ไบต์แต่มันค่อนข้างแตกต่างจากของคุณ ฉันควรสร้างโพสต์แยกต่างหาก
user1472751

@ user1472751 ฉันไม่ใช่ Laikoni แต่ไซต์นี้มีไว้สำหรับการแข่งขันรวมถึงการทำงานร่วมกัน ดังนั้นฉันจะโพสต์มัน
H.PWiz

@ user1472751 วิธีการที่ดี! กรุณาไปข้างหน้าและโพสต์มันเป็นคำตอบของคุณเอง
Laikoni

1

J , 49, 47 46 ไบต์

(0-[:<./2|@-/\]){.@[&]\({.<.{:)+[:i.{:(+*)@-{.

แรงบันดาลใจจากโซลูชันของ Emigna

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

 (0-[:<./2|@-/\]){.@[&]\({.<.{:)+[:i.{:(+*)@-{. - fork of 3 verbs

                        ({.<.{:)+[:i.{:(+*)@-{. - generates a list in the entire range of values
                                     {:     -{. - last minus first element  
                                       (+*)@    - adds the signum of the difference
                                 [:i.           - makes a list 
                       ({.<.{:)                 - the smallest of first and last elements                                     
                               +                - adds the offset to the list (translates all elements according to the first one)

 (0-[:<./2|@-/\])                               - finds the step
         2|@-/\]                                - the absolute differences between all consecutive elements
    [:<./                                       - the smallest one
  0-                                            - negate (for splitting)

                 {.@[&]\                        - splits the list from the right verb into left verb's result sublists and takes their first elements

ลองออนไลน์!


1

Husk , 9 ไบต์

m←C▼Ẋ≠⁰…⁰

ลองออนไลน์!

ขอบคุณมากที่H.PWizสำหรับการลดจำนวนไบต์ลงครึ่งหนึ่งด้วยการชี้ว่าการนำไปใช้ในรายการนั้นทำให้เป็นอันตราย! ...


@ HP.Wiz X_X ฉันไม่ทราบว่า Husk ทำรายการแบบนี้ ... คุณแน่ใจหรือว่าคุณไม่ต้องการโพสต์มันเป็นคำตอบแยกต่างหาก?
Mr. Xcoder

@ HP.Wiz ขอบคุณloooot !
นาย Xcoder

นอกจากนี้ยังสามารถF⌋ถูกแทนที่ด้วย?
H.PWiz

@ H.PWiz @ _ @ ทำไมถึงใช้งานได้
นาย Xcoder

ความแตกต่างที่เล็กที่สุด (สัมบูรณ์) จะเป็นความแตกต่างดั้งเดิม เหตุผลเพียงอย่างเดียวgcdคือการจัดการกับเดลต้าเชิงลบ
H.PWiz

1

C # (. NET Core) , 167 + 13 = 180 145 + 13 = 158 ไบต์

a=>{int x=a[1]-a[0],y=a[2]-a[1],d=x*x<y*y?x:y,s=Math.Abs((a[a.Length-1]-a[0])/d),i=0,j=a[0];var r=new int[s+1];for(;i<=s;j+=d)r[i++]=j;return r;}

ลองออนไลน์!

+13 สำหรับ using System;

น่าแปลกที่ความท้าทายนี้มีความแตกต่างมากกว่าที่ฉันคาดไว้ในตอนแรก

กิตติกรรมประกาศ

บันทึก -22 ไบต์เนื่องจากมีการทำให้เรียบง่ายอย่างประณีตจาก @DLosc

DeGolfed

a=>{
    int x = a[1]-a[0],        // difference between first and second numbers
        y = a[2]-a[1],        // difference between second to last and last numbers
        d = x*x < y*y? x : y, // smallest absolute value difference
        s = Math.Abs((a[a.Length-1] - a[0]) / d), // number of steps in the reconstructed sequence (not the number of elements)
        i = 0,                // step position
        j = a[0];             // next number in reconstructed sequence

    var r = new int[s+1];

    // reconstruct the sequence
    for(; i <= s; j+=d)
        r[i++]=j;

    return r;
}





0

Japt , 12 ไบต์

ÌõUg Uäa ñ g

ลองมัน


คำอธิบาย

สร้างอาร์เรย์ของจำนวนเต็ม ( õ) จากองค์ประกอบสุดท้ายของอาร์เรย์อินพุต ( Ì) ถึงแรก ( Ug) คำนวณขั้นตอนระหว่างองค์ประกอบโดยรับทั้งคู่องค์ประกอบจากอินพุตและลดพวกเขาด้วยความแตกต่างแน่นอน ( Uäa) แล้วการเรียงลำดับ ( ñ) อาร์เรย์และการรับองค์ประกอบแรก ( g)

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