ลองนึกภาพคุณมีสองกล่อง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
เพียงครั้งเดียว นั่นคงจะเป็นการโกง แต่ฉันไม่แน่ใจว่ามันจะเป็นการโกงที่ดีหรือการโกงที่ไม่ดี