ทำลำดับหนึ่ง


12

ลำดับของจำนวนเต็มเป็นหนึ่งในลำดับถ้าความแตกต่างระหว่างสองหมายเลขติดต่อกันในลำดับนี้คือ -1 หรือ 1 และองค์ประกอบแรกคือ 0

แม่นยำยิ่งขึ้น: a1, a2, ... , a เป็นลำดับเดียวหาก:

For any k (1 ≤  k < n): |a[k] - a[k+1]|=1, 
a[1]=0

อินพุต

  • n - จำนวนขององค์ประกอบในลำดับ
  • s - ผลรวมขององค์ประกอบในลำดับ

เอาท์พุต

  • ความยาวชุดลำดับ / รายการ / อาร์เรย์ / ฯลฯ ความยาวnด้วยผลรวมขององค์ประกอบsถ้าเป็นไปได้
  • การตั้งค่าที่ว่าง / รายการ / อาร์เรย์ / ฯลฯ หากไม่สามารถทำได้

ตัวอย่าง

สำหรับการป้อนข้อมูล8 4การส่งออกอาจจะเป็นหรือ[0 1 2 1 0 -1 0 1] [0 -1 0 1 0 1 2 1]อาจมีความเป็นไปได้อื่น ๆ

สำหรับอินพุต3 5เอาต์พุตจะว่างเปล่า[]เนื่องจากไม่สามารถทำได้

กฎระเบียบ

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


โดยวิธีการที่ฉันมีหลักฐานว่าตัวเลขทั้งหมด representable เป็นหนึ่งในลำดับของความยาวลิตรเป็นตัวเลขทั้งหมดระหว่าง(l-1)*l/2และที่มีความเท่าเทียมกันเช่นเดียวกับ-(l-1)*l/2 (l-1)*l/2
ภูมิใจ haskeller

สิ่งนี้สามารถใช้ในการสร้างอัลกอริทึมที่มีประสิทธิภาพ (O (n)) เพื่อสร้างลำดับที่ต้องการ
ภูมิใจ haskeller

คำตอบ:


7

CJam, 56 47 44 34 bytes

มีขอบเขตสำหรับการปรับปรุงมากมายที่นี่ แต่นี่เป็นครั้งแรกที่:

L0aa{{[~_(]_)2++}%}l~:N;(*{:+N=}=p

เครดิตเดนนิสสำหรับวิธีที่มีประสิทธิภาพในการทำ{ ... }%ส่วนหนึ่ง

พิมพ์การเป็นตัวแทนอาร์เรย์ถ้าเป็นไปได้มิฉะนั้น ""

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


ฉันสับสน: {}%ส่วนหนึ่งของรหัสของคุณดูเหมือนของฉัน (ซึ่งเป็นรหัสของ @ PeterTaylor แทนที่จุดด้วยเครื่องหมายขีดล่าง) ถ้าฉันมีส่วนร่วมในรหัสของคุณมันเป็น{}=โอเปอเรเตอร์ ...
Dennis

ตอนแรกฉันมี_{_W=)+}%\{_W=(+}%+ที่ทำสองชุดแรกเพิ่ม 1 ไปที่แรกลบ 1 จากอื่น ๆ ตัวอย่างของคุณทำให้ฉันเข้าใจวิธีการทำใน{ ... }%บล็อกเดียว เกี่ยวกับการ{ ... }=ฉันได้ลดลงมากที่ในการทดลองของฉันแม้ว่าจะยังไม่ได้โพสต์
เครื่องมือเพิ่มประสิทธิภาพ

ผมเข้าใจจากคำถามที่ได้รับการป้อนข้อมูล3 5การส่งออกที่ควรจะเป็น[]และไม่ได้""
ปีเตอร์เทย์เลอร์

1
@PeterTaylor "ชุดว่าง / รายการ / อาร์เรย์ / อื่น ๆ หากไม่สามารถทำได้" - ดังนั้นฉันคิดว่าฉันต้องทำให้ชัดเจน ...
เครื่องมือเพิ่มประสิทธิภาพ

พลัส[]pใน CJam ""เพียงเพื่อเอาท์พุท ดังนั้นวิธีการที่ภาษาหมายถึงอาร์เรย์ที่ว่างเปล่า
เครื่องมือเพิ่มประสิทธิภาพ

6

JavaScript (E6) 79 82

F=(n,t,
  d=n+n*~-n/4-t/2,
  l=1,
  q=[for(x of Array(n))d<n--?++l:(d+=~n,--l)]
)=>d?[]:q

ไม่ต้องการแรงเดรัจฉานหรือการแจกแจงของ tuples ทั้งหมด

ดูลำดับความยาวnเป็นn -1 ขั้นตอนแต่ละขั้นตอนเป็นการเพิ่มหรือลด
หมายเหตุคุณสามารถสลับการเพิ่มขึ้นเพื่อการลดลงเท่านั้นจำนวนรวมจะแปรผันตาม 2 ดังนั้นสำหรับความยาวที่กำหนดไว้ผลรวมจะเป็นเลขคู่หรือคี่เสมอ
มีการเพิ่มขึ้นทั้งหมดลำดับคือ 0, 1, 2, 3, ... , n-1 และเรารู้ว่าผลรวมคือ (n-1) * n / 2
การเปลี่ยนขั้นตอนสุดท้ายผลรวมจะเปลี่ยน 2 ดังนั้น ขั้นตอนสุดท้ายมีน้ำหนัก 2.
การเปลี่ยนขั้นตอนถัดไปเป็นขั้นสุดท้ายผลรวมจะเปลี่ยนเป็น 4 ดังนั้นขั้นตอนสุดท้ายจะมีน้ำหนัก 4 นั่นเป็นเพราะขั้นตอนต่อเนื่องสร้างตามผลรวมบางส่วนจนถึงตอนนี้
การเปลี่ยนขั้นตอนก่อนหน้านี้ผลรวมจะเปลี่ยน 6 ดังนั้นขั้นตอนสุดท้ายจะมีน้ำหนัก 6 (ไม่ใช่ 8 ไม่ใช่ตัวเลขไบนารี่)
...
การเปลี่ยนน้ำหนักขั้นตอนแรก (n-1) * 2

ขั้นตอนวิธี

Find the max sum (all increments)  
Find the difference with the target sum (if it's not even, no solution)  
Seq[0] is 0  
For each step  
  Compare current difference with the step weight
  if is less 
     we have an increment here, seq[i] = seq[i-1]+1 
  else 
     we have a decrement here, seq[i] = seq[i-1]-1.  
     Subtract we current weight from the current diff.
If remaining diff == 0, solution is Seq[]. Else no solution

รหัสไม่ได้รับการตอบ

F=(len,target)=>{
  max=(len-1)*len/2
  delta = max-target
  seq = [last=0]
  sum = 0
  weight=(len-1)*2
  while (--len > 0)
  {
    if (delta >= weight)
    {
      --last
      delta -= weight;
    }
    else
    {
      ++last
    }  
    sum += last
    seq.push(last);
    weight -= 2;
  }  
  if (delta) return [];
  console.log(sum) // to verify

  return seq
}

ทดสอบในคอนโซล Firefox / FireBug

F(8,4)

เอาท์พุต

[0, -1, 0, -1, 0, 1, 2, 3]

5

GolfScript ( 41 39 ไบต์)

[][1,]@~:^;({{.-1=(+.)))+}%}*{{+}*^=}?`

การสาธิตออนไลน์

ขอบคุณเดนนิสที่ 41-> 39


คุณสามารถร่นไป,0= ?พอร์ตตรงไปตรงมา CJam จะเป็น 5 ไบต์สั้น:L1,al~:S;({{_W=(+_)))+}%}*{:+S=}=p
เดนนิส

@Dennis oooh นั่นเป็นวิธีที่สะดวกในการนั่งสองบล็อก {}% ถ้าฉันใช้มัน
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer: ฉันทำไม่ได้ แต่มันไม่ใช่งานของฉันจริงๆ
เดนนิส

ฉันกำลังพูดถึง{ ... }%บล็อก ในรหัสของฉันฉันมีสองตัวพยายามลดให้เหลือ 1 อย่างที่อัลกอริธึมเกิดขึ้นจริงฉันคิดว่าทั้ง Peter และฉันโพสต์อัลกอริทึมเดียวกันเกือบจะพร้อมกัน
เครื่องมือเพิ่มประสิทธิภาพ

3

Mathematica, 73 ไบต์

f=FirstCase[{0}~Join~Accumulate@#&/@Tuples[{-1,1},#-1],l_/;Tr@l==#2,{}]&;

วิธีแก้ปัญหาแรงเดรัจฉานแบบง่าย

ฉันกำลังสร้างตัวเลือกขั้นตอนทั้งหมด จากนั้นฉันเปลี่ยนมันเป็นรายการสะสมเพื่อให้ได้ลำดับเดียว แล้วฉันกำลังมองหาอันแรกที่มีผลรวมเท่ากับพารามิเตอร์ตัวที่สอง หากมีบุหรี่, {}ค่าเริ่มต้นคือ


Mathematica แสดงความเห็นต่อปัญหาที่เกี่ยวข้องกับคณิตศาสตร์ / การรวมกันใช่ไหม? ;)
เครื่องมือเพิ่มประสิทธิภาพ

@ เครื่องมือวัดฉันมั่นใจว่า CJam จะชนะได้ ;) จริง ๆ แล้วอัลกอริทึมแบบเดียวกันนี้ไม่ควรยากที่จะทำใน CJam
Martin Ender

1
มันจะเอาชนะได้อย่างแน่นอน แต่เพียงเพราะชื่อวิธีการสั้น ๆ อัลกอริทึมจะไม่ตรงไปข้างหน้า
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ใช่มั้ย ฉันคิดว่ามันตรงไปตรงมากับลูปและตัวกรองที่ง่ายกว่าองค์ประกอบของฟังก์ชั่นนี้
Peter Taylor

3

Haskell, 56 ไบต์

n%s=[x|x<-scanl(+)0`map`mapM(\_->[1,-1])[2..n],s==sum x]

คำอธิบาย:

  • สร้างรายการด้วยพีชคณิตของ1,-1และความยาว n-1: replicateM n-1[-1,1]
    ตัวอย่าง: replicateM 2 [-1,1]==[[-1,-1],[-1,1],[1,-1],[1,1]]
  • สร้างลำดับหนึ่งออกมาจากมัน scanlมีประสิทธิภาพต่ำ แต่ทำงานได้ดีที่นี่
  • กรองลำดับเดียวที่เป็นไปได้ทั้งหมดด้วยความยาวnโดยรวมs

1
การปรับปรุงอย่างง่ายคือการเปลี่ยนฟังก์ชั่น infix นี่คือคำแนะนำในการปรับปรุงที่ไม่ได้ใช้งานง่ายขึ้น: การนำเข้าControl.Monadเฉพาะสำหรับการใช้งานreplicateMซึ่งยาวเกินไปแล้ว ฟังก์ชั่น monadic อื่น ๆ ที่คุณสามารถใช้ในการจำลองreplicateMคืออะไร?
ภูมิใจ haskeller

คุณควรส่งคืนโซลูชันเดียวเท่านั้นดังนั้นคุณควรเพิ่มhead$โซลูชันของคุณ
ภูมิใจ haskeller

headไม่กลับมา[]สำหรับ[] :: [[a]]- และฉันเกลียดข้อผิดพลาด
Johannes Kuhn

1
เพราะเวลาผ่านไปฉันจะบอกคุณว่าฉันหมายถึงอะไร คุณสามารถใช้mapM(\x->[1,-1])[2..n]แทนและsequence replicate
ภูมิใจ haskeller

น่าสนใจ นั่นสั้นกว่านี้ด้วย: P
Johannes Kuhn


0

CJam, 65 58 54 ไบต์

เพิ่งจะสั้นกว่าโซลูชัน Mathematica ของฉัน แต่ส่วนใหญ่เป็นความผิดของฉันที่ยังไม่ได้ใช้ CJam อย่างถูกต้อง:

0]]l~:S;({{_1+\W+}%}*{0\{+_}%);}%_{:+S=}#_@\i=\0>\[]?p

มันแท้จริงอัลกอริทึมเดียวกัน: ได้รับทั้งหมดn-1-tuples {1, -1}ของ ค้นหาคนแรกที่มีการสะสมเป็นเช่นเดียวกับs, ย่อหน้า 0พิมพ์อาร์เรย์ว่างถ้าไม่พบ




0

J, 47 ตัวอักษร

ตรวจสอบทุกลำดับเหมือนคำตอบอื่น ๆ จะพยายามทำให้โซลูชัน O (n) สั้นลง

   f=.4 :'(<:@#}.])(|:#~y=+/)+/\0,|:<:2*#:i.2^<:x'

   8 f 4
0 1 2 1 0 1 0 _1

   3 f 5
[nothing]

0

APL 38

{⊃(↓a⌿⍨⍺=+/a←+\0,⍉1↓¯1*(⍵⍴2)⊤⍳2*⍵),⊂⍬}

ตัวอย่าง:

     4 {⊃(↓a⌿⍨⍺=+/a←+\0,⍉1↓¯1*(⍵⍴2)⊤⍳2*⍵),⊂⍬}8
0 1 2 1 0 1 0 ¯1

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

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