Gulir Tujuh Segmen

15

Pos Kotak Pasir

Intro

Panel informasi ada di mana-mana. Ketika teknologi menjadi lebih murah, poster kertas diubah menjadi tanda-tanda bercahaya yang menunjukkan kata-kata yang muncul di satu sisi dan muncul di sisi lain, seperti yang ada di gambar:

masukkan deskripsi gambar di sini

Ketika salah satu dari tanda-tanda ini dimulai, biasanya mulai kosong dan teks pergi dari sisi kanan ke kiri, bergerak sampai menghilang.

Fungsinya untuk menyalakan dan mematikan bola lampu kecil (LED) untuk memberikan sensasi gerakan.

Jika alih-alih teks, kita hanya perlu menunjukkan angka, poster dapat menjadi kurang canggih menggunakan apa yang disebut penanda tujuh segmen seperti berikut:

masukkan deskripsi gambar di sini

Dalam hal ini setiap angka diwakili oleh kombinasi on / off hanya dari 7 segmen cahaya yang memungkinkan untuk mewakili semua angka:

masukkan deskripsi gambar di sini

Pertanyaan yang kami ajukan kepada diri sendiri adalah berapa banyak perubahan lampu (berapa banyak lampu menyala dan mati) yang harus dilakukan untuk melewati salah satu poster ini dengan jumlah tertentu?

Misalnya, untuk menampilkan 123 dalam tanda 3 digit yang dimulai dengan semua LED mati, kita akan memiliki:

masukkan deskripsi gambar di sini

Ini membuat total 42 perubahan lampu.


Tantangan

Diberi nomor non-negatif dan panjang tanda positif menghitung jumlah perubahan lampu.

Aturan

  • Asumsikan input terdiri dari angka non-negatif (N> = 0) dan panjang tanda positif (M> 0)
  • Asumsikan Panjang Masuk> = Panjang Nomor (M> = Digit (N))

Uji kasus

123, 3        => 42
45, 5         => 60
111, 3        => 12
98765, 10     => 220
0, 3          => 36
Luis felipe De jesus Munoz
sumber
1
Apa tujuan dari pertanyaan itu? Pada kenyataannya, bagian seperti MAX7219 akan mengontrol 8 digit, agar ditampilkan, Anda hanya akan mengirim 8 digit ke MAX7219 melalui perintah SPI. Titik desimal bit ke-8 dari 1 atau 2 digit akan digunakan untuk lampu - / +. Misalnya, 4 dapat dipasangkan untuk membuat tampilan 8 x 32 titik untuk menggulir teks, seperti yang saya buat: youtube.com/watch?v=hwYqgyMc5S4
CrossRoads
3
@CrossRoads Sebenarnya ini tidak dimaksudkan untuk jawaban perangkat keras nyata atau semacamnya. Merupakan tantangan untuk membuat algoritma yang dapat menampilkan jumlah perubahan lampu dari angka yang diberikan dalam kelipatan tampilan 7-segmen
Luis felipe De jesus Munoz
1
Kasing uji yang disarankan:0,3 => 36
Chas Brown
1
Bisakah kita mengambil bilangan bulat pertama sebagai string, atau daftar digit?
Οurous
1
@ No tidak berbahaya, Anda harus menggunakan kedua input sebagai bilangan bulat
Luis felipe De jesus Munoz

Jawaban:

7

Python 2 , 129 126 119 104 byte

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')

Cobalah online!

Terima kasih banyak 15 byte dari ovs .

Seperti yang ditentukan, mengambil angka non-negatif dan panjang tanda positif, dan mengembalikan perubahan total.

Chas Brown
sumber
4
Apa-apaan sebenarnya sihir ini. Anda adalah Tuan Python. Saya sangat senang mendapatkan kode saya di bawah 200 byte kemudian Anda muncul dengan'7367355777e0d93bf0fb'
Don Thousand
@Rushabh Mehta: Heh heh. Yah, aku hanya berdiri di atas bahu raksasa. Lihatlah kiat-kiat ini yang diposting oleh Ksatria Jedi sejati. Strategi string yang saya pelajari dari sini .
Chas Brown
2
104 byte atau 102 byte dengan ( \x7f) antara pdan {.
Ovs
@ovs: Pengaturan yang bagus!
Chas Brown
3

Jelly , 23 byte

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

Tautan diad yang menerima bilangan bulat untuk ditampilkan di sebelah kiri dan panjang tanda di sebelah kanan yang menghasilkan jumlah perubahan (juga berfungsi jika jumlah digit dalam bilangan bulat untuk ditampilkan lebih besar dari panjang tanda).

Cobalah online!

Bagaimana?

Selama seluruh pertunjukan, setiap 7-segmen tampilan (di beberapa titik) transisi dari kosong ke digit pertama, lalu ke yang kedua dan seterusnya, dan akhirnya dari yang terakhir menjadi kosong lagi. Transisi masing-masing biaya bitor XOR pada-segmen dari-digit dan ke-digit (di mana kosong adalah "digit" dengan 0-segmen). Saya mencuri segmen-on sebagai bilangan bulat dari revisi sebelumnya atas jawaban ETHproductions , tetapi permutasi dari 7 segmen akan melakukan hal yang sama.

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
Jonathan Allan
sumber
Bisakah Anda menyimpan byte dengan mengambil angka sebagai array digit? tio.run/##ATsAxP9qZWxsef//…
Shaggy
Ya, tetapi "Diberi nomor non-negatif" dan "input terdiri dari angka non-negatif" tampaknya ketat bagi saya.
Jonathan Allan
3

JavaScript (Node.js) , 104 94 93 93 byte

Disimpan 1 byte berkat @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))

Cobalah online!

Produksi ETH
sumber
Saya pikir ini berfungsi untuk -1 byte.
Shaggy
@ Shaggy Trik yang bagus, terima kasih!
ETHproduksi
OP telah mengklarifikasi bahwa kedua input harus secara khusus bilangan bulat (dan bukan daftar digit atau string)
Οurous
@ Berair Terima kasih, diperbaiki pada +0 byte.
Produk ETH
1
Juga, saya pikir 0,3 harus memberi 36; kamu memberi 0. (Saya memiliki masalah yang sama - memperbaiki ini menghabiskan sekitar 10 byte grrrr ... :)).
Chas Brown
2

Japt, 31 30 byte

Diadaptasi dari larutan Jonathan's Jelly. Mengambil input dalam urutan terbalik dengan nomor yang akan ditampilkan sebagai array digit.

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

Cobalah

Shaggy
sumber
OP telah mengklarifikasi bahwa kedua input harus secara khusus bilangan bulat (dan bukan daftar digit atau string)
menarik
2

Bersih , 280 byte

import StdEnv,Data.List
~ =toInt
?s=sum[(~s>>p)rem 2\\p<-[0..6]]
$n l#j=repeatn l 0
#n=j++[~c-47\\c<-:toString n]++j
#k=[getItems(map((!!)[0,119,3,62,31,75,93,125,19,127,95])n)[i-l..i-1]\\i<-[0..length n]]
=sum(zipWith@(tl k)k)
@[u][]= ?u
@[u:x][v:y]= ?((bitxor)u v)+ @x y
@[][]=0

Cobalah online!

Harus ada cara yang lebih pendek ..

Suram
sumber
1

Arang , 40 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Bekerja dengan mengonversi input ke nilai segmen biner, lalu menghitung jumlah perubahan di antara setiap karakter. Penjelasan:

      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
Neil
sumber
1

JavaScript (Node.js) , 88 byte

Mengambil input sebagai (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

Cobalah online!

Bagaimana?

{d1,d2,,dn}nwN

N=(Td1+i=2nTdi1,di+Tn)×w

Tx,yxyTxx

Berkomentar

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
Arnauld
sumber