Cuộn bảy đoạn


15

Bài Sandbox

Giới thiệu

Các bảng thông tin ở khắp mọi nơi. Khi công nghệ trở nên rẻ hơn, các áp phích giấy được chuyển thành các dấu hiệu phát sáng cho thấy các từ xuất hiện ở một bên và xuất hiện ở phía bên kia, giống như trên hình:

nhập mô tả hình ảnh ở đây

Khi một trong những dấu hiệu này bắt đầu, nó thường bắt đầu trống và văn bản rời khỏi bên phải sang trái, di chuyển cho đến khi nó biến mất.

Chức năng của nó là bật và tắt các bóng đèn nhỏ (đèn LED) để mang lại cảm giác chuyển động.

Nếu thay vì văn bản, chúng ta chỉ cần hiển thị số, người đăng có thể ít phức tạp hơn bằng cách sử dụng cái gọi là đánh dấu bảy đoạn như sau:

nhập mô tả hình ảnh ở đây

Trong trường hợp này, mỗi số được biểu thị bằng sự kết hợp bật / tắt chỉ 7 phân đoạn ánh sáng cho phép đại diện cho tất cả các số:

nhập mô tả hình ảnh ở đây

Câu hỏi chúng tôi tự hỏi là có bao nhiêu thay đổi của đèn (bao nhiêu bật và tắt) nên được thực hiện để vượt qua một trong những áp phích này một số nhất định?

Ví dụ: để hiển thị 123 trong ký hiệu 3 chữ số bắt đầu bằng tất cả các đèn LED tắt, chúng tôi sẽ có:

nhập mô tả hình ảnh ở đây

Điều này làm cho tổng cộng 42 thay đổi của đèn.


Thử thách

Cho một số không âm và độ dài dấu dương tính toán số lượng đèn thay đổi.

Quy tắc

  • Giả sử đầu vào bao gồm một số không âm (N> = 0) và độ dài dấu dương (M> 0)
  • Giả sử Độ dài ký hiệu> = Độ dài số (M> = chữ số (N))

Các trường hợp thử nghiệm

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

1
Mục tiêu của câu hỏi là gì? Trong thực tế, một phần như MAX7219 sẽ điều khiển 8 chữ số, để chúng hiển thị, bạn chỉ cần gửi 8 chữ số đến MAX7219 thông qua các lệnh SPI. Bit thập phân 8 bit từ 1 hoặc 2 chữ số sẽ được sử dụng cho ánh sáng - / +. Chẳng hạn, 4 có thể được tạo thành một màn hình 8 x 32 chấm để cuộn văn bản, giống như cái này tôi đã tạo: youtube.com/watch?v=hwYqgyMc5S4
CrossRoads

3
@CrossRoads Trên thực tế, điều này không dành cho câu trả lời phần cứng thực sự hoặc bất cứ điều gì như thế này. Thử thách tạo ra một thuật toán có thể tạo ra số lượng thay đổi ánh sáng của một số đã cho trong bội số màn hình 7 đoạn
Luis felipe De jesus Munoz

1
Trường hợp thử nghiệm được đề xuất:0,3 => 36
Chas Brown

1
Chúng ta có thể lấy số nguyên đầu tiên dưới dạng một chuỗi hoặc danh sách các chữ số không?
Οurous

1
@ Urous no, bạn phải lấy cả hai đầu vào là số nguyên
Luis felipe De jesus Munoz

Câu trả lời:


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

Hãy thử trực tuyến!

Thx cho 15 byte lớn từ ovs .

Như đã chỉ định, lấy số không âm và độ dài dấu dương và trả về tổng số thay đổi.


4
Cái quái gì thật là phù thủy này. Bạn là một Chúa tể Python. Tôi rất vui khi nhận được mã của mình dưới 200 byte sau đó bạn xuất hiện với'7367355777e0d93bf0fb'
Don Nghìn

@Rushabh Mehta: Heh heh. Chà, tôi chỉ đứng trên vai những người khổng lồ. Kiểm tra những lời khuyên được đăng bởi Hiệp sĩ Jedi thực sự. Chiến lược chuỗi tôi học được từ đây .
Chas Brown

2
104 byte hoặc 102 byte với một không thể in ( \x7f) giữa p{.
trứng

@ovs: Điều chỉnh tốt đẹp!
Chas Brown

3

Thạch , 23 byte

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

Một liên kết dyadic chấp nhận số nguyên để hiển thị ở bên trái và độ dài dấu ở bên phải mang lại số lượng thay đổi (cũng hoạt động nếu số chữ số trong số nguyên hiển thị lớn hơn độ dài dấu).

Hãy thử trực tuyến!

Làm sao?

Trong toàn bộ chương trình, mỗi màn hình 7 đoạn (tại một số điểm) chuyển từ trống sang chữ số đầu tiên, sau đó sang chữ số thứ hai, và cuối cùng từ cuối cùng sang trống một lần nữa. Mỗi lần chuyển đổi có giá XOR bitwise của các phân đoạn trên chữ số và chữ số (trong đó trống là "chữ số" có 0 trên phân đoạn). Tôi đã đánh cắp các phân đoạn trên dưới dạng số nguyên từ bản sửa đổi trước đây của câu trả lời của ETHproductions , nhưng mọi hoán vị của 7 phân đoạn cũng sẽ làm như vậy.

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

Bạn có thể lưu một byte bằng cách lấy số làm mảng số không? tio.run/##ATsAxP9qZWxsef// từ
Shaggy

Có, nhưng "Cho một số không âm" và "đầu vào bao gồm một số không âm" có vẻ nghiêm ngặt đối với tôi.
Jonathan Allan

3

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

Đã lưu 1 byte nhờ @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))

Hãy thử trực tuyến!


Tôi nghĩ rằng điều này làm việc cho -1 byte.
Xù xì

@Shaggy Thủ thuật hay, cảm ơn!
Sản xuất ETH

OP đã làm rõ rằng cả hai đầu vào phải đặc biệt là số nguyên (và không phải là danh sách các chữ số hoặc chuỗi)
urous

@ Urous Cảm ơn, đã sửa ở mức +0 byte.
Sản phẩm ETH

1
Ngoài ra, tôi nghĩ 0,3nên cho 36; bạn đưa ra 0. (Tôi gặp vấn đề tương tự - việc sửa lỗi này khiến tôi mất khoảng 10 byte grrrr ... :)).
Chas Brown

2

Japt, 31 30 byte

Chuyển thể từ giải pháp Jelly của Jonathan. Đưa đầu vào theo thứ tự ngược với số được hiển thị dưới dạng một mảng chữ số.

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

Thử nó


OP đã làm rõ rằng cả hai đầu vào phải đặc biệt là số nguyên (và không phải là danh sách các chữ số hoặc chuỗi)
urous

2

Dọn dẹp , 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

Hãy thử trực tuyến!

Phải có một cách ngắn hơn ..


1

Than , 40 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Hoạt động bằng cách chuyển đổi đầu vào thành các giá trị phân đoạn nhị phân, sau đó đếm số lượng thay đổi giữa mỗi ký tự. Giải trình:

      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 byte

Đưa đầu vào là (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

Hãy thử trực tuyến!

Làm sao?

{d1,d2,,dn}nwN

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

Tx,yx đến chữ số yT'x là số lượng thay đổi ánh sáng để chuyển từ chữ số trống sang chữ số x (Hoặc cách khác xung quanh).

Đã bình luận

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.