สร้างฟังก์ชั่นแบบโมโนโทนิก


12

ภาพรวม

ในความท้าทายนี้งานของคุณคือการสร้างฟังก์ชั่นทางคณิตศาสตร์แบบ monotonicระหว่างสองชุดแบบสุ่ม

อินพุต

ปัจจัยการผลิตของคุณเป็นจำนวนเต็มบวกและsn

หลังจากที่ได้รับปัจจัยการผลิตเหล่านี้โปรแกรมของคุณจะสร้างแบบสุ่มฟังก์ชั่นทางคณิตศาสตร์fจากชุดที่ไป กล่าวอีกนัยหนึ่งคือ "กฎ" ที่ใช้ในการ-tuple ของจำนวนเต็มระหว่างและและส่งกลับจำนวนเต็มหนึ่งเช่น นอกจากนี้ควรเป็นแบบโมโนโทนิกในแง่ต่อไปนี้ ถ้าและเป็นสอง-tuples ดังกล่าวว่าถือสำหรับทุกประสานงานแล้ว{0,1,...,s-1}n{0,1,...,s-1}fn0s-1fABnA[i] ≥ B[i]if(A) ≥ f(B)

การกระจายที่แน่นอนของฟังก์ชั่นโมโนเทอร์fนั้นไม่สำคัญตราบใดที่แต่ละฟังก์ชั่นดังกล่าวมีความเป็นไปได้ในเชิงบวกที่จะถูกสร้างขึ้น (สมมติว่า RNG สมบูรณ์แบบ)

เอาท์พุต

fส่งออกของคุณจะต้องนับของปัจจัยการผลิตและผลผลิต มันจะต้องมีทุกn-tuples ของจำนวนเต็มระหว่าง0และในคำสั่งบางแต่ละคนถูกตามด้วยการแสดงผลที่สอดคล้องกันของs-1 fรูปแบบผลลัพธ์ที่แน่นอนมีความยืดหยุ่น (ภายในเหตุผล)

ตัวอย่าง

อินพุตs = 3และn = 2อาจสร้างเอาต์พุต

(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 0
(1, 1) 1
(1, 2) 2
(2, 0) 1
(2, 1) 1
(2, 2) 2

มันมีคู่ทั้งหมดมากกว่าชุดที่{0, 1, 2}แน่นอนหนึ่งครั้งและแต่ละคู่ตามด้วยfค่าของมัน เงื่อนไข monotonicity ก็พอใจเช่นกัน สิ่งอันดับจะได้รับที่นี่ตามลำดับพจนานุกรม แต่ไม่จำเป็น

เป็นอีกตัวอย่างหนึ่งs = 2และn = 4อาจผลิต

(0, 0, 0, 0) 0
(0, 0, 0, 1) 0
(0, 0, 1, 0) 0
(0, 0, 1, 1) 0
(0, 1, 0, 0) 1
(0, 1, 0, 1) 1
(0, 1, 1, 0) 1
(0, 1, 1, 1) 1
(1, 0, 0, 0) 0
(1, 0, 0, 1) 1
(1, 0, 1, 0) 0
(1, 0, 1, 1) 1
(1, 1, 0, 0) 1
(1, 1, 0, 1) 1
(1, 1, 1, 0) 1
(1, 1, 1, 1) 1

ต่อไปนี้เป็นผลลัพธ์ที่เป็นไปได้ทั้งหมดสำหรับs = 2และn = 2(สูงสุดถึงการเรียงลำดับใหม่ของ tuples); โปรแกรมของคุณควรสุ่มเอาท์พุทหนึ่งในนั้น:

(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 0
-------
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 0
(1,0) 1
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 1
(1,1) 1
-------
(0,0) 1
(0,1) 1
(1,0) 1
(1,1) 1

กฎและเกณฑ์การให้คะแนน

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

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


มันอาจช่วยได้ถ้าคุณระบุฟังก์ชั่นที่เป็นไปได้ทั้งหมดสำหรับเคสขนาดเล็กเช่น s = 2 n = 2 ฉันต้องอ่านคำอธิบายสองสามครั้งเพื่อเข้าใจว่าการสุ่มนั้นจะเกิดขึ้นได้อย่างไร
SPARR

@ Sparr ความคิดที่ดี; แก้ไข
Zgarb

ขอบเขตความต้องการรันไทม์คืออะไร? ฉันใคร่ครวญวิธีการแก้ปัญหาที่สร้างฟังก์ชั่นแบบสุ่มจนกว่าจะพบฟังก์ชั่นเดียว
Sparr

@ Sparr ฉันคิดว่าฉันจะเพิ่มโบนัสสำหรับ runtime ที่ จำกัด ดังนั้นการแก้ปัญหาดังกล่าวจะไม่ถูกตัดสิทธิ์
Zgarb

@Zgarb - บางทีคุณควรทำโบนัสก้อนโตสำหรับโซลูชันที่มีขอบเขตและมีแนวโน้มว่าจะเสร็จภายในหนึ่งชั่วโมง
เกลน O

คำตอบ:


4

Pyth, 35 ไบต์ (38 - 15% = 31.45 ไกลออกไป)

#I!sm><FhMds<MCeMd^JC,mOQK^UQvzK2JB

สาธิต

อินพุตอยู่ในรูปแบบ:

n
s

เอาต์พุตอยู่ในรูปแบบ:

[[value, tuple], [value, tuple], ...]

เพียงสร้างความเป็นไปได้แบบสุ่มและทดสอบ


ทางเลือกรุ่น 37 ไบต์ซึ่งฉันเชื่อว่ามีสิทธิ์ได้รับโบนัส:

Of!sm><FhMds<MCeMd^T2mC,d^UQvz^UQ^Qvz

สาธิต

สิ่งนี้เริ่มต้นด้วยการสร้างฟังก์ชั่นแบบโมโนโทนิกที่เป็นไปได้ทั้งหมดจากนั้นจะส่งออกโดยการสุ่ม 2,2มันจะช้ามากและท็อปส์ซูออกที่


3, 2ตัวอย่างที่ดีมีการป้อนข้อมูล น่าเสียดายที่ฉันไม่ได้รับการตอบสนอง3, 3จากผู้ดำเนินการ pyth ออนไลน์ มีการวนซ้ำไม่รู้จบสำหรับชุดค่าผสมนี้หรือไม่!
bobbel

@bobbel ผู้ปฏิบัติการออนไลน์มีเวลาหมดฉันคิดว่า ฉันลองในเครื่อง
isaacg

@ Bobbel มันไม่ได้เป็นห่วง infitie มากช้ามาก มันใช้งาน2, 4ได้ แต่ไม่มาก
isaacg

@bobbel ฉันเพิ่มบางสิ่งบางอย่างช้าลง
isaacg

1

CJam, 40 ไบต์ - 15% = 34 ไบต์

q~1$\m*\1$,m*{W$\.+2m*{:.<2b}%1&!},mR]zp

วิธีการนี้จะสร้างฟังก์ชั่นที่ถูกต้องทั้งหมดแล้วเลือกเปิดแบบสุ่ม เวลารันไทม์เป็นอย่างน้อยO (s 2s n )แต่ค่าคงที่สำหรับอินพุตที่กำหนด

ฉันสงสัยว่านี่คือสิ่งที่ OP มีอยู่ในใจ แต่รับประกันได้ว่าจะเสร็จในระยะเวลาหนึ่ง (ขึ้นอยู่กับอินพุต [... ])และดังนั้นจึงมีสิทธิ์ได้รับโบนัส

ลองใช้ออนไลน์ในล่าม CJam


1

Julia, 64 ไบต์ (-15% = 54.4)

g(s,n)=(K=rand(0:s-1,ntuple(n,i->s));for i=1:n K=sort(K,i)end;K)

Ungolfed:

function g(s,n)
  # Generates a random n-dimensional array with s per dimension
  # and all values being integers between 0 and s-1
  K=rand(0:s-1,ntuple(n,i->s))
  # Loop over the various dimensions
  for i=1:n
    # Sort in the current dimension
    K=sort(K,i)
  end
  return K
end

สิ่งนี้จะทำงานได้อย่างรวดเร็วโดยปัญหาที่เป็นไปได้เพียงอย่างเดียวคือหน่วยความจำสำหรับ s และ n ที่มีขนาดใหญ่พอ (g (10,10)) ต้องสร้างอาร์เรย์ 10 ^ 10 ดังนั้นเห็นได้ชัดว่าหน่วยความจำหมด - แม้ว่าตัวเลขแต่ละหมายเลขจะเป็น หนึ่งไบต์นั่นคือ 10 กิกะไบต์ของข้อมูล)

เอาท์พุทคือการจัดทำดัชนีแบบ 1 ดังนั้นเพื่อกำหนดผลลัพธ์สำหรับอินพุตที่กำหนดคุณจำเป็นต้องเพิ่มหนึ่งรายการในแต่ละค่าอินพุต ยกตัวอย่างเช่นการหา f (1,2,6,0,3), K[2,3,7,1,4]คุณจำเป็นต้องตรวจสอบ

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