일곱 세그먼트 스크롤


15

샌드 박스 게시물

소개

정보 패널은 어디에나 있습니다. 기술이 저렴 해지자 종이 포스터는 그림과 같이 한쪽에 나타나고 다른쪽에 나오는 단어를 나타내는 빛나는 표시로 변형되었습니다.

여기에 이미지 설명을 입력하십시오

이 표지판 중 하나가 시작되면 일반적으로 비워지고 텍스트가 오른쪽에서 왼쪽으로 떠나 사라질 때까지 이동합니다.

그 기능은 작은 전구 (LED)를 켜고 끄는 것입니다.

텍스트 대신 숫자 만 표시하면 포스터는 다음과 같은 소위 7 세그먼트 마커를 사용하여 훨씬 덜 정교해질 수 있습니다.

여기에 이미지 설명을 입력하십시오

이 경우 각 숫자는 모든 숫자를 나타낼 수있는 7 개의 빛 세그먼트 만 조합하여 표시됩니다.

여기에 이미지 설명을 입력하십시오

우리 자신에게 묻는 질문은이 포스터 중 하나를 특정 숫자만큼 통과시키기 위해 얼마나 많은 조명 변경 (켜고 끄는 횟수)이 필요한가?

예를 들어, 모든 LED가 꺼진 상태로 시작하는 3 자리 부호로 123을 표시하려면 다음과 같이됩니다.

여기에 이미지 설명을 입력하십시오

이렇게하면 총 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 × 32 도트 디스플레이를 만들기 위해 daisychained 수 youtube.com/watch?v=hwYqgyMc5S4
교차로

3
@CrossRoads 실제로 이것은 실제 하드웨어 답변이나 이와 유사한 것이 아닙니다. 주어진 수의 조명 변화 횟수를 배수 7 세그먼트 디스플레이로 출력 할 수있는 알고리즘을 만드는 것은 어려운 일입니다.
Luis felipe De jesus Munoz

1
권장 테스트 사례 :0,3 => 36
Chas Brown

1
첫 번째 정수를 문자열 또는 숫자 목록으로 사용할 수 있습니까?
OUurous

1
어떤 Οurous @, 당신은 정수로 두 입력을해야한다
루이스 펠리페 드 예수님 무 노즈

답변:


7

파이썬 (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')

온라인으로 사용해보십시오!

ovs 에서 큰 15 바이트에 대한 Thx .

지정된대로 음수가 아닌 숫자와 양의 부호 길이를 취하여 전체 변경 사항을 리턴합니다.


4
실제 섹스는이 마법입니다. 당신은 파이썬 군주입니다. 200 바이트 미만의 코드를 얻는 것이 너무 기뻐서 다음과 같이 나타납니다'7367355777e0d93bf0fb'
Don Thousand

@Rushabh Mehta : Heh heh. 글쎄, 나는 거인의 어깨에만 서있다. 진정한 Jedi Knights가 게시 한이 팁을 확인하십시오 . 내가 여기서 배운 끈 전략 .
Chas Brown

2
104 바이트 또는 102 바이트 (인쇄 할 수없는 함께 \x7f사이) p{.
ovs

@ovs : 멋진 조정!
Chas Brown

3

젤리 , 23 바이트

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

왼쪽에 표시 할 정수와 오른쪽에 표시되는 부호 길이를 허용하는 가변 링크는 변경 횟수를 나타냅니다 (표시 할 정수의 자릿수가 부호 길이보다 큰 경우에도 작동 함).

온라인으로 사용해보십시오!

어떻게?

전체 쇼가 진행되는 동안 각 7- 세그먼트 디스플레이 (어느 시점에서)는 빈 자리에서 첫 번째 자리로, 두 번째 자리 등으로, 마지막으로 다시 빈 자리로 다시 전환됩니다. 트랜지션은 각각 시작 자리와 시작 자리의 세그먼트에서 비트 XOR의 비용을 지불합니다 (비어 있으면 세그먼트에서 0 인 "숫자"). 나는 이전 세그먼트의 ETHproductions answer 에서 정수로 세그먼트를 훔 쳤지 만 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//…
얽히고 설킨

예, 그러나 "음수가 아닌 숫자로"와 "입력이 음수가 아닌 숫자로 구성됨"은 나에게 엄격한 것 같습니다.
Jonathan Allan

3

자바 스크립트 (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

@Shaggy Nice trick, 감사합니다!
ETHproductions

OP는 두 입력 모두 구체적으로 정수 (숫자 또는 문자열 목록이 아님)
여야한다고 밝혔습니다

@ 0 감사합니다. +0 바이트로 고정되었습니다.
ETHproductions

1
또한 나는 생각 0,3해야한다 36. 당신은 제공 0합니다. (나는 같은 문제가 있었다-이 문제를 해결하는 데 약 10 바이트 grrrr ... :)).
Chas Brown

2

apt, 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

자바 스크립트 (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,,}

=('1+나는=2나는1,나는+')×

엑스,와이엑스와이'엑스엑스

댓글

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.