Wyświetlaj słowa przy użyciu wyświetlacza 7-segmentowego

13

Moim pierwszym programem do układania puzzli i gry w golfa jest Seven-Slash Display . Oto moje pierwsze wyzwanie, również oparte na 7-segmentowym wyświetlaczu.

Często zastanawiam się, oprócz cyfr, jakie litery mogę wyświetlić za pomocą prostego 7-segmentowego wyświetlacza. Okazuje się, że można wyświetlić wiele liter. W rzeczywistości wszystkie litery oprócz K, M, V, W, X można wyświetlić za pomocą pojedynczego wyświetlacza 7-segmentowego. Wynika to z faktu, że możesz wyświetlać małe lub duże litery. na przykład

„abcdef” może być wyświetlany jako

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

Zauważ, że każdy znak to macierz 3x3 złożona z !i _.

Oczywiście 7-segmentowy wyświetlacz może służyć do wyświetlania liczb i symboli:

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

Niektóre litery mogą mieć zarówno duże, jak i małe litery:

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

Oto pełny zestaw znaków:

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

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

Zwróć uwagę, że istnieją białe spacje ( ), myślnik ( -) i znak zapytania ( ?). Pismo I, Oi Zsą takie same jak numery 1, 0i 2odpowiednio.

W tym wyzwaniu napiszesz program lub funkcję do wyświetlania łańcucha przy użyciu powyższego formatu wyświetlania 7-segmentowego.

Zasady

  1. Możesz napisać program lub funkcję

  2. To jest code-golf, wygrywa najkrótszy kod w bajtach

  3. Twój program lub funkcja powinna pobierać dane wejściowe ze STDIN lub jako parametr. I wysyła ciąg do STDOUT lub jako ciąg w 3 liniach bez spacji wiodących, ale zakończony znakiem nowej linii. CHIOUPrawidłowo obchodź się z górną / dolną skrzynką .

  4. Opcjonalnie możesz wydrukować końcowe białe spacje

  5. Musisz postępować zgodnie z powyższym formatem. Użycie podkreślnika _i wykrzyknika !do utworzenia wyświetlacza 7-segmentowego.

  6. Musisz obsługiwać białe znaki ( ) , myślnik ( -) i znak zapytania ( ?)

  7. Jeśli ciąg zawiera nieobsługiwany znak (k, m, v, w, x), wyświetlany jest znak pojedynczego błędu (linia 3 horyzontu, patrz przykład). Oprócz 5 nieobsługiwanych znaków można założyć, że dane wejściowe składają się tylko z obsługiwanego zestawu znaków.

  8. Zdecydowałem się nie mieć litery na małe litery L ( l) ze względu na zamieszanie, ale jeśli masz taką skłonność, możesz wyświetlić ją jak 1po prawej lub lewej stronie.

Przykłady

$./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"
 _
 _
 _
jakiś użytkownik
źródło
Tak, możesz założyć, że nie ma nieobsługiwanych symboli. Moim zamiarem jest upewnienie się, że ciągi zawierające k, m, v, w, xnie będą się wyświetlać.
jakiś użytkownik
Myślę, że pomyliłeś zwrot karetki (CR, \r) z przesunięciem linii (LF, \n). * nix używa LF, a Windows używa CRLF. Tylko niektóre starsze systemy same używają CR. Więcej informacji tutaj: en.wikipedia.org/wiki/Newline
Winny
Twoja postać „8” wydaje się mieć pasek „|” zamiast wykrzyknika „!”. Czy to jest zamierzone?
coredump
1
@ Winny, oczywiście masz rację. Byłem zbyt leniwy, żeby to sprawdzić, kiedy to napisałem.
jakiś użytkownik

Odpowiedzi:

7

CJam, 123 114 112 110 bajtów

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

W powyższym użyto notacji karetką, ponieważ kod zawiera znaki niedrukowalne. Jednym z nich jest bajt zerowy ( ^@), co oznacza, że ​​ten kod można wykonać tylko z wiersza poleceń.

Kosztem tylko dwóch kolejnych bajtów (w sumie 112 ) możemy to naprawić.

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

Tym razem wszystkie znaki można wydrukować. Wypróbuj online w interpretatorze CJam .

Przykładowy przebieg

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

Pomysł (wersja do wydruku)

Każda postać może być pokazana na 9-segmentowym wyświetlaczu

!_!
!_!
!_!

przez zastąpienie niektórych znaków postaci spacjami.

Możemy zamienić określony znak w liczbę całkowitą, zastępując każdy pokazany segment w naturalnej kolejności odczytu wartością 1 , a każdy nie pokazany segment cyfrą 0 i biorąc pod uwagę wynikowe liczby binarne.

Pierwszy i trzeci segment nigdy nie są pokazywane, więc spowoduje to utworzenie liczb całkowitych z przedziałów [0,64) i [128 192) .

Możemy zakodować każdą z tych liczb całkowitych jako pojedynczy bajt, ale połowa z nich spowoduje powstanie znaków niedrukowalnych. Tak więc, dodamy 64 do każdej liczby całkowitej przed odlewania do znaku, który pilnuje punkty kodowe są w zakresach [64,128) i [192,256) .

Jedynym niedrukowalnym znakiem w tych dwóch zakresach jest DEL (punkt kodowy 127), co odpowiada następującej, niepotrzebnej konfiguracji wyświetlania:

!_!
!_!

Możemy odwrócić powyższe kodowanie poprzez dodanie 448 == 512 - 64 do każdego punktu kodowego, konwersję do podstawy 2 i usunięcie pierwszej cyfry binarnej.

Wszystko, co pozostało, aby znaleźć skuteczny sposób powiązania tych zakodowanych segmenetów z odpowiadającymi im znakami ASCII.

Jeśli zamapujemy znaki " -chiou"na znaki ";=KMVWX"i przekonwertujemy cały tekst na wielkie litery, możemy po prostu zapisać kodowanie wszystkich znaków między 0(punkt kodowy 48) a Z(punkt kodowy 90), co daje zakres 43.

Indeksowanie macierzy jest modułowe w CJam, więc jeśli Ajest łańcuchem o długości 43 A86=, A43=i A0=wszystkie dają takie same wyniki. Znak o punkcie kodowym 86 jest V, więc po prostu przechowujemy zakodowane segmenty V - Z i 0 - U , w kolejności.

W rzeczywistym kodzie wybieramy znak at jako znak „złej formy”, zastępujemy całe wejście ciągiem, "@"jeśli zawiera on niedozwoloną literę, i odwracamy kroki od góry.

Kod (wersja do wydruku)

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.
Dennis
źródło
2

Perl, 475 469 424 390 280 272 bajtów

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

wieloliniowy z komentarzami:

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

Wzory bitów kodujące segmenty są przechowywane w ciągu (unikając 3 znaków niedrukowalnych za pomocą \xi wykorzystując \0spację) i są odwzorowywane na znaki wejściowe za pomocą operatora transliteracji Perl.

W przypadku 5 z 7 segmentów bitowe jest używane wraz z operatorem trójskładnikowym w celu wyprowadzenia spacji lub znaku segmentu. W dolnych lewych dwóch segmentach (zakodowanych przez 2 i 4 w zestawie bitów) do zapisania 2 bajtów służy wyszukiwanie podciągu w ciągu 8 znaków.

Dzięki Dom Hastings za jego wskazówki dotyczące gry w Perla.

Stara wersja (używanie wyrażeń regularnych do kodowania wzorców), 390 bajtów:

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

wieloliniowy z komentarzami:

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

Łańcuch jest wczytywany i sprawdzany pod kątem niepoprawnych znaków za pomocą wyrażenia regularnego, kończąc, jeśli jakieś zostaną znalezione. Następnie niedozwolone znaki są zastępowane dozwolonymi małymi znakami, a cały ciąg znaków jest konwertowany na małe litery.

Wiersze są generowane pojedynczo, z 1 segmentem na literę w pierwszym rzędzie i 3 w pozostałych dwóch. Dla każdego wiersza ciąg jest przetwarzany po jednym znaku na raz, a znak jest dopasowywany do wyrażenia regularnego dla każdego segmentu, aby sprawdzić, czy! lub _ powinno zostać wyświetlone. Użycie wyrażenia regularnego oznacza, że ​​dla znaków, w których segment nie jest ustawiony, potrzeba 0 bitów na segment na znak, aby zakodować, czy należy go ustawić, a dla znaków, w których jest ustawiony, zajmuje to nieco mniej niż 8 bitów, ponieważ zakresy wyrażeń regularnych mogą być używany. Działa więc do około 3 lub 4 bitów na segment na znak w zestawie lub około 21-24 bitów na znak.

Nie obsługuje zawijania linii.

samgak
źródło
1
Hej @samgak, cieszę się, że widzę więcej miłości Perla! Zauważyłem kilka rzeczy, które mogą pomóc ci ogolić niektóre bajty i chciałem się nimi podzielić! Możesz użyć niektórych magicznych zmiennych Perla, aby to zmniejszyć; ' 'może być zastąpiony przez $"i ' 'może być tym, $"x3który przycina kilka, twoje \nmogą być dosłownie nowymi liniami, aby pozbyć się kilku innych. Twoje wcześniejsze wyjście może być również zwarte za pomocą kości, dzięki czemu if(/[kmvwx]/i){print" -\n"x3;exit}staje się die" - "x3if(/[kmvwx]/i). Przy odrobinie kruszenia możesz ponownie ustawić pętlę, aby uniknąć nawiasów i nie musisz $zoszczędzać więcej!
Dom Hastings
1
Mam nadzieję, że nie jesteś obrażony, ale zastanawiałem się nad dalszym zmniejszeniem, gist.github.com/dom111/e651b5de8c7e7fc9a6cf . Do 323!
Dom Hastings
@DomHastings wcale się nie obraził, dzięki za wspaniałe wskazówki golfowe! Użyłem ich jak najwięcej w edytowanej odpowiedzi, którą zmieniłem, aby używać kodowania bitowego zamiast wyrażeń regularnych dla wzorców segmentów. Niestety $ z powrócił i nie mogę się dowiedzieć, jak się go pozbyć. Również $_=lc<>nie działa, ponieważ wtedy kod nie może rozróżniać wielkich i małych liter CHIOU
samgak
1

Common Lisp, 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)))

Przykład

Z "abcdefg'hijklnopqrstuz"drukuje:

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

Uwagi

Znaki i ich reprezentacje są zakodowane w tym numerze w bazie 36:

IL884OIVFXJY4DCQ0O8DPH8MOMR2DSLPP3O4ESYHS234A9HEQYSV8IBDBZI6Z3C3MCVR77OYD3QN5G6CX2UQWGL4UY5R9PKYI1JQ5Y6DC27MQQGUZSCGI8Q9JCYP9N1L4YYKRWM1ZNMSVTSB4792UUWV6Z3906VSP981WCCBMDNJ02

Binarna reprezentacja tej cyfry jest podzielona na grupy 17 bitów.

Na przykład ostatnia grupa 17 bitów 110000111101010, która jest tutaj podzielona na dwie części:

  1. 110000, kod znaków 0
  2. 111101010, kodowanie rysunku, najlepiej przedstawione w następujący sposób:

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

    Bity w pierwszej i ostatniej „kolumnie” dotyczą !znaków, te w środkowej kolumnie dla _znaku. W razie potrzeby przechowywane są zarówno duże, jak i małe wersje znaku.

Funkcja iteruje trzy razy po ciągu wejściowym, po jednym dla każdego wiersza wyniku, wyszukuje pasujący znak w tabeli (lub domyślnie 146, czyli trzy paski) i drukuje reprezentację w bieżącym wierszu.

rdzeń rdzeniowy
źródło
Dziękujemy za udział w konkursie. Zauważyłem, że twoje „K” jest wyświetlane jako „L” w twoim wyniku. Być może źle zrozumiałeś, że nieobsługiwana postać nie może być drukowana razem z inną prawidłową postacią. Widzę też, że dodałeś 'postać, co jest miłe; będzie jednak wyświetlany poza 7-segmentowym wyświetlaczem. Jeśli przesuniesz w !dół o 1 linię, byłoby idealnie.
jakiś użytkownik
Zaktualizuję 'znak i edytuję pytanie, Kponieważ w rzeczywistości Kwstawiłem niewłaściwe miejsce w ciągu wejściowym („... jlKn ...”) ;-) Widać tylko trzy paski (błąd) po prostu po L. Dziękuję za zauważenie tego.
coredump
1

JavaScript (ES6), 380 352 324 bajty

( Uwaga: Kod używa notacji karetki, ponieważ zawiera pewne znaki niedrukowalne. Aby uzyskać oryginalny kod, kliknij tutaj i wybierz nieprzetworzone dane. I nie, hto nie jest program 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}

Nazywany jako d("7-seg display")lub podobny. Działa w przeglądarce Firefox 40, ale może nie działać w innych przeglądarkach. Z jakiegoś powodu fragment kodu HTML / JS nie zapisuje materiałów niedrukowalnych, ale możesz skopiować i wkleić surowe dane z tego miejsca .

Nie golfowany:

( Uwaga: g i hsą spacjami dopasować 8, -, ÿi spacez ich odpowiednimi wartościami unikodowe).

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

Wyjaśnienie:

Natychmiast zauważyłem, że 7 segmentów, przekonwertowanych na 0/ 1bity, pasuje do pierwszych 128 znaków Unicode. Problem z tym pomysłem polega na tym, że 1/4 z tych znaków to niedrukowalne znaki kontrolne. Wykorzystanie ich w moim kodzie sprawiłoby, że wyglądałoby to niesamowicie niechlujnie (lub niesamowicie inteligentnie; nie zdecydowałem, który z nich). Aby rozwiązać ten problem, pozostawiając resztę kodu prostą, wpadłem na ten pomysł:

Z wyjątkiem -, przestrzeni i błędów , żaden z bohaterów brakowało zarówno z niższych segmentów pionowych. Aby upewnić się, że wszystkie te znaki pozostały pomiędzy 0020i 007f, po prostu zamapowałem 64 i 32 bity na te segmenty, tak:

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

Liczby pozostałych 5 segmentów nie są zbyt ważne; można je ułożyć w inny sposób i nadal mieć wszystkie te same znaki „w granicach”.

Jako przykład, oto zakodowana wersja 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 = {

Następnie wrzuciłem zakodowaną wersję każdego 7-segmentowego znaku h. Jednak 8spowodowało 007f(do kasowania kodu sterującego; stała bez względu na to, w jaki sposób segmenty są ułożone), przestrzeń spowodowała 0000(z zerowym kodem; również stała), -spowodowały 0002, i błąd spowodowała 0007. Kopiować, wklejać nieprzetworzonych bajtów w odpowiedniej pozycji za 8, -i błąd ; łatwo było uzyskać przestrzeń\0 .

Po tym całym kodowaniu musiałem tylko użyć go do zdekodowania łańcucha i wyprowadzenia go w formacie czytelnym dla 7 segmentów. Użyłem pętli for i trzech zmiennych ( x, yi zkażda odpowiadająca linii wyjściowej), aby przejść przez każdy znak w ciągu i dodać jego 7-seg ekwiwalent do wyniku. Wybrałem ÿdo błędu charakteru ponieważ AFAIK, to nie na każdej klawiaturze, a to ostatnia postać w u+0000-u+00ffzasięgu. Być może Ξzamiast tego mógłbym być dowcipny i wybrany (grecka litera xi) ....;)

Edit 1: Saved grono przestrzeni tworząc mini-funkcje, aby określić, czy !, _czy jest potrzebne.

Edycja 2: Zaoszczędziłem sporo miejsca dzięki sztuczkom, których nauczyłem się od czasu, gdy ostatnio odwiedziłem ten post.

Jak zwykle sugestie są bardzo mile widziane!

ETHprodukcje
źródło