แก้ปริศนาจับคู่


17

ใน puzzling SE มีสิ่งที่เรียกว่า"ปัญหาของไม้ขีดไฟ"ซึ่งคณิตศาสตร์เขียนด้วยไม้ขีดและคุณได้รับอนุญาตให้ย้ายจำนวนหนึ่งของพวกเขาเพื่อให้ได้คุณสมบัติที่แน่นอน

ในคำถามนี้เราจะพิจารณาเฉพาะจำนวนเต็มที่แสดงในรูปแบบการแสดงผล 7 ส่วน นี่คือตัวเลข 10 หลักในรูปแบบนั้น:

 __          __   __          __    __    __    __    __
|  |     |   __|  __|  |__|  |__   |__      |  |__|  |__|
|__|     |  |__   __|     |   __|  |__|     |  |__|   __|    

แต่ละเซกเมนต์ของจอแสดงผลเป็นหนึ่ง "match-stick" ซึ่งสามารถเคลื่อนย้ายได้อย่างอิสระจากหมายเลขที่เหลือ ไม้ขีดไฟนั้นไม่สามารถแยกออกและทำลายได้ไม่สามารถทำลายหรือถอดออกไม่ว่าด้วยวิธีใด

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

 __      __  __      __   __      __   __
|  |    |  |        |  |    |       |    |
|__| ,   __|     ,     |      ,     |    |

อย่างไรก็ตามคุณไม่สามารถสร้างหนึ่งช่องเป็น 2 หรือสร้างช่องใหม่ระหว่างช่องที่มีอยู่ได้ตัวอย่างเช่นการเปลี่ยน 4 เป็น 11 ตรงกลางของตัวเลขหรือใส่ตัวเลขใหม่ในระหว่างที่มีอยู่ การย้ายแต่ละครั้งไม่จำเป็นต้องให้ตัวเลขที่ถูกต้อง แต่ผลลัพธ์สุดท้ายควรเป็นตัวเลขที่เหมาะสมในการแสดงผลส่วนฐาน 10 เจ็ด คุณไม่จำเป็นต้องใช้ทุกการเคลื่อนไหวหากคุณไม่ต้องการ ซึ่งแตกต่างจากการทำให้งงนี่คือ [แท็ก: คำถามปิดท้าย] คุณไม่สามารถใช้ตัวดำเนินการใด ๆ (การคูณการยกกำลังเป็นต้น) หรือค่าคงที่ทางคณิตศาสตร์ (Pi, หมายเลขเกรแฮม ฯลฯ ) ในคำตอบของคุณ

งาน

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

นี่เป็นคำถามเกี่ยวกับดังนั้นคำตอบจะได้คะแนนเป็นไบต์โดยไบต์น้อยจะดีขึ้น

กรณีทดสอบ

n, moves -> max
0, 1     -> 9
0, 3     -> 77
0, 4     -> 111
8, 3     -> 74
220, 1   -> 320
220, 2   -> 520
220, 3   -> 7227
220, 4   -> 22111
220, 5   -> 32111
747, 1   -> 747
747, 2   -> 7171
747, 3   -> 7711

ที่เกี่ยวข้อง


5
ฉัน ... นอนดึกแล้วเมื่อคืนนี้พิจารณาระยะทางระหว่าง Levenshtein กับตัวเลขไม้ขีดไฟต่าง ๆ ... มันเป็นเรื่องบังเอิญที่แปลก: P
ETHproductions

1
ช่องว่างเปล่าที่เกิดขึ้นตรงกลางจะถูกละเว้นในตอนท้ายหรือไม่? เช่น919, 2 -> 991
DanTheMan


ตัวช่วยสร้างข้าวสาลีซึ่งใช้กริดใด
tuskiomi

@tuskiomi "อย่างไรก็ตามคุณไม่สามารถสร้างหนึ่งช่องเป็น 2 หรือสร้างช่องใหม่ระหว่างช่องที่มีอยู่เดิมได้"
Post Rock Garf Hunter

คำตอบ:


7

JavaScript (ES6), 297 286 279 267 ไบต์

รับอินพุตในรูปแบบ currying (s)(k)โดยที่sคืออาร์เรย์ของอักขระหลักและkคือจำนวนการเคลื่อนไหว (จำนวนเต็ม)

s=>k=>(B=(n,b=0)=>n?B(n^n&-n,b+1):b,b=[...p='u"[k,iy#}m'].map(c=>c.charCodeAt()+2),r=[],g=(n,d='')=>n?n>0&&b.map((v,i)=>g(n-B(v),d+i)):r.push(d))(s.reduce((s,c)=>s+B(b[c]),M=0))&&b.map((_,j)=>r.map(n=>M=[...n+p].reduce((t,d,i)=>t+B(b[d]^b[s[i-j]]),0)>k*2|+n<M?M:n))|M

กรณีทดสอบ


อย่างไร?

ฟังก์ชันรูปร่างข้อมูลและตัวช่วย

  • อาร์เรย์bอธิบายถึงรูปร่างของตัวเลขเป็นจำนวนเต็ม 7 บิตโดยที่แต่ละบิตเป็นส่วน:

    7 ส่วน

    ตัวอย่างเช่นรูปร่างของ "7" คือ 0b0100101 = 37

  • ฟังก์ชั่นผู้ช่วยB ()ส่งคืนจำนวน 1 ในการแทนเลขฐานสองของจำนวนที่กำหนด:

    B = (n, b = 0) => n ? B(n ^ n & -n, b + 1) : b

ขั้นตอนที่ 1

ก่อนอื่นเราจะนับจำนวนไม้ขีดไฟที่ใช้ในหมายเลขอินพุต:

s.reduce((s, c) => s + B(b[c]), 0)

ขั้นตอนที่ 2

เราส่งค่านี้ไปยังฟังก์ชั่นวนซ้ำg ()ซึ่งจะแสดงรายการrพร้อมตัวเลขทั้งหมดที่สามารถสร้างขึ้นด้วยจำนวนไม้ขีดไฟนี้:

g = (n, d = '') =>
  n ?
    n > 0 &&
    b.map((v, i) => g(n - B(v), d + i))
  :
    r.push(d)

ยกตัวอย่างเช่นกรัม (5)จะโหลด[ '17', '2', '3', '5', '71' ]เข้าไปในR

ขั้นตอนที่ # 3

ตอนนี้เราต้องเลือกจำนวนสูงสุดMในrซึ่งสามารถรับได้จริงจากหมายเลขอินพุตภายในจำนวนการย้ายk ที่อนุญาต

เนื่องจากแต่ละหมายเลขn in rใช้ matchsticks ให้ได้มากที่สุดเท่าที่ใส่ตัวเลขsจำนวนการเคลื่อนที่ที่จำเป็นในการแปลงsเป็นnเท่ากับครึ่งหนึ่งของจำนวนความแตกต่างของเซ็กเมนต์ระหว่างแต่ละหลัก

จำนวนของความแตกต่างระหว่างสองส่วนตัวเลขxและy ที่จะได้รับจากจำนวน 1 ในฐานเป็นตัวแทนของข [x] XOR ข [Y]

ในที่สุดก็เป็นสิ่งสำคัญที่จะทราบว่าเราจะต้องลองหลายจัดแนวที่เป็นไปได้หลักเพราะหลักแรกของsไม่จำเป็นต้องเป็นแมปกับหลักแรกของn การเปลี่ยนระหว่างตัวเลขนั้นถูกกำหนดโดยตัวแปรjในโค้ด


1

Mathematica, 188 197 200 203 170 174 ไบต์

หมายเหตุ:รหัสยังเป็นประเภทรถ ฉันกำลังทำงานกับมัน

ข้อผิดพลาด +30 ไบต์

(p=PadLeft;q=IntegerDigits;g=Join@@(#~q~2~p~7&/@ToCharacterCode["w$]m.k{% o"][[1+q@#]])&;h=(v=g@#2~#~96-g@i~#~96;Tr@v==0&&Tr@Abs@v<=2#3)&;For[i=10^Tr@g@#,!h[p,##]&&!h[PadRight,##],--i];i)&

อักขระระหว่าง%และoควรเป็น0x7Fแต่ SE จะไม่อนุญาต คุณสามารถคลิกลิงค์ pastebinเพื่อคัดลอกรหัสต้นฉบับ

รหัสใช้เวลานานเมื่อมีแท่งไม้มากกว่า 6-7 แท่ง (คุณสามารถปรับเปลี่ยนค่าเริ่มต้นiเป็นตัวเลขที่น้อยลงเพื่อทดสอบ)

คำอธิบาย

gเป็นฟังก์ชั่นผู้ช่วยแปลงตัวเลขลงในรายการของการเป็นตัวแทนติด (ตามที่นี่ ) เช่นสำหรับ{1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}220

h เป็นฟังก์ชั่นตัวช่วยในการจัดการกับการแพ็ดซ้ายและแพ็ดขวาระหว่างตัวเลขสองตัว

fวนซ้ำจาก10^Tr@g@#(ขีด จำกัด สูงสุด) ถึง1เพื่อค้นหาจำนวนเต็มซึ่งการแทนค่าแท่งมีปริมาณเท่ากัน1 -> 0และ0 -> 1เปรียบเทียบกับจำนวนเดิมและปริมาณมีขนาดเล็กกว่าหรือเท่ากับอาร์กิวเมนต์ที่สอง


ฉันให้ +1 เพราะคุณไม่เคยเห็นคำตอบที่ชนะมีคะแนนต่ำกว่าคำตอบอื่น ๆ ฉันถือว่ามันเป็นเพราะมันขาดตัวเลือกการทดสอบออนไลน์ บางทีบางคนที่มี Mathematica อาจมาทดสอบและตรวจสอบว่ามันทำงานได้ดีดังนั้นคุณจะได้ upvotes เพิ่มขึ้น หรือบางทีอาจมีคนเปลี่ยนเป็น Octave ถ้าเป็นไปได้
geokavel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.