40 ตัวเลขใน 9 ไบต์


40

มี40 วิธีที่เส้นทาง Hamiltonianกำกับสามารถจัดเรียงบนตาราง 3 × 3 ได้:
เส้นทางมิลโตเนียนที่ไม่มีเส้นทางทั้ง 20 รายการเป็น 3 & times3;  ตะแกรง
กราฟิกนี้ ( ขอบคุณ Sp3000! ) แสดงเฉพาะเส้นทางที่ไม่มีเส้นทาง 20 เส้นทางเท่านั้น ข้ามเส้นสีแต่ละเส้นในทั้งสองทิศทางสำหรับเส้นทาง 40 เส้นทาง

ท้าทาย

ใช้ASCII ที่พิมพ์ได้เท่านั้นเขียนอักขระ 3 × 3 ตารางเช่น:

ABC
DEF
GHI

เมื่อแต่ละเส้นทาง 40 เส้นทางถูกอ่านจากตารางนี้เป็น 40 โปรแกรมบรรทัดเดียว, 9 ตัวอักษรเป้าหมายคือการให้แต่ละโปรแกรมส่งออกจำนวนเต็มที่ไม่ซ้ำกันจาก 1 ถึง 40 การทำเช่นนี้สำหรับเส้นทาง 40 ทั้งหมดดูเหมือนยากและไม่น่าเป็นไปได้ ดังนั้นคุณจะต้องทำให้มันใช้งานได้หลายเส้นทางเท่าที่จะทำได้

การส่งผลงานที่ 40 โปรแกรมเส้นทางส่งออกตัวเลขที่แตกต่างกันมากที่สุดจาก 1 ถึง 40 จะเป็นผู้ชนะ Tiebreaker ไปที่การส่งก่อนหน้า

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

  • โปรแกรมที่เกิดข้อผิดพลาดขณะคอมไพล์รันหรือออกจะไม่ถูกนับ คำเตือนก็โอเค
  • โปรแกรมที่ไม่ส่งออกจำนวนเต็มตั้งแต่ 1 ถึง 40 หรือแสดงผลสิ่งที่ผิดปกติเล็กน้อยเช่น-35หรือ35 36ไม่นับ
  • โปรแกรมที่ต้องการให้ผู้ใช้ป้อนข้อมูลเพื่อสร้างผลลัพธ์จะไม่ถูกนับ
  • โปรแกรมที่ไม่สิ้นสุดจะไม่ถูกนับรวม
  • นับจากนี้โปรแกรมที่ไม่ได้กำหนดค่าจะไม่ถูกนับ
  • มิฉะนั้นโปรแกรมที่ถูกต้องที่ส่งออกจำนวนเต็มตั้งแต่ 1 ถึง 40 ว่าโปรแกรมที่ถูกต้องอื่นได้ออกแล้วจะไม่ถูกนับ (โปรแกรมแรกจะถูกนับ)
  • เฉพาะโปรแกรมที่แสดงตัวเลขจำนวนเต็มตั้งแต่ 1 ถึง 40 (รวม) จะนับรวมกับผลรวมของคุณ ตัวเลขที่มีการคาดว่าจะอยู่ในปกติ1, 2, ... , 39, 40รูปแบบเว้นแต่ที่ไม่ได้เป็นบรรทัดฐานสำหรับภาษาของคุณ (ขึ้นบรรทัดใหม่ในผลลัพธ์เป็นปกติ)
  • หมายเลขใดที่โปรแกรมของคุณส่งออกและสิ่งที่อยู่ในลำดับไม่สำคัญ เฉพาะจำนวนเต็มที่แตกต่างจากโปรแกรมที่ถูกต้องเท่านั้น

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

อักขระ ASCII ที่พิมพ์ได้ 9 ตัวของคุณไม่จำเป็นต้องแตกต่างกัน

ตัวอย่าง

ถ้ากริด 3 × 3 ของคุณเป็น

ABC
DEF
GHI

และ 40 โปรแกรมและผลลัพธ์ของคุณเป็นแบบนี้

ABCFEDGHI -> 26
ABCFIHEDG -> 90
ABCFIHGDE -> 2
ABEDGHIFC -> syntax error
ADEBCFIHG -> prints 40 but then errors
ADGHEBCFI -> 6
ADGHIFCBE -> 6
ADGHIFEBC -> 6
CBADEFIHG -> runtime error
CBADGHEFI -> 3
CBADGHIFE -> 4
CFEBADGHI -> -32
CFIHEBADG -> 38.0
CFIHGDABE -> "36"
EDABCFIHG -> 33
EFCBADGHI -> no output
EHGDABCFI -> compilation error
EHIFCBADG -> 8
GDABCFEHI -> 22
GHEDABCFI -> 41
IHGDEFCBA -> 0
GDEHIFCBA -> '9'
EDGHIFCBA -> +10
CFIHGDEBA -> 11
GHIFCBEDA -> error
IFCBEHGDA -> error
EBCFIHGDA -> prints 23 but then loops infinitely
CBEFIHGDA -> randomly prints either 24 or 44
GHIFEDABC -> error
IFEHGDABC -> 30
EFIHGDABC -> 39
IHGDABEFC -> 7
GDABEHIFC -> 29
EBADGHIFC -> -1
GHIFCBADE -> 26
IHGDABCFE -> 1
IFCBADGHE -> error
GDABCFIHE -> no output
IHEFCBADG -> no output
IFCBADEHG -> "quack"

คะแนนของคุณจะเป็น 14 เนื่องจากมีจำนวนเต็ม 14 ที่แตกต่างกัน 1-40 26 2 6 3 4 33 8 22 11 30 39 7 29 1การส่งออกอย่างถูกต้องคือ


14
-1 ความท้าทายไม่มีการอ้างอิงถึงธง
อเล็กซ์ A.

@ Sp3000 การจัดเรียงในภาพตามลำดับเฉพาะหรือไม่? (ฉันถือว่าการท้าทายการสั่งซื้อนั้นไม่สำคัญ แต่ฉันกำลังจะตายเพราะความอยากรู้อยากเห็นเกี่ยวกับภาพโดยเฉพาะอย่างยิ่งถ้าสิ่งเหล่านี้ถูกใช้เป็นเมล็ดในระบบ L สำหรับ Curve Space ของ Hilbert มีการเข้ารหัสตามธรรมชาติสำหรับ set?)
luser droog

@luserdroog อืมSp ทำรูปแล้วดีที่สุดที่จะถามเขา
งานอดิเรกของ Calvin

@luserdroog หากคุณนับเซลล์ 1 ถึง 9 พวกมันควรเรียงตามลำดับคำศัพท์เช่นอันดับแรกคือ123654789
Sp3000

@luserdroog (นั่นคือเลือกตัวแทน lexicographically ก่อนหน้านี้ของแต่ละเส้นทางที่กำกับแล้วจัดเรียงตัวแทน 20 คนในรูปแบบพจนานุกรม)
mathmandan

คำตอบ:


27

PARI / GP - 24

1%1
 8
2+3

PARI / GP ละเว้นช่องว่างระหว่างตัวเลขเพื่อให้ตัวอย่างเช่นจะถือว่าเป็น1 8 2 182เดียวกันสามารถทำงานสำหรับ perl โดยแทนที่ช่องว่างด้วยขีดล่าง ฉันไม่ได้หมดพื้นที่ค้นหาทั้งหมดดังนั้นอาจมีผู้สมัครที่ดีกว่า

โปรแกรมสามารถป้อนไปยัง gp เป็นgp -q -f program.gpหรือโต้ตอบในแบบจำลอง


เอาท์พุต

1%1 8 2+3 -> 4
1%1 3+8 2 -> 83 # invalid
1%1 3+2 8 -> 29
1%8 2+3 1 -> 32
1 8%1 3+2 -> 7
1 2+8%1 3 -> 20
1 2+3 1%8 -> 19
1 2+3 8%1 -> 12
1%1 8 3+2 -> 3
1%1 2+8 3 -> 84 # invalid
1%1 2+3 8 -> 39
1 8%1 2+3 -> 9
1 3+8%1 2 -> 21
1 3+2 1%8 -> 18
8 1%1 3+2 -> 5
8 1%1 2+3 -> 12 # dup
8+2 1%1 3 -> 16
8+3 1%1 2 -> 15
2 1%1 8+3 -> 6
2+8 1%1 3 -> 5  # dup
3+2 8 1%1 -> 3  # dup
2 8+3 1%1 -> 28
8 2+3 1%1 -> 82 # invalid
1 3+2 8%1 -> 13
2+3 1%8 1 -> 33
3 1%8+2 1 -> 28 # dup
8%1 3+2 1 -> 29 # dup
1%8 3+2 1 -> 22
2+3 8 1%1 -> 2
3 8+2 1%1 -> 38
8 3+2 1%1 -> 83 # invalid
3+2 1%8 1 -> 24
2 1%8+3 1 -> 36
8%1 2+3 1 -> 39 # dup
2+3 1%1 8 -> 15 # dup
3+2 1%1 8 -> 6  # dup
3 1%1 2+8 -> 15 # dup
2 1%1 3+8 -> 16 # dup
3+8 1%1 2 -> 12 # dup
3 1%1 8+2 -> 15 # dup

ค่าทั้งหมดยกเว้น 4 ค่าอยู่ในช่วงที่ต้องการโดยมี 12 รายการซ้ำกัน


ปรับปรุง

ฉันทำกระทืบเสร็จแล้วมี 23 ข้อที่แตกต่างกันหกข้อและมีเพียง 24 ข้อเท่านั้น (ตามที่อ่านโดยแถว):

23 1%1 6 2+3 [2, 3, 4, 5, 7, 8, 11, 12, 13, 14, 16, 17, 18, 19, 22, 24, 26, 27, 32, 33, 34, 36, 37]
23 1 2%3+2*8 [2, 5, 7, 8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 22, 23, 25, 26, 29, 31, 32, 37, 40]
23 2 3%1+8 2 [2, 4, 6, 7, 10, 11, 12, 13, 14, 15, 16, 20, 21, 23, 24, 28, 29, 30, 31, 32, 33, 34, 40]
23 4%6%5*7+6 [2, 4, 5, 6, 7, 8, 9, 12, 13, 19, 21, 23, 24, 26, 29, 31, 32, 33, 34, 37, 38, 39, 40]
23 5%6%4*7+6 [2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 25, 26, 29, 31, 33, 34, 37, 38, 39, 40]
23 5%6%4*8+6 [1, 3, 5, 6, 8, 9, 10, 12, 14, 15, 18, 22, 24, 25, 27, 29, 30, 32, 34, 36, 37, 39, 40]

24 1%1 8 2+3 [2, 3, 4, 5, 6, 7, 9, 12, 13, 15, 16, 18, 19, 20, 21, 22, 24, 28, 29, 32, 33, 36, 38, 39]

โปรแกรมที่ฉันใช้สำหรับ crunching อยู่ด้านล่าง PARI / GP มีความสามารถในการประมวลผลสตริงที่ จำกัด ดังนั้นให้จัดการกับ char charays (aka Vecsmall) เป็นหลัก ผู้ประกอบการที่ผ่านการทดสอบมี+, -, *, \(ชั้น div) %, ;(แยกแสดงออกเป็นหลักทิ้งทุกอย่างก่อนที่มัน) และ(พื้นที่ตามที่อธิบายไว้ข้างต้น) ตัวดำเนินการเลขชี้กำลัง^สามารถเพิ่มได้ แต่มันช้าเกินไปที่จะทดสอบอย่างละเอียด

perms = {[
  [1, 2, 3, 6, 5, 4, 7, 8, 9], [1, 2, 3, 6, 9, 8, 5, 4, 7], [1, 2, 3, 6, 9, 8, 7, 4, 5], [1, 2, 5, 4, 7, 8, 9, 6, 3],
  [1, 4, 5, 2, 3, 6, 9, 8, 7], [1, 4, 7, 8, 5, 2, 3, 6, 9], [1, 4, 7, 8, 9, 6, 3, 2, 5], [1, 4, 7, 8, 9, 6, 5, 2, 3],
  [3, 2, 1, 4, 5, 6, 9, 8, 7], [3, 2, 1, 4, 7, 8, 5, 6, 9], [3, 2, 1, 4, 7, 8, 9, 6, 5], [3, 6, 5, 2, 1, 4, 7, 8, 9],
  [3, 6, 9, 8, 5, 2, 1, 4, 7], [3, 6, 9, 8, 7, 4, 1, 2, 5], [5, 4, 1, 2, 3, 6, 9, 8, 7], [5, 6, 3, 2, 1, 4, 7, 8, 9],
  [5, 8, 7, 4, 1, 2, 3, 6, 9], [5, 8, 9, 6, 3, 2, 1, 4, 7], [7, 4, 1, 2, 3, 6, 5, 8, 9], [7, 8, 5, 4, 1, 2, 3, 6, 9],
  [9, 8, 7, 4, 5, 6, 3, 2, 1], [7, 4, 5, 8, 9, 6, 3, 2, 1], [5, 4, 7, 8, 9, 6, 3, 2, 1], [3, 6, 9, 8, 7, 4, 5, 2, 1],
  [7, 8, 9, 6, 3, 2, 5, 4, 1], [9, 6, 3, 2, 5, 8, 7, 4, 1], [5, 2, 3, 6, 9, 8, 7, 4, 1], [3, 2, 5, 6, 9, 8, 7, 4, 1],
  [7, 8, 9, 6, 5, 4, 1, 2, 3], [9, 6, 5, 8, 7, 4, 1, 2, 3], [5, 6, 9, 8, 7, 4, 1, 2, 3], [9, 8, 7, 4, 1, 2, 5, 6, 3],
  [7, 4, 1, 2, 5, 8, 9, 6, 3], [5, 2, 1, 4, 7, 8, 9, 6, 3], [7, 8, 9, 6, 3, 2, 1, 4, 5], [9, 8, 7, 4, 1, 2, 3, 6, 5],
  [9, 6, 3, 2, 1, 4, 7, 8, 5], [7, 4, 1, 2, 3, 6, 9, 8, 5], [9, 8, 5, 6, 3, 2, 1, 4, 7], [9, 6, 3, 2, 1, 4, 5, 8, 7]
]}

ops = Vecsmall("+-*\\%; ")

ms = 1

for(c = 48, 57, {
 for(d = c, 57,
  for(f = d, 57,
   for(g = c, 57,
    for(e = 48, 57,
     print1(Strchr([c,d,e,f,g,13]));
     for(h = 1, #ops,
      for(i = 1, #ops,
       for(j = 1, #ops,
        for(k = 1, #ops,
         a = Vecsmall([c, ops[h], d, ops[i], e, ops[j], f, ops[k], g]);
         s = Set();
         for(m = 1, #perms,
          v = Strchr(vecextract(a, perms[m]));
          iferr(b = eval(v), E, b = 0);
          if(b >= 1 && b <= 40, s = setunion(s, [b]))
         );
         if(#s >= ms, ms = min(23, #s); print(#s, " ", Strchr(a), " ", s));
        )
       )
      )
     )
    )
   )
  )
 )
})

อนิจจาโปรแกรม Perl ไม่ได้ส่งออกค่าสุดท้าย รูทีนย่อย Perl ทำ แต่รูทีนย่อยมีเครื่องหมายปีกกา ( "ลายเซ็นเป็นส่วนหนึ่งของเนื้อหาของรูทีนย่อยโดยปกติแล้วเนื้อหาของรูทีนย่อยนั้นเป็นเพียงรหัสของโค้ด" ) ดังนั้นฉันไม่คิดว่ามันจะทำได้ใน Perl
msh210

29

Deadfish , 18

นี่เป็นภาษาแรกที่ฉันลองใช้ก่อนที่จะพิจารณาตัวดำเนินการมัด ตอนนี้ฉันกำลังโพสต์มันเพื่อความฮือฮาอย่างแท้จริงของความคิดที่ว่า Deadfish อาจมีประโยชน์สำหรับบางสิ่งบางอย่าง

iii
ios
sii

สำหรับผู้ที่ไม่ทราบว่า Deadfish iคือการเพิ่มขึ้นsเป็นกำลังสองและoเอาต์พุตโดยมีการสะสมเริ่มต้นที่ 0 (นอกจากนี้ยังมีคำสั่งที่ 4 dสำหรับการลดลงที่ไม่ได้ใช้ที่นี่) ความจริงที่ว่าเราไม่มีการพิมพ์อัตโนมัติและจำเป็นต้องใช้oเป็นข้อเสียเปรียบที่สำคัญ แต่ที่น่าประหลาดใจ Deadfish ไม่ได้ทำที่นี่มากเกินไปทุกสิ่งพิจารณา ปรากฎว่าตำแหน่งที่เหมาะสมของผู้ปฏิบัติงานเอาท์พุทอยู่ตรงกลาง

iiisoisii 9
iiisiiois 11
iiisiisio 122
iioisiisi 2
iioiisiis 2
iisioiisi 5
iisiisiio 38
iisiisoii 36
iiiiosiis 4
iiiisiosi 17
iiiisiiso 324
isoiiisii 1
isiioiiis 3
isiisiiio 12
oiiiisiis 0
osiiiisii 0
oisiiiisi 0
oiisiiiis 0
siiiisoii 16
sioiiiisi 1
iisiosiii 5
sioiisiii 1
oisiisiii 0
isiisioii 10
siisiioii 6
isiioisii 3
oiisiisii 0
iiosiisii 2
siisoiiii 4
isoisiiii 1
osiisiiii 0
iisiiiosi 7
siiioiisi 3
oiiisiisi 0
siisiiiio 8
iisiiiiso 64
isiiiisio 26
siiiisiio 18
iiosiiiis 2
isiiiiois 5

25

Python REPL และอีกมากมาย22 23

6+7
*5%
6%4

การสังเกตหลัก: ถ้าคุณใช้สีกริดเหมือนกระดานหมากรุกเส้นทางจะสลับสีกริดเมื่อมันไปและเริ่มและสิ้นสุดบนสีเดียวกัน

ยังคงเดรัจฉานบังคับให้ดีขึ้น การลองใช้+*%(และแม้กระทั่ง**ภาษาที่^มีการยกกำลัง) ไม่ได้ทำให้อะไรดีขึ้นไปอย่างน่าเสียดาย ฉันพยายามโยนตัวดำเนินการระดับบิตและมีเพียง^(xor) ที่ดูเหมือนว่าจะช่วยได้เล็กน้อย แต่การค้นหาใช้เวลานานเกินไปดังนั้นฉันจึงยอมแพ้

6+7%5*6%4 6
6+7%4%5*6 24
6+7%4%6*5 21
6+5*6%4%7 8
6*5+7%4%6 33
6*6%5+7%4 4
6*6%4%7+5 5
6*6%4%5+7 7
7+6*5%4%6 9
7+6*6%5%4 8
7+6*6%4%5 7
7%5+6*6%4 2
7%4%5+6*6 39
7%4%6*6+5 23
5*6+7%4%6 33
5%7+6*6%4 5
5%6*6+7%4 33
5%4%7+6*6 37
6*6+7%5%4 38
6%5*6+7%4 9
4%6*5%7+6 12
6*5%4%7+6 8
5*6%4%7+6 8
7%4%6*5+6 21
6%4%7+5*6 32
4%7+5%6*6 34
5+7%4%6*6 23
7+5%4%6*6 13
6%4%5*6+7 19
4%5%6*6+7 31
5%4%6*6+7 13
4%6*6+5%7 29
6*6+5%4%7 37
5+6*6%4%7 5
6%4%7+6*5 32
4%6*6+7%5 26
4%7+6*6%5 5
6*6+7%4%5 39
4%5%7+6*6 40
4%7+6*5%6 4

5
งานถัดไป: เขียนโปรแกรมที่สร้างโปรแกรมด้วยค่าที่ไม่ซ้ำกันมากที่สุด จากนั้นตีกอล์ฟโปรแกรมนั้น :)
Reto Koradi

@RetoKoradi ส่วนแรกคือสิ่งที่ฉันทำ ที่สอง ... ภายหลัง: P
Sp3000

@ Sp3000 ฉันจบการเดรัจฉานบังคับของวิธีการแก้ปัญหาแบบนี้ มี6+7*5%6%4, 6+7*4%6%5และ6+8*4%6%5(ซ้ายไปขวาบนลงล่าง) และไม่มีอะไรอื่น
isaacg

1
@isaacg มีวิธีแก้ปัญหา 23 จุดเพิ่มเติมหากคุณเลือกตัวดำเนินการเพิ่มเติมเช่น & | ^
Sparr

เป็นความคิดแบบสุ่ม: คุณเคยลองอนุญาต+และ-อยู่ที่มุมหรือกึ่งกลางใช่ไหม เนื่องจากพวกมันยังไม่พร้อมเช่นเดียวกับตัวดำเนินการแบบไบนารีซึ่งยังควรส่งผลให้นิพจน์ที่ถูกต้องทั้งหมด ไม่น่าเป็นไปได้ว่ามันจะส่งผลในการแก้ปัญหาที่ดีกว่า แต่อย่างน้อยก็ขยายพื้นที่การค้นหา อืมจริงๆแล้วมันอาจจะเป็นปัญหาเพราะคุณสามารถจบลงด้วยลำดับของโอเปอเรเตอร์
Reto Koradi

13

J, 15

2 + 1
* 3 *
2 + 3

ผลลัพธ์นี้จะแสดงเฉพาะตัวเลขที่ถูกต้อง แต่มีจำนวนมากซ้ำซ้อน 17 11 16 28 31 23 13 10 21 33 18 24 22 29 27ค่าที่ไม่ซ้ำกัน คุณสามารถทำได้ดีกว่าโดยการเปลี่ยนตัวดำเนินการและจำนวนเต็มที่เกี่ยวข้อง

2+1*3*2+3 -> 17
2+1*3+3*2 -> 11
2+1*3+2*3 -> 11
2+3*2+3*1 -> 17
2*3+1*3+2 -> 16
2*2+3+1*3 -> 16
2*2+3*1+3 -> 28
2*2+3*3+1 -> 28
1+2*3*3+2 -> 31
1+2*2+3*3 -> 23
1+2*2+3*3 -> 23
1*3+2*2+3 -> 13
1*3+3+2*2 -> 10
1*3+2*2+3 -> 13
3*2+1*3+2 -> 21
3*1+2*2+3 -> 33
3+2*2+1*3 -> 13
3+3*1+2*2 -> 18
2*2+1*3+3 -> 16
2+3*2+1*3 -> 17
3+2*3*1+2 -> 21
2*3+3*1+2 -> 24
3*2+3*1+2 -> 33
1*3+2*3+2 -> 13
2+3*1+3*2 -> 23
3*1+3+2*2 -> 24
3+1*3+2*2 -> 10
1+3*3+2*2 -> 22
2+3*3*2+1 -> 29
3*3+2*2+1 -> 27
3*3+2*2+1 -> 27
3+2*2+3*1 -> 13
2*2+3+3*1 -> 16
3+2*2+3*1 -> 13
2+3*1+2*3 -> 23
3+2*2+1*3 -> 13
3*1+2*2+3 -> 33
2*2+1*3+3 -> 16
3+3*1+2*2 -> 18
3*1+2*3+2 -> 33

โดยวิธีการขอแสดงความยินดีกับการกดปุ่มตัวแทน 1k! :)
Alex A.

@AlexA กดปุ่ม 1k บนคำตอบ J หลังจากไม่มีอะไรเลยนอกจากคำตอบของ Prolog นอกใจ ...
เสียชีวิต

8
ไม่เป็นไรฉันมั่นใจว่า Prolog จะเข้าใจ
Alex A.

3
@AlexA Yes.
John Dvorak

@JanDvorak คุณกำลังพูดในนามของ Prolog หรือไม่?
Alex A.

11

> <>, 36 *

หากคุณโชคดีพอ!

x;x
lxl
xnx

เนื่องจากความท้าทายไม่ต้องการรหัสเพื่อกำหนดขึ้นเราจึงต้องพิสูจน์ว่าเป็นไปได้ (แม้ว่าไม่น่าจะเป็นไปได้) ที่จะส่งคืนหมายเลข 36 และเราก็ทำเสร็จแล้ว มันดีในขณะที่มันกินเวลาฉันเดา

(สำหรับผู้ที่ไม่คุ้นเคยกับ> <> สามารถพบคำแนะนำที่ดีได้ที่นี่ )

> <> เป็นภาษา 2D แบบกองซ้อน ซึ่งหมายความว่าคำสั่งจะไม่ถูกดำเนินการเชิงเส้นเหมือนกับภาษาดั้งเดิมส่วนใหญ่ - การไหลของโปรแกรมสามารถขึ้นลงซ้ายหรือขวา!

ฉันตัดสินใจใช้คำสั่ง "x" ใน> <> ซึ่งเปลี่ยนทิศทางตัวชี้คำสั่งเป็นแบบขึ้นลงซ้ายหรือขวาโดยการสุ่ม เนื่องจากรหัสของเราจะเป็นหนึ่งบรรทัดนั่นหมายความว่าเราสามารถดูกรณีที่มันไปทางขวาหรือซ้ายเท่านั้นเพราะถ้าตัวชี้ขึ้นหรือลงมันก็จะกดคำสั่ง "x" อีกครั้ง

คำสั่ง "n" จะปรากฏหมายเลขที่ด้านบนสุดของสแต็กและพิมพ์ออกมา อย่างไรก็ตามหากสแต็กต์ว่างเปล่าและไม่มีสิ่งใดที่จะปรากฎจะเกิดข้อผิดพลาดขึ้น

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

The ";" คำสั่งสิ้นสุดโปรแกรม

แนวคิดในการใช้ "x" คือตัวอย่างเช่นหากมีเพียงหนึ่ง "x" ในโค้ด (โดยที่ A, B, C, D เป็นคำแนะนำ)

ABCx;D

โปรแกรมจะดำเนินการ A จากนั้น B และ C และเมื่อถึง "x" เราจะมีสอง possibilites: รหัสก็ยังคงดำเนินต่อไปและไปที่ ";" และออกหรือมันไปทางซ้ายและดำเนินการ C แล้ว B จากนั้น A แล้ว D แล้วออกเท่านั้น ดังนั้นหากรหัสของเรามีหนึ่ง "x" โปรแกรมจะได้รับโปรแกรมที่เป็นไปได้สองรายการซึ่งเราอาจเลือกโปรแกรมที่เหมาะสมที่สุด

ฉันมี "x" สองตัวหรือมากกว่านั้นจากนั้นเราจะได้จำนวนโปรแกรมที่เป็นไปได้ที่ไม่สิ้นสุด

รหัสของเรามีห้า "x" es ยิ่งกว่านั้นแต่ละรายการอยู่ใน "เซลล์เริ่มต้น" ของเส้นทาง Hamiltonian ซึ่งหมายความว่าทุกโปรแกรมเดียวจะเริ่มต้นด้วย "x" และทุกโปรแกรมจะมีโครงสร้าง:

xAxBxCxDx

โดยที่ A, B, C, D เป็นของ {; , n, l, l} ซึ่งหมายความว่ามีเพียง 12 โปรแกรมที่ไม่ซ้ำกัน นอกจากนี้เนื่องจากเรามักจะเริ่มต้นที่ "x" เราอาจดูกรณีที่โปรแกรมไปทางซ้ายดังนั้นโปรแกรมสมมาตรก็ถือว่าเหมือนกัน ความสมมาตรมีโปรแกรมที่แตกต่างกันเพียง 6 โปรแกรมเท่านั้น มีเพียง 4 คนเท่านั้นที่เกิดขึ้นในโปรแกรมที่สร้างเป็นเส้นทางแฮมิลตัน:

xnxlxlx;x
xlxnxlx;x
xnxlx;xlx
xlxnx;xlx

ให้เราดูที่โปรแกรมแรก "xnxlxlx; x" ถ้าเราไปที่ขั้นตอนแรกเราจะตีคำสั่งการพิมพ์ซึ่งจะทำให้เกิดข้อผิดพลาดเนื่องจากเราไม่มีอะไรในกอง ถ้าเราไปทางซ้ายเราก็กดคำสั่งสิ้นสุดโปรแกรม ดังนั้นเราจึงไม่สามารถส่งออกจำนวนใด ๆจากโปรแกรมเหล่านี้

โปรแกรมที่สอง "xlxnxlx; x" มีความหวังมากขึ้นเนื่องจากเมื่อไปทางขวาที่จุดเริ่มต้นที่ศูนย์ถูกวางลงบนสแต็กถ้าเราจากนั้นไปที่ "x" ถัดไปสแต็กของเราจะได้หนึ่งจากนั้น ไปอีกครั้งเรามี 2 ที่เราสามารถพิมพ์และดำเนินการต่อเพื่อสิ้นสุดโปรแกรม เราสามารถสังเกตได้ว่าเราสามารถพิมพ์เลขคู่ใด ๆ ได้จริงเนื่องจากในส่วน "xlx" ที่จุดเริ่มต้นเราสามารถไปถึงขนาดที่กำหนดได้จำนวนหนึ่งโดยไปทางขวาจากนั้นไปทางซ้ายแล้วกลับมาขวาอีกครั้งตามจำนวนที่กำหนด

จะเห็นได้ว่าโปรแกรมที่สาม xnxlx; xlx สามารถส่งออกเลขคี่ใด ๆ ได้โดยไปทางซ้ายที่จุดเริ่มต้นแล้วทำซ้ำคำสั่ง "xlx" เพียงครั้งนี้เท่านั้นที่เหลือจากนั้นไปทางซ้าย

และโปรแกรมที่สี่นั้นก็เหมือนกับโปรแกรมที่สองและสามารถเอาท์พุทเป็นเลขคู่ได้

ดังนั้นสำหรับโปรแกรมที่จำเป็นเรามี:

x;xlxlxnx (none)
x;xlxnxlx (any even number)
x;xlxnxlx (any even number)
x;xlxnxlx (any even number)
xlx;xlxnx (any odd number)
xlxnx;xlx (any even number)
xlxnxlx;x (any even number)
xlxnxlx;x (any even number)
x;xlxlxnx (none)
x;xlxnxlx (any even number)
x;xlxnxlx (any even number)
xlx;xlxnx (any odd number)
xlxnx;xlx (any even number)
xlxnxlx;x (any even number)
xlx;xlxnx (any odd number)
xlx;xlxnx (any odd number)
xnxlx;xlx (any odd number)
xnxlx;xlx (any odd number)
xlx;xlxnx (any odd number)
xnxlx;xlx (any odd number)
xnxlxlx;x (none)
xlxnxlx;x (any even number)
xlxnxlx;x (any even number)
xlxnxlx;x (any even number)
xnxlx;xlx (any odd number)
xlx;xnxlx (any even number)
x;xlxnxlx (any even number)
x;xlxnxlx (any even number)
xnxlxlx;x (none)
xlxnxlx;x (any even number)
xlxnxlx;x (any even number)
xnxlx;xlx (any odd number)
xlx;xnxlx (any even number)
x;xlxnxlx (any even number)
xnxlx;xlx (any odd number)
xnxlx;xlx (any odd number)
xlx;xlxnx (any odd number)
xlx;xlxnx (any odd number)
xnxlx;xlx (any odd number)
xlx;xlxnx (any odd number)

นั่นคือ 4 โปรแกรมที่ไม่สามารถเอาท์พุทตัวเลข 20 ที่สามารถส่งออกเลขคู่ใด ๆ 16 ที่สามารถส่งออกเลขคี่ใด ๆ เนื่องจากมีตัวเลข 20 คู่และอย่างน้อย 16 เลขคี่ในช่วง 1 ถึง 40 จากนั้นมีความเป็นไปได้ที่แน่นอนว่ามีความเป็นไปได้ที่จะมี 36 ตัวเลขที่แตกต่างกันในช่วง 1 ถึง 40 เอาต์พุตโดยบล็อกโค้ดนี้


11
36 รู้สึกว่าไม่ดีอย่างยิ่งสำหรับคำตอบที่เป็นการละเมิดช่องโหว่ที่มีประสิทธิภาพ
Sp3000

บางครั้งฉันหวังว่าปลาจะมีคำสั่งเดียวสำหรับ "พิมพ์สิ่งสุดท้ายบนสแต็กและออก" ที่จะช่วยได้มาก อย่างไรก็ตามฉันอาจมีคำตอบช่องโหว่ที่เหมาะสมอย่างสมบูรณ์ในไม่ช้า
cirpis

ฉันลืมเพิ่มกฎโดยไม่นับโปรแกรมที่ไม่ได้กำหนด ฉันได้เพิ่มตอนนี้ คุณยินดีที่จะติดตามเรื่องนี้เพราะมันฉลาดและอธิบายได้ดี แต่ฉันจะไม่ยอมรับคำตอบนี้
งานอดิเรกของ Calvin

1
แน่นอนว่าคำตอบนี้ไม่ได้มีไว้เพื่อเป็นคำตอบที่แข่งขันมันเป็นปฏิกิริยาเข่าสะบัดมากขึ้นเมื่อฉันอ่านความท้าทายนี้และคิดว่าจะมีคำตอบปลา
cirpis

9

GolfScript, 8

192
6#7
281

ปัจจุบันวิธีการให้คะแนนที่สูงที่สุด : Pเป็นคนดีในขณะที่มันกินเวลา

โปรแกรม

1927#6281 1927
192718#62 192718
19271826# 19271826
19#628172 19
16#927182 16
1628#9271 1628
16281729# 16281729
162817#92 162817
2916#7182 2916
291628#71 291628
29162817# 29162817
27#916281 27
2718#9162 2718
27182619# 27182619
#61927182 
#72916281 
#82619271 
#81729162 
261927#81 261927
28#619271 28
1826#7291 1826
26#817291 26
#62817291 
271826#91 271826
281729#61 281729
1729#8261 1729
#92718261 
29#718261 29
2817#6192 2817
17#826192 17
#71826192 
182619#72 182619
2619#8172 2619
#91628172 
28172916# 28172916
18261927# 18261927
17291628# 17291628
26192718# 26192718
18#729162 18
172916#82 172916

1
ในขณะที่มันใช้งาน ... เป็นเวลา 30 นาที ..
เครื่องมือเพิ่มประสิทธิภาพ

2
ดีที่สุดที่ฉันสามารถหา GolfScript ได้0)1#2#3(4ที่ 15. สมมาตรที่สวยงามเช่นกัน
primo

1
@primo: นั่นฉลาด ฉันไม่คิดว่าความคิดเห็นเพิ่มเติมจะเพิ่มคะแนนจริง ๆ
Dennis

8

CJam, 14

3(4
;];
0)1

ด้านล่างโปรแกรมทำงาน:

3(4;];0)1 = 11
3(4;1)0;] = 22
3(];0)1;4 = 14
3;0)](4;1 = 11
3;0)1;4(] = 13
3;0)1;](4 = 14
4(3;];1)0 = 20
4(3;0)];1 = 1
4(3;0)1;] = 31
4;1)](3;0 = 20
4;1)0;3(] = 22
0;3(4;])1 = 21
0)];3(4;1 = 21
1)0;];4(3 = 33
4;1)0;](3 = 23
0)1;4(];3 = 3
1;4(])0;3 = 33
4(];1)0;3 = 23
0)1;];3(4 = 24
1)0;3(];4 = 4
0;3(])1;4 = 24
0)1;4(3;] = 13
1)0;3(4;] = 22
1;4(3;0)] = 31
0;3(4;1)] = 22
1)];4(3;0 = 30
1;4(3;])0 = 30

ค่าที่สร้างขึ้นคือ: [1, 3, 4, 11, 13, 14, 20, 21, 22, 23, 24, 30, 31, 33]


รหัสนี้คุณเขียนด้วยตนเองหรือไม่ หรือว่าคุณระบุและประเมินรูปแบบของรหัสอย่างเป็นระบบหรือไม่ ฉันสงสัยว่าภาษาที่มีสัญกรณ์ใส่มัดอาจจะดีกว่าโดยเนื้อแท้สำหรับเรื่องนี้หรือถ้าเป็นไปได้ที่จะเอาชนะวิธีการของ @ Sp3000 ด้วยภาษากอล์ฟ
Reto Koradi

@Reto ฉันเขียนโปรแกรมที่ลองใช้ค่าทั้งหมด 0..9 สำหรับพารามิเตอร์ตัวเลข 4 ตัว ฉันพยายามเปลี่ยนผู้ให้บริการด้วยตนเอง ปัญหาของภาษาที่ใช้กองซ้อนคือตัวดำเนินการส่วนใหญ่ต้องการพารามิเตอร์ 2 ตัวบนกองซ้อนดังนั้นเราจึงมีข้อผิดพลาดมากมาย ภาษาของ Infix ได้ประโยชน์จากโครงสร้างตัวตรวจสอบที่อธิบายโดย Sp3000 ในโพสต์ของเขา
Arnaud

ใช่นั่นเป็นความรู้สึกของฉันอย่างแท้จริงเมื่อฉันเห็นวิธีการพื้นฐาน การมีโครงร่างอย่างง่ายที่รับประกันว่าจะสร้างนิพจน์ที่ถูกต้องทั้งหมดเป็นข้อได้เปรียบที่ยิ่งใหญ่ ข้อได้เปรียบเพียงอย่างเดียวของ CJam คือมีผู้ให้บริการจดหมายมากกว่าหนึ่งราย
Reto Koradi

5

dc (20)

2+3
*p+
4+5
ABCFEDGHI -> 2+3+p*4+5 -> 5     $ **
ABCFIHEDG -> 2+3+5+p*4 -> 10    $ **
ABCFIHGDE -> 2+3+5+4*p -> 40    $ **
ABEDGHIFC -> 2+p*4+5+3 -> 2     $ **
ADEBCFIHG -> 2*p+3+5+4 -> 2       **
ADGHEBCFI -> 2*4+p+3+5 -> 6     $ **
ADGHIFCBE -> 2*4+5+3+p -> 14    $ **
ADGHIFEBC -> 2*4+5+p+3 -> 11    $ **
CBADEFIHG -> 3+2*p+5+4 -> 6       **
CBADGHEFI -> 3+2*4+p+5 -> 10      **
CBADGHIFE -> 3+2*4+5+p -> 15    $ **
CFEBADGHI -> 3+p+2*4+5 -> 3     $ **
CFIHEBADG -> 3+5+p+2*4 -> 8     $ **
CFIHGDABE -> 3+5+4*2+p -> 34    $ **
EDABCFIHG -> p*2+3+5+4 -> 
EFCBADGHI -> p+3+2*4+5 -> 
EHGDABCFI -> p+4*2+3+5 -> 
EHIFCBADG -> p+5+3+2*4 -> 
GDABCFEHI -> 4*2+3+p+5 -> 9     $ **
GHEDABCFI -> 4+p*2+3+5 -> 4     $ **
IHGDEFCBA -> 5+4*p+3+2 -> 20    $ **
GDEHIFCBA -> 4*p+5+3+2 -> 4       **
EDGHIFCBA -> p*4+5+3+2 -> 
CFIHGDEBA -> 3+5+4*p+2 -> 32    $ **
GHIFCBEDA -> 4+5+3+p*2 -> 12    $ **
IFCBEHGDA -> 5+3+p+4*2 -> 8       **
EBCFIHGDA -> p+3+5+4*2 -> 
CBEFIHGDA -> 3+p+5+4*2 -> 3       **
GHIFEDABC -> 4+5+p*2+3 -> 9       **
IFEHGDABC -> 5+p+4*2+3 -> 5       **
EFIHGDABC -> p+5+4*2+3 -> 
IHGDABEFC -> 5+4*2+p+3 -> 22    $ **
GDABEHIFC -> 4*2+p+5+3 -> 6       **
EBADGHIFC -> p+2*4+5+3 -> 
GHIFCBADE -> 4+5+3+2*p -> 24    $ **
IHGDABCFE -> 5+4*2+3+p -> 25    $ **
IFCBADGHE -> 5+3+2*4+p -> 20      **
GDABCFIHE -> 4*2+3+5+p -> 14      **
IHEFCBADG -> 5+p+3+2*4 -> 5       **
IFCBADEHG -> 5+3+2*p+4 -> 16    $ **

เอาท์พุท 32, 20 ของพวกเขาแตกต่างกัน (ทำเครื่องหมายด้วย$)

2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 16, 20, 22, 24, 25, 32, 34, 40

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