นาฬิกาดิจิตอลจับคู่ปริศนา


10

มีปริศนามากมายที่มีการจับคู่ที่เกี่ยวข้องกับการเพิ่มการเอาออกหรือการย้ายจำนวนที่ตรงกันเพื่อสร้างตัวเลขหรือรูปร่างใหม่ นี่เป็นเช่นนั้นพร้อมนาฬิกาดิจิตอล

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

ตัวเลขนาฬิกามีลักษณะดังนี้:

  |
  |
 _
 _|
|_
 _
 _|
 _|

|_|
  |
 _
|_
 _|
 _
|_
|_|
 _
  |
  |    
 _ 
|_|
|_|
 _
|_|
 _|
 _
| |
|_|

กรณีทดสอบ:

การป้อนข้อมูล: 123

แสดงนาฬิกา:

       _   _
  | :  _|  _|
  | : |_   _|

เอาท์พุท: 4

คำอธิบาย: การแสดงผล1:23ต้องการวาดทั้งหมด 12 บรรทัด ดังนั้นเพื่อให้ตัวเลขทุกตัวเหมือนกันแต่ละหลักจะต้องมี 4 บรรทัด หลักเดียวที่มี 4 4สายคือ 4ดังนั้นคำตอบที่จะต้องมี

การป้อนข้อมูล: 1212

แสดงนาฬิกา:

     _        _
  |  _| :  |  _|
  | |_  :  | |_

เอาท์พุท: -1

คำอธิบาย: จอแสดงผล12:12จำเป็นต้องมี 14 บรรทัด 14 หารด้วย 4 ไม่ใช่จำนวนเต็มดังนั้นจึงเป็นไปไม่ได้ที่ทุกหลักจะเหมือนกัน

การป้อนข้อมูล: 654

แสดงนาฬิกา:

 _     _  
|_  : |_  |_|
|_| :  _|   |

เอาท์พุท: 5

คำอธิบาย: จำนวนบรรทัดทั้งหมดคือ 15 15 หารด้วย 3 คือ 5 ดังนั้นแต่ละหลักต้องมี 5 บรรทัด ตัวเลขเท่านั้นที่มี 5 เส้น2, และ3 5คำตอบก็คือ5มันต้องใช้เพียง 2 การเคลื่อนไหวเพื่อทำให้ทุก ๆ 5 เพียงแค่ย้ายบรรทัดที่ด้านล่างซ้ายของ 6 ถึงด้านล่างของ 4 จากนั้นคุณมี:

 _     _  
|_  : |_  |_|
 _| :  _|  _|

จากนั้นคุณสามารถเห็นสิ่งที่คุณต้องทำคือการย้ายสายที่ด้านบนขวาของหลักที่เดิม 4 5:55ไปด้านบนและคุณได้รับ หากต้องการทำให้ทุกหลัก a 2หรือ3ต้องการมากกว่า 2 การเคลื่อนไหว

การป้อนข้อมูล: 609

แสดงนาฬิกา:

 _     _   _
|_  : | | |_|
|_| : |_|  _|

เอาท์พุท: 609( 6,0,9หรือ[6,0,9]ยังตกลง)

คำอธิบาย: 6, 0และ9เป็นตัวเลขหลักเดียวที่มี 6 บรรทัด เช่นนี้พวกเขายังเป็นทางออกที่เป็นไปได้เท่านั้น ไม่ยากเลยที่จะเห็นว่ามันจะต้องใช้เวลาสองการเคลื่อนไหวเพื่อทำให้ตัวเลขเหล่านี้เป็นเพียงตัวเลข ดังนั้นคุณส่งออกทั้งสามหลัก

หมายเหตุ:

  • แม้ว่าเวลาอินพุตจะต้องถูกต้อง แต่เวลาการส่งออกจะไม่ (เช่น999การส่งออกเป็น OK)
  • ฉันมีความยืดหยุ่นในการป้อนข้อมูล คุณสามารถกำหนดให้เป็นศูนย์นำหน้า 0 คุณสามารถใช้ตัวเลขที่มีจุดทศนิยม คุณสามารถใช้สตริง คุณสามารถใช้อาร์เรย์ คุณสามารถมีพารามิเตอร์สำหรับทุกหลัก

ที่เกี่ยวข้อง: codegolf.stackexchange.com/q/54008/42545
ETHproductions

คำตอบ:


1

Julia, 160 157 154

x->(c=count_ones;l=[119;36;93;109;46;107;123;37;127;111];m=l[x+1];n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);find(n.==minimum(n).!=1/0)-1)

นี่คือฟังก์ชั่นแลมบ์ดา กำหนดให้กับตัวแปรที่จะเรียกมัน ยอมรับเวกเตอร์ของจำนวนเต็มในช่วง0-9ความยาวใด ๆ และส่งกลับผลลัพธ์ของเวกเตอร์ (อาจว่างเปล่า)

กรณีทดสอบ

julia> clock = x->(c=co...        # assign function to variable
(anonymous function)

julia> clock([1 2 3])
1-element Array{Int64,1}:
 4

julia> clock([1 2 1 2])
0-element Array{Int64,1}

julia> clock([6 5 4])
1-element Array{Int64,1}:
 5

clock([6 0 9])
3-element Array{Int64,1}:
 0
 6
 9

คำอธิบาย

ระบุเซกเมนต์เจ็ดส่วนและแทนพวกเขาเป็นเวกเตอร์บิต

+---+                     +-0-+
|   |      Enumerate      1   2
+---+   >  the seven  >   +-3-+
|   |      segments       4   5
+---+                     +-6-+

ตัวอย่าง: 1 (เปิดใช้งานส่วน 2 + 5) จะกลายเป็น36(ชุดบิต 2 + 5) นี่คือการแสดงสำหรับตัวเลข
0-9

l=[119;36;93;109;46;107;123;37;127;111];
m=l[x+1];

เราสามารถใช้ตัวเลขเป็นดัชนีเพื่อให้ได้การแทนเวกเตอร์บิต +1เนื่องจากการจัดทำดัชนีแบบ 1 ในจูเลีย

ฟังก์ชั่นc=count_ones;นับจำนวน 1 บิตในจำนวนเต็ม เรากำหนดนามแฝงเพราะเราต้องการมันบ่อยกว่า

โปรแกรมเต็มรูปแบบค่อนข้าง ungolfed:

x->(
  c=count_ones;
  l=[119;36;93;109;46;107;123;37;127;111];
  m=l[x+1];
  n=map(a->c(a)==mean(map(c,m))?sum(map(b->c(a$b),m)):1/0,l);
  find(n.==minimum(n).!=1/0)-1
)

ตอนนี้รายละเอียดสองบรรทัดสุดท้าย:

mean(map(c,m)) คำนวณจำนวนบรรทัดโดยเฉลี่ยต่อตัวเลขอินพุต

n=map(a->...,l) วนซ้ำผ่านตัวแทนเวกเตอร์ของตัวเลขทั้งหมด

ถ้าจำนวนเส้นหลักในปัจจุบันของเราaคือไม่เท่ากันกับ linecount infเฉลี่ยของการป้อนกลับ

c(a)==mean(map(c,m))?...:1/0

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

sum(map(b->c(a$b),m))

ตอนนี้เรามีเวกเตอร์ที่มีnความยาว10แทนตัวเลข0-9ที่ให้จำนวนการบวก / ลบทั้งหมดที่เราต้องทำเพื่อเปลี่ยนตัวเลขอินพุตทั้งหมดให้เป็นจำนวนนั้นหรือinfถ้าการแปลงดังกล่าวเป็นไปไม่ได้โดยไม่ต้องเปลี่ยนจำนวนบรรทัด

find(n.==minimum(n).!=1/0)-1

สุดท้ายการส่งออกที่สถานที่ (0-based) infของน้อยทั้งหมดที่ไม่ได้

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