Прокручування семи сегментів


15

Пісочниця повідомлення

Вступ

Інформаційні панелі є скрізь. Коли технологія подешевшала, паперові плакати були перетворені на світні знаки, які показують слова, які з’являються з одного боку і виходять з іншого, як те, що на малюнку:

введіть тут опис зображення

Коли одна з цих ознак запускається, вона, як правило, починається порожньою, і текст відходить від правого боку до лівого, рухаючись, поки він не зникне.

Його функціональність полягає в тому, щоб включати і вимикати маленькі лампочки (світлодіоди), щоб дати відчуття руху.

Якщо замість тексту нам потрібно лише показати цифри, плакат може бути набагато менш складним, використовуючи так звані семисегментні маркери, як-от наступне:

введіть тут опис зображення

У цьому випадку кожне число представлено комбінацією увімкнення / вимкнення лише 7 легких сегментів, які дозволяють представляти всі числа:

введіть тут опис зображення

Питання, яке ми задаємо собі, скільки змін у вогнях (скільки увімкнених і вимкнених) потрібно зробити, щоб через один із цих плакатів пройти певну кількість?

Наприклад, для показу 123 у 3-х значному знаку, який починається зі всіх вимкнених світлодіодів, у нас буде:

введіть тут опис зображення

Це робить в цілому 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 ні, ви повинні брати обидва введення як цілі числа
Луїс феліпе Де ісус Муноз

Відповіді:


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

Спробуйте в Інтернеті!

Thx за великі 15 байт від ов .

Як зазначено, приймає невід'ємне число та позитивну довжину знака та повертає загальні зміни.


4
Який справжній ебать - це чаклунство. Ти лорд-пітон. Я такий щасливий, що отримаю мій код у 200 байт, потім ти '7367355777e0d93bf0fb'
Дон тисячі

@Rushabh Mehta: Хе-хе. Ну, я лише стою на плечах гігантів. Ознайомтеся з цими порадами, опублікованими справжніми лицарями-джедаями. Струнну стратегію я дізнався звідси .
Час Браун

2
104 байти або 102 байти з недрукуваною ( \x7f) між pі {.
ов

@ovs: Гарне налаштування!
Chas Brown

3

Желе , 23 байти

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

Діадичне посилання, що приймає ціле число для відображення зліва та довжину знака праворуч, яке дає кількість змін (також працює, якщо кількість цифр у цілому для відображення більше довжини знаку).

Спробуйте в Інтернеті!

Як?

Протягом усього шоу кожен 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

Так, але "З огляду на негативне число" та "Введення складається з негативного числа" мені здалося суворим.
Джонатан Аллан

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 байт.
Кудлатий

@Shaggy Хороший трюк, дякую!
ETHproductions

OP уточнила, що обидва входи повинні бути спеціально цілими числами (а не списками цифр чи рядків)
Οurous

@ Οurous Спасибі, встановлено на рівні +0 байт.
ETHproductions

1
Також, я думаю, 0,3слід давати 36; ти даєш 0. (У мене була така ж проблема - виправлення цього коштувало мені приблизно 10 байт grrrr ... :)).
Час Браун

2

Japt, 31 30 байт

Адаптований з розчину Джонатана Желе. Приймає введення в зворотному порядку з номером, який відображається у вигляді цифрового масиву.

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

Спробуй це


OP уточнила, що обидва входи мають бути спеціально цілими числами (а не списками цифр чи рядків)
Οurous

2

Чистота , 280 байт

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

Спробуйте в Інтернеті!

Має бути коротший шлях ..


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

Спробуйте в Інтернеті!

Як?

{г1,г2,,гн}ншN

N=(Т'г1+i=2нТгi-1,гi+Т'н)×ш

Де Тх,у - кількість змін світла для переходу від цифри х для цифри у і Т'х - кількість змін світла для переходу від порожньої цифри до цифри х (або навпаки).

Прокоментував

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.