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

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.

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.


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.


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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.