七段滚动


15

沙盒发布

介绍

信息面板无处不在。当技术变得更便宜时,纸质海报变成了发光的招牌,上面写着单词,而单词又出现在另一侧,如图所示:

在此处输入图片说明

当这些标志之一启动时,它通常开始为空,并且文本从右侧向左侧离开,移动直到消失。

它的功能是打开和关闭小灯泡(LED),以带给您运动的感觉。

如果我们只需要显示数字而不是文字,则可以使用如下所示的所谓的七段标记来简化海报的制作:

在此处输入图片说明

在这种情况下,每个数字仅由7个灯段的开/关组合表示,这些灯段可以代表所有数字:

在此处输入图片说明

我们问自己一个问题,就是要使这些海报之一通过一定数量的灯光变化(打开和关闭多少个)?

例如,要以三位数符号显示123(以所有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位数字,要显示它们,您只需通过SPI命令将8位数字发送到MAX7219。小数点后第1位或第2位的第8位将用于-/ +指示灯。例如,可以通过菊花链连接4来制作8 x 32点显示,以滚动文本,就像我所做的那样:youtube.com/watch?
v=hwYqgyMc5S4

3
@CrossRoads实际上,这并不是真正的硬件答案或类似的东西。创建一个算法可以输出给定数目的灯光变化数,该算法以倍数7段显示器显示是一个挑战
Luis felipe De jesus Munoz

1
建议的测试用例:0,3 => 36
Chas Brown,

1
我们可以将第一个整数作为字符串或数字列表吗?
世纪

1
@Οurous没有,你必须采取两个输入为整数
路易斯·费利佩·穆尼奥斯耶稣

Answers:


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用于从ovs获得 15个字节的大字节。

根据指定,采用非负数和正号长度,并返回总变化。


4
真正的他妈的是什么法术。您是Python主。我很高兴将我的代码控制在200个字节以下,然后您看到'7367355777e0d93bf0fb'
Don Thousand

@Rushabh Mehta:呵呵。好吧,我只是站在巨人的肩膀上。看看真正的绝地武士发布的这些技巧。我从这里学到的弦策略。
Chas Brown '18

2
104个字节102个字节,且和\x7f之间有不可打印的()。p{
ovs '18

@ovs:很好的调整!
Chas Brown

3

果冻,23 字节

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

双向链接,接受整数以显示在左侧,符号长度在右侧,以产生更改次数(如果要显示的整数中的位数大于符号长度,则也可以使用)。

在线尝试!

怎么样?

在整个显示过程中,每个7段显示(在某些时候)从空到第一个数字,然后到第二个数字,依此类推,最后从最后一个过渡到空。每个转换都对起始数字和起始数字的分段的按位XOR进行运算(其中,空是具有0个分段的“数字”)。我从ETHproductions的答案的先前版本中窃取了on-segments作为整数,但是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//…–
毛茸茸的

是的,但是“给定一个非负数”和“输入包含一个非负数”对我来说似乎很严格。
乔纳森·艾伦

3

JavaScript(Node.js)104 94 93 93字节

@Shaggy节省了1个字节

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明确指出,两个输入都必须专门为整数(而不是数字或字符串列表)
十八年

@OOurous谢谢,固定为+0个字节。
ETHproductions

1
另外,我认为0,3应该给36;你给0。(我有同样的问题-修复此问题使我花费了大约10个字节grrrr ... :))。
Chas Brown

2

Japt,31个 30字节

改编自Jonathan的Jelly解决方案。以与要显示为数字数组的数字相反的顺序进行输入。

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

尝试一下


OP明确指出,两个输入都必须特别是整数(而不是数字列表或字符串列表)
十八年

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

在线尝试!

怎么样?

{d1,d2,,dn}nwN

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

Tx,yXÿŤ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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.