ทวีคูณด้วยการดำเนินการที่ถูก จำกัด


44

มีเป็น500 ตัวแทนโปรดปรานอย่างไม่เป็นทางการสำหรับการตีคำตอบที่ดีที่สุดในปัจจุบัน

เป้าหมาย

เป้าหมายของคุณคือการคูณสองตัวเลขโดยใช้ชุดการดำเนินการทางคณิตศาสตร์และการกำหนดตัวแปรที่ จำกัด มาก

  1. ส่วนที่เพิ่มเข้าไป x,y -> x+y
  2. ซึ่งกันและกันx -> 1/x( ไม่หารx,y -> x/y)
  3. การปฏิเสธx -> -x( ไม่ใช่การลบx,y -> x-yถึงแม้ว่าคุณสามารถทำได้สองการดำเนินการx + (-y))
  4. ค่าคงที่1(ไม่อนุญาตให้มีค่าคงที่อื่นยกเว้นที่สร้างโดยการดำเนินการจาก1)
  5. การมอบหมายตัวแปร [variable] = [expression]

เกณฑ์การให้คะแนน:ค่าเริ่มต้นในตัวแปรและa bเป้าหมายของคุณคือการบันทึกผลิตภัณฑ์a*bลงในตัวแปรcโดยใช้การดำเนินการให้น้อยที่สุด การดำเนินการและการมอบหมายแต่ละครั้ง+, -, /, =มีค่าใช้จ่ายจุด (เทียบเท่าการใช้ (1), (2), (3) หรือ (4) แต่ละครั้ง ค่าคงที่1มีอิสระ การแก้ปัญหาที่จุดน้อยที่สุดชนะ Tiebreak เป็นโพสต์แรกสุด

ค่าเผื่อ:การแสดงออกของคุณจะต้องมีความถูกต้องสำหรับ arithmetically reals "สุ่ม" และa bมันอาจล้มเหลวในเซตย่อยที่มีค่าเป็นศูนย์ของR 2นั่นคือเซตที่ไม่มีพื้นที่ถ้าพล็อตในระนาบa- bระนาบคาร์ทีเซียน (อาจมีความจำเป็นเนื่องจากส่วนกลับของนิพจน์ที่อาจเป็น0เช่น1/aนี้)

ไวยากรณ์:

นี่คืออะตอมรหัสกอล์ฟไม่สามารถใช้การดำเนินการอื่นได้ โดยเฉพาะอย่างยิ่งสิ่งนี้หมายความว่าไม่มีฟังก์ชั่น, เงื่อนไข, ลูปหรือประเภทข้อมูลที่ไม่ใช่ตัวเลข นี่คือไวยากรณ์สำหรับการดำเนินการที่อนุญาต (ความเป็นไปได้ถูกคั่นด้วย|) โปรแกรมคือลำดับของ<statement>s โดยที่ a <statement>ถูกกำหนดดังนี้

<statement>: <variable> = <expr>
<variable>: a | b | c | [string of letters of your choice]
<expr>: <arith_expr> | <variable> | <constant>
<arith_expr>: <addition_expr> | <reciprocal_expr> | <negation_expr> 
<addition_expr>: <expr> + <expr>
<reciprocal_expr>: 1/(<expr>)
<negation_expr>: -<expr>
<constant>: 1

คุณไม่จำเป็นต้องโพสต์รหัสในไวยากรณ์ที่ถูกต้องนี้ตราบใดที่มันชัดเจนว่าคุณกำลังทำอะไรอยู่และการนับการทำงานของคุณถูกต้อง ตัวอย่างเช่นคุณสามารถเขียนa-bสำหรับa+(-b)และนับเป็นสองการดำเนินงานหรือกำหนดแมโครสำหรับความกะทัดรัด

(มีคำถามก่อนหน้านี้Multiply โดยไม่มี Multiplyแต่อนุญาตให้ใช้ชุดการดำเนินการที่หลวมมาก)


4
เป็นไปได้ไหม
Ypnypn

1
@Ypnypn ใช่และฉันได้เขียนตัวอย่างเพื่อให้แน่ใจ
xnor

2
สิ่งนี้ให้ความรู้สึกว่าเป็นความท้าทายที่จะพบทางออกที่ดีที่สุด (เมื่อพบวิธีแก้ไขปัญหาใด ๆ ) แล้วไทเบรกเกอร์ในกรณีนี้คืออะไร?
Martin Ender

1
@ MartinBüttner Tiebreak เป็นการโพสต์ที่เร็วที่สุดในกรณีนั้น ฉันคิดว่ามีพื้นที่ว่างจำนวนมากสำหรับการปรับให้เหมาะสมดังนั้นฉันจึงไม่คิดว่ามันจะเป็นการแข่งขันเพื่อค้นหาสิ่งที่ได้ผลและเขียนอย่างหมดจด อย่างน้อยนั่นคือสิ่งที่ฉันพบในการทดลอง บางทีบางคนอาจพบทางออกที่ชัดเจนน้อยที่สุด
xnor

2
ตกลงเนื่องจากไม่ใช่ทุกคนที่คิดว่าแอนเวอร์ของฉันเป็นเรื่องตลกเหมือนที่ฉันทำฉันลบมันและแสดงความคิดเห็นที่นี่: กฎเกี่ยวกับการตั้งค่าการวัดศูนย์ชุดไม่ได้เลือกอย่างชาญฉลาดมากเพราะจำนวนตรรกยะ ใช้เปอร์เซ็นต์ที่แน่นอนแทน (หรือประเภทอื่น) แต่ฉันชอบความคิดของการท้าทายนี้โดยสิ้นเชิง!
ข้อบกพร่อง

คำตอบ:


34

22 การดำเนินงาน

itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(itx + itx + 1/(1+nx)) + 1/(1/(a+nx) + 1/(b+nx)) ) #14

ลองออนไลน์!

ops คือการเพิ่ม 10, 7 inverses, 2 negations และ 3 การมอบหมาย

ดังนั้นฉันจะได้รับสิ่งนี้ได้อย่างไร ฉันเริ่มต้นด้วยเทมเพลตที่ดูมีแนวโน้มจากผลรวมของเศษส่วนสองชั้นสองชั้นซึ่งเป็นบรรทัดฐานที่ปรากฏในความพยายามครั้งก่อนหลายครั้ง

c = 1/(1/x + 1/y) + 1/(1/z + 1/w)

เมื่อเรา จำกัด ผลรวมx+y+z+w=0การยกเลิกที่สวยงามเกิดขึ้นโดยให้:

c = (x+z)*(y+z)/(x+y),

ซึ่งมีผลิตภัณฑ์ (มักจะง่ายกว่าที่จะได้รับt*u/vมากกว่าt*uเพราะคนแรกมีดีกรี 1)

มีวิธีที่สมมาตรมากกว่าที่จะคิดเกี่ยวกับนิพจน์นี้ ด้วยข้อ จำกัดx+y+z+w=0ค่าของพวกเขาจะถูกระบุโดยพารามิเตอร์สามตัวp,q,rของผลรวมคู่ของพวกเขา

 p = x+y
-p = z+w
 q = x+z
-q = y+w
 r = x+w
-r = y+z

c=-q*r/pและเรามี ผลรวมpนั้นแตกต่างกันเหมือนอยู่ในตัวส่วนโดยสอดคล้องกับคู่(x,y)และ(z,w)ของตัวแปรที่อยู่ในเศษส่วนเดียวกัน

นี่คือการแสดงออกที่ดีสำหรับcในp,q,rแต่เศษเสี้ยวสองชั้นอยู่ในx,y,z,wดังนั้นเราจะต้องแสดงอดีตในแง่ของหลัง:

x = ( p + q + r)/2
y = ( p - q - r)/2
z = (-p + q - r)/2
w = (-p - q + r)/2

ตอนนี้เราต้องการเลือกp,q,rให้c=-q*r/pเท่าa*bกัน ทางเลือกหนึ่งคือ:

p = -4
q = 2*a
r = 2*b

จากนั้นค่าสองเท่าสำหรับqและrถูกลดลงครึ่งหนึ่งใน:

x = -2 + a + b
y = -2 - a - b
z =  2 + a - b
w =  2 - a + b

การบันทึก2เป็นตัวแปรtและเสียบเข้ากับสมการเพื่อcให้โซลูชัน 24-op

#24 ops
t = 1+1   #2
c = 1/(1/(-t+a+b) + 1/-(t+a+b))  +  1/(1/(-b+t+a) + 1/(-a+b+t)) #1, 10, 1, 10

มีการเพิ่มเติม 12 ครั้งผู้รุกราน 6 คนการปฏิเสธ 4 ครั้งและการมอบหมาย 2 ครั้ง

จำนวนมากของปฏิบัติการจะใช้เวลาแสดงในแง่ของx,y,z,w 1,a,bหากต้องการบันทึก Ops แทนที่จะแสดงxในp,q,r(และa,b,1) แล้วเขียนในแง่ของy,z,wx

y = -x + p
z = -x + q
w = -x + r

เลือก

p = 1
q = a
r = b

และแสดงcด้วยการปฏิเสธเมื่อc=-q*r/pเราได้รับ

x = (1+a+b)/2
y = -x + 1
z = -x + a
w = -x + b

น่าเสียดายที่การลดลงครึ่งหนึ่งxมีค่าใช้จ่ายสูง จำเป็นต้องดำเนินการโดยการย้อนกลับเพิ่มผลลัพธ์ให้กับตัวเองและกลับเข้ามาอีกครั้ง นอกจากนี้เรายังปฏิเสธที่จะผลิตnxเพื่อ-xเนื่องจากนั่นคือสิ่งที่y,z,wใช้ สิ่งนี้ทำให้เรามีโซลูชั่น 23-op:

#23 ops
itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(1/(-nx) + 1/(1+nx))  +  1/(1/(a+nx) + 1/(b+nx)) ) #15

itx1 / (2 * x) และเป็นnx -xเพิ่มประสิทธิภาพในขั้นสุดท้ายของการแสดง1/xเป็นitx+itxแทนเทมเพลต1/(-nx)ตัดตัวอักษรและนำมาลงแก้ปัญหา 22 Ops


มีการเพิ่มประสิทธิภาพการปฏิบัติงาน 21 อย่างง่าย ๆ itx + itxเกิดขึ้นสองครั้ง แต่itxไม่เกิดขึ้นในบริบทอื่น ๆ กำหนดแทนix = (1+1)/(1+a+b)และคุณแทนที่สองส่วนเพิ่มเติมด้วยหนึ่ง
Peter Taylor

และโดยการแยกm = -1มันเป็นไปได้ที่จะได้รับ 20:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
ปีเตอร์เทย์เลอร์

3
อ๊ะการปรับให้เหมาะสมทั้งสองแบบนั้นล้มเหลวเนื่องจากการดำเนินการที่ได้รับการสนับสนุนนั้นเป็นแบบตอบแทนมากกว่าการหาร
Peter Taylor

หากaและbแยกออกจากกันเพียงหนึ่งเดียวa + nx = 0หรืออย่างใดอย่างหนึ่งหรือb + nx = 0ทำให้โซลูชันของคุณหารด้วยศูนย์
MooseOnTheRocks

1
@MooseOnTheRocks ไม่เป็นไรดู "เผื่อ" ในความท้าทายที่โค้ดสามารถล้มเหลวในเซ็ตย่อยที่มีค่าเป็นศูนย์ ฉันคิดว่าความท้าทายนั้นเป็นไปไม่ได้
xnor

26

23 การดำเนินงาน

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
res = z+z

พิสูจน์โดยการระเบิด:

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
             1/(a+1)+1/(b+1)                            == (a+b+2) / (ab+a+b+1)
          1/(1/(a+1)+1/(b+1))                           == (ab+a+b+1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1                         == (ab - 1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1)             == ab / (a+b+2)
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))            == (a+b+2) / ab
                                              1/a+1/b   == (a+b) / ab
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)  == 2 / ab
    1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)) == ab / 2

z = ab / 2 and therefore z+z = ab

ฉันใช้ wolfram alpha เพื่อให้ได้ภาพที่สวยงามนี้ (wolfram alpha พยายามให้ฉันสมัครรับ pro เพื่อบันทึก แต่จากนั้น ctrl-c ctrl-v ;-)):

คะแนน (พร้อมเพิ่ม+ในการลบ):

z = ////++/++-+/++++-/+/
res = +

ขอแสดงความยินดีกับทางออกที่สั้นที่สุด!
xnor

@ xnor ขอบคุณที่ให้คำตอบแรกกับฉันและรางวัลแรกของฉัน!
ภูมิใจ haskeller

ไม่ใช่ว่าจะเป็นจู้จี้จุกจิก แต่ไม่ควร ... (b + 1)) - 1 + 1 ... และ ... 1)) - (1 / a + ... เป็น ... (b + 1 )) + - 1 + 1 ... และ ... 1)) + - (1 / a + ... ตามลำดับ?
tfitzger

@tfitzger ฉันคิดว่ามันง่ายกว่านั้น คำถามบอกว่ามันไม่สำคัญ หมายเหตุฉันนับคะแนนได้อย่างถูกต้อง (ลบทุกสอง)
ภูมิใจ Haskeller

Wolfram Alpha มีการทดลองใช้ฟรี 7 วัน fyi
ghosts_in_the_code

13

29 การดำเนินงาน

ไม่ทำงานสำหรับชุด {(a, b) ∈ R 2 | a + b = 0 หรือ a + b = -1 หรือ ab = 0 หรือ ab = -1} นั่นอาจจะวัดเป็นศูนย์?

sum = a+b
nb = -b
diff = a+nb
rfc = 1/(1/(1/sum + -1/(sum+1)) + -1/(1/diff + -1/(diff+1)) + nb + nb)  # rfc = 1/4c
c = 1/(rfc + rfc + rfc + rfc)

# sum  is  2: =+
# nb   is  2: =-
# diff is  2: =+
# rfc  is 18: =///+-/++-//+-/+++
# c    is  5: =/+++
# total = 29 operations

โครงสร้างของrfc(Reciprocal-Four-C) มีความชัดเจนมากขึ้นถ้าเรากำหนดแมโคร

s(x) = 1/(1/x + -1/(x+1))              # //+-/+ (no = in count, macros don't exist)
rfc = 1/(s(sum) + - s(diff) + nb + nb) # =/s+-s++ (6+2*s = 18)

ทำคณิตศาสตร์กันเถอะ:

  • s(x)คณิตศาสตร์เป็น1/(1/x - 1/(x+1))ซึ่งเป็นหลังจากบิตของพีชคณิตหรือx*(x+1)x*x + x
  • เมื่อคุณย่อยทุกอย่างลงไปrfcมันเป็นสิ่ง1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))ที่1/((a+b)^2 - (a-b)^2)แท้จริง
  • หลังจากความแตกต่างของกำลังสองหรือการขยายแบบธรรมดาคุณrfcก็จะ1/(4*a*b)ได้
  • สุดท้ายcเป็นของกันและกันครั้งที่ 4 rfcเพื่อให้กลายเป็น1/(4/(4*a*b))a*b

2
+1, ฉันกำลังอยู่ระหว่างการคำนวณที่เหมือนกันนี้
Eric Tressler

1
นั่นคือการวัดศูนย์แน่นอน มันคือการรวมกันของเส้น
xnor

ไม่ต้องให้ความเห็นเกี่ยวกับการรวมกันของเส้น ... @ อัลกอริทึมคุณสามารถบอกเราได้มากขึ้นว่าคุณเกิดขึ้นกับตัวตนนี้ได้อย่างไร คุณช่วยแก้ปัญหาอย่างไร
ข้อบกพร่อง

1
@ flawr ฉันจำได้ว่าคุณสมบัติของs(x)พอดีกับความต้องการของคำถามจากแคลคูลัสดังนั้นนั่นหมายความว่าฉันมีฟังก์ชั่นสแควร์ หลังจาก faffing เกี่ยวกับฉันพบว่าฉันจะได้a*bคำกับความแตกต่างของเคล็ดลับกำลังสอง เมื่อฉันได้รับแล้วมันเป็นเรื่องของการทดลองว่าการบ้านใดที่บันทึกการปฏิบัติการไว้
algorithmshark

เมื่อคุณใช้-1สามครั้งrfcคุณไม่สามารถใส่ตัวละครด้วยการกำหนดให้ตัวแปร?
isaacg

9

27 การดำเนินงาน

tmp = 1/(1/(1+(-1/(1/(1+(-a))+1/(1+b))))+1/(1/(1/b+(-1/a))+1/(a+(-b))))
res = tmp+tmp+(-1)

# tmp is 23: =//+-//+-+/++///+-/+/+-
# res is 4: =++-

ไม่มีทฤษฎีอยู่เบื้องหลังสิ่งนี้ ฉันพยายามที่จะได้รับ(const1+a*b)/const2และเริ่มต้นด้วยและ(1/(1-a)+1/(1+b))(-1/a+1/b)


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