ช่วยฉันผัดวันประกันพรุ่งในการซ่อมคอมพิวเตอร์ของฉัน!


23

ความท้าทายนี้มาถึงคุณโดยแรงบันดาลใจ (และน่าเศร้า) จริง เมื่อเร็ว ๆ นี้แถวหมายเลขบนแป้นพิมพ์ของฉันเป็นระยะ ๆ ปุ่มใช้1-9งานได้บางครั้ง - แต่บางครั้งก็ไม่มีผล ในฐานะโปรแกรมเมอร์ตัวยงนี่มันช่างน่ากลัว! (ดูที่เครื่องหมายอัศเจรีย์นั่นคือวิธีที่คุณรู้ว่าพวกเขากำลังทำงานอยู่ในขณะนี้) ไม่เพียง แต่ฉันมักจะต้องการตัวเลขตัวเอง แต่สัญลักษณ์!@#$%^&*(มีประสิทธิภาพอย่างสมบูรณ์ครึ่งเวลาเช่นกัน! ในฐานะที่เป็นโปรแกรมเมอร์ C แทนที่จะใช้เวลาในการยุ่งกับการเขียนโค้ดเพื่อแก้ไขแล็ปท็อปของฉันฉันจึงสนใจที่จะแก้ไขปัญหามากกว่า ในช่วงไม่กี่สัปดาห์ที่ผ่านมาช้าตัวเลขตัวอักษรทั้งหมดในรหัสของฉันถูกแทนที่ด้วยเลขฐานสิบหกเพื่อที่ฉันจะได้ไม่ต้องไปหาตัวเลขเพื่อคัดลอกและวาง 1-9อย่างไรก็ตามตัวเลขบางไม่สะดวกในการพิมพ์โดยไม่ต้องคีย์ ยกตัวอย่างเช่นจำนวน1ไม่สามารถเขียนได้ดังนั้นเพียงแค่ในเลขฐานสิบหกและฉันได้ resorted เพื่อแทนที่ในรหัสของฉันด้วย1 0xF - 0xEคีย์เท่านั้นที่ได้รับผลกระทบ1-9ดังนั้นฉันรักษาการใช้งานเต็มรูปแบบของสัญลักษณ์เช่น+, และ- /อย่างไรก็ตามฉันไม่สามารถใช้การคูณหรือวงเล็บเช่น*และ(มักจะขาด สิ่งนี้นำไปสู่ความท้าทายของคุณ

อินพุต

จำนวนเต็มnถึง stdin หรือเทียบเท่าภาษาของคุณ หากคุณต้องการจำนวนเต็มอาจนำหน้าหรือตามด้วยบรรทัดใหม่หรืออักขระช่องว่างอื่น หรือคุณอาจรับอินพุตผ่านอาร์กิวเมนต์บรรทัดคำสั่ง

โปรแกรมของคุณควรตอบสนองต่อการป้อนข้อมูลเชิงลบได้อย่างถูกต้องและสามารถจัดการกับจำนวนเต็มที่มีลายเซ็นอย่างน้อย 32 บิต

เอาท์พุต

โปรแกรมของคุณควรส่งออกในรูปแบบที่สังเกตได้บางวิธีที่สั้นที่สุด (ในอักขระที่ไม่ใช่ช่องว่าง) ที่เป็นไปได้ในการเขียนตัวเลขnเป็นผลรวมความแตกต่างหรือการหารของค่าเลขฐานสิบหกอย่างน้อยหนึ่งค่า มีมากกว่าหนึ่งวิธีในการแก้ไขปัญหานี้และคุณไม่ต้องการให้คุณใช้เอาต์พุตที่มีความยาวเท่ากันมากกว่าวิธีอื่น

เอาท์พุทควรจะอยู่ในรูปแบบA % A % A...ที่Aเป็นค่าฐานสิบหกต่อไปนี้0xมีตัวเลขเท่านั้นA-F a-fและเป็นหนึ่งของสัญลักษณ์% -+/อนุญาต/อธิบายการหารจำนวนเต็มไม่ใช่ทศนิยม

(โปรดทราบว่าผลลัพธ์ของคุณควรส่งผลnเมื่อประเมินหน่วยงานก่อนจากซ้ายไปขวาจากนั้นเพิ่มและลบออกจากซ้ายไปขวาตามแบบแผน)

กรณีทดสอบ

อินพุตเอาต์พุต

  1. 1

    0xF - 0xE(หรือ0xF-0xEหรือ0xB-0xAหรือ0xd - 0xcหรือ0xF/0xF)

  2. 15

    0xF

  3. 255

    0xFF

  4. 30

    0xF + 0xF

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

นี่คือรหัสกอล์ฟ คะแนนเบื้องต้นของคุณคือจำนวนไบต์ในไฟล์ต้นฉบับของคุณ

คุณไม่สามารถใช้ตัวเลขใด ๆ1-9ในแหล่งที่มาของคุณ

คุณอาจใช้สัญลักษณ์!@#$%^&*(ในแหล่งที่มาของคุณ แต่แต่ละคนจะมีค่าปรับที่ +20 ถึงคะแนนของคุณ

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

ไม่อนุญาตช่องโหว่มาตรฐาน

คะแนนต่ำสุดชนะ! โชคดี!

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


มีข้อ จำกัด ด้านขนาดของจำนวนเต็มหรือไม่ นอกจากนี้ตัวเลขเชิงลบจะถูกนำไปแสดงด้วยความแม่นยำตามอำเภอใจ (เช่น 32 บิต) หรือไม่
FryAmTheEggman

@FryAmTheEggman แก้ไขโพสต์ต้นฉบับเพื่อความกระจ่าง อินพุตอาจเป็นลบและโปรแกรมของคุณควรตอบกลับอย่างถูกต้องกับอินพุตอย่างน้อย 32 บิต ขอบคุณ!
BrainSteel

ที่เกี่ยวข้อง: codegolf.stackexchange.com/a/32114/21348
edc65

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

1
จำนวนเต็มหรือหารจำนวนทศนิยม?
edc65

คำตอบ:


5

จาวาสคริปต์ 287 (187 + 20 * 5) 295 (195 + 20 * 5) 338 (198 + 20 * 7)

ฟังก์ชันที่ตรวจสอบชุดเลขฐานสิบหกที่อนุญาตให้เป็นไปได้ทั้งหมด 6 หลัก (0xA ถึง 0xF) และตัวดำเนินการที่อนุญาต 3 รายการ ส่งออกผ่านป๊อปอัพและไม่ส่งคืนค่าตามที่ร้องขอ

ฉันใช้ [] เพื่อจัดกลุ่มนิพจน์คั่นด้วยนิพจน์ แต่ไม่สามารถหลีกเลี่ยงวงเล็บเปิด5 5 7สำหรับลูปและการเรียกใช้ฟังก์ชัน
เพื่อหลีกเลี่ยงตัวเลขที่มีตัวแปร A, B, C สำหรับ 1,2,3 (นี่ทำให้โค้ดคลุมเครือมากยิ่งขึ้น)

แก้ไขรหัสที่แก้ไขแล้วโดยมุ่งเน้นที่การหลีกเลี่ยง '('. ลบifการสร้าง s และ RegExp ออกอย่างชัดเจน

ระวัง: ฟังก์ชั่นนี้ช้าอย่างไม่น่าเชื่อมันจะเกินเวลาที่กำหนดสำหรับสคริปต์ใน FireFox แม้สำหรับอินพุตขนาดเล็กเช่น 90

เมื่อต้องการระบุนิพจน์ที่เป็นไปได้ทั้งหมดฉันใช้หมายเลขเริ่มต้นที่ 3 และขึ้นไปตลอด การเข้ารหัสตัวเลข:
0,1,2 เป็นตัวดำเนินการ +, -, /
4 ถึง 9 เป็นเลขฐานสิบหก A .. F
3 ไม่ได้รับอนุญาต
แต่ละหมายเลขจะถูกตรวจสอบด้วย regexp /3|[0-2]{2}/เพื่อหลีกเลี่ยงตัวเลข 3 และมีตัวดำเนินการติดต่อกัน 2 ตัว ( ตรวจสอบยังหลีกเลี่ยงการค้าขายและผู้ประกอบการชั้นนำ - ดูรหัส)

สตริงผลลัพธ์เป็นสิ่ง0xA + 0xA - 0xDที่เป็นจาวาสคริปต์ที่ถูกต้องดังนั้นฉันใช้ eval เพื่อประเมินมัน โชคไม่ดีที่ตัวดำเนินการ '/' เป็นทศนิยมและไม่ใช่จำนวนเต็มใน JavaScript ดังนั้นฉันไม่แน่ใจ 100% ว่าผลลัพธ์ที่ถูกต้องจะส่งผลสุดท้ายให้เป็นจำนวนเต็ม (แต่ฉันค่อนข้างมั่นใจเนื่องจากข้อผิดพลาดในการปัดเศษขนาดเล็กไม่สามารถ ถูกขยายโดย '*')

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

อื่น ๆ อีก

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

parser ง่ายขึ้นจริงใน parser จริง V และ O ควรเป็นอาร์เรย์ที่มีสแต็กค่าที่ค้างอยู่และสแต็กโอเปอเรเตอร์ที่ค้างอยู่ นี่ V คือค่าที่ค้างอยู่เดี่ยว (และค่าส่งคืน) และ O เป็นสตริงที่มีอักขระไม่เกิน 2 ตัว P มีตารางตัวดำเนินการที่มีความสำคัญสำหรับ '- + /' => '112'

คะแนนนี้ 275 + 4 * 20 => 355

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

ทดสอบในคอนโซล Firefox / FireBug เปลี่ยนการแจ้งเตือนด้วยการส่งคืน (มีประโยชน์มากขึ้น)

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0xA - 0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + ​​0xF

ชัดเจนน้อยกว่าเล็กน้อย (แต่ต้องอดทน)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF + ​​0xF
51 0xDD - 0xAA
62 0xEA - 0xAC
73 0xA + 0xEA - 0xAB
84 0xFE - 0xAA
95 0xA + 0xFF - 0xFF


3

Python 2: 185 ไบต์ + 2 * 20 = 225

นานเกินไปสำหรับคำตอบที่จริงจัง แต่เนื่องจากยังไม่มีคำตอบฉันจะโพสต์มันต่อไป

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

productสร้างการจัดเรียงที่แตกต่างกันทั้งหมดของตัวอักษรที่อนุญาต execพยายามถอดรหัสมัน เรื่องนี้น่าเศร้าส่งกลับข้อยกเว้นจากนั้นtry - catchบล็อกยาว มันเป็นผลลัพธ์ที่ดีมันพิมพ์และมีอยู่

การลงโทษ 2 ครั้งเนื่องจากการจัดฟันระหว่างการเรียกใช้ฟังก์ชัน


2
คำตอบนี้อาจมีปัญหาสองประการ: (1) 0ไม่ใช่ตัวอักษรฐานสิบหก (2) การหารที่เกี่ยวข้องกับจำนวนลบใน Python ให้ผลลัพธ์ที่แตกต่างกว่าใน C
feersum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.