Seidel Triangle


14

The Seidel Triangle เป็นโครงสร้างทางคณิตศาสตร์ที่คล้ายกับสามเหลี่ยมของ Pascal และเป็นที่รู้จักกันดีว่ามีส่วนเกี่ยวข้องกับตัวเลขของเบอร์นูลี

สองสามแถวแรกคือ:

      1
      1  1
   2  2  1
   2  4  5  5
16 16 14 10 5
16 32 46 56 61 61

แต่ละแถวถูกสร้างดังต่อไปนี้:

หากหมายเลขแถวเป็นเลขคู่ (ทำดัชนี 1 รายการ):

  • นำไอเท็มแรกของแถวก่อนลงมา

  • ทุกรายการถัดไปคือผลรวมของรายการก่อนหน้าและรายการด้านบน

  • ทำซ้ำรายการสุดท้าย

ถ้าหมายเลขแถวเป็นเลขคี่:

  • ดึงรายการสุดท้ายของแถวก่อนหน้า

  • ย้อนกลับไปแต่ละรายการคือผลรวมของรายการก่อนหน้าและรายการด้านบน

  • ทำซ้ำสิ่งที่ตอนนี้เป็นรายการแรก

โดยพื้นฐานแล้วเราสร้างสามเหลี่ยมในรูปแบบซิกแซก:

    1
    v
    1 > 1
        v
2 < 2 < 1
v
2 > 4 > 5 > 5

สำหรับข้อมูลเพิ่มเติมดูที่หน้า Wikipediaเกี่ยวกับหมายเลข Bernoulli

ความท้าทาย:

ป.ร. ให้nไว้ไม่ว่าจะเป็นอาร์กิวเมนต์ฟังก์ชั่นหรือจาก STDIN พิมพ์หรือกลับnแถวที่สองของสามเหลี่ยม Seidel หรือnแถวแรก คุณสามารถใช้การจัดทำดัชนี 0 หรือ 1

คุณไม่จำเป็นต้องจัดการอินพุตที่เป็นค่าลบหรือไม่ใช่จำนวนเต็ม (หรือ 0 หากดัชนี 1) คุณไม่ต้องจัดการกับผลลัพธ์ที่มีขนาดใหญ่กว่า2147483647 = 2^31 - 1

เนื่องจากนี่เป็นโค้ดกอล์ฟให้ทำในจำนวนไบต์น้อยที่สุด

ตัวอย่าง:

ในตัวอย่างเหล่านี้ค่าส่งคืนคือnแถวที่ 0 ซึ่งจัดทำดัชนีไว้

Input   ->  Output

0           1
1           1 1
2           2 2 1
6           272 272 256 224 178 122 61
13          22368256 44736512 66750976 88057856 108311296 127181312 144361456 159575936 172585936 183194912 191252686 196658216 199360981 199360981

"คุณไม่ต้องจัดการเอาท์พุทขนาดใหญ่กว่าชนิด int เริ่มต้นภาษาของคุณ" นี้ทำให้จิ๊บจ๊อยสำหรับภาษาที่มี ints 1 บิตเท่านั้น
ASCII เท่านั้น

สามารถเรียงลำดับแถวได้ตั้งแต่เล็กไปจนถึงใหญ่หรือไม่?
อัง

@ ASCII เท่านั้นเปลี่ยนให้ตรงกับ int สูงสุด c ++ 's
Bolce Bussiere

@Angs ไม่ควรสั่งแถวตามที่แสดง
Bolce Bussiere

@ ASCII-only นั่นเป็นช่องโหว่เริ่มต้น (แม้ว่า IMO จะพูดได้ไม่ดีนักเพราะขึ้นอยู่กับสิ่งที่ผู้คนจะพิจารณาว่า "สมเหตุสมผล")
user202729

คำตอบ:


7

Brain-Flak , 66 ไบต์

<>(())<>{({}[()]<(()[{}]<<>{(({}<>{}))<>}>)>)}{}{{}<>{({}<>)<>}}<>

ลองออนไลน์!

แถวถูกจัดทำดัชนี 0

# Push 1 (the contents of row 0) on other stack; use implicit zero as parity of current row
<>(())<>

# Do a number of times equal to input:
{({}[()]<

  # Subtract the row parity from 1
  (()[{}]<

    # For each entry in old row:
    <>{

      # Add to previous entry in new row and push twice
      (({}<>{}))<>

    }

  >)

>)}{}

# If row parity is odd:
{{}

  # Reverse stack for output
  <>{({}<>)<>}

# Switch stacks for output
}<>

4

JavaScript (SpiderMonkey) , 67 ไบต์

รหัสนี้ใช้sort()วิธีการที่ไม่เหมาะสมและไม่สามารถใช้ได้กับทุกเครื่องมือ

แถวถูกจัดทำดัชนี 0

f=(n,a=[1],r)=>n--?f(n,[...a.map(n=>k+=n,k=0),k].sort(_=>n|r),!r):a

ลองออนไลน์!

อย่างไร?

เราย้อนกลับอาร์เรย์แบบมีเงื่อนไขโดยใช้sort()วิธีการที่มีฟังก์ชั่นการโทรกลับที่ละเว้นพารามิเตอร์และส่งกลับ0หรือจำนวนเต็มบวก อย่าลองทำที่บ้าน! ใช้งานได้กับ SpiderMonkey เท่านั้น

let A = [1,2,3,4,5] and B = [1,2,3,4,5,6,7,8,9,10,11]

             | SpiderMonkey (Firefox)  | V8 (Chrome)             | Chakra (Edge)
-------------+-------------------------+-------------------------+------------------------
A.sort(_=>0) | 1,2,3,4,5               | 1,2,3,4,5               | 1,2,3,4,5
A.sort(_=>1) | 5,4,3,2,1               | 5,4,3,2,1               | 1,2,3,4,5
B.sort(_=>0) | 1,2,3,4,5,6,7,8,9,10,11 | 6,1,3,4,5,2,7,8,9,10,11 | 1,2,3,4,5,6,7,8,9,10,11
B.sort(_=>1) | 11,10,9,8,7,6,5,4,3,2,1 | 6,11,1,10,9,8,7,2,5,4,3 | 1,2,3,4,5,6,7,8,9,10,11

โปรดทราบว่า V8 อาจใช้อัลกอริทึมการเรียงลำดับที่แตกต่างกันขึ้นอยู่กับความยาวของอาเรย์ (น้อยกว่าหรือมากกว่า 10 องค์ประกอบ)

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

f = (                     // f = recursive function taking:
  n,                      //   n   = row counter
  a = [1],                //   a[] = current row, initialized to [1]
  r                       //   r   = 'reverse' flag, initially undefined
) =>                      //
  n-- ?                   // decrement n; if it was not equal to zero:
    f(                    //   do a recursive call with:
      n,                  //     - the updated value of n
      [ ...a.map(n =>     //     - a new array:
          k += n, k = 0   //       - made of the cumulative sum of a[]
        ), k              //         with the last value appended twice
      ].sort(_ => n | r), //       - reversed if n is not equal to 0 or r is set
      !r                  //     - the updated flag r
    )                     //   end of recursive call
  :                       // else:
    a                     //   stop recursion and return a[]

คุณลักษณะนี้ใช้งานอะไรได้บ้าง?
Downgoat

@Downgoat มันใช้ประโยชน์จากการใช้งานเฉพาะของsort()เครื่องมือนี้ ฉันได้เพิ่มคำอธิบายแล้ว
Arnauld


3

Haskell , 89 87 82 ไบต์

(cycle[r,id]!!)<*>s
r=reverse
s 0=[1]
s n=let a=zipWith(+)(0:a)$(r.s$n-1)++[0]in a

เพียงsพิมพ์บรรทัดตามลำดับ zig-zag ฟังก์ชั่นที่ไม่ระบุชื่อในแถวแรกจะกลับครึ่งหนึ่งของแถว

ขอบคุณ @nimi สำหรับการบันทึก 5 ไบต์!

ลองออนไลน์!




2

Julia 0.6 , 85 bytes

r(l,n=cumsum(l))=[n...,n[end]]
w=reverse
f(n)=n<2?[1]:n%2<1?r(f(n-1)):w(r(w(f(n-1))))

ลองออนไลน์!

นี่เป็นโซลูชันแบบเรียกซ้ำในจูเลีย โปรดทราบว่ามันมีการจัดทำดัชนีแบบ 1 ดังนั้นการทดสอบ

เวอร์ชันที่ไม่ดีเพื่อทำความเข้าใจกับตรรกะ:

function new_row(last_row)
    new_row = cumsum(last_row)
    push!(new_row, new_row[end])
    return new_row
end


function triangle(n)
    if n == 1
        return [1]
    elseif mod(n,2) == 0
        return new_row(triangle(n-1))
    else
        return reverse(new_row(reverse(triangle(n-1))))
    end
end

Asa bonus นี่เป็นเวอร์ชันที่ไม่ต้องเรียกซ้ำ แต่นี่จะนานกว่า:

w=reverse;c=cumsum
r(l,i)=i%2<1?c([l...,0]):w(c(w([0,l...])))
f(n,l=[1])=(for i=2:n l=r(l,i)end;l)

1

Python 2 , 103 97 ไบต์

f=lambda n,r=[1],k=2:n and f(n-1,[sum(r[-2::-1][:i],r[-1])for i in range(k)],k+1)or r[::-(-1)**k]

ลองออนไลน์!

เวอร์ชันที่ไม่ใช่แบบเรียกซ้ำ (อ่านง่ายกว่า):

Python 2 , 106 ไบต์

def f(n,r=[1],j=1):
 while n:
	a=r[-2::-1];r=r[-1:];n-=1;j=-j
	for x in a+[0]:r+=[r[-1]+x]
 return r[::-j]

ลองออนไลน์!

แน่นอนดีกว่าเป็นไปได้!


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