Yedi Segment Kaydırma


15

Korumalı Alan Gönderisi

giriş

Bilgi panelleri her yerde. Teknoloji daha ucuz hale geldiğinde, kağıt posterler, bir tarafta görünen ve diğer tarafta ortaya çıkan kelimeleri gösteren parlak işaretlere dönüştürüldü:

resim açıklamasını buraya girin

Bu işaretlerden biri başladığında, genellikle boş başlar ve metin kaybolana kadar sağ taraftan sola doğru hareket eder.

İşlevselliği, hareket hissi vermek için küçük ampulleri (LED'ler) açıp kapatmaktır.

Metin yerine yalnızca sayıları göstermemiz gerekiyorsa, poster aşağıdaki gibi yedi bölümlü işaretçiler kullanılarak çok daha az karmaşık olabilir:

resim açıklamasını buraya girin

Bu durumda, her sayı, tüm sayıları temsil etmeyi sağlayan yalnızca 7 ışık segmentinin açık / kapalı kombinasyonu ile temsil edilir:

resim açıklamasını buraya girin

Kendimize sorduğumuz soru, bu posterlerden belirli bir sayıdan geçmek için kaç ışık değişikliğinin (kaç tane açık ve kapalı) yapılması gerektiğidir.

Örneğin, 123'ü tüm LED'lerin yanmasıyla başlayan 3 basamaklı bir işarette göstermek için:

resim açıklamasını buraya girin

Bu, toplam 42 ışık değişikliği yapar.


Meydan okuma

Negatif olmayan bir sayı ve pozitif bir işaret uzunluğu verildiğinde, ışık değişikliklerinin sayısını hesaplayın.

kurallar

  • Girdinin negatif olmayan bir sayıdan (N> = 0) ve pozitif bir işaret uzunluğundan (M> 0) oluştuğunu varsayalım
  • İşaret uzunluğu> = Sayı uzunluğu (M> = rakam (N))

Test senaryoları

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

1
Sorunun amacı nedir? Gerçekte, MAX7219 gibi bir parça 8 basamağı kontrol eder, görüntülenmesi için 8 basamağı SPI komutlarıyla MAX7219'a gönderirsiniz. - / + ışığı için 1 veya 2 basamaklı ondalık basamak 8. biti kullanılır. Örneğin, 4, metni yaptığım gibi kaydırmak için 8 x 32 noktalı bir ekran yapmak için papatya dizimi yapılabilir: youtube.com/watch?v=hwYqgyMc5S4
CrossRoads

3
@CrossRoads Aslında bu gerçek bir donanım yanıtı veya bunun gibi bir şey için tasarlanmamıştır. Birden fazla 7 segmentli ekranda belirli bir sayının ışık değişikliklerinin sayısını çıkarabilen bir algoritma oluşturmak zor
Luis felipe De jesus Munoz

1
Önerilen test örneği:0,3 => 36
Chas Brown

1
İlk tamsayıyı dize veya rakam listesi olarak alabilir miyiz?
Οurous

1
@ Οurous hayır, her iki girişi de tam sayı olarak almalısınız
Luis felipe De jesus Munoz

Yanıtlar:


7

Python 2 , 129 126 119 104 bayt

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

Çevrimiçi deneyin!

Ovs'tan büyük bir 15 bayt için teşekkürler .

Belirtildiği gibi, negatif olmayan bir sayı ve pozitif bir işaret uzunluğu alır ve toplam değişiklikleri döndürür.


4
Asıl lanet şey bu büyücülük. Sen bir Python Lordusun. Kodumu 200 baytın altında almaktan çok mutluyum, o zaman sizlerle birlikte '7367355777e0d93bf0fb'
Don Thousand

@Rushabh Mehta: Heh heh. Sadece devlerin omuzlarında duruyorum. Gerçek Jedi Şövalyeleri tarafından gönderilen bu ipuçlarına göz atın . Dize strateji ben öğrendim burada .
Chas Brown

2
104 bayt veya 102 bayt ile ve \x7farasında yazdırılamaz ( ) . p{
ovs

@ovs: Güzel ayar!
Chas Brown

3

Jöle , 23 bayt

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

Solda görüntülenmek için tamsayıyı ve sağda değişiklik sayısını veren işaret uzunluğunu kabul eden ikili bir bağlantı (görüntülenecek tamsayıdaki basamak sayısı işaret uzunluğundan büyükse de çalışır).

Çevrimiçi deneyin!

Nasıl?

Tüm gösteri boyunca her 7 segmentli ekran (bir noktada) boştan ilk basamağa, sonra ikinci ve daha sonra geçiş yapar ve son olarak sondan tekrar boşalır. Geçişlerin her biri, basamaktan ve basamağın on-segmentlerinin bitsel XOR'una mal olur (burada boş, 0 segmentli bir "basamaktır"). ETHproductions'ın cevabının önceki bir revizyonundan tamsayılar olarak segmentleri çaldım , ancak 7 segmentin herhangi bir permütasyonu da aynısını yapardı.

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

Sayıyı rakam dizisi olarak alarak bir baytı kaydedebilir misiniz? tio.run/##ATsAxP9qZWxsef//…
Shaggy

Evet, ancak "Negatif olmayan bir sayı verildiğinde" ve "girdi negatif olmayan bir sayıdan oluşuyor" benim için katı görünüyordu.
Jonathan Allan

3

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

@Shaggy sayesinde 1 bayt kaydedildi

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

Çevrimiçi deneyin!


Bence bu -1 bayt için geçerli.
Shaggy

@Shaggy Güzel numara, teşekkürler!
ETHproductions 22:18

OP her iki girişin de tamsayı olması gerektiğini açıkladı (basamak veya dizgiler değil)
0

@ Οurous Teşekkürler, +0 bayt olarak düzeltildi.
ETHproductions 23:08

1
Ayrıca, bence 0,3vermeli 36; ver 0. (Ben aynı sorunu vardı - bu düzeltme bana yaklaşık 10 bayt grrrr ... :) maliyeti.
Chas Brown

2

Japt, 31 30 bayt

Jonathan'ın Jelly çözümünden uyarlanmıştır. Rakam dizisi olarak görüntülenecek numara ile girişi ters sırada alır.

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

Dene


OP, her iki girişin de tamsayı olması gerektiğini açıkladı (basamak veya dize listesi değil)
Οurous

2

Temiz , 280 bayt

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

Çevrimiçi deneyin!

Daha kısa bir yol olmalı ..


1

Kömür , 40 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Girdiyi ikili segment değerlerine dönüştürüp her karakter arasındaki değişiklik sayısını sayarak çalışır. Açıklama:

      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 bayt

Girişi alır (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

Çevrimiçi deneyin!

Nasıl?

{d1,d2,,dn}nwN

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

Tx,yxyTxx (ya da başka bir şekilde).

Yorumlananlar

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.