Tampilkan kata-kata menggunakan tampilan 7-segmen

13

Pertama saya pernah Pemrograman Puzzle & Kode Golf adalah Tujuh-Slash Tampilan . Inilah Tantangan pertama saya, juga berdasarkan tampilan 7-segmen.

Saya sering memikirkan, selain angka, huruf apa yang bisa saya tampilkan menggunakan layar 7 segmen sederhana. Ternyata banyak surat bisa ditampilkan. Bahkan, semua kecuali huruf K, M, V, W, X dapat ditampilkan menggunakan tampilan 7-segmen tunggal. Ini karena Anda dapat menampilkan huruf kecil atau huruf besar. misalnya

"abcdef" dapat ditampilkan sebagai

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

Perhatikan bahwa setiap karakter adalah matriks 3x3 yang terdiri dari !dan _.

Tentu saja, tampilan 7-segmen dapat digunakan untuk menampilkan angka dan simbol:

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

Beberapa huruf dapat memiliki huruf besar dan kecil:

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

Berikut ini karakter lengkapnya:

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

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

Perhatikan bahwa ada spasi putih ( ), tanda hubung ( -) dan tanda tanya ( ?). Hurufnya I, Odan Zsama dengan angka 1, 0dan 2masing - masing.

Dalam tantangan ini, Anda akan menulis program atau fungsi untuk menampilkan string menggunakan format tampilan 7-segmen di atas.

Aturan

  1. Anda dapat menulis suatu program atau fungsi

  2. Ini adalah kode-golf, kode terpendek dalam byte menang

  3. Program atau fungsi Anda harus mengambil input dari STDIN atau sebagai parameter. Dan mengeluarkan string ke STDOUT atau sebagai string dalam 3 baris tanpa spasi sebelum diakhiri dengan baris baru. Tangani huruf besar / kecil CHIOUdengan benar.

  4. Anda dapat mencetak spasi spasi tambahan

  5. Anda harus mengikuti format di atas. Menggunakan tanda garis bawah _dan tanda seru !untuk membentuk tampilan 7-segmen Anda.

  6. Anda harus mendukung spasi putih ( ), tanda hubung ( -) dan tanda tanya ( ?)

  7. Jika string berisi karakter yang tidak didukung (k, m, v, w, x), karakter kesalahan tunggal (3 garis horizon, lihat contoh) ditampilkan. Selain 5 karakter yang tidak didukung, Anda dapat menganggap input terdiri dari hanya set karakter yang didukung.

  8. Saya memilih untuk tidak memiliki huruf untuk huruf kecil L ( l) karena kebingungan tetapi jika Anda cenderung, Anda dapat menampilkannya seperti 1kanan atau kiri.

Contohnya

$./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"
 _
 _
 _
beberapa pengguna
sumber
Ya, Anda dapat menganggap tidak ada simbol yang tidak didukung. Tujuan saya adalah memastikan string yang berisi k, m, v, w, xtidak ditampilkan.
beberapa pengguna
Saya pikir Anda bingung carriage return (CR, \r) dengan umpan baris (LF, \n). * nix menggunakan LF dan Windows menggunakan CRLF. Hanya sistem warisan tertentu yang menggunakan CR dengan sendirinya. Informasi lebih lanjut di sini: en.wikipedia.org/wiki/Newline
Winny
Karakter "8" Anda tampaknya memiliki bilah "|" bukannya tanda seru "!". Apakah ini dimaksudkan?
coredump
1
@ Winny, tentu saja kamu benar. Saya terlalu malas untuk mencarinya ketika saya menulisnya.
beberapa pengguna

Jawaban:

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*

Di atas menggunakan notasi tanda kuret, karena kode mengandung karakter yang tidak patut dicetak. Salah satunya adalah byte nol ( ^@), yang berarti bahwa kode ini hanya dapat dieksekusi dari baris perintah.

Dengan biaya hanya dua byte lagi (dengan total 112 ), kita dapat memperbaikinya.

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

Kali ini, semua karakter dapat dicetak. Cobalah online di penerjemah CJam .

Contoh dijalankan

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

Ide (versi yang dapat dicetak)

Setiap karakter dapat ditampilkan pada layar 9-segmen

!_!
!_!
!_!

dengan mengganti beberapa karakter karakternya dengan spasi.

Kita dapat mengubah karakter tertentu menjadi bilangan bulat dengan mengganti setiap segmen yang ditampilkan, dalam urutan bacaan alami, dengan 1 , masing-masing segmen tidak ditampilkan dengan 0 dan mempertimbangkan hasil angka biner.

Segmen pertama dan ketiga tidak pernah ditampilkan, jadi ini akan menghasilkan bilangan bulat dalam kisaran [0,64) dan [128.192) .

Kita dapat menyandikan masing-masing bilangan bulat ini sebagai satu byte, tetapi setengahnya akan menghasilkan karakter yang tidak dapat dicetak. Jadi, kami menambahkan 64 ke setiap bilangan bulat sebelum memberikan karakter, yang memastikan bahwa titik kode berada dalam rentang [64.128) dan [192.256) .

Satu-satunya karakter yang tidak dapat dicetak dalam dua rentang ini adalah DEL (titik kode 127), yang terkait dengan konfigurasi tampilan yang tidak diinginkan berikut ini:

!_!
!_!

Kita dapat membalikkan pengkodean di atas dengan menambahkan 448 == 512 - 64 ke setiap titik kode, mengkonversi ke basis 2 dan menghapus digit biner pertama.

Semua yang tersisa untuk menemukan cara yang efisien untuk mengaitkan segmen yang disandikan ini dengan karakter ASCII yang sesuai.

Jika kita memetakan karakter " -chiou"ke karakter ";=KMVWX"dan mengonversi seluruh input menjadi huruf besar, kita bisa menyimpan penyandian untuk semua karakter antara 0(titik kode 48) dan Z(titik kode 90), memberikan kisaran 43.

Pengindeksan array adalah modular dalam CJam, jadi jika Aadalah string dengan panjang 43 A86=,, A43=dan A0=semua menghasilkan hasil yang sama. Karakter dengan titik kode 86 adalah V, jadi kami hanya menyimpan segmen yang dikodekan dari V - Z dan 0 - U , secara berurutan.

Dalam kode aktual, kami memilih tanda at sebagai karakter "bentuk buruk", ganti seluruh input dengan string "@"jika mengandung huruf terlarang dan balikkan langkah-langkah dari atas.

Kode (versi yang dapat dicetak)

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

multi-line dengan komentar:

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

Pola bit yang mengkodekan segmen disimpan dalam string (melarikan diri 3 karakter yang tidak dapat digunakan menggunakan \xdan menggunakan \0ruang) dan dipetakan ke karakter input menggunakan operator transliterasi Perl.

Untuk 5 dari 7 segmen, bitwise dan digunakan bersama dengan operator ternary untuk menghasilkan spasi atau karakter segmen. Untuk dua segmen kiri bawah (dikodekan oleh 2 dan 4 dalam bitset), pencarian substring ke string 8 karakter digunakan untuk menyimpan 2 byte.

Terima kasih kepada Dom Hastings untuk tips golfnya di Perl.

Versi lama (menggunakan regex untuk menyandikan pola), 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"

multi-line dengan komentar:

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

String dibaca dan diperiksa untuk karakter yang tidak valid menggunakan regex, keluar jika ada yang ditemukan. Kemudian karakter huruf kecil yang diizinkan diganti untuk karakter yang tidak valid dan seluruh string dikonversi menjadi huruf kecil.

Baris dihasilkan satu per satu, dengan 1 segmen per huruf pada baris pertama dan 3 pada dua lainnya. Untuk setiap baris, string diproses satu karakter pada satu waktu dan karakter tersebut dicocokkan dengan regex untuk setiap segmen untuk memeriksa apakah! atau _ harus ditampilkan. Menggunakan regex berarti bahwa untuk karakter di mana segmen tidak diatur, dibutuhkan nol bit per segmen per karakter untuk menyandikan apakah akan mengaturnya, dan bagi mereka yang membutuhkan rata-rata sedikit kurang dari 8 bit karena rentang karakter regex dapat bekas. Jadi berhasil sekitar 3 atau 4 bit per segmen per karakter di set, atau sekitar 21-24 bit per karakter.

Itu tidak menangani pembungkus garis.

samgak
sumber
1
Hey @samgak, senang melihat lebih banyak cinta Perl! Saya perhatikan beberapa hal yang dapat membantu Anda mencukur beberapa byte dan ingin membagikannya! Anda dapat menggunakan beberapa variabel ajaib Perl untuk membantu mengurangi ini; ' 'dapat diganti dengan $"dan ' 'dapat menjadi $"x3yang trims off, \ns Anda bisa menjadi baris baru harfiah untuk menghilangkan beberapa lagi. Jalan keluar awal Anda juga dapat disingkat, menggunakan die, sehingga if(/[kmvwx]/i){print" -\n"x3;exit}menjadi die" - "x3if(/[kmvwx]/i). Dengan sedikit fudging juga Anda dapat mengatur ulang loop untuk menghindari tanda kurung dan Anda tidak perlu $zmenyimpan lebih banyak lagi!
Dom Hastings
1
Saya harap Anda tidak tersinggung, tetapi saya telah melihat pengurangan lebih banyak, gist.github.com/dom111/e651b5de8c7e7fc9a6cf . Turun ke 323!
Dom Hastings
@HomHastings jangan tersinggung sama sekali, terima kasih atas tips golf yang hebat! Saya telah menggunakan sebanyak mungkin dari mereka dalam jawaban yang diedit, yang telah saya ubah untuk menggunakan pengodean bitwise alih-alih regex untuk pola segmen. Sayangnya $ z sudah kembali, dan saya tidak tahu bagaimana cara menghilangkannya. Juga, $_=lc<>tidak berfungsi, karena kode tersebut tidak dapat membedakan CHIOU huruf besar dan kecil
samgak
1

Gangguan umum, 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)))

Contoh

Dengan "abcdefg'hijklnopqrstuz", cetakan:

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

Catatan

Karakter dan representasi mereka dikodekan dalam angka ini dalam basis 36:

IL884OIVFXJY4DCQ0O8DPH8MOMR2DSLPP3O4ESYHS234A9HEQYSV8IBDBZI6Z3C3MCVR77OYD3QN5G6CX2UQWGL4UY5R9PKYI1JQ5Y6DC27MQQGUZSCGI8Q9JCYP9N1L4YYKRWM1ZNMSVTSB4792UUWV6Z3906VSP981WCCBMDNJ02

Representasi biner dari digit ini dibagi dalam kelompok-kelompok 17 bit.

Sebagai contoh, kelompok terakhir dari 17 bit adalah 110000111101010, yang didekomposisi di sini dalam dua bagian:

  1. 110000, kode karakter 0
  2. 111101010, penyandian gambar, paling baik disajikan sebagai berikut:

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

    Bit di "kolom" pertama dan terakhir adalah untuk !karakter, yang ada di kolom tengah untuk _karakter. Bila perlu, versi huruf besar dan kecil dari karakter disimpan.

Fungsi ini berulang tiga kali lebih dari string input, satu untuk setiap baris output, mencari karakter yang cocok dalam tabel (atau default ke 146, alias tiga bar), dan mencetak representasi di baris saat ini.

coredump
sumber
Terima kasih telah berpartisipasi dalam tantangan ini. Saya perhatikan bahwa 'K' Anda ditampilkan sebagai 'L' di output Anda. Anda mungkin telah salah memahami persyaratan bahwa karakter yang tidak didukung tidak dapat dicetak bersama dengan karakter yang valid lainnya. Juga, saya melihat bahwa Anda menambahkan 'karakter, yang bagus; namun, itu akan ditampilkan di luar kemampuan tampilan 7-segmen. Jika Anda memindahkan !1 baris ke bawah, itu akan menjadi sempurna.
beberapa pengguna
Saya akan memperbarui 'karakter dan mengedit pertanyaan karena Kkarena pada kenyataannya, saya menempatkan Kdi tempat yang salah di input string ("... jlKn ...") ;-) Anda dapat melihat triple bar (kesalahan) hanya setelah L. Terima kasih telah memperhatikannya.
coredump
1

JavaScript (ES6), 380 352 324 byte

( Catatan: Kode menggunakan notasi tanda sisipan, karena mengandung beberapa karakter yang tidak dapat dicetak . Untuk mendapatkan kode asli, klik di sini dan pilih data mentah. Dan tidak, hini bukan 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}

Disebut sebagai d("7-seg display")atau mirip. Bekerja di Firefox 40, tetapi mungkin tidak di browser lain. Untuk beberapa alasan, cuplikan HTML / JS tidak menyimpan yang tidak dapat dicetak, tetapi Anda dapat menyalin-menempelkan data mentah dari sini .

Tidak Disatukan:

( Catatan: g dan htelah diisi dengan spasi untuk mencocokkan 8, -, ÿdan spacedengan nilai-nilai yang sesuai Unicode mereka.)

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

Penjelasan:

Saya segera memperhatikan bahwa 7 segmen, diubah menjadi 0/1 bit, akan cocok dengan 128 karakter Unicode pertama. Masalah dengan ide ini adalah bahwa 1/4 dari karakter ini adalah karakter kontrol yang tidak dapat dicetak. Menggunakannya dalam kode saya akan membuatnya terlihat sangat berantakan (atau sangat cerdas; saya belum memutuskan yang mana). Untuk mengatasi ini sambil menjaga sisa kode sederhana, saya datang dengan ide ini:

Dengan pengecualian -, spasi , dan kesalahan , tidak ada karakter yang kehilangan kedua segmen vertikal bawah. Jadi untuk memastikan bahwa semua karakter tetap berada di antara 0020dan 007f, saya hanya memetakan 64 dan 32 bit ke segmen ini, seperti :

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

Angka 5 segmen lainnya tidak terlalu penting; mereka dapat diatur dengan cara lain dan masih memiliki semua karakter yang sama "in-bounds".

Sebagai contoh, inilah versi A yang disandikan :

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

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

Saya kemudian memasukkan versi yang dikodekan dari setiap karakter 7-seg di h. Namun, 8menghasilkan 007f( kode kontrol hapus ; konstan tidak peduli bagaimana segmen disusun), ruang menghasilkan 0000( kode nol ; juga konstan), -menghasilkan 0002, dan kesalahan menghasilkan 0007. Saya menyalin-disisipkan byte mentah ke posisi yang benar untuk 8, -dan kesalahan ; ruang dengan mudah dicapai \0.

Setelah semua pengkodean ini, yang harus saya lakukan adalah menggunakannya untuk mendekode string dan output dalam format yang dapat dibaca 7-seg. Saya menggunakan for for dan tiga variabel ( x,, ydan z, masing-masing sesuai dengan garis output) untuk pergi melalui masing-masing karakter dalam string dan menambahkan 7-seg yang setara dengan output. Saya memilih ÿuntuk karakter kesalahan karena AFAIK, itu bukan pada keyboard apa pun, dan itu adalah karakter terakhir dalam u+0000-u+00ffjangkauan. Mungkin saya bisa lebih cerdas dan dipilih Ξ(huruf Yunani xi) sebagai gantinya ....;)

Edit 1: Disimpan sekelompok ruang dengan menciptakan mini-fungsi untuk menentukan apakah !, _atau diperlukan.

Sunting 2: Menyimpan lebih banyak ruang menggunakan trik yang saya pelajari sejak saya terakhir mengunjungi posting ini.

Seperti biasa, saran sangat dihargai!

Produksi ETH
sumber