ไฟดับรุ่น 7 ส่วน


14

เมื่อได้รับการแสดงผล 7 เซกเมนต์ที่มีการเปิดและปิดบางเซกเมนต์ให้ค้นหาลำดับของตัวเลข (0-9) ดังนั้นหลังจากสลับการเซกเมนต์ที่สอดคล้องกันสำหรับแต่ละหลักแล้วเซกเมนต์ทั้งหมดจะถูกปิด

ตัวอย่าง

  _
  _    [3] =>     |   [1] =>    [OFF]
  _               |

ตัวเลขและส่วนที่เกี่ยวข้อง:

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

กฎระเบียบ

Codegolf ⊨ผลงานที่สั้นที่สุดชนะ

อินพุต

รายการของเซ็กเมนต์ที่ไม่เปิดซึ่งเปิดอยู่

  1. ลำดับของตัวเลข กลุ่มมีหมายเลขจากบนลงล่างซ้ายไปขวา เริ่มจาก 0 หรือ 1 หมายเลขไม่จำเป็นต้องเรียงตามลำดับ

  2. ตัวเลข 7 บิตเดียว ไม่ได้ระบุ MSB / LSB (ซึ่งคุณสามารถเลือกได้)

อนุญาตให้ใช้อักขระที่ไม่ใช่ตัวเลขระหว่างตัวเลขได้ (แต่ไม่จำเป็นต้องรองรับ)

เช่น. สำหรับหมายเลข7: 136หรือ1010010หรือ0100101

เอาท์พุต

ลำดับของตัวเลขที่จะ "นำไปใช้" กับจอแสดงผล ไม่ถูก จำกัด แต่อย่างใดเช่นคำสั่งของตัวเลข เช่น. สำหรับสถานะเริ่มต้นที่สอดคล้องกับจำนวน1ผลผลิตที่ถูกต้องจะเป็น1, 111,010ฯลฯ

เอาต์พุตอื่นเป็นตัวเลข 10 บิต (อีกครั้ง MSB / LSB เป็นตัวเลือกของคุณ) เช่น. สำหรับ1เป็นอินพุตเอาต์พุตจะเป็น1000000000หรือ0000000001หรือ

ชุดค่าผสมบางตัวมีโซลูชันที่ไม่ซ้ำซ้อนหลายอย่างเช่น กลุ่มที่ตรงกับตัวอักษรตัวพิมพ์ใหญ่Hสามารถปิดได้ด้วย013เช่นกัน489และ0258และ

หากไม่มีวิธีแก้ไข (ซึ่งฉันเชื่อว่าเป็นไปไม่ได้) เอาต์พุตจะว่างเปล่า


2
ต้องการคุณสมบัติเพิ่มเติม ส่วนใดที่รวมอยู่ในแต่ละหลัก (ตัวอย่างเช่น 9 รวมส่วนด้านล่างหรือไม่) โปรดวาดตัวเลขทั้งหมดและระบุหมายเลขของกลุ่มที่รวมอยู่ในแต่ละส่วน
เลเวลริเวอร์เซนต์

นอกจากนี้รูปแบบใดที่อนุญาตให้ป้อนข้อมูล หมายเลขกลุ่มจะได้รับตามลำดับหรือไม่ เราจะทำอย่างไรถ้าไม่มีวิธีแก้ปัญหา?
Level River St

"ชุดค่าผสมบางตัวมีโซลูชันที่ไม่ซ้ำซ้อนหลายตัว"นอกจากนี้การเปลี่ยนแปลงวิธีการแก้ปัญหาก็เป็นอีกวิธีหนึ่งใช่มั้ย (เช่น301สำหรับH)
Arnauld

1
พิสูจน์ว่ามีทางออกอยู่เสมอ: พอเพียงที่จะหาวิธีแก้ปัญหาสำหรับแต่ละเซ็กเมนต์ โซลูชั่นสำหรับกลุ่มแนวนอนจากบนลงล่างเป็น17, และ08 1479โซลูชั่นสำหรับกลุ่มแนวตั้งบนซ้ายไปขวามีและ39 59โซลูชั่นสำหรับกลุ่มแนวตั้งที่ต่ำกว่าซ้ายไปขวามีและ56 2389
เกร็กมาร์ติน

1
@GregMartin 2ไม่จำเป็นเสมอเพราะคุณสามารถแทนที่ด้วยอย่างใดอย่างหนึ่ง0468, 1358หรือ1369ขึ้นอยู่กับว่าคุณต้องการ0, 8หรือ9ในคำตอบของคุณ แต่มีวิธีการกำจัดไม่มี7เลยและผมคิดว่าคุณต้องมีอย่างน้อยหนึ่ง ของและ1 3
Neil

คำตอบ:


4

เจลลี่ , 26 25 ไบต์

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ

ลองออนไลน์!

รับอินพุตเป็นจำนวนเต็ม 7 บิต ส่งคืนรูปแบบไบนารีของจำนวนเต็ม 10 บิต

เดียรัจฉานนี้บังคับให้เป็นไปได้ทั้งหมด เอาออกเพื่อรับผลลัพธ์ที่เป็นไปได้ทั้งหมดหรือแทนที่ด้วยXเพื่อให้ได้ผลลัพธ์ที่เป็นไปได้แบบสุ่ม

โปรแกรมสร้างภาพเวทย์มนตร์!

มันทำงานอย่างไร

2ṗ⁵’µ×“wØ][:koR¶{‘^/=µÐfḢ  - main link, takes one integer
2ṗ⁵’                       - generate all length-10 binary arrays
    µ                µÐf   - now we find those arrays which correspond to digit-
                              sequences which work to switch off all segments:
                              Filter (keep) those arrays which:
     ×                      - multiplied by 
      “wØ][:koR¶{‘          - [119, 18, 93, 91, 58, 107, 111, 82, 127, 123] 
                               (encoding for turned-on segments given number)
                  ^/        - reduced by XOR
                    =      - are equal to (implicit) the program's input
                        Ḣ  - output the first of these valid arrays

1
อาร์เรย์ของตัวเลข (“wØ][:koR¶z‘ ) อาจมีข้อผิดพลาด หมายเลขของคุณ9ไม่มีเซ็กเมนต์ด้านล่าง (เปรียบเทียบ9ในการสร้างภาพข้อมูลของคุณกับหนึ่งในคำอธิบายงาน) เป็นอย่างอื่นดีมากโดยเฉพาะการสร้างภาพ!
kyrill

1
@kyrill แก้ไขแล้ว! เพียงแค่ต้องการเปลี่ยนแปลงเล็กน้อยในรายการตามตัวอักษร
fireflame241

2

JavaScript (ES6), 60 ไบต์

n=>[65,35,55,42,48,54,110].reduce((r,v,i)=>r^=n>>i&1&&v+v,0)

งานนี้เพราะ:

  • การสลับที่ 1 และ 7 สลับส่วนบนเท่านั้น
  • การสลับ 1, 2 และ 6 สลับส่วนซ้ายบนเท่านั้น
  • การสลับ 1, 2, 3, 5 และ 6 สลับส่วนบนขวาเท่านั้น
  • การสลับ 2, 4 และ 6 จะสลับเฉพาะส่วนตรงกลางเท่านั้น
  • การสลับที่ 5 และ 6 สลับส่วนที่ด้านล่างซ้ายเท่านั้น
  • การสลับ 2, 3, 5 และ 6 สลับส่วนขวาล่างเท่านั้น
  • การสลับ 2, 3, 4, 6 และ 7 สลับส่วนล่างเท่านั้น

1
ไม่แน่ใจว่าควรได้รับการยอมรับว่าเป็นผู้ชนะหรือไม่เพราะเห็นได้ชัดว่าคุณได้รับแรงบันดาลใจจาก Arnauld แต่แล้วเขายังได้แรงบันดาลใจจากความคิดเห็นของคุณ อย่างไรก็ตามคำตอบที่ดีทั้งคู่!
kyrill

@kyrill คำตอบที่อัปเดตของฉันยังเป็นคำแนะนำจาก Neil ไม่ต้องสงสัยเลยว่าคำตอบของเขาชนะแล้ว
Arnauld

2

JavaScript (ES6), 117 107 101 86 84 ไบต์

บันทึก 15 ไบต์ขอบคุณ Neil

รับอินพุตเป็นจำนวนเต็ม 7 บิตโดยที่ LSB เป็นส่วนบน ส่งกลับจำนวนเต็ม 10 บิตที่ LSB 0เป็นหลัก

f=(n,k)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,-~k):k

การสาธิต


1
การเรียกซ้ำสั้นลง: f=(n,k=1023)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?k--&&f(n,k):k. f=(n,k=0)=>[83,0,57,73,10,71,87,1,91,75].reduce((n,v,i)=>n^=k>>i&1&&v+36,n)?f(n,k+1):kหรือถ้าคุณสมมติคำตอบอยู่แล้ว
Neil

1
@ Neil ขอบคุณ! ใช่คำตอบอยู่เสมอ
Arnauld

1
ในฐานะที่มันเป็นไปได้เสมอที่จะสร้างคำตอบโดยใช้ตัวเลขที่1-7คุณสามารถบันทึกอีก 8 ไบต์โดยการลบ83และและการใช้,91,75 k+2
Neil

2

Mathematica ขนาด 40 ไบต์

BitXor@@{260,802,10,514,3,266,293}[[#]]&

(มันอาจจะเล่นกอล์ฟมากขึ้นโดยเลือกเอาท์พุทสำหรับแต่ละเซ็กเมนต์อย่างระมัดระวังและสลับระหว่าง LSB และ MSB)

รับอินพุตเป็นรายการของตำแหน่งตัวอย่างเช่น{2,4,5,7}และส่งออกหมายเลข 10 บิต ( 384= เป็น0110000000ไบนารี) ตามลำดับ MSB (0, ... , 9)

ในตัวอย่างมันสอดคล้องกับ

  |_
  |_

{7,8}และสอดคล้องกับการส่งออกไปยัง

คำอธิบาย:

หมายเลขเวทย์มนตร์ (รายการฮาร์ดโค้ด) คือเอาต์พุตที่ส่งคืนสำหรับแต่ละเซกเมนต์ (เข้ารหัสเป็นเลขฐานสอง) และหากตัวเลขปรากฏในรายการสองครั้งเอฟเฟกต์จะไม่เหมือนกันดังนั้นจึงใช้ XOR ในระดับบิต เราเพียงแค่ต้อง XOR ผลลัพธ์ของค่าที่เป็นไปได้ของกลุ่มที่เปิด


2

เยลลี่ 12 ไบต์

ị“A#7*06n‘^/

ลองออนไลน์!

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

เอาท์พุทเป็นรายการของการเคลื่อนไหวหลัก

มันทำงานอย่างไร

นี่จะเป็นไปอย่างรวดเร็ว

ị“A#7*06n‘^/ - main link, takes input as a list of turned-on segments (eg. [1,3,6])
 “A#7*06n‘   - list literal [65,35,55,42,48,54,110] where each element is a 7-bit
                 integer, where each integer corresponds to how to turn off
                 a segment (eg. turn off the first segment with 7 and 1 =>2^7+2^1=>64)
ị            - get the elements in the list corresponding to the input indices
          ^/ - XOR reduce these elements to get a single 7-bit integer

คุณไม่สามารถใช้ประโยชน์จากความจริงที่ว่าอนุญาตให้ทำซ้ำโซลูชันเมื่อใช้อัลกอริทึมนี้เพื่อแทนที่ XOR-reduction ด้วยบางสิ่งที่สั้นกว่า (เช่นแบน) หรือฉันกำลังพลาดอะไรอยู่?

รหัสตามที่ฉันมีตอนนี้สร้างรายการจำนวนเต็ม 7 บิตโดยประมาณเท่ากับ1*use digit 1 + 2*use digit 2 + 4*use digit 3 ... 64*use digit 7XOR แล้วลดจำนวนลง @ ais523 การแบนจะทำงานกับรายการตัวเลขที่ใช้ซึ่งใช้อักขระมากขึ้น
fireflame241
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.