7 세그먼트 디스플레이를 사용하여 단어 표시


13

내 최초의 프로그래밍 퍼즐 및 코드 골프는 Seven-Slash Display 입니다. 여기 7 세그먼트 디스플레이를 기반으로 한 첫 번째 도전 과제가 있습니다.

나는 종종 숫자 외에도 간단한 7 세그먼트 디스플레이를 사용하여 어떤 종류의 문자를 표시 할 수 있는지 생각합니다. 많은 글자를 표시 할 수 있습니다. 실제로, 문자 K, M, V, W, X를 제외한 모든 문자는 단일 7 세그먼트 디스플레이를 사용하여 표시 할 수 있습니다. 소문자 또는 대문자를 표시 할 수 있기 때문입니다. 예 :

"abcdef"는 다음과 같이 표시 될 수 있습니다

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

참고 각 문자로 구성된 3 × 3 행렬이라고 !하고 _.

물론, 7- 세그먼트 디스플레이는 숫자와 기호를 표시하는 데 사용될 수 있습니다 :

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

일부 문자는 대문자와 소문자를 모두 사용할 수 있습니다.

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

전체 문자 세트는 다음과 같습니다.

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

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

공백 ( ), 대시 ( -) 및 물음표 ( ?)가 있음에주의하십시오. 편지 I, O그리고 Z숫자와 동일합니다 1, 0그리고 2각각.

이 과제에서는 위의 7 세그먼트 표시 형식을 사용하여 문자열을 표시하는 프로그램이나 함수를 작성합니다.

규칙

  1. 프로그램이나 함수를 작성할 수 있습니다

  2. 이것은 바이트 단위의 가장 짧은 코드 인 코드 골프입니다.

  3. 프로그램 또는 기능은 STDIN 또는 매개 변수로 입력해야합니다. 그리고 문자열을 STDOUT에 출력하거나 선행 공백없이 3 줄의 문자열로 출력하지만 줄 바꿈으로 종료합니다. 대소 문자를 CHIOU올바르게 처리하십시오.

  4. 선택적으로 후행 공백을 인쇄 할 수 있습니다

  5. 위 형식을 따라야합니다. 밑줄 _과 느낌표를 사용 !하여 7 세그먼트 디스플레이를 구성하십시오.

  6. 공백 ( ), 대시 ( -) 및 물음표 ( ?)를 지원해야합니다.

  7. 문자열에 지원되지 않는 문자 (k, m, v, w, x)가 포함 된 경우 단일 오류 문자 (3 수평선, 예 참조)가 표시됩니다. 지원되지 않는 5 개의 문자 외에도 입력이 지원되는 문자 세트로만 구성된 것으로 가정 할 수 있습니다.

  8. l혼란으로 인해 소문자 L ( )로 된 편지를 선택하지 않았지만 기울어 진 1경우 오른쪽이나 왼쪽에 표시 할 수 있습니다 .

$./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"
 _
 _
 _

예, 지원되지 않는 기호가 없다고 가정 할 수 있습니다. 내 의도는 포함 된 문자열 k, m, v, w, x이 표시되지 않도록 하는 것입니다.
일부 사용자


캐리지 리턴 (CR, \r)과 줄 바꿈 (LF, \n) 을 혼동했다고 생각합니다 . * nix는 LF를 사용하고 Windows는 CRLF를 사용합니다. 특정 레거시 시스템 만 CR을 사용합니다. 자세한 정보는 여기 : en.wikipedia.org/wiki/Newline
Winny

"8"캐릭터에 막대 "|"가있는 것 같습니다 느낌표 "!"대신. 의도 된 것입니까?
coredump

1
@ 위니, 당신은 물론입니다. 글을 쓸 때 너무 게으르다.
일부 사용자

답변:


7

CJam, 123 114 112 110 바이트

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

코드에는 인쇄 할 수없는 문자가 포함되어 있으므로 위의 캐럿 표기법을 사용합니다. 그중 하나가 널 바이트 ( ^@) 이며이 코드는 명령 행에서만 실행할 수 있습니다.

단 2 바이트 만 추가하면 (총 112 )이 문제를 해결할 수 있습니다.

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

이번에는 모든 문자를 인쇄 할 수 있습니다. CJam 통역사 에서 온라인으로 사용해보십시오 .

예제 실행

$ 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
 _ 
 _ 
 _

아이디어 (인쇄용 버전)

각 문자는 9- 세그먼트 디스플레이에 표시 될 수 있습니다

!_!
!_!
!_!

일부 문자 문자를 공백으로 바꿉니다.

자연스럽게 읽은 순서대로 표시된 각 세그먼트를 1 로 바꾸고 각각의 표시 되지 않은 세그먼트를 0 으로 바꾸고 결과 이진수를 고려하여 특정 문자를 정수로 바꿀 수 있습니다.

첫 번째와 세 번째 세그먼트는 표시되지 않으므로 [0,64)[128,192) 범위의 정수가 생성됩니다 .

이러한 정수 각각을 단일 바이트로 인코딩 할 수 있지만 그 중 절반은 인쇄 할 수없는 문자가됩니다. 따라서 문자로 캐스트하기 전에 각 정수 에 64더하여 코드 포인트가 [64,128)[192,256) 범위에 있는지 확인합니다 .

이 두 범위에서 인쇄 할 수없는 유일한 문자는 DEL (코드 포인트 127)이며 다음과 같은 무의미한 디스플레이 구성에 해당합니다.

!_!
!_!

각 코드 포인트에 448 == 512-64 를 추가 하고 밑이 2로 변환되고 첫 번째 이진수를 제거하여 위의 인코딩을 되돌릴 수 있습니다 .

이 인코딩 된 세그먼트를 해당 ASCII 문자와 연결하는 효율적인 방법을 찾기 위해 남겨진 모든 것입니다.

우리의 문자지도 경우 " -chiou"의 문자를 ";=KMVWX"대문자로 전체 입력 및 변환, 우리는 단순히 사이의 모든 문자를 인코딩 저장할 수 있습니다 0(코드 포인트 48)와 Z, (코드 포인트 90) (43)의 범위를 제공합니다.

배열 인덱싱 그렇다면 CJam에서 모듈러 A길이 43의 캐릭터이며 A86=, A43=그리고 A0=모두 동일한 결과를 얻었다. 코드 포인트 86의 문자는 V이므로 V-Z0-U 의 인코딩 된 세그먼트 를 순서대로 저장합니다.

실제 코드에서 at 기호를 "잘못된 형식"문자로 선택하고 "@"금지 된 문자가 포함 된 경우 전체 입력을 문자열로 바꾸고 위의 단계를 반대로하십시오.

코드 (인쇄 버전)

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

475 469 424 390 280 272 바이트

$_=<>;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
"

주석이있는 여러 줄 :

$_=<>;   # 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
"

세그먼트를 인코딩하는 비트 패턴은 문자열로 저장되고 ( 공간을 사용 \x하고 사용 하는 3 개의 인쇄 할 수없는 문자를 이스케이프 \0) Perl 음역 연산자를 사용하여 입력 문자에 매핑됩니다.

7 개의 세그먼트 중 5 개는 비트 단위이며 삼항 연산자와 함께 사용되어 공백 또는 세그먼트 문자를 출력합니다. 왼쪽 하단의 두 세그먼트 (비트 세트에서 2와 4로 인코딩 됨)의 경우 8 바이트 문자열로 하위 문자열 조회를 사용하여 2 바이트를 저장합니다.

Perl 골프 팁을 준 Dom Hastings에게 감사합니다.

이전 버전 (정규를 사용하여 패턴 인코딩), 390 바이트 :

$_=<>;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"

주석이있는 여러 줄 :

$_=<>;   # 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

문자열을 읽고 정규식을 사용하여 유효하지 않은 문자가 있는지 확인하고 발견되면 종료합니다. 그런 다음 허용 된 소문자가 유효하지 않은 문자로 대체되고 전체 문자열이 소문자로 변환됩니다.

행은 한 번에 하나씩 생성되며, 첫 번째 행에는 문자 당 1 개의 세그먼트가 있고 다른 두 개에는 3 개가 있습니다. 각 행에 대해 문자열은 한 번에 한 문자 씩 처리되고 문자는 각 세그먼트의 정규식과 일치하여! 또는 _가 표시되어야합니다. 정규식을 사용한다는 것은 세그먼트가 설정되지 않은 문자의 경우 설정 여부를 인코딩하기 위해 문자 당 세그먼트 당 0 비트가 필요하고 정규식 문자 범위가 익숙한. 따라서 세트의 문자 당 세그먼트 당 약 3 또는 4 비트 또는 문자 당 약 21-24 비트로 작동합니다.

줄 바꿈을 처리하지 않습니다.


1
@samgak 님, Perl의 더 많은 사랑을 보게되어 기쁩니다! 몇 바이트를 줄이고 공유하는 데 도움이되는 몇 가지 사항을 발견했습니다! Perl의 마법 변수를 사용하여이를 줄일 수 있습니다. ' '로 대체 할 수 $"' '수 있습니다 $"x3약간 떨어져 트림하는, 당신 \n의 몇 가지 더 제거하는 문자 줄 바꿈 할 수 있습니다. 즉, 귀하의 조기 종료는 다이를 사용하여도 단락 될 수 if(/[kmvwx]/i){print" -\n"x3;exit}됩니다 die" - "x3if(/[kmvwx]/i). 약간 더 퍼지하기 때문에 대괄호를 피하기 위해 루프를 다시 정렬 할 수 있으며 $z더 이상 저장할 필요가 없습니다 !
Dom Hastings

1
나는 당신이 기분 나쁘지 않기를 바랍니다 . 하지만 더 많이 줄이는 것을 보았습니다 . gist.github.com/dom111/e651b5de8c7e7fc9a6cf . 323까지!
Dom Hastings

@DomHastings 훌륭한 골프 팁을 가져 주셔서 감사합니다! 편집 된 답변에서 최대한 많이 사용했습니다. 세그먼트 패턴에 정규 표현식 대신 비트 인코딩을 사용하도록 변경했습니다. 불행히도 $ z가 돌아 왔고 그것을 제거하는 방법을 알 수 없습니다. 또한 $_=lc<>코드가 대소 문자 CHIOU를 구별 할 수 없기 때문에 작동하지 않습니다.
samgak

1

일반 리스프, 488 416

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

로 다음 "abcdefg'hijklnopqrstuz"을 인쇄합니다.

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

비고

문자와 그 표현은 기본 36에서이 숫자로 인코딩됩니다.

IL884OIVFXJY4DCQ0O8DPH8MOMR2DSLPP3O4ESYHS234A9HEQYSV8IBDBZI6Z3C3MCVR77OYD3QN5G6CX2UQWGL4UY5R9PKYI1JQ5Y6DC27MQQGUZSCGI8Q9JCYP9N1L4YYKRWM1ZNMSVTSB4792UUWV6Z3906VSP981WCCBMDNJ02

이 숫자의 이진 표현은 17 비트 그룹으로 나뉩니다.

예를 들어 17 비트의 마지막 그룹은입니다. 110000111101010여기서 두 부분으로 분해됩니다.

  1. 110000문자 코드 0
  2. 111101010, 도면의 인코딩은 다음과 같이 가장 잘 나타납니다.

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

    첫 번째 및 마지막 "열"의 비트는 !문자 용이며 중간 열의 _문자 는 문자 용입니다. 필요한 경우, 대문자와 소문자 버전의 문자가 모두 저장됩니다.

이 함수는 입력 문자열에 대해 각 출력 행마다 하나씩 세 번 반복되며 테이블에서 일치하는 문자를 검색하거나 기본값은 146 (일명 3 개의 막대)으로 표시되며 현재 행에서 표현을 인쇄합니다.


도전에 참여해 주셔서 감사합니다. 출력에서 'K'가 'L'로 표시됩니다. 지원되지 않는 문자를 다른 유효한 문자와 함께 인쇄 할 수 없다는 요구 사항을 이해하지 못했을 수 있습니다. 또한 '캐릭터 를 추가 한 것이 좋습니다. 그러나 7- 세그먼트 디스플레이가 할 수있는 것의 외부에 표시 될 것입니다. !한 줄 아래로 이동하면 완벽합니다.
일부 사용자

'문자를 업데이트하고 질문을 편집하겠습니다 K. 실제로 K입력 문자열 ( "... jlKn ...") ;-)에 잘못된 위치를 입력했기 때문에 트리플 바 (오류) 만 표시됩니다. L. 후에 그것을 알아 주셔서 감사합니다.
coredump

1

자바 스크립트 (ES6) 380 352 324 바이트

( 참고 : 코드에는 인쇄 할 수없는 문자가 포함되어 있으므로 캐럿 표기법을 사용합니다. 원본 코드를 얻으려면 여기를 클릭 하고 원시 데이터를 선택하십시오. 아니요, hCJam 프로그램은 아닙니다.;)

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}

d("7-seg display")또는 이와 유사하게 부름 . Firefox 40에서 작동하지만 다른 브라우저에서는 작동하지 않을 수 있습니다. 어떤 이유로 HTML / JS 스 니펫은 인쇄 할 수없는 파일을 저장하지 않지만 여기서 원시 데이터를 복사하여 붙여 넣을 수 있습니다 .

언 골프 드 :

( 참고 : gh일치 공란되고 8, -, ÿspace그들의 대응하는 유니 코드 값).

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;
}

설명:

나는 0/ 1비트로 변환 된 7 개의 세그먼트 가 처음 128 개의 유니 코드 문자와 잘 어울린다는 것을 즉시 알았습니다 . 이 아이디어의 문제점은 이러한 문자 중 1/4이 인쇄 불가능 제어 문자라는 것입니다. 내 코드에서 그것들을 사용하면 엄청나게 지저분 해 보일 것입니다 (또는 믿을 수 없을만큼 지능적입니다. 나는 어느 것을 결정하지 않았습니다). 나머지 코드를 단순하게 유지 하면서이 문제를 해결하기 위해이 아이디어를 생각해 냈습니다.

-, spaceerror를 제외하고 는 아래쪽 세로 세그먼트가 모두 누락 된 문자가 없습니다. 따라서 모든 문자가 0020와 사이에 유지되도록하기 위해 64 비트 와 32 비트를 이러한 세그먼트에 007f간단히 매핑했습니다 .

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

다른 5 개의 세그먼트 숫자는 그다지 중요하지 않습니다. 그것들은 다른 방식으로 배열 될 수 있으며 여전히 같은 문자 "in-bounds"를 가질 수 있습니다.

예를 들어 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 = {

그런 다음에 각 7 세그먼트 문자의 인코딩 된 버전을 채웠습니다 h. 그러나, 8결과 007f합니다 ( 삭제 , 불변 아무리 세그먼트가 배치되는 방식을 제어 코드) 공간 초래하지 0000합니다 ( ; 같은 일정한 코드) -의 결과 0002오류 결과 0007. 내가 올바른 위치로 원시 바이트를 붙여 넣은 사본을 8, -오류 ; 공간 은 쉽게 달성되었습니다 \0.

이 인코딩을 모두 마친 후에는 문자열을 디코딩하여 7 세그먼트 읽기 가능 형식으로 출력하기 만하면됩니다. I는 사용 을 위해 루프 (세 개의 변수 x, yz문자열의 각 문자를 통과하고 그 출력 -7- SEG 당량을 추가, 각 출력 라인에 대응). 나는 선택했다 ÿ에 대한 오류 AFAIK, 그것은 어떤 키보드에없는, 그리고 그것이 마지막 문자 때문에 문자 u+0000-u+00ff범위. 어쩌면 나는 재치 있고 선택 될 수 있었을 것입니다 Ξ(그리스 문자 xi) ....;)

편집 1 : 저장된 미니 기능을 만들어 공간의 무리 여부를 결정하기 위해 !, _또는 필요합니다.

편집 2 : 이 게시물을 마지막으로 방문한 후 배운 트릭을 사용하여 더 많은 공간을 절약했습니다.

평소와 같이 제안은 대단히 감사합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.