ไม่ใช่แค่ตัวต่อสี่ตัวเท่านั้น


11

ในตัวแปรสี่ตัวต่อปริศนานี้คุณควรใช้มากถึงx x's(และไม่มีตัวเลขอื่น) และชุดปฏิบัติการที่กำหนดไว้เพื่อให้ถึงทุกหมายเลขตั้งแต่ 0 ถึง 100 หากx = 4คุณสามารถใช้งานได้มากถึงสี่4sและคำถามนี้จะกลายเป็นสี่แบบคลาสสิก ตัวต่อ (ยกเว้นคุณสามารถใช้ 4s ได้สูงสุดสี่ตัวแทนที่จะต้องใช้สี่อันอย่างแน่นอน) 1 < x <= 9เราคิด

ในรุ่นนี้อนุญาตเฉพาะผู้ประกอบการดังต่อไปนี้:

  • การบวก ( +) การลบ ( -) การคูณ ( *) การหาร ( /) 5/2 = 2.5หมายเหตุนี้เป็นส่วนหนึ่งที่แท้จริงเพื่อที่ว่า
  • การยกกำลัง (เช่น 4 ^ 4) เนื่องจากจะไม่มีสัญลักษณ์พิเศษหากเขียนด้วยมือตามปกติ
  • xsคุณสามารถทำให้จำนวนเต็มใหม่โดยการเชื่อมโยง 4, 44, 444, 4444เช่นคุณสามารถทำให้จำนวนเต็ม

นอกจากนี้คุณยังสามารถใช้วงเล็บเป็นหมายเลขกลุ่มเพื่อควบคุมลำดับการประเมินของผู้ดำเนินการ ตัวอย่างเช่นคุณไม่สามารถรวมวงเล็บเข้ากับการต่อข้อมูล(4/4)(4/4) = (1)(1) = 11ได้

ไม่สามารถใช้สัญลักษณ์อื่น ๆ และใช้การดำเนินการตามมาตรฐาน

โปรแกรมของคุณควรสร้างขึ้นxในช่วงที่กำหนดและnระหว่าง0และ100รวมโซลูชันที่ถูกต้องสำหรับอินพุตนั้นหากมีอยู่ มิฉะนั้นโค้ดของคุณจะต้องแสดงผลออกมาเพื่อระบุว่าไม่มีวิธีแก้ไขปัญหาดังกล่าว

คุณจะต้องสามารถเรียกใช้การส่งของคุณให้เสร็จสมบูรณ์บนเครื่องของคุณสำหรับค่าอินพุตใด ๆ ของxและnในช่วงที่อนุญาต นี่คือรหัสกอล์ฟดังนั้นทางออกที่สั้นที่สุดจึงชนะ

คำถามเก่าที่เกี่ยวข้องนี้ใช้ตัวดำเนินการเพิ่มเติม (และ 4s เท่านั้น) และด้วยเหตุนี้ตัวเลขทั้งหมดตั้งแต่ 0 ถึง 100 สามารถแก้ไขได้ซึ่งจะไม่เป็นจริงสำหรับความท้าทายนี้

อินพุตและเอาต์พุต

รหัสของคุณใช้จำนวนเต็มสองจำนวนxและnเป็นอินพุตและควรแสดงโซลูชัน (หรือตัวบ่งชี้ว่าไม่มีวิธีแก้ปัญหา) ในรูปแบบที่มนุษย์สามารถอ่านได้ที่คุณเห็นว่าสะดวก อินพุต4 6จะหมายถึง "การใช้งานสูงสุดสี่ 4s ให้สร้างหมายเลข 6" ดังนั้นถ้าใส่เป็นผลผลิตที่อาจจะ4 6(4+4)/4+4



2
สามารถรวม parens เข้ากับการต่อข้อมูลได้หรือไม่? เช่น `(4/4) (4/4) = (1) (1) = 11?
Digital Trauma

1
การเพิ่มวงเล็บ (และไม่อนุญาตวงเล็บ + การต่อข้อมูล) ทำให้สิ่งนี้ยากขึ้นอย่างมาก
Draconis

2
การเพิ่มตัวดำเนินการการยกกำลังและการวนรอบด้านนอกตามจำนวนครั้งที่ใช้ไม่ใช่ IMO เพิ่มสิ่งที่ไม่น่าสนใจบนcodegolf.stackexchange.com/q/82884/194
Peter Taylor

2
@PeterTaylor วงเล็บดูเหมือนจะสร้างความแตกต่างได้มากมาย ฉันจะลงคะแนนเพื่อเปิดใหม่ถ้าทำได้
felipa

คำตอบ:


4

Python 3 , 265 ไบต์

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

ลองออนไลน์!

ใช้งานได้กับตัวเลขทั้งหมดในการอ้างอิงที่เชื่อมโยงโดยวิศวกรขนมปัง

วิ่งไปเรื่อย ๆx=8บน tio x=9ใช้เวลาสองสามนาทีบนเครื่องของฉัน


ฟังก์ชั่นgส่งกลับชุดรวมกันทั้งหมดที่มีมากที่สุดxจำนวนx's fจากนั้นวนnซ้ำพวกเขาและส่งกลับครั้งแรกที่ประเมินถึงจำนวน

จำนวนค่าที่เป็นไปได้ที่ฉันพบสำหรับแต่ละค่าxคือ:

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

ตัวเลขทั้งหมดข้างต้นสามารถสร้างขึ้นจาก(a+b), (a-b), (a+b), a*b, a/b, และ (a/b) และอย่าให้ตัวเลขเพิ่มเติมa^ba+ba-b

a^b นอกจากนี้ยังใช้เพียงครั้งเดียวเท่านั้นเนื่องจากมีการสร้างจำนวนมากขึ้น (สิ่งนี้ได้รับการยืนยันในเอกสารอ้างอิงด้านบนด้วย)


รุ่นอื่นที่ลัดวงจรทันทีที่พบวิธีแก้ปัญหา (ไม่ใช่กอล์ฟ):

นี่คือเร็วกว่ามากสำหรับx=7..9ตัวเลขทั้งหมดสามารถสร้าง

Python 3 , 338 289 ไบต์

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

ลองออนไลน์!


นี่เป็นคำตอบที่ดีมาก! ฉันคิดว่าคุณมักจะใช้อย่างถูกต้อง (ตรงข้ามกับสูงสุด) x xs (เช่น(4/4**(4-4))สำหรับ4) แต่ปรากฎว่าไม่ใช่กรณี
Anush

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