ลองนึกภาพคุณมีสองกล่องB(x)และB(y)แต่ละกล่องมีบิตที่ไม่รู้จัก - 0 หรือ 1 และเครื่องFที่สามารถเอ็กซเรย์และสร้างกล่องที่สามสำหรับB(x^y)( xor ) FยังสามารถคำนวณB(x*y)( และ ) ในความเป็นจริงนั้นเป็นเพียงกรณีพิเศษของการดำเนินการเดียวที่เครื่องสามารถดำเนินการได้ - ผลิตภัณฑ์ภายในแต่ละตัวแสดงด้วยF()ด้านล่าง
สำหรับสองอาร์เรย์ที่มีความยาวเท่ากัน
[B(x[0]), B(x[1]), ..., B(x[n-1])]
[B(y[0]), B(y[1]), ..., B(y[n-1])]
ผลิตภัณฑ์ภายในถูกกำหนดให้เป็น
B(x[0]*y[0] ^ x[1]*y[1] ^ ... ^ x[n-1]*y[n-1])
" แต่ละ " หมายถึงF()สามารถประมวลผลหลายคู่x[], y[]ในหนึ่งไป x[]และy[]จากหนึ่งคู่จะต้องมีความยาวเดียวกัน; x[]-s และy[]-s จากคู่ที่แตกต่างกันไม่จำเป็นต้อง
กล่องถูกแสดงด้วยรหัสจำนวนเต็มที่ไม่ซ้ำกัน
การใช้งานผลิตภัณฑ์ภายในแต่ละตัวใน JavaScript อาจดูเหมือน
var H=[0,1]; // hidden values, indexed by boxId
function B(x) { // seal x in a new box and return the box id
return H.push(x)-1;
}
function F(pairs) { // "inner product each"
return pairs.map(function (pair) {
var r = 0, x = pair[0], y = pair[1];
for (var i = 0; i < x.length; i++) r ^= H[x[i]] * H[y[i]];
return B(r);
})
}
(โปรดแปลข้างต้นเป็นภาษาที่คุณเลือก)
ให้สิทธิ์ในการF()ใช้งานตามความเหมาะสมสำหรับภาษาของคุณ (แต่ไม่สามารถเข้าถึงHหรือB()) และให้กล่องรหัสสองอาร์เรย์ซึ่งประกอบไปด้วยการแทนเลขฐานสองแบบ 16 บิตของจำนวนเต็มสองตัวaและbงานของคุณคือการผลิตกล่องรหัสสำหรับการเป็นตัวแทนไบนารีแบบ ของa+b(ทิ้งมากF()เกินไป) ด้วยจำนวนการโทรขั้นต่ำ
โซลูชันที่เรียกF()เวลาน้อยที่สุดจะเป็นผู้ชนะ ความสัมพันธ์จะถูกทำลายโดยการนับจำนวนx[],y[]คู่ทั้งหมดที่F()ถูกเรียกด้วย - น้อยกว่าดีกว่า หากยังคงถูกผูกไว้ขนาดของรหัสของคุณ (ไม่รวมการติดตั้งF()และผู้ช่วย) จะเป็นตัวกำหนดผู้ชนะในการตีกอล์ฟแบบดั้งเดิม โปรดใช้ชื่อเช่น "MyLang, 123 สาย, 456 คู่, 789 ไบต์" สำหรับคำตอบของคุณ
เขียนฟังก์ชั่นหรือโปรแกรมที่สมบูรณ์ อินพุต / เอาต์พุต / อาร์กิวเมนต์ / ผลลัพธ์คือ int arrays ในรูปแบบที่เหมาะสม การเป็นตัวแทนแบบไบนารีอาจเป็นแบบเล็กหรือใหญ่ - เลือกอย่างใดอย่างหนึ่ง
ภาคผนวก 1: เพื่อให้การท้าทายง่ายขึ้นเล็กน้อยคุณสามารถสมมติว่ากล่องที่มีรหัส 0 และ 1 มีค่า 0 และ 1 ซึ่งจะช่วยให้คุณมีค่าคงที่มีประโยชน์เช่นการปฏิเสธ ( x^1คือ "ไม่") แน่นอนว่ามีหลายวิธีที่ยังขาดค่าคงที่ แต่ความท้าทายที่เหลือก็ยากพออยู่แล้วดังนั้นเรามากำจัดความฟุ้งซ่านนี้กัน
ภาคผนวก 2: หากต้องการรับรางวัลคุณต้องทำอย่างใดอย่างหนึ่งต่อไปนี้:
โพสต์คะแนนของคุณ (โทร, คู่, ไบต์) และรหัสของคุณก่อนกำหนด
โพสต์คะแนนของคุณและแฮชของรหัสของคุณก่อนถึงเส้นตาย; จากนั้นโพสต์รหัสจริงภายใน 23 ชั่วโมงหลังจากกำหนด
y=f(x)และให้ขึ้นอยู่กับx y
data Box = B Int deriving (Show); f :: [[[Box]]] -> [Box]ฉันจะต้องใช้เวลามากขึ้นในการหาวิธีการใช้งานf(Haskell บังคับให้ตัวพิมพ์เล็กที่นี่) - ฉันจะลองในวันพรุ่งนี้
Fเพียงครั้งเดียว นั่นคงจะเป็นการโกง แต่ฉันไม่แน่ใจว่ามันจะเป็นการโกงที่ดีหรือการโกงที่ไม่ดี