ปริศนาสองศูนย์หนึ่งหนึ่ง


13

พื้นหลัง

ตัวต่อนี้เป็นรูปแบบของตัวต่อสี่สี่ตัว (เป็นหัวข้อของคำถามที่ผ่านมา ) เช่นเดียวกับจิ๊กซอร์นั้นเป้าหมายคือการค้นหานิพจน์ทางคณิตศาสตร์สำหรับจำนวนเต็มที่แตกต่างกันโดยใช้เพียงตัวเลขสี่หลักและตัวดำเนินการทางคณิตศาสตร์บางตัว ในกรณีนี้ แต่ตัวเลขที่ได้รับอนุญาตเป็นเพียง 2, 0, 1 และ 5 แต่ละคนจะต้องปรากฏอย่างแม่นยำหนึ่งครั้งในการแก้ปัญหาและในลำดับที่ถูกต้อง น่าแปลกที่ตัวเลขทั้งหมดจำนวนมากสามารถแสดงด้วยวิธีนี้ เราขอแนะนำให้นักแก้ปัญหาลองแก้ปัญหาด้วยมือก่อนเพราะสนุกอย่างน่าประหลาด

กฎระเบียบ

ค่าคงที่อาจถูกสร้างขึ้นจากตัวเลขเดียวหรือหลายหลัก:

  • จำนวนเต็ม: เช่น 2, 0, 15 เป็นต้น
  • ทศนิยม: เช่น .2, .01, 1.5, ฯลฯ
  • ทำซ้ำทศนิยม : เช่น. 2 ~ (= 0.222 ... ), .15 ~ (= 0.1555 ... ), 20.15 ~~ (= 20.1515 ... )

อนุญาตให้มีการปฏิบัติงานที่ไม่เกิดเหตุต่อไปนี้:

  • การปฏิเสธคู่กัน: -x
  • รากที่สอง: sqrt (x)
  • จำนวนเต็ม: x!

อนุญาตการดำเนินการไบนารีต่อไปนี้:

  • ตัวดำเนินการทางคณิตศาสตร์มาตรฐาน: x + y, xy, x * y และ x / y
  • การยกกำลังโดยพลการ: x ^ y
  • รากเอง: rt [x] (y) (= x'th root ของ y)

งาน

โปรแกรมของคุณควรพิมพ์นิพจน์สำหรับจำนวนเต็มจำนวนมากระหว่าง 0 ถึง 100 เท่าที่จะทำได้จากนั้นส่งออกจำนวนนิพจน์ที่สร้างขึ้น

  • ต้องพิมพ์โซลูชั่นตามลำดับในรูปแบบ n = [expr]
  • นิพจน์ต้องใช้ตัวเลขทั้งหมด 2, 0, 1, 5, แต่ละครั้งตามลำดับ
  • นิพจน์จะต้องพิมพ์โดยใช้สัญลักษณ์ที่อธิบายไว้ข้างต้น อนุญาตวงเล็บที่ไม่จำเป็น แต่ไม่จำเป็นเช่นเดียวกับช่องว่าง ลำดับความสำคัญของโอเปอเรเตอร์คือการปฏิเสธค่าแฟกทอเรียลการยกกำลังการคูณ / การหารและการบวก / การลบ
  • โปรแกรมไม่จำเป็นต้องส่งคืนโซลูชั่นสำหรับหมายเลขทั้งหมด โปรแกรมที่แสดงผลลัพธ์ 0 เพียงอย่างเดียวจึงใช้ได้ อย่างไรก็ตามดูหัวข้อการให้คะแนนด้านล่าง
  • โปรแกรมควรทำงานภายใน 15 นาทีบนคอมพิวเตอร์ที่ทันสมัย

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

ตัวอย่างผลลัพธ์

0=2*0*1*5
10=20*1*.5
42=((2+0!)!+1)!/5!
100=20*1*5
4

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

ปรับปรุง : @ orlp ได้สังเกตเห็นข้อบกพร่องในระบบการให้คะแนน ดูhttp://meta.codegolf.stackexchange.com/questions/5106/way-of-salvaging-two-zero-one-five-puzzle-challengeสำหรับการสนทนาว่าควรแก้ไขอย่างไร

โซลูชั่นจะได้รับคะแนนก่อนตามจำนวนนิพจน์ที่พวกเขาสร้างขึ้นและจากนั้นตามความยาวโค้ดเป็นไบต์ ดังนั้นโปรแกรม 1,000 ไบต์ที่สร้างผลลัพธ์ 80 รายการจะชนะโปรแกรม 100 ไบต์ที่สร้างเพียง 79 เท่านั้น (แม้ว่าโปรแกรมหลังสามารถขยายได้อย่างง่ายดายเพื่อรวมผลลัพธ์ที่หายไป)

สำหรับผู้ที่ต้องการเป้าหมายที่สร้างแรงบันดาลใจด้านล่างจะเป็นขอบเขตล่างของจำนวนนิพจน์ที่สามารถแสดงได้ ฉันไม่ได้วางแผนที่จะส่งผลงานดังนั้นอาจเป็นไปได้ที่จะได้รับรางวัลน้อยลง!

อย่างน้อย 85 (จาก 101) แม้ว่ามันอาจจะสูงกว่าก็ตาม

ป้ายบอกคะแนน

นี่เป็นบทสรุปของความก้าวหน้าของคะแนน เมื่อใดก็ตามที่คุณเอาชนะคะแนนสูงสุดรู้สึกอิสระที่จะเพิ่มตัวเองไปด้านบนของตาราง (หรือขอให้คนอื่น)

  • 0 นิพจน์, 1 ไบต์ (Pyth): การใช้งานที่เพิ่งส่งออก 0

.20 เป็นค่าคงที่ที่อนุญาตหรือไม่
ลุค

1
@ ลุค: ใช่แม้ว่ามันจะสามารถแสดงเป็น (.2 + 0) ดังนั้นมันจึงไม่เพิ่มการแสดงออก
Uri Granta

1
@orlp โปรดทราบว่าศูนย์นำหน้าและเศษส่วนที่มากกว่าศูนย์จะไม่เพิ่มความชัดเจนใด ๆ : เช่น 015 = 0 + 15 และ 1.5 = 1 + .5
Uri Granta

1
@ mbomb007 มันซับซ้อนเกินไป นี่คือคำอธิบายสั้น ๆ ที่ฉันเขียน: gist.github.com/orlp/e92b3b7d26ad9b11378e
orlp

2
@UriZarfaty จากนั้นมีค่าคงที่ที่มีประโยชน์ 99 ชุด: gist.github.com/orlp/eb997e49e41878c76d0a
orlp

คำตอบ:


9

85, ~ 2400 ไบต์

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

  0 = ((2*0)^15)
  1 = ((2^0)^15)
  2 = (2-(0^15))
  3 = (20*.15)
  4 = (20*(1/5))
  5 = (20-15)
  6 = ((.20+1)*5)
  7 = ((20*.1)+5)
  8 = (2*((0-1)+5))
  9 = ((.20/.1~)*5)
 10 = (20/(1/.5))
 11 = ((((2-0)+1))!+5)
 12 = (20*(.1+.5))
 13 = ((-(2)-0)+15)
 14 = (20-(1+5))
 15 = ((2*0)+15)
 16 = ((2^0)+15)
 17 = ((2-0)+15)
 18 = (20-(1/.5))
 19 = (20-(1^5))
 20 = (20^(1^5))
 21 = (20+(1^5))
 22 = (20+(1/.5))
 23 = (((2-0)/.1~)+5)
 24 = ((20-1)+5)
 25 = ((20^1)+5)
 26 = ((20+1)+5)
 27 = (rt[.2](((0)!+1))-5)
 28 = (2*(-((0)!)+15))
 29 = ((((2+(0)!)+1))!+5)
 30 = ((2-0)*15)
 31 = (20+sqrt((1+(5)!)))
 32 = ((20*.1)^5)
 33 = ((.2^-((0)!))/.15~~)
 34 = (2+(((0)!+1)^5))
 35 = (20+15)
 36 = (20*(1/.5~))
 37 = (rt[.2](((0)!+1))+5)
 38 = ((20-1)/.5)
 39 = (-((2^0))+(sqrt(.1~)*(5)!))
 40 = (20*(1/.5))
 41 = (((.2~^-((0)!))/.1~)+.5)
 42 = ((20+1)/.5)
 43 = (-(2)+(((0)!/.1~)*5))
 44 = (20+((-(1)+5))!)
 45 = (20/(1-.5~))
 46 = ((.2+((0)!/.1~))*5)
 47 = (2+(((0)!/.1~)*5))
 48 = (2*(((0-1)+5))!)
 49 = ((((2+(0)!))!/.1~)-5)
 50 = (((2^0)/.1)*5)
 51 = ((.2+((0)!/.1))*5)
 52 = (2+(((0)!/.1)*5))
 54 = (((2+(0)!)/.1)/.5~)
 55 = ((2+((0)!/.1~))*5)
 56 = (((.2-(0)!)+sqrt(.1~))*-((5)!))
 58 = (-(2)+sqrt((((((0)!/sqrt(.1~)))!)!*5)))
 59 = ((((2+(0)!))!/.1~)+5)
 60 = (20/(.1~^.5))
 62 = (2*(-((0)!)+sqrt(rt[-(.1)](.5))))
 64 = ((2-0)^(1+5))
 65 = ((20/sqrt(.1~))+5)
 66 = ((-(((2+(0)!))!)/.1~)+(5)!)
 67 = (((((2+(0)!))!)!*.1)-5)
 69 = ((2^(((0)!/sqrt(.1~)))!)+5)
 70 = (((.2^-((0)!))/-(.1))+(5)!)
 72 = ((2+(0)!)*((-(1)+5))!)
 75 = ((.2^-((0)!))*15)
 76 = (rt[(-(2)^-((0)!))](.1~)-5)
 77 = (((((2+(0)!))!)!*.1)+5)
 78 = (2*(-((0)!)+(sqrt(.1~)*(5)!)))
 80 = (-(20)*(1-5))
 81 = (201-(5)!)
 82 = (2*((0)!+(sqrt(.1~)*(5)!)))
 84 = (((.2-(0)!)+.1)*-((5)!))
 85 = (((((2+(0)!))!)!*.1~)+5)
 86 = (rt[(-(2)^-((0)!))](.1~)+5)
 88 = (rt[.2]((-((0)!)-1))+(5)!)
 90 = ((20/.1~)*.5)
 93 = (((2+(0)!)/-(.1~))+(5)!)
 95 = ((20-1)*5)
 96 = ((.20-1)*-((5)!))
 98 = (-(20)*(.1-5))
 99 = ((-(20)-1)+(5)!)
100 = (20/(1/5))
85

จากที่นี่เป็นเพียงความท้าทายในการบีบอัด บางทีฉันจะแข่งขันในภายหลังบางทีฉันอาจจะไม่ สำหรับฉันความสนุกส่วนใหญ่คือความท้าทายในการค้นหาสูตรส่วนใหญ่

คำแนะนำสำหรับผู้ที่พยายามเขียนแก้ปัญหา - รันไทม์ไม่น่าจะมีปัญหา หากคุณมีสูตรมากเกินไปที่จะตรวจสอบว่าคุณต้องมีฮิวริสติกมากขึ้นเพื่อทิ้งวิธีแก้ปัญหาที่สิ้นหวังและทำซ้ำ รหัสที่ฉันเขียนเพื่อสร้างการทำงานข้างต้นใน ~ 5 วินาทีบน Python


rt [.1] (-. 5) เป็นรูตที่ 0.1 ของ -0.5 ไม่ใช่รูต -0.5th ที่ 0.1
Uri Granta

นอกจากนี้ฉันเริ่มสงสัยว่าผู้ชนะอาจเป็นข้อความที่ถูกบีบอัด ควรคิดวิธีที่ดีกว่าเพื่อหลีกเลี่ยงสิ่งนั้น :-(
Uri Granta

@UriZarfaty โอ้ฉันจะแก้ไขมันในรหัสของฉันและเรียกใช้อีกครั้งให้ฉันหนึ่งวินาที
orlp

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

1
@ mbomb007 ฉันทำไม่มีความพยายามที่จะทำความสะอาดใด ๆ และผมคิดว่ารหัสในสถานะปัจจุบันเสีย - ลอง uncommenting บางสิ่งบางอย่าง: gist.github.com/orlp/878da16b5b7c650ebd09
orlp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.