7 segmentli ekranı kullanarak kelimeleri görüntüleme


13

Benim ilk Programlama Bulmacalar ve Kod Golf Seven-Slash Ekran . İşte 7 segmentli ekrana dayanan ilk Mücadelem.

Rakamların yanı sıra, 7 bölümlü basit bir ekran kullanarak ne tür harfler gösterebileceğimi düşünüyorum. Çok sayıda harf görüntülenebileceği ortaya çıkıyor. Aslında, K, M, V, W, X dışındaki tüm harfler tek bir 7 segmentli ekran kullanılarak görüntülenebilir. Bunun nedeni, bir harfin küçük veya büyük harfini görüntüleyebilmenizdir. Örneğin

"abcdef" şu şekilde görüntülenebilir:

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

Not her karakter oluşan bir 3x3 matris olduğu !ve _.

Tabii ki, 7 segmentli ekran sayıları ve sembolleri görüntülemek için kullanılabilir:

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

Bazı harflerin hem büyük hem de küçük harfleri olabilir:

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

İşte karakterlerin tamamı:

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

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

Beyaz boşluk ( ), tire ( -) ve soru işareti ( ?) bulunduğuna dikkat edin. Mektup I, Ove Zsayıları aynıdır 1, 0ve 2sırasıyla.

Bu meydan okumada, yukarıdaki 7 segmentli görüntüleme biçimini kullanarak bir dize görüntülemek için bir program veya işlev yazacaksınız.

kurallar

  1. Bir program veya işlev yazabilirsiniz

  2. Bu kod golfü, bayttaki en kısa kod kazanıyor

  3. Programınız veya işleviniz STDIN'den veya parametre olarak girdi almalıdır. Ve bir dize STDOUT ya da satır aralığı olmadan ancak satırsonu ile sonlandırılmış 3 satırda bir dize olarak çıktılar. Büyük / küçük harfleri CHIOUdoğru kullanın.

  4. İsteğe bağlı olarak sondaki boşlukları yazdırabilirsiniz

  5. Yukarıdaki biçimi izlemelisiniz. 7 segmentli ekranınızı oluşturmak için alt çizgi _ve ünlem işareti kullanma !.

  6. Beyaz boşluk ( ), tire ( -) ve soru işaretini ( ?) desteklemelisiniz

  7. Dize desteklenmeyen karakter içeriyorsa (k, m, v, w, x), tek bir hata karakteri (3 ufuk çizgisi, örneğe bakın) görüntülenir. Desteklenmeyen 5 karakterin yanı sıra, girdinin yalnızca desteklenen karakter kümesinden oluştuğunu varsayabilirsiniz.

  8. lKafa karışıklıkları nedeniyle küçük L ( ) harfine sahip olmamayı tercih ettim, ancak eğer bu kadar eğimli iseniz, bunu 1sağa veya sola doğru gösterebilirsiniz .

Örnekler

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

Evet, desteklenmeyen semboller olmadığını varsayabilirsiniz. Amacım içeren dizelerin k, m, v, w, xgörüntülenmemesini sağlamaktır.
bazı kullanıcılar


Bence satır başı (CR, \r) satır besleme (LF, \n) ile karıştırdınız. * nix LF, Windows CRLF kullanır. Sadece belirli eski sistemler CR'yi kendi başına kullanır. Daha fazla bilgi için: en.wikipedia.org/wiki/Newline
Winny

"8" karakterinizin çubuğu "|" yerine ünlem işareti "!". Amaçlanıyor mu?
coredump

1
@ Winny, elbette haklısın. Yazarken onu aramak için çok tembeltim.
bazı kullanıcılar

Yanıtlar:


7

CJam, 123 114 112 110 bayt

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

Yukarıdaki kod, yazdırılamayan karakterler içerdiğinden düzeltme işareti kullanmaktadır. Bunlardan biri boş bir bayt ( ^@), yani bu kod sadece komut satırından yürütülebilir.

Sadece iki bayt daha pahasına (toplam 112 için ), bunu düzeltebiliriz.

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

Bu kez, tüm karakterler yazdırılabilir. CJam yorumlayıcısında çevrimiçi deneyin .

Örnek çalışma

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

Fikir (yazdırılabilir sürüm)

Her karakter 9 segmentli ekranda gösterilebilir

!_!
!_!
!_!

bazı karakterlerini boşluklarla değiştirerek.

Biz ile, doğal bir okuma sırasında, her gösterilen bölümünü değiştirerek, bir tamsayı, belirli bir karakter açabilir 1 a, her biri gösterilmemiştir segmenti 0 ve sonuç ikili basamak dikkate.

Birinci ve üçüncü segment asla gösterilmez, bu nedenle [0,64) ve [128,192) aralıklarında tamsayılar üretilir .

Bu tamsayıların her birini tek bir bayt olarak kodlayabiliriz, ancak bunların yarısı yazdırılamaz karakterler ile sonuçlanır. Böylece, karaktere döküm yapmadan önce her tamsayıya 64 ekleriz , bu da kod noktalarının [64,128) ve [192,256) aralığında olmasını sağlar .

Bu iki aralıktaki yazdırılamayan tek karakter, aşağıdaki yayınlanmamış ekran yapılandırmasına karşılık gelen DEL (kod noktası 127):

!_!
!_!

Yukarıdaki kodlamayı , her kod noktasına 448 == 512 - 64 ekleyerek , taban 2'ye dönüştürerek ve ilk ikili basamağı kaldırarak tersine çevirebiliriz .

Bu kodlanmış segmenetleri karşılık gelen ASCII karakterleriyle ilişkilendirmenin etkili bir yolunu bulmak için geriye kalan.

Karakterlerini " -chiou"karakterlerle ";=KMVWX"eşler ve tüm girdiyi büyük harfe dönüştürürsek, 43 karakter aralığı vererek 0(kod noktası 48) ve Z(kod noktası 90) arasındaki tüm karakterler için kodlamayı depolayabiliriz .

Dizi indeksleme eğer öyleyse, CJam modüler yapıda olup Auzunluğu 43 dizesidir, A86=, A43=ve A0=hepsi aynı sonuçları vermektedir. Kod noktası 86 olan karakter V, bu nedenle V - Z ve 0 - U'nun kodlanmış segmentlerini sırayla saklarız .

Gerçek kodda, at işaretini "bozuk form" karakteri olarak seçeriz, "@"yasaklanmış bir harf içeriyorsa tüm girdiyi dizeyle değiştiririz ve yukarıdaki adımları tersine çeviririz.

Kod (yazdırılabilir sürüm)

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 bayt

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

yorumlarla çok satırlı:

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

Segmentleri kodlayan bit desenleri bir dizede saklanır ( boşluk kullanarak \xve kullanarak 3 yazdırılamaz karakterden kaçınır \0) ve Perl harf çevirisi operatörü kullanılarak giriş karakterlerine eşlenir.

7 segmentten 5'i için, bitsel olarak ve bir boşluk veya segment karakteri çıktısı almak için üçlü operatörle birlikte kullanılır. Sol alt iki segment için (bit kümesinde 2 ve 4 ile kodlanmış), 2 bayt kaydetmek için 8 karakterli bir dize içine bir alt dize arama kullanılır.

Perl golf ipuçları için Dom Hastings'e teşekkürler.

Eski sürüm (kalıpları kodlamak için normal ifadeler kullanarak), 390 bayt:

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

yorumlarla çok satırlı:

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

Dize okunur ve bulunmuşsa çıkılarak normal ifade kullanılarak geçersiz karakter olup olmadığı kontrol edilir. Daha sonra, izin verilen küçük harf karakterleri geçersiz karakterlerin yerine kullanılır ve dizenin tamamı küçük harfe dönüştürülür.

Satırlar her seferinde bir tane oluşturulur, ilk satırda harf başına 1 segment ve diğer ikisinde 3 harf bulunur. Her satır için, dize her seferinde bir karakter işlenir ve karakter her segment için bir regex ile eşleştirilir. veya _ görüntülenmelidir. Normal ifade kullanmak, segmentin ayarlanmadığı karakterlerde, karakter kümesinin ayarlanıp ayarlanmayacağını kodlamak için karakter başına segment başına sıfır bit sürdüğü ve normal ifade karakter aralıklarının olabileceği için ortalama 8 bitten biraz daha az sürdüğü anlamına gelir. Kullanılmış. Böylece, kümedeki karakter başına segment başına yaklaşık 3 veya 4 bit veya karakter başına yaklaşık 21-24 bit çalışır.

Satır sarma işlemez.


1
Hey @samgak, daha fazla Perl aşkı gördüğüme sevindim! Bazı baytları tıraş etmenize yardımcı olabilecek birkaç şey fark ettim ve paylaşmak istedim! Bunu azaltmaya yardımcı olmak için Perl'in bazı sihirli değişkenlerini kullanabilirsiniz; ' 'ile değiştirilebilir $"ve ' 'olabilir $"x3bir kaç kapalı kırpar, hangi sizin \nler birkaç tane daha kurtulmak için birebir yeni satırlar olabilir. Erken çıkışınız kalıp kullanarak da kısaltılabilir, böylece if(/[kmvwx]/i){print" -\n"x3;exit}olur die" - "x3if(/[kmvwx]/i). Biraz daha fazla şekerleme ile, parantezleri önlemek için döngüyü yeniden düzenleyebilirsiniz ve $zbirkaç tane daha kaydetmeniz gerekmez !
Dom Hastings

1
Umarım kırılmazsın , ama daha fazlasını azaltmaya baktım , gist.github.com/dom111/e651b5de8c7e7fc9a6cf . 323'e kadar!
Dom Hastings

@DomHastings hiçbir suç alınmadı, harika golf ipuçları için teşekkürler! Segment düzenleri için normal ifadeler yerine bitsel kodlama kullanmak için değiştirdiğim düzenlenmiş cevabımda mümkün olduğunca çok kullandım. Ne yazık ki $ z geri döndü ve ondan nasıl kurtulacağımı anlayamıyorum. Ayrıca, $_=lc<>çalışmaz, çünkü o zaman kod büyük ve küçük CHIOU arasında ayrım yapamaz
samgak

1

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

Misal

İle "abcdefg'hijklnopqrstuz", baskılar:

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

Uyarılar

Karakterler ve temsili 36 numaralı tabanda bu sayı ile kodlanmıştır:

IL884OIVFXJY4DCQ0O8DPH8MOMR2DSLPP3O4ESYHS234A9HEQYSV8IBDBZI6Z3C3MCVR77OYD3QN5G6CX2UQWGL4UY5R9PKYI1JQ5Y6DC27MQQGUZSCGI8Q9JCYP9N1L4YYKRWM1ZNMSVTSB4792UUWV6Z3906VSP981WCCBMDNJ02

Bu rakamın ikili gösterimi 17 bitlik gruplara ayrılır.

Örneğin, burada 17 110000111101010parçadan oluşan son 17 bitlik grup :

  1. 110000, karakterin karakter kodu 0
  2. 111101010, çizimin bir kodlaması, en iyi şu şekilde gösterilir:

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

    İlk ve son "sütundaki" bitler !karakterler için, orta sütunda bulunanlar ise _karakter içindir. Gerektiğinde, bir karakterin hem büyük hem de küçük harf sürümleri saklanır.

İşlev, her bir çıktı satırı için bir tane olmak üzere giriş dizesi üzerinde üç kez yinelenir, tabloda eşleşen bir karakteri arar (veya varsayılan olarak 146, diğer üç çubuk olarak adlandırılır) ve geçerli satırdaki temsili yazdırır.


Yarışmaya katıldığınız için teşekkür ederiz. Çıktınızda 'K'nin' L 'olarak görüntülendiğini fark ettim. Desteklenmeyen karakterin diğer geçerli karakterlerle birlikte yazdırılamaması gerektiğini yanlış anlamış olabilirsiniz. Ayrıca, 'hoş bir karakter eklediğinizi görüyorum ; ancak, 7 segmentli bir ekranın neler yapabileceğinin dışında görüntülenecektir. !Aşağı doğru 1 satır hareket ettirirseniz, mükemmel olur.
bazı kullanıcılar

'Karakteri güncelleyeceğim ve soruyu düzenleyeceğim Kçünkü aslında, Kgiriş dizesinde yanlış yere koydum ("... jlKn ...") ;-) Üçlü çubukları görebilirsiniz (hata) L.'den sonra fark ettiğin için teşekkürler.
coredump

1

JavaScript (ES6), 380 352 324 bayt

( Not: Kod, yazdırılamayan karakterler içerdiği için düzeltme işareti kullanır. Orijinal kodu almak için burayı tıklayın ve ham verileri seçin. Hayır, hbir CJam programı değildir.)

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")Veya benzeri olarak adlandırılır . Firefox 40'da çalışır, ancak diğer tarayıcılarda çalışmayabilir. Nedense, HTML / JS pasajı olmayan printables kaydetme, ancak ham verileri kopyalayıp yapıştırın gelmez buraya .

Ungolfed:

( Not: g ve heşleştirmek için boşluklarla takviye edilmiş 8, -, ÿve spacebunların karşılık gelen Unicode değerleri ile).

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

Açıklama:

Hemen 0/ 1bit'e dönüştürülen 7 segmentin ilk 128 Unicode karakteriyle iyi gideceğini hemen fark ettim . Bu fikirdeki sorun, bu karakterlerin 1 / 4'ünün yazdırılamayan kontrol karakterleri olmasıdır. Onları kodumda kullanmak, inanılmaz derecede dağınık görünmesini sağlayacaktır (veya inanılmaz derecede akıllı; hangisine karar vermedim). Kodun geri kalanını basit tutarken bunu çözmek için bu fikri buldum:

Hariç olmak üzere -, uzay ve yanılma , karakterlerin hiçbiri alt dikey segmentlerin her ikisi eksikti. Yani tüm bu karakterler arasında kaldı emin olmak için 0020ve 007fben sadece eşleştirilmiş, 64 ve 32 gibi, bu segmentlere bitleri böylece:

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

Diğer 5 segmentin sayısı çok önemli değil; başka bir şekilde düzenlenebilirler ve aynı karakterlerin hepsi "sınırlar içinde" olabilir.

Örnek olarak, işte A'nın kodlanmış sürümü :

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

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

Sonra her 7-seg karakter kodlanmış sürümünü doldurdu h. Ancak 8sonuçta 007f( silme kontrol kodu; segmentler nasıl düzenlenirse değiştirilsin sabit), boşlukla sonuçlandı 0000( boş kod; ayrıca sabit), -sonuçlandı 0002ve hata oluştu 0007. Ben doğru konuma ham bayt-yapıştırılan kopya için 8, -ve hata ; ile kolayca mekana ulaşıldı \0.

Tüm bu kodlamadan sonra, tek yapmam gereken dizeyi deşifre etmek ve 7 segmentlik okunabilir bir formatta çıkarmaktı. Bir kullanılan için döngü ve (üç değişken x, yve zdize her karakter geçmesi ve çıkışı için 7-seg eşdeğer eklemek için, her bir çıkış hattına karşılık gelen). Seçtiğim ÿiçin hata AFAIK, herhangi bir klavyede değil, ve bunun son karakter çünkü karakteri u+0000-u+00ffaralığında. Belki esprili olabilir ve Ξonun yerine (Yunanca harf xi) seçilebilirdim ....;)

Düzenleme 1: Kayıtlı mini fonksiyonları oluşturarak uzayda bir demet olmadığını belirlemek için !, _ya da ihtiyaç vardır.

Edit 2: Bu yazıyı en son ziyaret ettiğimden beri öğrendiğim hileleri kullanarak biraz daha fazla alan kaydetti.

Her zamanki gibi, öneriler büyük beğeni topluyor!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.