Hiển thị từ bằng màn hình 7 đoạn


13

Câu đố lập trình & Code Golf đầu tiên của tôi là Màn hình Bảy chém . Đây là Thử thách đầu tiên của tôi, cũng dựa trên màn hình 7 đoạn.

Tôi thường nghĩ về, bên cạnh những con số, loại chữ nào tôi có thể hiển thị bằng màn hình 7 đoạn đơn giản. Hóa ra rất nhiều chữ cái có thể được hiển thị. Trên thực tế, tất cả các chữ K, M, V, W, X đều có thể được hiển thị bằng một màn hình 7 đoạn duy nhất. Điều này là do bạn có thể hiển thị chữ thường hoặc chữ hoa của chữ cái. ví dụ

"abcdef" có thể được hiển thị dưới dạng

 _     _     _  _
!_!!_ !   _!!_ !_ 
! !!_!!_ !_!!_ !  

Lưu ý rằng mỗi ký tự là một ma trận 3x3 được tạo thành từ !_.

Tất nhiên, màn hình 7 đoạn có thể được sử dụng để hiển thị số và ký hiệu:

 _     _  _  _           _  _     _    
  ! _ !_ !_ !      _!  !!_ !_!!  !_!!_!
  !    _!!_ !_!   !_!  ! _!!  !_ ! ! _!

Một số chữ cái có thể có cả chữ hoa và chữ thường:

 _                 _          
!   _ !_!!_   !   ! ! _ ! !   
!_ !_ ! !! !  !  !!_!!_!!_!!_!

Dưới đây là bộ đầy đủ các ký tự:

 _     _  _     _  _  _  _  _                       _
! !  ! _! _!!_!!_ !_   !!_!!_!    _ !_     _     _  _!
!_!  !!_  _!  ! _!!_!  !!_! _!   !_ ! !  !!_!!_!   !  

 _     _     _  _  _                 _  _  _     _           _ 
!_!!_ !   _!!_ !_ !  !_!  !  !!   _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ !  !_!! !  !!_!!_ ! !!_!!    !!   _!!_ !_! _!!_ 

Hãy chú ý rằng có một khoảng trắng ( ), dấu gạch ngang ( -) và dấu hỏi ( ?). Chữ cái I, OZgiống như số 1, 02tương ứng.

Trong thử thách này, bạn sẽ viết chương trình hoặc hàm để hiển thị chuỗi bằng định dạng hiển thị 7 đoạn ở trên.

Quy tắc

  1. Bạn có thể viết một chương trình hoặc một chức năng

  2. Đây là code-golf, mã ngắn nhất tính bằng byte thắng

  3. Chương trình hoặc chức năng của bạn nên lấy đầu vào từ STDIN hoặc làm tham số. Và xuất một chuỗi thành STDOUT hoặc dưới dạng một chuỗi trong 3 dòng mà không có khoảng trắng hàng đầu nhưng được kết thúc bằng dòng mới. Xử lý trường hợp trên / dưới của CHIOUđúng.

  4. Bạn có thể tùy ý in dấu trắng

  5. Bạn phải làm theo định dạng trên. Sử dụng dấu gạch dưới _và dấu chấm than !để tạo thành màn hình 7 đoạn của bạn.

  6. Bạn phải hỗ trợ khoảng trắng ( ), dấu gạch ngang ( -) và dấu hỏi ( ?)

  7. Nếu chuỗi chứa ký tự không được hỗ trợ (k, m, v, w, x), một ký tự lỗi đơn (3 đường chân trời, xem ví dụ) được hiển thị. Ngoài 5 ký tự không được hỗ trợ, bạn có thể giả sử đầu vào được tạo thành từ chỉ bộ ký tự được hỗ trợ.

  8. Tôi đã chọn không có chữ cái viết thường L ( l) do nhầm lẫn nhưng nếu bạn quá nghiêng, bạn có thể hiển thị nó như một 1bên phải hoặc bên trái.

Ví dụ

$./a.out Start
 _     _    
!_ !_ !_! _ !_
 _!!_ ! !!  !_
$./a.out "7-seg dIsplay"
 _     _  _  _           _  _     _ 
  ! _ !_ !_ !      _!  !!_ !_!!  !_!!_!
  !    _!!_ !_!   !_!  ! _!!  !_ ! ! _!
$./a.out "0123456789 chiou-?"
 _     _  _     _  _  _  _  _                       _
! !  ! _! _!!_!!_ !_   !!_!!_!    _ !_     _     _  _!
!_!  !!_  _!  ! _!!_!  !!_! _!   !_ ! !  !!_!!_!   !
$./a.out "ABCDEFGHIJLNOPQRSTUZ"
 _     _     _  _  _                 _  _  _     _        _
!_!!_ !   _!!_ !_ !  !_!  !  !!   _ ! !!_!!_! _ !_ !_ ! ! _!
! !!_!!_ !_!!_ !  !_!! !  !!_!!_ ! !!_!!    !!   _!!_ !_!!_
$./a.out "abcdefghijlnopqrstuz"
 _           _  _  _                    _  _     _        _
!_!!_  _  _!!_ !_ !  !_      !!   _  _ !_!!_! _ !_ !_     _!
! !!_!!_ !_!!_ !  !_!! !  !!_!!_ ! !!_!!    !!   _!!_ !_!!_
$./a.out "Bad Form"
 _
 _
 _
$./a.out "Hello"
    _       
!_!!_ !  !   _
! !!_ !_ !_ !_!
$./a.out "World"
 _
 _
 _

Có, bạn có thể cho rằng không có biểu tượng không được hỗ trợ. Ý định của tôi là đảm bảo các chuỗi chứa k, m, v, w, xkhông được hiển thị.
một số người dùng


Tôi nghĩ rằng bạn đã nhầm lẫn vận chuyển trở lại (CR, \r) với nguồn cấp dữ liệu (LF, \n). * nix sử dụng LF và Windows sử dụng CRLF. Chỉ một số hệ thống di sản nhất định sử dụng CR của chính nó. Thêm thông tin tại đây: vi.wikipedia.org/wiki/Newline
Winny

Ký tự "8" của bạn dường như có một thanh "|" thay vì một dấu chấm than "!". Có dự định không?
coredump

1
@Winny, bạn đúng rồi. Tôi đã quá lười biếng để tìm nó khi tôi viết nó.
một số người dùng

Câu trả lời:


7

CJam, 123 114 112 110 byte

Qq_eu";=KMVWX":T&"@"@?" -chiou"Tereu{i"^A^W^G;^Þ¯     ^Þ^Û9³·^É¿»
^@
^P
^Ü^Ò½7¦^_¶´§=   ^O^V&5^U¯¼¹^T³6/"=i2b9Ue[3/"!_!"f.{S?}.+}/N*

Ở trên sử dụng ký hiệu dấu mũ, vì mã chứa các ký tự không thể in được. Một trong số đó là null byte ( ^@), có nghĩa là mã này chỉ có thể được thực thi từ dòng lệnh.

Với chi phí chỉ có hai byte nữa (với tổng số 112 ), chúng tôi có thể khắc phục điều này.

Qq_eu";=KMVWX":T&"@"@?" -chiou"Tereu{i"AWG{ÞïIÞÛyó÷Éÿû
@
P
ÜÒýwæ_öôç}IOVfuUïüùTóvo"=i448+2b1>3/"!_!"f.{S?}.+}/N*

Lần này, tất cả các nhân vật đều có thể in được. Hãy thử trực tuyến trong trình thông dịch CJam .

Chạy ví dụ

$ LANG=en_US
$ xxd -ps -r > 7seg.cjam <<< 51715f6575223b3d4b4d565758223a5426224022403f22202d6368696f752254657265757b69220117073b9eaf099e9b39b3b789bfbb0a000a100a9c92bd37a61fb6b4a73d090f16263515afbcb914b3362f223d6932623955655b332f22215f2122662e7b533f7d2e2b7d2f4e2a
$ wc -c 7seg.cjam 
110 7seg.cjam
$ echo -n '0123456789 chiou-?' | cjam 7seg.cjam; echo
 _     _  _     _  _  _  _  _                       _ 
! !  ! _! _!!_!!_ !_   !!_!!_!    _ !_     _     _  _!
!_!  !!_  _!  ! _!!_!  !!_! _!   !_ ! !  !!_!!_!   !  
$ echo -n 'ABCDEFGHIJLNOPQRSTUYZ' | cjam 7seg.cjam; echo
 _     _     _  _  _                 _  _  _     _           _ 
!_!!_ !   _!!_ !_ !  !_!  !  !!   _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ !  !_!! !  !!_!!_ ! !!_!!    !!   _!!_ !_! _!!_ 
$ echo -n 'World' | cjam 7seg.cjam; echo
 _ 
 _ 
 _

Ý tưởng (phiên bản có thể in)

Mỗi ký tự có thể được hiển thị trên màn hình 9 đoạn

!_!
!_!
!_!

bằng cách thay thế một số ký tự của nhân vật bằng dấu cách.

Chúng ta có thể biến một ký tự cụ thể thành một số nguyên bằng cách thay thế từng phân đoạn được hiển thị, theo thứ tự đọc tự nhiên, bằng 1 , mỗi phân đoạn không được hiển thị bằng 0 và xem xét các chữ số nhị phân kết quả.

Phân đoạn thứ nhất và thứ ba không bao giờ được hiển thị, do đó, phần này sẽ tạo ra các số nguyên trong phạm vi [0,64)[128,192) .

Chúng ta có thể mã hóa từng số nguyên này dưới dạng một byte đơn, nhưng một nửa trong số chúng sẽ dẫn đến các ký tự không thể in được. Do đó, chúng tôi thêm 64 vào mỗi số nguyên trước khi truyền vào ký tự, điều này đảm bảo các điểm mã nằm trong phạm vi [64,128)[192,256) .

Ký tự không thể in duy nhất trong hai phạm vi này là DEL (mã điểm 127), tương ứng với cấu hình hiển thị không hiển thị sau:

!_!
!_!

Chúng ta có thể đảo ngược mã hóa ở trên bằng cách thêm 448 == 512 - 64 vào mỗi điểm mã, chuyển đổi sang cơ sở 2 và xóa chữ số nhị phân đầu tiên.

Tất cả chỉ còn lại để tìm ra một cách hiệu quả để liên kết các bộ phân tách được mã hóa này với các ký tự ASCII tương ứng của chúng.

Nếu chúng ta ánh xạ các ký tự " -chiou"thành các ký tự ";=KMVWX"và chuyển đổi toàn bộ đầu vào thành chữ hoa, chúng ta chỉ cần lưu trữ mã hóa cho tất cả các ký tự giữa0 (mã điểm 48) và Z(mã điểm 90), cho phạm vi 43.

Mảng lập chỉ mục là mô-đun trong CJam, vì vậy nếu Alà một chuỗi có độ dài 43, A86=, A43=A0=tất cả mang lại kết quả tương tự. Ký tự có mã điểm 86 là V, vì vậy chúng tôi chỉ lưu trữ các đoạn được mã hóa của V - Z 0 - U , theo thứ tự.

Trong mã thực tế, chúng tôi chọn ký tự có dấu là "biểu mẫu xấu", thay thế toàn bộ đầu vào bằng chuỗi "@" nếu nó chứa một chữ cái bị cấm và đảo ngược các bước từ phía trên.

Mã (phiên bản có thể in)

Q            e# Push an empty array for posterior concatenation.
q            e# Read from STDIN.
_eu          e# Copy the input and convert is to uppercase.
";=KMVWX":T& e# Intersect the result with with T := ";=KMVWX".
"@"@?        e# Select "@" if truthy and the input if falsy.
" -chiou"Ter e# Perform transliteration.
eu           e# Convert everything to uppercase.
{            e# For each character in the modified input:
  i          e#   Push its code point.
  "…"=       e#   Select the corresponding character from the string.
  i448+      e#   Push that character's code point and add 448.
  2b1>       e#   Convert to base 2 and discard the first digit.
  3/         e#   Group into triplets of digits (rows).
  "!_!"      e#   Push that string.
  f.{        e#   For each group of digits:
    S?       e#     Select the corresponding char of "!_!" for 1 and " " for 0.
  }          e#
  .+         e#   Concatenate along the rows with the previous results.
}/           e#
N*           e# Join, separating by linefeeds.

2

Perl, 475 469 424 390 280 272 byte

$_=<>;die" -
"x3if/[kmvwx]/i;y/chiou/kmvwx/;$_=lc;while(/(.)/g){$z=ord($1=~y/a-z0-9\-\? /{v\x17nWS7z(.F\x16rb?[yBuV> f&|O?(Omxuw)\x7f}@K\0/r);$i.=$z&1?' _ ':$"x3;$m.=($z&16?'!':$").($z&64?'_':$").($z&8?'!':$");$p.=substr("  !  _!_",$z&6,2).($z&32?'!':$")}print"$i
$m
$p
"

đa dòng với ý kiến:

$_=<>;   # accept input
die" -   # check for invalid chars
"x3if/[kmvwx]/i;
y/chiou/kmvwx/;$_=lc;   # substitute invalid chars, convert to lowercase
while(/(.)/g)   # loop over each character
    # lookup character from string using transliteration and convert to
    # number using ord() for bit checking:
    {$z=ord($1=~y/a-z0-9\-\? /{v\x17nWS7z(.F\x16rb?[yBuV> f&|O?(Omxuw)\x7f}@K\0/r);
    $i.=$z&1?' _ ':$"x3;    # first row
    $m.=($z&16?'!':$").($z&64?'_':$").($z&8?'!':$");   # second row
    $p.=substr("  !  _!_",$z&6,2).($z&32?'!':$")}    # third row
# print result:
print"$i
$m
$p
"

Các mẫu bit mã hóa các phân đoạn được lưu trữ trong một chuỗi (thoát 3 ký tự không thể in được bằng cách sử dụng \xvà sử dụng\0 cho không gian) và được ánh xạ tới các ký tự đầu vào bằng toán tử chuyển ngữ Perl.

Đối với 5 trong số 7 phân đoạn, một bitwise và được sử dụng cùng với toán tử ternary để tạo ra một khoảng trắng hoặc ký tự phân đoạn. Đối với hai phân đoạn dưới cùng bên trái (được mã hóa bởi 2 và 4 trong bitet), một chuỗi tìm kiếm chuỗi con thành chuỗi 8 ký tự được sử dụng để lưu 2 byte.

Cảm ơn Dom Hastings vì những lời khuyên chơi gôn Perl của anh ấy.

Phiên bản cũ (sử dụng biểu thức chính quy để mã hóa các mẫu), 390 byte:

$_=<>;if(/[kmvwx]/i){print" -\n"x3;exit}y/chiou/kmvwx/;$_=lc;while(/(.)/g){$z=$1;$i.=($z=~/[acefgopqsz\?0235-9]/?' _ ':'   ');$m.=($z=~/[abce-hlmopqstuy045689]/?'!':' ').($z=~/[abdefhkmnp-twyz\-\?2-689]/?'_':' ').($z=~/[adhijopquyz\?0-4789]/?'!':' ');$p.=($z=~/[a-hj-prtuwxz\?0268]/?'!':' ').($z=~/[b-egjklostuw-z0235689]/?'_':' ').($z=~/[abdg-jmnoqsu-y013-9]/?'!':' ')}print"$i\n$m\n$p\n"

đa dòng với ý kiến:

$_=<>;   # accept input
if(/[kmvwx]/i){print" -\n"x3;exit}   # check for invalid chars
y/chiou/kmvwx/;$_=lc;   # substitute invalid chars, convert to lowercase
while(/(.)/g)
{$z=$1;$i.=($z=~/[acefgopqsz\?0235-9]/?' _ ':'   '); # first row
$m.=($z=~/[abce-hlmopqstuy045689]/?'!':' ').
($z=~/[abdefhkmnp-twyz\-\?2-689]/?'_':' ').
($z=~/[adhijopquyz\?0-4789]/?'!':' '); # second row
$p.=($z=~/[a-hj-prtuwxz\?0268]/?'!':' ').
($z=~/[b-egjklostuw-z0235689]/?'_':' ').
($z=~/[abdg-jmnoqsu-y013-9]/?'!':' ')} # third row
print"$i\n$m\n$p\n" # print result

Chuỗi được đọc và kiểm tra các ký tự không hợp lệ bằng cách sử dụng biểu thức chính quy, thoát nếu có bất kỳ ký tự nào được tìm thấy. Sau đó, các ký tự chữ thường được phép được thay thế cho các ký tự không hợp lệ và toàn bộ chuỗi được chuyển đổi thành chữ thường.

Các hàng được tạo cùng một lúc, với 1 đoạn trên mỗi chữ cái ở hàng đầu tiên và 3 trên hai hàng còn lại. Đối với mỗi hàng, chuỗi được xử lý một ký tự tại một thời điểm và ký tự được khớp với biểu thức chính quy cho mỗi phân đoạn để kiểm tra xem a! hoặc _ nên được hiển thị. Sử dụng biểu thức chính quy có nghĩa là đối với các ký tự không đặt phân đoạn, phải mất 0 bit trên mỗi phân đoạn để mã hóa có nên đặt nó hay không và đối với những ký tự trung bình chỉ mất ít hơn 8 bit vì phạm vi ký tự regex có thể đã sử dụng. Vì vậy, nó hoạt động với khoảng 3 hoặc 4 bit cho mỗi phân đoạn trên mỗi ký tự trong tập hợp, hoặc khoảng 21-24 bit cho mỗi ký tự.

Nó không xử lý gói hàng.


1
Này @samgak, rất vui khi thấy thêm tình yêu của Perl! Tôi nhận thấy một vài điều có thể giúp bạn cạo sạch một số byte và muốn chia sẻ chúng! Bạn có thể sử dụng một số biến số ma thuật của Perl để giúp giảm bớt điều này; ' 'có thể được thay thế bằng $"' 'có thể $"x3cắt bớt một vài thứ, \ns của bạn có thể là dòng mới theo nghĩa đen để loại bỏ một vài thứ nữa. Lối ra sớm của bạn cũng có thể được rút ngắn, sử dụng die, vì vậy nó if(/[kmvwx]/i){print" -\n"x3;exit}sẽ trở thành die" - "x3if(/[kmvwx]/i). Với một chút mờ nhạt hơn, bạn có thể sắp xếp lại vòng lặp để tránh các dấu ngoặc và bạn không cần $zphải tiết kiệm thêm một chút!
Dom Hastings

1
Tôi hy vọng bạn không bị xúc phạm, nhưng tôi đã xem xét giảm hơn nữa, gist.github.com/dom111/e651b5de8c7e7fc9a6cf . Xuống tới 323!
Dom Hastings

@DomHastings không có hành vi phạm tội nào cả, cảm ơn vì những mẹo chơi golf tuyệt vời! Tôi đã sử dụng càng nhiều càng tốt trong câu trả lời đã được chỉnh sửa của mình, tôi đã thay đổi để sử dụng mã hóa bitwise thay vì regex cho các mẫu phân đoạn. Thật không may, $ z đã quay trở lại và tôi không thể tìm ra cách loại bỏ nó. Ngoài ra, $_=lc<>không hoạt động, vì sau đó mã không thể phân biệt chữ hoa và chữ thường CHIOU
samgak

1

Lisp thường gặp 488 420

(lambda(z)(dotimes(r 3)(map()(lambda(c)(do((i 0(+ 17 i))n)((or(and(> i 901)(setf n 146))(=(char-code c)(ldb(byte 8 9)(setf n(ldb(byte 17 i)#36RIL884OIVFXJY4DCQ0O8DPH8MOMR2DSLPP3O4ESYHS234A9HEQYSV8IBDBZI6Z3C3MCVR77OYD3QN5G6CX2UQWGL4UY5R9PKYI1JQ5Y6DC27MQQGUZSCGI8Q9JCYP9N1L4YYKRWM1ZNMSVTSB4792UUWV6Z3906VSP981WCCBMDNJ02)))))(loop for v from(* 3 r)for d across"!_!"do(format t"~:[ ~;~A~]"(logbitp v n)d)))))z)(terpri)))

Thí dụ

Với "abcdefg'hijklnopqrstuz", in:

 _           _  _  _  _           _           _  _     _        _ 
!_!!_  _  _!!_ !_ !   _ !_   !  ! _ !   _  _ !_!!_! _ !_ !_     _!
! !!_!!_ !_!!_ !  !_! _ ! !  !!_! _ !_ ! !!_!!    !!   _!!_ !_!!_ 

Nhận xét

Các ký tự và biểu diễn của chúng được mã hóa theo số này trong cơ sở 36:

IL884OIVFXJY4DCQ0O8DPH8MOMR2DSLPP3O4ESYHS234A9HEQYSV8IBDBZI6Z3C3MCVR77OYD3QN5G6CX2UQWGL4UY5R9PKYI1JQ5Y6DC27MQQGUZSCGI8Q9JCYP9N1L4YYKRWM1ZNMSVTSB4792UUWV6Z3906VSP981WCCBMDNJ02

Biểu diễn nhị phân của chữ số này được chia thành các nhóm 17 bit.

Ví dụ, nhóm 17 bit cuối cùng là 110000111101010, được phân tách ở đây thành hai phần:

  1. 110000, mã char của nhân vật 0
  2. 111101010, một mã hóa của bản vẽ, được trình bày tốt nhất như sau:

    010 (bits 0-2)         _ 
    101 (bits 3-5)   =>   ! !
    111 (bits 6-8)        !_!
    

    Các bit trong "cột" đầu tiên và cuối cùng là dành cho các !ký tự, các bit ở cột giữa cho _ký tự. Khi cần thiết, cả hai phiên bản chữ hoa và chữ thường của một ký tự được lưu trữ.

Hàm lặp ba lần trên chuỗi đầu vào, một lần cho mỗi dòng đầu ra, tìm kiếm một ký tự trùng khớp trong bảng (hoặc mặc định là 146, còn gọi là ba thanh) và in biểu diễn ở hàng hiện tại.


Cảm ơn bạn đã tham gia vào thử thách. Tôi nhận thấy rằng 'K' của bạn được hiển thị là 'L' trong đầu ra của bạn. Bạn có thể đã hiểu nhầm yêu cầu rằng ký tự không được hỗ trợ không thể được in cùng với ký tự hợp lệ khác. Ngoài ra, tôi thấy rằng bạn đã thêm 'nhân vật, đó là tốt đẹp; tuy nhiên, nó sẽ được hiển thị bên ngoài màn hình 7 đoạn có khả năng. Nếu bạn di chuyển !xuống 1 dòng, nó sẽ hoàn hảo.
một số người dùng

Tôi sẽ cập nhật 'nhân vật và chỉnh sửa câu hỏi choK vì thực tế, tôi đã đặt Ksai vị trí trong chuỗi đầu vào ("... jlKn ...") ;-) Bạn chỉ có thể thấy ba thanh (lỗi) sau khi cảm ơn vì đã chú ý đến nó
coredump

1

JavaScript (ES6), 380 352 324 byte

( Lưu ý: Mã sử ​​dụng ký hiệu dấu mũ, vì nó chứa một số ký tự không thể in được. Để lấy mã gốc, nhấp vào đây và chọn dữ liệu thô. Và không, hkhông phải là chương trình CJam .;)

d=s=>{a=' ',u=n=>r>>n&1?'!':a,v=n=>r>>n&1?'_':a,g='ABCDEFGHIJLNOPQRSTUYZabcdefghijlnopqrstuyz0123456789-? ÿ',h='{vUnWSuz(lTb}[;B7V|>O{vFnWSur lTbf[;B7Vd>O}(O/:7w)^??^BK^0^G',x=y=z='';for(i=0;i<s.length;x+=a+v(0)+a,y+=u(4)+v(1)+u(3),z+=u(6)+v(2)+u(5)){q=g.indexOf(s[i++]);if(q<0)return d`ÿ`;r=h.charCodeAt(q)}return x+`
${y}
`+z}

Được gọi là d("7-seg display")hoặc tương tự. Hoạt động trong Firefox 40, nhưng có thể không có trong các trình duyệt khác. Vì một số lý do, đoạn mã HTML / JS không lưu các bản không in được, nhưng bạn có thể sao chép-dán dữ liệu thô từ đây .

Ung dung:

( Lưu ý: ghđã được đệm bằng không gian để phù hợp với 8, -, ÿspacevới các giá trị Unicode tương ứng của họ.)

d = function (s) {
  t = function (n) { return Math.floor(n) % 2; };
  g = 'ABCDEFGHIJLNOPQRSTUYZabcdefghijlnopqrstuyz012345679? 8      -      ÿ      space ';
  h = '{vUnWSuz(lTb}[;B7V|>O{vFnWSur lTbf[;B7Vd>O}(O/:7w)?K \u007f \u0002 \u0007 \u0000';
  x = y = z = '';
  for(var i = 0; i < s.length; i++) {
    q = g.indexOf(s.charAt(i));
    if (q < 0)          // if g does not contain the character
      return d('ÿ');    // ÿ is equivalent to the error character, '\u0007'
    r = h.charCodeAt(q);
    x += ' ' + (r % 2 === 1 ? '_' : ' ') + ' ';
    y += (t(r / 16) === 1 ? '!' : ' ') + (t(r / 2) === 1 ? '_' : ' ') + (t(r / 8) === 1 ? '!' : ' ');
    z += (t(r / 64) === 1 ? '!' : ' ') + (t(r / 4) === 1 ? '_' : ' ') + (t(r / 32) === 1 ? '!' : ' ');
  }
  return x + '\n' + y + '\n' + z;
}

Giải trình:

Tôi ngay lập tức nhận thấy rằng 7 phân đoạn, được chuyển đổi thành 0/ 1bit, sẽ hoạt động tốt với 128 ký tự Unicode đầu tiên. Vấn đề với ý tưởng này là 1/4 trong số các ký tự này là các ký tự điều khiển không in được. Sử dụng chúng trong mã của tôi sẽ làm cho nó trông cực kỳ lộn xộn (hoặc cực kỳ thông minh; tôi chưa quyết định cái nào). Để giải quyết điều này trong khi giữ cho phần còn lại của mã đơn giản, tôi đã nảy ra ý tưởng này:

Ngoại trừ -, không gianlỗi , không có ký tự nào bị thiếu cả hai phân đoạn dọc thấp hơn. Vì vậy, để đảm bảo rằng tất cả những nhân vật đó ở giữa 0020007f, tôi chỉ cần ánh xạ 64 32 bit vào các phân đoạn này, như sau:

     1
    ---
16 |   | 8
  2 ---
64 |   | 32
    ---
     4

Số của 5 phân khúc khác không quá quan trọng; chúng có thể được sắp xếp theo bất kỳ cách nào khác và vẫn có tất cả các ký tự giống nhau "trong giới hạn".

Ví dụ, đây là phiên bản được mã hóa của A :

     1
    ---
16 |   | 8
  2 ---
64 |   | 32

Dec: 64 + 32 + 16 + 8 + 2 + 1 = 123
Hex: 40 + 20 + 10 + 8 + 2 + 1 = 7B = u+007B = {

Sau đó tôi nhồi phiên bản được mã hóa của mỗi ký tự 7-seg vào h. Tuy nhiên, 8dẫn đến 007f( mã điều khiển xóa ; không đổi cho dù các phân đoạn được sắp xếp như thế nào), không gian dẫn đến 0000( mã null ; cũng là hằng số), -dẫn đến 0002và dẫn đến lỗi0007 . Tôi copy-dán các byte liệu vào đúng vị trí cho 8, -lỗi ; không gian dễ dàng đạt được với \0.

Sau tất cả mã hóa này, tất cả những gì tôi phải làm là sử dụng nó để giải mã chuỗi và xuất ra nó ở định dạng có thể đọc được 7 chữ. Tôi đã sử dụng một vòng lặp for và ba biến ( x, yz, mỗi biến tương ứng với một dòng đầu ra) để đi qua từng ký tự trong chuỗi và thêm 7-seg của nó tương đương với đầu ra. Tôi đã chọn ÿcho ký tự lỗi vì AFAIK, nó không có trên bất kỳ bàn phím nào và đó là ký tự cuối cùng trong u+0000-u+00ffphạm vi. Có lẽ tôi có thể dí dỏm và được chọn Ξ(chữ Hy Lạp xi) thay vì ....;)

Chỉnh sửa 1: lưu một loạt các không gian bằng cách tạo ra mini-chức năng để xác định xem !, _hoặc là cần thiết.

Chỉnh sửa 2: Đã tiết kiệm được nhiều dung lượng hơn bằng cách sử dụng các mẹo tôi đã học được kể từ lần cuối tôi truy cập bài đăng này.

Như thường lệ, các đề xuất được đánh giá rất cao!

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.