การเลื่อนเซกเมนต์เจ็ดส่วน


15

โพสต์ Sandbox

Intro

แผงข้อมูลมีอยู่ทุกที่ เมื่อเทคโนโลยีราคาถูกลงโปสเตอร์กระดาษจะถูกเปลี่ยนเป็นสัญญาณเรืองแสงที่แสดงคำที่ปรากฏอยู่ด้านหนึ่งและออกมาอีกด้านหนึ่งเหมือนกับที่อยู่ในรูป:

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อสัญญาณใดสัญญาณหนึ่งเหล่านี้เริ่มขึ้นมักจะเริ่มว่างเปล่าและข้อความจะออกจากด้านขวาไปทางซ้ายเคลื่อนย้ายจนกว่าจะหายไป

การทำงานของมันคือการเปิดและปิดหลอดไฟขนาดเล็ก (LEDs) เพื่อให้ความรู้สึกเคลื่อนไหว

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

ป้อนคำอธิบายรูปภาพที่นี่

ในกรณีนี้แต่ละหมายเลขจะแสดงโดยการเปิด / ปิดเพียง 7 เซกเมนต์แสงที่อนุญาตให้แสดงตัวเลขทั้งหมด:

ป้อนคำอธิบายรูปภาพที่นี่

คำถามที่เราถามตัวเองว่าควรมีการเปลี่ยนแปลงของแสง (จำนวนเท่าใดในและนอก) ที่จะผ่านโปสเตอร์หนึ่งในจำนวนเหล่านี้?

ตัวอย่างเช่นเพื่อแสดง 123 ในสัญลักษณ์ 3 หลักที่เริ่มต้นด้วย LED ทั้งหมดที่เราจะได้:

ป้อนคำอธิบายรูปภาพที่นี่

ทำให้มีการเปลี่ยนแปลงของไฟทั้งหมด 42 ครั้ง


ท้าทาย

กำหนดตัวเลขที่ไม่เป็นลบและความยาวเครื่องหมายบวกคำนวณจำนวนการเปลี่ยนแปลงของแสง

กฎระเบียบ

  • สมมติว่าอินพุตประกอบด้วยตัวเลขที่ไม่เป็นลบ (N> = 0) และความยาวเครื่องหมายบวก (M> 0)
  • สมมติว่าความยาวเครื่องหมาย> = ความยาวหมายเลข (M> = ตัวเลข (N))

กรณีทดสอบ

123, 3        => 42
45, 5         => 60
111, 3        => 12
98765, 10     => 220
0, 3          => 36

1
เป้าหมายของคำถามคืออะไร ในความเป็นจริงส่วนหนึ่งเช่น MAX7219 จะควบคุม 8 หลักเพื่อให้พวกเขาแสดงคุณเพียงแค่ส่ง 8 หลักไปยัง MAX7219 ผ่านคำสั่ง SPI จุดทศนิยมจะเป็นบิตที่ 8 จาก 1 หรือ 2 หลักสำหรับไฟ - / + ตัวอย่างเช่น 4 อาจถูกปรับให้แสดง 8 x 32 จุดเพื่อเลื่อนข้อความข้ามอย่างที่ฉันทำ: youtube.com/watch?v=hwYqgyMc5S4
CrossRoads

3
@ CrossRoads จริงๆแล้วมันไม่ได้มีไว้สำหรับคำตอบของฮาร์ดแวร์จริงหรืออะไรแบบนี้ มันเป็นความท้าทายในการสร้างอัลกอริทึมที่สามารถแสดงจำนวนการเปลี่ยนแปลงแสงของจำนวนที่กำหนดในการแสดงผล 7 ส่วน
Luis felipe De jesus Munoz

1
กรณีทดสอบที่แนะนำ:0,3 => 36
Chas Brown

1
เราจะใช้จำนวนเต็มแรกเป็นสตริงหรือรายการตัวเลขได้ไหม
Οurous

1
@ Οurous no คุณต้องรับอินพุตเป็นจำนวนเต็มทั้งสอง
Luis felipe De jesus Munoz

คำตอบ:


7

Python 2 , 129 126 119 104 ไบต์

def f(n,k,p=0):z=p<1or n>0;q=-~ord('}/lx2Z^o~z'[n%10])*z;return(z and f(n/10,k,q))+k*bin(p^q).count('1')

ลองออนไลน์!

ขอบคุณสำหรับขนาดใหญ่ 15 ไบต์จากOVS

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


4
เวทมนตร์ที่แท้จริงคืออะไร คุณคือ Python Lord ฉันมีความสุขมากที่ได้รับโค้ดของฉันต่ำกว่า 200 ไบต์จากนั้นคุณก็ปรากฏตัวขึ้นด้วย'7367355777e0d93bf0fb'
Don Thousand

@Rushabh Mehta: Heh heh ฉันยืนอยู่บนไหล่ของยักษ์เท่านั้น ดูเคล็ดลับเหล่านี้ที่โพสต์โดยอัศวินเจไดที่แท้จริง ที่ผมได้เรียนรู้กลยุทธ์สตริงจากที่นี่
Chas Brown

2
104 ไบต์หรือ102 ไบต์ที่มี unprintable ( \x7f) ระหว่างและp {
ovs

@ovs: การปรับตัวที่ดี!
Chas Brown

3

เยลลี่ 23 ไบต์

Dị“¤]þ+>~Œ¶?w‘Ø0j^ƝBFS×

ลิงก์ dyadic ยอมรับจำนวนเต็มเพื่อแสดงทางด้านซ้ายและความยาวเครื่องหมายทางด้านขวาซึ่งให้ผลเป็นจำนวนการเปลี่ยนแปลง (เช่นถ้าจำนวนตัวเลขในจำนวนเต็มที่จะแสดงนั้นมากกว่าความยาวเครื่องหมาย)

ลองออนไลน์!

อย่างไร?

ในระหว่างการแสดงทั้งหมดการแสดงผล 7 เซกเมนต์ (ในบางจุด) เปลี่ยนจากที่ว่างเปล่าเป็นตัวเลขแรกจากนั้นเป็นวินาทีและต่อ ๆ ไปและในที่สุดจากสุดท้ายไปยังว่างเปล่าอีกครั้ง การเปลี่ยนแต่ละค่าใช้จ่ายบิต XOR ของในส่วนของจากหลักและหลัก (ที่ว่างเปล่าคือ "หลัก" กับ 0 ในกลุ่ม) ฉันขโมยออนเซกเมนต์เป็นจำนวนเต็มจากการแก้ไขคำตอบของETHproductionsก่อนหน้านี้แต่การเปลี่ยนแปลงของเซกเมนต์ 7 รายการใด ๆ ก็ทำได้เช่นกัน

Dị“¤]þ+>~Œ¶?w‘Ø0j^ƝBFS× - Link: integer to display, V; integer sign length, L  e.g. 123, 3
D                       - cast V to decimal digits                                  [1,2,3]
  “¤]þ+>~Œ¶?w‘          - code-page indices list = [3,93,31,43,62,126,19,127,63,119]
 ị                      - index into (1-based & modular) (vectorises)             [3,93,31]
              Ø0        - literal = [0,0]                                             [0,0]
                j       - join                                                [0,3,93,31,0]
                  Ɲ     - pairwise application of:
                 ^      -   bitwise XOR                                        [3,94,66,31]
                   B    - convert to binary digits (vectorises)               [[1,1],[1,0,1,1,1,1,0],[1,0,0,0,0,1,0],[1,1,1,1,1]]
                    F   - flatten                                             [1,1,1,0,1,1,1,1,0,1,0,0,0,0,1,0,1,1,1,1,1]
                     S  - sum                                                            14
                      × - multiply by L                                                  42

คุณสามารถบันทึกไบต์ด้วยการใช้ตัวเลขเป็นอาร์เรย์หลักได้หรือไม่ tio.run/##ATsAxP9qZWxsef//…
Shaggy

ใช่ แต่ "ระบุตัวเลขที่ไม่ใช่ลบ" และ "อินพุตประกอบด้วยตัวเลขที่ไม่ใช่ลบ" ดูเหมือนเข้มงวดสำหรับฉัน
Jonathan Allan

3

JavaScript (Node.js) , 104 94 93 93 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Shaggy

B=n=>n&&n%2+B(n>>1)
F=(d,w,q)=>w*B(q^(q=d&&"w`>|i]_p}".charCodeAt(d%10)))+(d&&F(d/10|0,w,q))

ลองออนไลน์!


ฉันคิดว่ามันใช้งานได้กับ -1 ไบต์
ปุย

@ เคล็ดลับ Nice Shaggy ขอบคุณ!
ETHproductions

OP ได้ชี้แจงว่าทั้งสองปัจจัยการผลิตโดยเฉพาะจะต้องเป็นจำนวนเต็ม (และไม่ได้รายชื่อของตัวเลขหรือสตริง)
Οurous

@ Οurousขอบคุณคงที่ +0 ไบต์
ETHproductions

1
นอกจากนี้ฉันคิดว่า0,3ควรให้36; 0คุณให้ (ฉันมีปัญหาเดียวกัน - แก้ไขค่าใช้จ่ายฉันประมาณ 10 ไบต์ grrrr ... :))
Chas Brown

2

Japt 31 31ไบต์

ดัดแปลงมาจากสารละลายเยลลี่ของโจนาธาน รับอินพุตในลำดับกลับกันโดยมีหมายเลขที่จะแสดงเป็นอาร์เรย์หลัก

*Vm!c"w]+>~?" pT ä^T x_¤¬x

ลองมัน


OP ได้ชี้แจงว่าทั้งสองอินพุตจะต้องเป็นจำนวนเต็มโดยเฉพาะ (และไม่ใช่รายการของตัวเลขหรือสตริง)
Οurous


1

ถ่าน 40 ไบต์

≔⁺×⁷0⭆S§⪪”)∧??%←⁶%*An”⁷IιθI×NΣEθ¬⁼ι§θ⁺⁷κ

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

      S                     Convert first input to string
     ⭆                      Map over digits and join
         ”)∧??%←⁶%*An”      Compressed segment value string
        ⪪             ⁷     Split into groups of seven characters
                        ι   Current digit
                       I    Convert to integer
       §                    Index into groups
    0                       Literal `0`
  ×⁷                        Repeat seven times
 ⁺                          Concatentate
≔                        θ  Assign to variable `q`

     θ          Variable `q`
    E           Map over characters
             κ  Current index
           ⁺⁷   Add seven
          θ     Variable `q`
         §      Cyclically index
        ι       Current character
       ⁼        Compare
      ¬         Logical not
   Σ            Sum results
  N             Second input
 ×              Multiply
I               Cast to string
                Implicitly print

1

JavaScript (Node.js) , 88 ไบต์

(integer)(width)จะเข้าเป็น

n=>w=>[...n+'',g=n=>n&&1+g(n&n-1)].map(c=>s+=g(x^(x=Buffer('w$]m.k{%o')[c])),x=s=0)|s*w

ลองออนไลน์!

อย่างไร?

{d1,d2,...,dn}nWยังไม่มีข้อความ

ยังไม่มีข้อความ=(T'd1+Σผม=2nTdผม-1,dผม+T'n)×W

Tx,YxYT'xx

แสดงความคิดเห็น

n => w =>                       // n = integer; w = width of display
  [ ...n + '',                  // coerce n to a string and split it
    g = n =>                    // g = helper function counting the number of 1's
      n && 1 + g(n & n - 1)     // by defining it here, we also force an extra iteration
  ]                             // with an undefined digit (interpreted as the blank digit)
  .map(c =>                     // for each entry c in this array:
    s += g(                     //   add to s the result of a call to g():
      x ^ (x =                  //     XOR the previous value of x
        Buffer('w$]m.k{%?o')[c] //     with the new one, picked from a 10-entry lookup
      )                         //     gives undefined (coerced to 0) for the last entry
    ),                          //   end of call to g()
    x = s = 0                   //   start with x = 0 and s = 0
  ) | s * w                     // end of map(); return s * w
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.