จำนวนเต็มความซับซ้อน


29

งานของคุณคือการเขียนโปรแกรมที่อินพุต n ให้เอาท์พุตนิพจน์ที่น้อยที่สุดของแต่ละหมายเลข 1 ถึง n ตามลำดับ โปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ

การแสดงออกที่น้อยที่สุดจะรวม 1 กับการบวกและการคูณเพื่อให้ได้ผลลัพธ์ตามจำนวนที่กำหนดโดยใช้น้อยที่สุดเท่าที่จะเป็นไปได้ ตัวอย่างเช่น23แสดง23=((1+1+1)(1+1)+1)(1+1+1)+1+1ด้วยสิบเอ็ดซึ่งน้อยที่สุด

ที่ต้องการ:

  1. โปรแกรมจะต้องใช้เป็นอินพุตจำนวนธรรมชาติบวก
  2. ผลลัพธ์จะต้องอยู่ในรูปแบบนี้: 20 = ((1+1+1)(1+1+1)+1)(1+1)
  3. 8 = ((1+1)(1+1))(1+1)การส่งออกของคุณอาจมีวงเล็บไม่จำเป็นเช่น
  4. สัญลักษณ์การคูณ*เป็นตัวเลือก
  5. ช่องว่างเป็นตัวเลือก
  6. คุณไม่ได้มีการส่งออกทั้งหมดของสมการที่เป็นไปได้สำหรับค่าที่กำหนด: ตัวอย่างเช่นคุณสามารถเลือกที่จะส่งออกหรือ4=1+1+1+1 4=(1+1)(1+1)คุณไม่ต้องออกทั้งคู่
  7. โปรแกรมที่สั้นที่สุด (เป็นไบต์) ในแต่ละภาษาชนะ
1 = 1
2 = 1 + 1
3 = 1 + 1 + 1
4 = 1 + 1 + 1 + 1
= 1 5 + 1 + 1 + 1 + 1
= 6 (1 + 1 + 1) (1 + 1)
= 7 (1 + 1 + 1) (1 + 1) 1
= 8 (1 + 1 + 1 + 1) (1 + 1)
= 9 (1 + 1 + 1) (1 + 1 + 1)
= 10 (1 + 1 + 1) (1 + 1 + 1) 1
= 11 (1 + 1 + 1) (1 + 1 + 1) + 1 + 1
12 = (1 + 1 + 1) (1 + 1) (1 + 1)
= 13 (1 + 1 + 1) (1 + 1) (1 + 1) 1
= 14 ((1 + 1 + 1) (1 + 1) 1) (1 + 1)
= 15 (1 + 1 + 1 + 1 + 1) (1 + 1 + 1)
= 16 (1 + 1 + 1 + 1) (1 + 1) (1 + 1)
= 17 (1 + 1 + 1 + 1) (1 + 1) (1 + 1) 1
= 18 (1 + 1 + 1) (1 + 1 + 1) (1 + 1)
= 19 (1 + 1 + 1) (1 + 1 + 1) (1 + 1) 1
= 20 ((1 + 1 + 1) (1 + 1 + 1) 1) (1 + 1)

ต่อไปนี้เป็นกรณีทดสอบเพิ่มเติม: (จำไว้ว่าอนุญาตให้ใช้นิพจน์อื่นที่มีจำนวน 1 เท่ากันได้)

157=((1+1+1)(1+1)(1+1)+1)(1+1+1)(1+1)(1+1)+1

444=((1+1+1)(1+1+1)(1+1)(1+1)+1)(1+1+1)(1+1)(1+1)

1223=((1+1+1)(1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)(1+1+1+1+1)+1+1+1

15535=((((1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)((1+1+1)(1+1)+1)+1)(1+1+1)+1)(1+1+1)(1+1+1)+1

45197=((((1+1+1)(1+1)(1+1)(1+1)+1)(1+1+1+1+1)(1+1)+1)(1+1+1)(1+1)(1+1)+1)(1+1+1+1+1)(1+1+1)+1+1

โชคดี! - เต่า🐢


1
1) bullet # 6 ของคุณยังไม่เสร็จ (มันไม่มีตัวอย่างผลลัพธ์สำหรับn=20) และ 2) คุณพูดตอนแรกว่าความซับซ้อนของจำนวนเต็มซึ่งแตกต่างจากสมการจะต้องเป็นผลลัพธ์ แต่คุณไม่ได้รวมไว้ใน ตัวอย่างใด ๆ ยกเว้นตัวอย่างแรก
El'endia Starman

ฉันยังไม่ชัดเจน คุณแค่เอาสมการออกมาไหม
xnor

ใช่. ความซับซ้อนของจำนวนเต็มไม่ควรแสดงผล ฉันจะชี้แจงด้วยเช่นกัน ขออภัยในความผิดพลาด :(
The Turtle

อ๊ะฉันพูด bullet # 6 เมื่อฉันควรจะพูด bullet # 5 ในรายการข้อกำหนดของคุณ สำหรับปัญหาอื่น ๆ ขอขอบคุณสำหรับการแก้ไข :)
El'endia Starman

1
ที่เกี่ยวข้อง: oeis.org/A005245 oeis.org/A061373และในที่สุดก็oeis.org/A091333
ข้อบกพร่อง

คำตอบ:


10

Pyth, 60 ไบต์

LjWqeb\1b`()L?tbho/N\1++'tb"+1"m+y'/bdy'df!%bTr2b1VSQ++N\='N

สาธิต

คอมไพเลอร์ออนไลน์สามารถไปถึง 1223 ก่อนหมดเวลาขอบคุณการบันทึกฟังก์ชั่นอัตโนมัติของ Pyth

1223=((1+1+1)(1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)(1+1+1+1+1)+1+1+1

ในความคิดที่ abbrieviated

1223=(3^5+1)*5+3

สิ่งนี้ใช้ฟังก์ชั่นวนซ้ำ'ซึ่งคำนวณผลิตภัณฑ์และผลรวมทั้งหมดที่สามารถให้ผลลัพธ์ที่ต้องการค้นหาสตริงที่สั้นที่สุดในแต่ละการดำเนินการขั้นสุดท้ายจากนั้นทำการเปรียบเทียบด้วยการ1นับและส่งกลับอันแรก

มันใช้ฟังก์ชั่นตัวช่วยyซึ่งจะวงเล็บการแสดงออกเฉพาะในกรณีที่จะต้องวงเล็บ

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

บรรทัดสุดท้ายของเอาต์พุต:

15535=((((1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)((1+1+1)(1+1)+1)+1)(1+1+1)+1)(1+1+1)(1+1+1)+1

real    7m8.430s
user    7m7.158s
sys 0m0.945s

ในรูปแบบย่อ

15535=(((3^4+1)*(3*2+1)+1)*3+1)*3^2+1

7

CJam, 105 102 98 96 ไบต์

q~{)'=1$2,{:I{I1$-'+}%3/1>Imf'*+aImp!*+{)\{j}%\+}:F%{e_"+*"-:+}$0=}j2,{F)_'*={;{'(\')}%1}&*}jN}/

ลองใช้ออนไลน์ในล่าม CJam

ทดสอบการทำงาน

ล่ามออนไลน์ช้าเกินไปสำหรับกรณีทดสอบที่มีขนาดใหญ่กว่า แม้จะมีล่าม Java กรณีทดสอบที่ใหญ่กว่าจะใช้เวลานานและต้องใช้หน่วยความจำจำนวนมาก

$ time cjam integer-complexity.cjam <<< 157
1=1
2=1+1
3=1+1+1
4=1+1+1+1
5=1+1+1+1+1
6=(1+1)(1+1+1)
7=1+(1+1)(1+1+1)
8=(1+1)(1+1)(1+1)
9=(1+1+1)(1+1+1)
10=1+(1+1+1)(1+1+1)
11=1+1+(1+1+1)(1+1+1)
12=(1+1)(1+1)(1+1+1)
13=1+(1+1)(1+1)(1+1+1)
14=(1+1)(1+(1+1)(1+1+1))
15=(1+1+1)(1+1+1+1+1)
16=(1+1)(1+1)(1+1)(1+1)
17=1+(1+1)(1+1)(1+1)(1+1)
18=(1+1)(1+1+1)(1+1+1)
19=1+(1+1)(1+1+1)(1+1+1)
20=(1+1)(1+1)(1+1+1+1+1)
21=(1+1+1)(1+(1+1)(1+1+1))
22=1+(1+1+1)(1+(1+1)(1+1+1))
23=1+1+(1+1+1)(1+(1+1)(1+1+1))
24=(1+1)(1+1)(1+1)(1+1+1)
25=1+(1+1)(1+1)(1+1)(1+1+1)
26=(1+1)(1+(1+1)(1+1)(1+1+1))
27=(1+1+1)(1+1+1)(1+1+1)
28=1+(1+1+1)(1+1+1)(1+1+1)
29=1+1+(1+1+1)(1+1+1)(1+1+1)
30=(1+1)(1+1+1)(1+1+1+1+1)
31=1+(1+1)(1+1+1)(1+1+1+1+1)
32=(1+1)(1+1)(1+1)(1+1)(1+1)
33=1+(1+1)(1+1)(1+1)(1+1)(1+1)
34=(1+1)(1+(1+1)(1+1)(1+1)(1+1))
35=(1+1+1+1+1)(1+(1+1)(1+1+1))
36=(1+1)(1+1)(1+1+1)(1+1+1)
37=1+(1+1)(1+1)(1+1+1)(1+1+1)
38=(1+1)(1+(1+1)(1+1+1)(1+1+1))
39=(1+1+1)(1+(1+1)(1+1)(1+1+1))
40=(1+1)(1+1)(1+1)(1+1+1+1+1)
41=1+(1+1)(1+1)(1+1)(1+1+1+1+1)
42=(1+1)(1+1+1)(1+(1+1)(1+1+1))
43=1+(1+1)(1+1+1)(1+(1+1)(1+1+1))
44=(1+1)(1+1)(1+1+(1+1+1)(1+1+1))
45=(1+1+1)(1+1+1)(1+1+1+1+1)
46=1+(1+1+1)(1+1+1)(1+1+1+1+1)
47=1+1+(1+1+1)(1+1+1)(1+1+1+1+1)
48=(1+1)(1+1)(1+1)(1+1)(1+1+1)
49=1+(1+1)(1+1)(1+1)(1+1)(1+1+1)
50=(1+1)(1+1+1+1+1)(1+1+1+1+1)
51=(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
52=(1+1)(1+1)(1+(1+1)(1+1)(1+1+1))
53=1+(1+1)(1+1)(1+(1+1)(1+1)(1+1+1))
54=(1+1)(1+1+1)(1+1+1)(1+1+1)
55=1+(1+1)(1+1+1)(1+1+1)(1+1+1)
56=(1+1)(1+1)(1+1)(1+(1+1)(1+1+1))
57=(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
58=1+(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
59=1+1+(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
60=(1+1)(1+1)(1+1+1)(1+1+1+1+1)
61=1+(1+1)(1+1)(1+1+1)(1+1+1+1+1)
62=(1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
63=(1+1+1)(1+1+1)(1+(1+1)(1+1+1))
64=(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)
65=1+(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)
66=(1+1)(1+1+1)(1+1+(1+1+1)(1+1+1))
67=1+(1+1)(1+1+1)(1+1+(1+1+1)(1+1+1))
68=(1+1)(1+1)(1+(1+1)(1+1)(1+1)(1+1))
69=1+(1+1)(1+1)(1+(1+1)(1+1)(1+1)(1+1))
70=(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
71=1+(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
72=(1+1)(1+1)(1+1)(1+1+1)(1+1+1)
73=1+(1+1)(1+1)(1+1)(1+1+1)(1+1+1)
74=(1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
75=(1+1+1)(1+1+1+1+1)(1+1+1+1+1)
76=(1+1)(1+1)(1+(1+1)(1+1+1)(1+1+1))
77=1+(1+1)(1+1)(1+(1+1)(1+1+1)(1+1+1))
78=(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
79=1+(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
80=(1+1)(1+1)(1+1)(1+1)(1+1+1+1+1)
81=(1+1+1)(1+1+1)(1+1+1)(1+1+1)
82=1+(1+1+1)(1+1+1)(1+1+1)(1+1+1)
83=1+1+(1+1+1)(1+1+1)(1+1+1)(1+1+1)
84=(1+1)(1+1)(1+1+1)(1+(1+1)(1+1+1))
85=1+(1+1)(1+1)(1+1+1)(1+(1+1)(1+1+1))
86=(1+1)(1+(1+1)(1+1+1)(1+(1+1)(1+1+1)))
87=(1+1+1)(1+1+(1+1+1)(1+1+1)(1+1+1))
88=(1+1)(1+1)(1+1)(1+1+(1+1+1)(1+1+1))
89=1+(1+1)(1+1)(1+1)(1+1+(1+1+1)(1+1+1))
90=(1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
91=1+(1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
92=1+1+(1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
93=(1+1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
94=1+(1+1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
95=(1+1+1+1+1)(1+(1+1)(1+1+1)(1+1+1))
96=(1+1)(1+1)(1+1)(1+1)(1+1)(1+1+1)
97=1+(1+1)(1+1)(1+1)(1+1)(1+1)(1+1+1)
98=(1+1)(1+(1+1)(1+1+1))(1+(1+1)(1+1+1))
99=(1+1+1)(1+1+1)(1+1+(1+1+1)(1+1+1))
100=(1+1)(1+1)(1+1+1+1+1)(1+1+1+1+1)
101=1+(1+1)(1+1)(1+1+1+1+1)(1+1+1+1+1)
102=(1+1)(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
103=1+(1+1)(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
104=(1+1)(1+1)(1+1)(1+(1+1)(1+1)(1+1+1))
105=(1+1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
106=1+(1+1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
107=1+1+(1+1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
108=(1+1)(1+1)(1+1+1)(1+1+1)(1+1+1)
109=1+(1+1)(1+1)(1+1+1)(1+1+1)(1+1+1)
110=1+1+(1+1)(1+1)(1+1+1)(1+1+1)(1+1+1)
111=(1+1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
112=(1+1)(1+1)(1+1)(1+1)(1+(1+1)(1+1+1))
113=1+(1+1)(1+1)(1+1)(1+1)(1+(1+1)(1+1+1))
114=(1+1)(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
115=1+(1+1)(1+1+1)(1+(1+1)(1+1+1)(1+1+1))
116=(1+1)(1+1)(1+1+(1+1+1)(1+1+1)(1+1+1))
117=(1+1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
118=1+(1+1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
119=(1+(1+1)(1+1+1))(1+(1+1)(1+1)(1+1)(1+1))
120=(1+1)(1+1)(1+1)(1+1+1)(1+1+1+1+1)
121=1+(1+1)(1+1)(1+1)(1+1+1)(1+1+1+1+1)
122=(1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1+1+1))
123=(1+1+1)(1+(1+1)(1+1)(1+1)(1+1+1+1+1))
124=(1+1)(1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
125=(1+1+1+1+1)(1+1+1+1+1)(1+1+1+1+1)
126=(1+1)(1+1+1)(1+1+1)(1+(1+1)(1+1+1))
127=1+(1+1)(1+1+1)(1+1+1)(1+(1+1)(1+1+1))
128=(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)
129=1+(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)(1+1)
130=(1+1)(1+1+1+1+1)(1+(1+1)(1+1)(1+1+1))
131=1+(1+1)(1+1+1+1+1)(1+(1+1)(1+1)(1+1+1))
132=(1+1)(1+1)(1+1+1)(1+1+(1+1+1)(1+1+1))
133=(1+(1+1)(1+1+1))(1+(1+1)(1+1+1)(1+1+1))
134=1+(1+(1+1)(1+1+1))(1+(1+1)(1+1+1)(1+1+1))
135=(1+1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
136=1+(1+1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
137=1+1+(1+1+1)(1+1+1)(1+1+1)(1+1+1+1+1)
138=(1+1)(1+1+1)(1+1+(1+1+1)(1+(1+1)(1+1+1)))
139=1+(1+1)(1+1+1)(1+1+(1+1+1)(1+(1+1)(1+1+1)))
140=(1+1)(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
141=1+(1+1)(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1))
142=(1+1)(1+(1+1)(1+1+1+1+1)(1+(1+1)(1+1+1)))
143=(1+1+(1+1+1)(1+1+1))(1+(1+1)(1+1)(1+1+1))
144=(1+1)(1+1)(1+1)(1+1)(1+1+1)(1+1+1)
145=1+(1+1)(1+1)(1+1)(1+1)(1+1+1)(1+1+1)
146=(1+1)(1+(1+1)(1+1)(1+1)(1+1+1)(1+1+1))
147=(1+1+1)(1+(1+1)(1+1+1))(1+(1+1)(1+1+1))
148=(1+1)(1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
149=1+(1+1)(1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
150=(1+1)(1+1+1)(1+1+1+1+1)(1+1+1+1+1)
151=1+(1+1)(1+1+1)(1+1+1+1+1)(1+1+1+1+1)
152=(1+1)(1+1)(1+1)(1+(1+1)(1+1+1)(1+1+1))
153=(1+1+1)(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
154=1+(1+1+1)(1+1+1)(1+(1+1)(1+1)(1+1)(1+1))
155=(1+1+1+1+1)(1+(1+1)(1+1+1)(1+1+1+1+1))
156=(1+1)(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))
157=1+(1+1)(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1))

real    0m3.896s
user    0m4.892s
sys     0m0.066s

ให้เวลาเพียงพอมันจะผลิตโซลูชันเหล่านี้สำหรับกรณีทดสอบถัดไป:

444=(1+1)(1+1)(1+1+1)(1+(1+1)(1+1)(1+1+1)(1+1+1))
1223=1+1+(1+1+1)(1+1+(1+1+1)(1+1+1))(1+(1+1)(1+1)(1+1+1)(1+1+1))

มันทำงานยังไง?
ข้อบกพร่อง

@ flawr ฉันยังคงหวังที่จะเล่นกอล์ฟนี้อีกเล็กน้อย ฉันจะเพิ่มคำอธิบายเมื่อฉันเลิก / ยอมแพ้
Dennis

4

Julia, 229 ไบต์

n->(F=i->K[i]>0?E[i]:"("E[i]")";C=[1;3:n+1];K=0C;E=fill("1",n);for s=1:n for i=1:s÷2 (D=C[i]+C[s-i])<C[s]?(C[s]=D;E[s]=E[i]"+"E[s-i];K[s]=0):s%i>0||(D=C[i]+C[j=s÷i])<C[s]&&(C[s]=D;E[s]=F(i)F(j);K[s]=1)end;println("$s="E[s])end)

อันนี้ค่อนข้างเร็วจริงๆ การกำหนดฟังก์ชั่นfและการทำงาน@time f(15535)จะให้เอาต์พุต (สองบรรทัดสุดท้ายเท่านั้น)

15535=1+(1+1+1)(1+1+1)(1+(1+1+1)(1+(1+(1+1)(1+1+1))(1+(1+1+1)(1+1+1)(1+1+1)(1+1+1))))
32.211583 seconds (263.30 M allocations: 4.839 GB, 4.81% gc time)

และสำหรับ@time f(45197)มันให้

45197=1+1+(1+1+1)(1+1+1+1+1)(1+(1+1)(1+1)(1+1+1)(1+(1+1)(1+1+1+1+1)(1+(1+1)(1+1)(1+1)(1+1+1))))
289.749564 seconds (2.42 G allocations: 43.660 GB, 4.91% gc time)

ดังนั้นรหัสทำอะไร Simple - Cเก็บหนึ่งCจำนวนปัจจุบันKเป็นอาร์เรย์ตัวบ่งชี้ที่ติดตามว่าการแสดงออกเป็นพื้นฐานผลรวมหรือผลิตภัณฑ์เพื่อวัตถุประสงค์ในการจัดการกับการถ่ายภาพคร่อมและEถือExpression เอง เมื่อมองจากด้านบนs=1จนถึงnด้านบนรหัสจะค้นหาจำนวนที่น้อยที่สุดsในแง่ของค่าที่ต่ำกว่าโดยมองหาผลรวมหรือผลิตภัณฑ์ หากเป็นผลิตภัณฑ์ก็จะตรวจสอบส่วนประกอบทั้งสองและใส่เครื่องหมายวงเล็บไว้รอบ ๆ หากเป็นผลรวม การตรวจสอบนั้นทำในฟังก์ชันFเพื่อบันทึกไบต์ (เพราะต้องทำสองครั้งสำหรับสองปัจจัย)

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