Giải mã màn hình 7 đoạn


17

Có thể bạn đều biết màn hình 7-segment có thể hiển thị trong số những thứ khác tất cả các chữ số từ 09 :

Hiển thị 7 đoạn (wikipedia.org)

Thử thách

Chúng tôi chỉ xem xét các phân đoạn , nhiệm vụ của bạn là giải mã một chữ số cho các phân đoạn nào được bật.AG

Điều này có thể được mã hóa dưới dạng số nguyên 8 bit, đây là bảng của mỗi chữ số với biểu diễn nhị phân của chúng và các giá trị cuối nhỏ và cuối lớn tương ứng:

Digit.ABCDEFGLittle-endianBig-endian0011111101260x7E1260x7E100110000480x30120x0C2011011011090x6D1820xB63011110011210x791580x9E400110011510x332040xCC501011011910x5B2180xDA601011111950x5F2500xFA7011100001120x70140x0E8011111111270x7F2540xFE9011110111230x7B2220xDE

Quy tắc & I / O

  • Đầu vào sẽ là một trong
    • số nguyên đơn (như trong bảng trên một trong hai đơn hàng đã cho)
    • một danh sách / mảng / .. của bit
    • một chuỗi bao gồm các ký tự ABCDEFG(bạn có thể giả sử nó được sắp xếp, như một ví dụ ABCmã hóa ), trường hợp của chúng là sự lựa chọn của bạn (không phải là trường hợp hỗn hợp)7
  • Đầu ra sẽ là chữ số được mã hóa
  • Bạn có thể cho rằng không có đầu vào không hợp lệ (không hợp lệ có nghĩa là không có chữ số tương ứng)

Xét nghiệm

Vì thử thách này cho phép nhiều đại diện, vui lòng tham khảo bảng.



Chúng ta có thể chấp nhận một số nguyên (hoặc mảng) theo bất kỳ thứ tự bit được chỉ định nào không hoặc chỉ hai số được hiển thị?
Jonathan Allan

@Jonathan ALLan: Tôi sẽ làm rõ, chỉ những cái đã được hiển thị.
ბიმო

Ohhh tào lao, bạn không phải xử lý tất cả các loại đầu vào? Chỉ một? Rất tiếc ...
Bạch tuộc ma thuật Urn

@MagicOctopusUrn: Có thực sự :)
ბიმო

Câu trả lời:




7

Ngôn ngữ Wolfram (Mathicala) , 41 byte

9[,6,0,8,2,3,1,7,5,4][[#~Mod~41~Mod~11]]&

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

Sử dụng cột số nguyên nhỏ làm đầu vào. Bỏ qua cảnh báo cú pháp.

Đối với đầu vào X, trước tiên chúng ta lấy X mod 41 và sau đó lấy mod kết quả 11. Kết quả là mod 11 riêng biệt, vì vậy chúng ta có thể trích xuất chúng từ một bảng. Ví dụ: 126 mod 41 mod 11 là 3, vì vậy nếu chúng ta đặt vị trí 3 bằng 0, thì chúng ta sẽ có câu trả lời đúng cho đầu vào là 126.

Cái bàn là 9[,6,0,8,2,3,1,7,5,4]. Phần 0 là phần đầu 9. Phần 1 bị thiếu, vì vậy Null, để tiết kiệm một byte: chúng ta không bao giờ cần phải lấy phần 1. Sau đó, phần 2 là 6, phần 3 là 0, v.v., như thường lệ.


Câu trả lời của Jonathan Allan cho chúng ta 1[4,9,8,6,2,0,5,3,7][[384~Mod~#~Mod~13]]&. Điều này không ngắn hơn, nhưng nó tránh cảnh báo cú pháp!


Ngôn ngữ Wolfram (Mathicala) , 27 25 byte

Mod[Hash[")dD}"#]+2,11]&

(Có một số nhân vật ở đây không hoàn toàn xuất hiện, xin lỗi. Nhấp vào liên kết bên dưới và bạn sẽ thấy nó.)

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

Đây là tất cả về brute - buộc một số chuỗi đi vào bên trong Hashđể băm kết thúc có giá trị đúng mod 11. Việc buộc vũ phu nhiều hơn có thể đưa chúng ta đến một giải pháp thậm chí ngắn hơn.


Bạn có thể vui lòng giải thích câu trả lời này một chút, cho một người không biết Mathicala?
jrook

Tôi nghĩ rằng nó sẽ có thể đọc được cho bất cứ ai, nhưng không sao, tôi sẽ chỉnh sửa trong một lời giải thích.
Misha Lavrov

Chúc mừng; giải pháp 41 byte đã phá vỡ máy nén Mathicala của tôi.
lirtosiast



4

Java (JDK) , 32 byte

n->"99608231754".charAt(n%41%11)

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

Tín dụng


Phương pháp của Misha Lavrov làm cho 32 .
Jonathan Allan

Cảm ơn, @Jonathan ALLan! Nhiều đánh giá cao!
Olivier Grégoire


3

Khoảng trắng , 152 byte

Bắt buộc "S, T và L không thực sự ở đó, chúng chỉ là những đại diện hữu hình của các lệnh".

S S S T	S S L
S S S T	S T	L
S S S T	T	T	L
S S S T	L
S S S T	T	L
S S S T	S L
S S S T	S S S L
S S S L
S S S T	T	S L
S S S L
S S S T	S S T	L
S S S L
S L
S T	L
T	T	T	T	T	S S S T	S T	S S T	L
T	S T	T	S S S T	S T	T	L
T	S T	T	L
S S L
S L
S L
T	S S L
S T	L
S T	L
S S S T	L
T	S S T	L
S L
L
L
S S S L
S L
L
T	L
S T	

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

Kết thúc trong một lỗi.

Cú pháp giống như lắp ráp tương đương:

	push 4
	push 5
	push 7
	push 1
	push 3
	push 2
	push 8
	push 0
	push 6
	push 0
	push 9
	push 0
	dup
	readi
	retrieve
	push 41
	mod
	push 11
	mod
slideLoop:
	dup
	jz .slideLoop
	slide 1
	push 1
	sub
	jmp slideLoop
.slideLoop:
	drop
	printi

Bạn có thể xóa ba dòng mới để lưu 3 byte. Nó đưa ra một lỗi trong STDERR, nhưng chương trình vẫn hoạt động và được các quy tắc meta cho phép .
Kevin Cruijssen

3

brainfuck , 474 176 154 151 149 137 byte

Lấy một chuỗi đầu vào gồm tám 01bao gồm chuỗi đầu tiên 0cho dấu thập phân.

(giống như trong cột thứ hai của bảng trong bài)

Đầu ra chữ số từ 0 đến 9.

,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]

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

Thuật toán

Bằng cách quan sát trạng thái của một phân khúc cụ thể, chúng ta có thể chia một tập hợp các chữ số có thể thành các tập con nhỏ hơn. Dưới đây là cây tìm kiếm nhị phân tĩnh được sử dụng trong mã của tôi. Cây con bên trái tương ứng với trạng thái phân đoạn ON, bên phải tương ứng với trạng thái TẮT phân khúc.

                                         0,1,2,3,4,5,6,7,8,9
                                                  |    
                                         /-------[A]-------------------------\
                                 0,2,3,5,6,7,8,9                             1,4
                                        |                                     |
                         /-------------[B]----------------\             /----[G]----\
                   0,2,3,7,8,9                            5,6          4             1   
                        |                                  |
              /--------[E]--------\                  /----[E]----\    
            0,2,8                3,7,9              6             5
              |                    |
        /----[F]----\        /----[F]----\
      0,8            2      9            3,7   
       |                                  |
 /----[G]----\                      /----[G]----\
8             0                    3             7

Một số quan sát hữu ích cho việc chơi golf

  1. Bits C và D là dự phòng và có thể bỏ qua.
  2. Số 0 (bit cho dấu thập phân) có thể là (ab) được sử dụng làm giá trị 48, quan trọng cả cho phân tích cú pháp đầu vào và chuẩn bị đầu ra.
  3. Khi đạt được lá và chữ số được in, chúng ta chỉ cần bỏ qua tất cả các điều kiện tiếp theo. Nó có thể được thực hiện bằng cách di chuyển con trỏ dữ liệu đủ xa đến khu vực số không để nó không thể quay lại.
  4. Để tương thích, tốt hơn là sử dụng các số 0 ở bên phải, bởi vì một số triển khai BF không hỗ trợ các con trỏ dữ liệu âm.
  5. Do đó, tốt hơn là lưu trữ giá trị đầu ra trong ô ngoài cùng bên phải, vì vậy chúng ta có thể dễ dàng tiếp cận khu vực số 0 ở bên phải.
  6. Do đó, tốt hơn là kiểm tra các bit từ trái sang phải: A, B, E, F, G để chúng ta có thể tiếp cận ô đầu ra dễ dàng hơn.
  7. Các chữ số khác nhau có thể chia sẻ mã đầu ra. Ví dụ, 5 và 6 nằm trong cùng một cây con. Chúng tôi có thể làm +++++cho cả hai giá trị và sau đó +cho sáu chỉ.
  8. Chúng tôi có thể giảm số lượng +lệnh nếu chúng tôi thêm 2 vào giá trị đầu ra trước. Trong trường hợp đó, chúng ta cần giảm 01chỉ và nhận lợi thế cho các chữ số khác.

2

Võng mạc , 96 byte

^(A)?(B)?C?(D|())(E|())(F)?(G)?
$.($.5*$.8*$(6*$7$2$2)$#6*$.3*$($.2*$(___$7)5*$7)$#4*$(6*$1_3*$8

Hãy thử trực tuyến! Có thể không phải là cách tốt nhất, nhưng đó là một cách lập trình thú vị ở Retina. Giải trình:

^(A)?(B)?C?(D|())(E|())(F)?(G)?

Cố gắng để nắm bắt các trường hợp thú vị. Các ảnh chụp tích cực chỉ đơn giản là chụp bức thư nếu nó hiện diện. Do đó, độ dài của ảnh chụp là 1 nếu nó có mặt và 0 nếu không có. Các trường hợp đặc biệt là chụp 4 và 6 chỉ tồn tại nếu D hoặc E vắng mặt tương ứng. Chúng chỉ có thể được biểu thị bằng số thập phân $#4$#6nhưng đó là tất cả những gì chúng ta cần ở đây. Các ảnh chụp sau đó được xây dựng thành một chuỗi có độ dài là số mong muốn. Chẳng hạn, nếu chúng ta viết 6*$1thì chuỗi này có độ dài 6 nếu A có mặt và 0 nếu nó vắng mặt. Để chọn giữa các biểu thức khác nhau, chúng tôi sử dụng $.(cho các ảnh chụp dương) hoặc $#(cho các ảnh chụp âm) ước tính bằng 0 hoặc 1 và điều này sau đó có thể được nhân với chuỗi.

$.5*$.8*$(6*$7$2$2)

Fđược lặp lại 6 lần và Bhai lần (bằng cách ghép nối khi nó là gôn thủ). Tuy nhiên, kết quả bị bỏ qua trừ khi cả hai EGcó mặt. Điều này xử lý các trường hợp 2, 68.

$#6*$.3*$($.2*$(___$7)5*$7)

Fđược lặp lại 5 lần và nếu Bcó, nó được thêm lần thứ sáu cộng thêm 3 lần (được biểu thị bằng một chuỗi không đổi có độ dài 3). Tuy nhiên, kết quả bị bỏ qua trừ khi Dcó mặt và Evắng mặt. Điều này xử lý các trường hợp 3, 59.

$#4*$(6*$1_3*$8

Ađược lặp lại 6 lần và Gđược lặp lại 3 lần và được thêm 1vào (được biểu thị bằng một ký tự không đổi giữa hai vì nó là gôn thủ). Tuy nhiên, kết quả bị bỏ qua trừ khi Dvắng mặt. Điều này xử lý các trường hợp 1, 47.

$.(

Các chuỗi trên sau đó được nối và độ dài thực hiện. nếu không có điều nào ở trên áp dụng, thì không có chuỗi nào được tạo và do đó độ dài của chuỗi là do đó 0.

Các chuỗi kết quả (trước khi độ dài được thực hiện) như sau:

1   _
2   BB
3   ___
4   _GGG
5   FFFFF
6   FFFFFF
7   AAAAAA_
8   FFFFFFBB
9   ___FFFFFF

2

MATL , 14 byte

'/lx2Z^o~z'Q&m

Đầu vào là một số đại diện cho các phân đoạn ở định dạng endian nhỏ.

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

Giải trình

'/lx2Z^o~z'  % Push this string
Q            % Add 1 to the codepoint of each char. This gives the array
             % [48 109 ... 123], corresponding to numbers 1 2 ... 9. Note that
             % 0 is missing
&m           % Implicit input. Call ismember function with second output. This
             % gives the 1-based index in the array for the input, or 0 if the
             % input is not present in the array.
             % Implicit display



1

Japt, 15 byte

Lấy giá trị cuối lớn làm đầu vào.

"~¶ÌÚúþÞ"bUd

Thử nó


Giải trình

Chuỗi chứa các ký tự tại mỗi điểm mã của các giá trị cuối lớn; Udlấy ký tự tại điểm mã của đầu vào và btìm chỉ mục của chuỗi đó trong chuỗi.


1

Neim , 15 byte

&bᚫJ𝕂𝕨O𝐖𝐞ℤ£ᛖ𝕪)𝕀

Giải trình:

&bᚫJ𝕂𝕨O𝐖𝐞ℤ£ᛖ𝕪)      create list [126 48 109 121 51 91 95 112 127 123]
                 𝕀     index of

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



1

TI-BASIC (TI-83 + / 84 + series), 15 byte

int(10fPart(194909642ln(Ans

Sử dụng đầu vào ít endian. Băm khá phổ biến trong TI-BASIC, vì vậy tôi đã viết hàm băm brute-forcer cho các trường hợp như thế này.

Chúng tôi có một chút may mắn ở đây, vì số nhân dài 9 chữ số thay vì 10 chữ số dự kiến.

      fPart(194909642ln(Ans   hash function mapping onto [0,1)
int(10                        take first digit after decimal point

1

05AB1E , 17 16 15 12 byte

•NŽyf¯•I41%è

-1 byte nhờ @ErikTheOutgolfer .
-1 byte bằng cách tạo một cổng của câu trả lời Mathicala của @MishaLavrov .
-3 byte nhờ @Grimy .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

NŽyf¯•       # Push compressed integer 99608231754
       I41%   # Push the input modulo-41
           è  # Index this into the integer (with automatic wraparound)
              # (and output the result implicitly)

Xem 05AB1E mẹo này của tôi (phần Làm thế nào để nén các số nguyên lớn? ) Để hiểu tại sao •NŽyf¯•99608231754.



@EriktheOutgolfer Ah, tất nhiên .. Thật trùng hợp 128в. Quên có một tích hợp để 128được một nửa 256. Cảm ơn!
Kevin Cruijssen

Tôi đã thử một số thứ kỳ dị quá không thể có được dưới 15. Nỗ lực kỳ lạ nhất: ¦C•26¤æÈÛµÀš•2ô₂+sk(19).
Bạch tuộc ma thuật Urn

1
@Grimy Cảm ơn! Bây giờ tôi thấy điều đó là hiển nhiên, vì số nguyên nén có kích thước 11 và
vòng tròn

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.