แสดงคำโดยใช้การแสดงผล 7 ส่วน


13

ครั้งแรกของฉันที่เคย Programming ปริศนาและรหัสกอล์ฟเป็นจอแสดงผล Seven-Slash นี่คือความท้าทายครั้งแรกของฉันซึ่งขึ้นอยู่กับการแสดงผล 7 ส่วน

ฉันมักจะคิดถึงตัวอักษรที่ฉันสามารถแสดงได้ด้วยตัวเลข 7 ส่วน ปรากฎตัวอักษรจำนวนมากสามารถแสดงได้ ในความเป็นจริงทั้งหมดสามารถแสดงตัวอักษร K, M, V, W, X โดยใช้จอแสดงผล 7 ส่วนเดียว นี่เป็นเพราะคุณสามารถแสดงตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ของตัวอักษร เช่น

"abcdef" สามารถแสดงเป็น

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

โปรดทราบว่าตัวละครแต่ละตัวคือเมทริกซ์ 3x3 ที่สร้างขึ้นจากและ!_

แน่นอนว่าการแสดงผล 7 ส่วนสามารถใช้เพื่อแสดงตัวเลขและสัญลักษณ์:

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

ตัวอักษรบางตัวสามารถมีทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก:

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

นี่คือชุดอักขระเต็มรูปแบบ:

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

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

ระวังว่ามีช่องว่าง ( ), เส้นประ ( -) และเครื่องหมายคำถาม ( ?) ตัวอักษรI, OและZเป็นเช่นเดียวกับตัวเลข1, 0และ2ตามลำดับ

ในความท้าทายนี้คุณจะเขียนโปรแกรมหรือฟังก์ชั่นเพื่อแสดงสตริงโดยใช้รูปแบบการแสดงผล 7 ส่วนด้านบน

กฎระเบียบ

  1. คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น

  2. นี่คือโค้ดกอล์ฟซึ่งเป็นรหัสที่สั้นที่สุดในหน่วยไบต์

  3. โปรแกรมหรือฟังก์ชั่นของคุณควรรับข้อมูลจาก STDIN หรือเป็นพารามิเตอร์ และส่งออกสตริงไปยัง STDOUT หรือเป็นสตริงใน 3 บรรทัดโดยไม่มีช่องว่างนำหน้า แต่ถูกยกเลิกด้วยการขึ้นบรรทัดใหม่ จัดการกับกรณีบน / ล่างของCHIOUอย่างถูกต้อง

  4. คุณอาจเลือกพิมพ์ช่องว่างสีขาวต่อท้าย

  5. คุณต้องทำตามรูปแบบด้านบน ใช้เครื่องหมายขีดล่าง_และอัศเจรีย์!เพื่อจัดรูปแบบการแสดงผล 7 ส่วนของคุณ

  6. คุณต้องสนับสนุน white space ( ), dash ( -) และเครื่องหมายคำถาม ( ?)

  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ไม่แสดง
ผู้ใช้บางคน

1
ที่เกี่ยวข้อง: codegolf.stackexchange.com/questions/9266/ …
DavidC

ฉันคิดว่าคุณสับสน carriage return (CR, \r) ด้วย line feed (LF, \n) * nix ใช้ LF และ Windows ใช้ CRLF ระบบดั้งเดิมบางระบบเท่านั้นที่ใช้ CR ด้วยตัวเอง ข้อมูลเพิ่มเติมที่นี่: en.wikipedia.org/wiki/Newline
Winny

ตัวละคร "8" ของคุณดูเหมือนจะมีบาร์ "|" แทนเครื่องหมายอัศเจรีย์ "!" มันตั้งใจหรือไม่
coredump

1
@ Winny คุณพูดถูก ฉันขี้เกียจเกินไปที่จะค้นหามันเมื่อฉันเขียนมัน
ผู้ใช้บางคน

คำตอบ:


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*

ด้านบนใช้เครื่องหมายรูปหมวกเนื่องจากรหัสมีอักขระที่ไม่สามารถพิมพ์ได้ หนึ่งในนั้นคือ null ไบต์ ( ^@) ซึ่งหมายความว่ารหัสนี้สามารถเรียกใช้จากบรรทัดคำสั่งเท่านั้น

ที่ราคาเพิ่มอีกสองไบต์เท่านั้น (รวมเป็น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)และ[128192)

เราสามารถเข้ารหัสแต่ละจำนวนเต็มเป็นไบต์เดียว แต่ครึ่งหนึ่งจะส่งผลให้มีอักขระที่ไม่สามารถพิมพ์ได้ ดังนั้นเราจึงเพิ่ม64แต่ละจำนวนเต็มก่อนที่จะส่งไปยังตัวละครซึ่งจะทำให้แน่ใจว่าจุดรหัสอยู่ในช่วง[64,128)และ[192256)

อักขระที่ไม่สามารถพิมพ์ได้อย่างเดียวในสองช่วงนี้คือ DEL (รหัสจุด 127) ซึ่งสอดคล้องกับการกำหนดค่าการแสดงผลที่ไม่ต่อเนื่องดังต่อไปนี้:

!_!
!_!

เราสามารถย้อนกลับการเข้ารหัสข้างต้นโดยการเพิ่ม448 == 512 - 64ไปยังจุดรหัสแต่ละจุดแปลงเป็นฐาน 2 และลบเลขฐานสองแรก

สิ่งที่เหลืออยู่เพื่อค้นหาวิธีที่มีประสิทธิภาพในการเชื่อมโยง segmenets ที่เข้ารหัสเหล่านี้กับอักขระ ASCII ที่สอดคล้องกัน

หากเราแมปอักขระของ" -chiou"กับอักขระของ";=KMVWX"และแปลงอินพุตทั้งหมดเป็นตัวพิมพ์ใหญ่เราสามารถเก็บการเข้ารหัสสำหรับอักขระทั้งหมดระหว่าง0(รหัสจุด 48) และZ(รหัสจุด 90) โดยมีช่วง 43

การจัดทำดัชนีอาร์เรย์เป็น modular ใน CJam ดังนั้นหากAเป็นสตริงที่มีความยาว 43, A86=, A43=และA0=ผลผลิตผลลัพธ์เดียวกัน อักขระที่มีรหัสจุด 86 คือVเราก็เก็บส่วนที่เข้ารหัสของV - Zและ0 - 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

Perl, 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
"

รูปแบบบิตที่เข้ารหัสกลุ่มจะถูกเก็บไว้ในสตริง (หนี 3 ตัวอักษรที่ไม่สามารถพิมพ์ได้โดยใช้\xและใช้\0พื้นที่) และแมปไปยังอักขระอินพุตโดยใช้ตัวดำเนินการทับศัพท์ภาษา Perl

สำหรับ 5 ใน 7 เซกเมนต์ bitwise และใช้ร่วมกับผู้ประกอบการที่สามเพื่อส่งออกช่องว่างหรืออักขระเซ็กเมนต์ สำหรับด้านล่างซ้ายสองเซ็กเมนต์ (เข้ารหัสโดย 2 และ 4 ในบิตเซ็ต) การค้นหาสตริงย่อยในสตริงอักขระ 8 ตัวถูกใช้เพื่อบันทึก 2 ไบต์

ขอบคุณ Dom Hastings สำหรับเคล็ดลับการเล่นกอล์ฟ Perl ของเขา

เวอร์ชันเก่า (โดยใช้ regexes เพื่อเข้ารหัสรูปแบบ), 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

สตริงจะถูกอ่านและตรวจสอบตัวอักษรที่ไม่ถูกต้องโดยใช้ regex ออกหากพบว่ามี จากนั้นตัวอักษรตัวพิมพ์เล็กที่อนุญาตจะถูกแทนที่สำหรับตัวอักษรที่ไม่ถูกต้องและสตริงทั้งหมดจะถูกแปลงเป็นตัวพิมพ์เล็ก

แถวจะถูกสร้างขึ้นทีละหนึ่งโดยมี 1 ส่วนต่อตัวอักษรในแถวแรกและ 3 ในอีกสองส่วน สำหรับแต่ละแถวสตริงจะถูกประมวลผลครั้งละหนึ่งอักขระและอักขระนั้นถูกจับคู่กับ regex สำหรับแต่ละเซ็กเมนต์เพื่อตรวจสอบว่า! หรือ _ ควรจะแสดง การใช้ regex หมายความว่าสำหรับตัวละครที่ไม่ได้ตั้งค่าเซ็กเมนต์จะใช้เวลาเป็นศูนย์บิตต่อเซกเมนต์ต่ออักขระเพื่อเข้ารหัสว่าจะตั้งค่าหรือไม่ ใช้ ดังนั้นจึงใช้งานได้ประมาณ 3 หรือ 4 บิตต่อเซ็กเมนต์ต่อตัวละครในชุดหรือประมาณ 21-24 บิตต่อตัวละคร

ไม่จัดการกับการตัดบรรทัด


1
เฮ้ @samgak ดีใจที่ได้เห็นความรัก Perl มากขึ้น! ฉันสังเกตเห็นบางสิ่งที่จะช่วยให้คุณสามารถกำจัดบางไบต์และต้องการแบ่งปัน! คุณสามารถใช้ตัวแปรเวทของ Perl บางอย่างเพื่อช่วยลดสิ่งนี้ ' 'สามารถถูกแทนที่ด้วย$"และ' 'สามารถ$"x3ที่จดจ้องไม่กี่ออกคุณ\nสามารถขึ้นบรรทัดใหม่ตามตัวอักษรเพื่อกำจัดอีกไม่กี่ ออกจากต้นของคุณสามารถ shorted เกินไปใช้ตายเพื่อที่จะกลายเป็นif(/[kmvwx]/i){print" -\n"x3;exit} die" - "x3if(/[kmvwx]/i)ด้วยความเหลวไหลที่เพิ่มขึ้นอีกเล็กน้อยคุณสามารถจัดเรียงลูปอีกครั้งเพื่อหลีกเลี่ยงการใส่วงเล็บและคุณไม่จำเป็นต้อง$zประหยัดอีกต่อไป!
Dom Hastings

1
ฉันหวังว่าคุณไม่ได้โกรธ แต่ผมมองไปที่การลดมากขึ้นgist.github.com/dom111/e651b5de8c7e7fc9a6cf ลงไปที่ 323!
Dom Hastings

@ DomHastings ไม่มีความผิดใด ๆ เลยขอบคุณสำหรับเคล็ดลับการเล่นกอล์ฟที่ยอดเยี่ยม! ฉันใช้มากที่สุดเท่าที่จะทำได้ในคำตอบที่แก้ไขซึ่งฉันเปลี่ยนเป็นการใช้การเข้ารหัสระดับบิตแทน regexes สำหรับรูปแบบกลุ่ม น่าเสียดายที่ $ 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, aka สามแท่ง) และพิมพ์การแสดงที่แถวปัจจุบัน


ขอบคุณสำหรับการเข้าร่วมการแข่งขัน ฉันสังเกตเห็นว่า 'K' ของคุณแสดงเป็น 'L' ในเอาต์พุตของคุณ คุณอาจเข้าใจผิดเกี่ยวกับข้อกำหนดที่ไม่สามารถพิมพ์อักขระที่ไม่รองรับพร้อมกับอักขระที่ใช้ได้ นอกจากนี้ฉันเห็นว่าคุณเพิ่ม'ตัวละครซึ่งเป็นสิ่งที่ดี; อย่างไรก็ตามมันจะถูกแสดงด้านนอกของความสามารถในการแสดงผล 7 ส่วน หากคุณเลื่อน!ลงทีละ 1 บรรทัดมันจะสมบูรณ์แบบ
ผู้ใช้บางคน

ฉันจะอัปเดต'ตัวละครและแก้ไขคำถามKเพราะในความเป็นจริงฉันใส่Kผิดตำแหน่งในสตริงอินพุต ("... jlKn ... ") ;-) คุณสามารถเห็นแถบสามแถบ (ข้อผิดพลาด) เพียง หลังจาก L. ขอบคุณสำหรับการสังเกต
coredump

1

JavaScript (ES6), 380 352 324 ไบต์

( หมายเหตุ:รหัสใช้เครื่องหมายรูปหมวกเนื่องจากมีอักขระที่ไม่สามารถพิมพ์ได้บางส่วนหากต้องการรับรหัสต้นฉบับให้คลิกที่นี่และเลือกข้อมูลดิบและไม่hไม่ใช่โปรแกรม 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}

เรียกได้ว่าd("7-seg display")คล้ายกันหรือ ใช้งานได้ใน Firefox 40 แต่อาจไม่สามารถใช้ได้กับเบราว์เซอร์อื่น ด้วยเหตุผลบางอย่าง HTML / JS snippet ไม่ได้บันทึกสิ่งที่ไม่สามารถพิมพ์ได้ แต่คุณสามารถคัดลอกวางข้อมูลดิบจากตรงนี้ได้

Ungolfed:

( หมายเหตุ: gและhได้รับการเบาะที่มีช่องว่างเพื่อให้ตรงกับ8, -, ÿและspaceมีค่า Unicode ที่สอดคล้องกันของพวกเขา.)

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

คำอธิบาย:

ฉันสังเกตได้ทันทีว่า 7 เซกเมนต์ที่แปลงเป็น0/ 1บิตจะเข้ากันได้ดีกับอักขระ Unicode 128 ตัวแรก ปัญหาเกี่ยวกับแนวคิดนี้คือ 1/4 ของอักขระเหล่านี้เป็นอักขระควบคุมที่ไม่สามารถพิมพ์ได้ การใช้มันในโค้ดของฉันจะทำให้มันดูยุ่งเหยิงอย่างไม่น่าเชื่อ (หรือฉลาดอย่างไม่น่าเชื่อ เพื่อแก้ปัญหานี้ในขณะที่รักษารหัสส่วนที่เหลือให้เรียบง่ายฉันจึงได้แนวคิดนี้:

ด้วยข้อยกเว้นของ-, พื้นที่และข้อผิดพลาดที่ไม่มีตัวอักษรที่หายไปทั้งในกลุ่มที่ต่ำกว่าแนวตั้ง ดังนั้นเพื่อให้แน่ใจว่าตัวละครทั้งหมดนั้นอยู่ระหว่าง0020และ007fฉันก็แมป64และ32บิตกับกลุ่มเหล่านี้เช่น:

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

ตัวเลขอีก 5 กลุ่มไม่สำคัญเกินไป พวกเขาสามารถจัดเรียงในลักษณะอื่นใดและยังคงมีอักขระเดียวกันทั้งหมด "ในขอบเขต"

ตัวอย่างเช่นต่อไปนี้เป็นเวอร์ชันที่เข้ารหัสของ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-seg hใน อย่างไรก็ตาม8ผลใน007f(คนลบรหัสควบคุมอย่างต่อเนื่องไม่ว่าส่วนที่มีการจัดเรียง) พื้นที่ส่งผลให้0000(คนnullรหัส; ยังคง) -ส่งผลให้ใน0002และข้อผิดพลาด0007ส่งผลให้ ผมคัดลอกวางไบต์ดิบในตำแหน่งที่ถูกต้องสำหรับ8, -และข้อผิดพลาด ; พื้นที่\0ก็ประสบความสำเร็จได้อย่างง่ายดายด้วย

หลังจากการเข้ารหัสนี้ทั้งหมดที่ฉันต้องทำคือใช้มันเพื่อถอดรหัสสตริงและส่งออกในรูปแบบที่อ่านได้ 7-seg ฉันใช้สำหรับลูปและตัวแปรสามตัว ( x,, yและzแต่ละอันที่สอดคล้องกับบรรทัดเอาต์พุต) เพื่อผ่านแต่ละอักขระในสตริงและเพิ่ม 7-seg เทียบเท่ากับเอาต์พุต ผมเลือกÿสำหรับข้อผิดพลาดของตัวละครเพราะ AFAIK ก็ไม่ได้อยู่บนแป้นพิมพ์ใด ๆ และเป็นตัวอักษรตัวสุดท้ายในu+0000-u+00ffช่วง บางทีฉันอาจจะมีไหวพริบและเลือกΞ(อักษรกรีก xi) แทน .... ;)

แก้ไข 1:บันทึกไว้พวงของพื้นที่โดยการสร้างมินิฟังก์ชั่นเพื่อตรวจสอบว่า!, _หรือเป็นสิ่งจำเป็น

แก้ไข 2:บันทึกพื้นที่ให้มากขึ้นโดยใช้ลูกเล่นที่ฉันได้เรียนรู้ตั้งแต่ฉันไปที่โพสต์นี้ครั้งล่าสุด

ตามปกติคำแนะนำจะได้รับการชื่นชมอย่างมาก!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.