วาดกระดานซูโดกุโดยใช้อักขระวาดเส้น


20

นี่คือรหัสกอล์ฟ สำหรับความท้าทายนี้ฉันจะยอมรับวิธีการ (คุณไม่จำเป็นต้องใช้โปรแกรมเต็มรูปแบบ) แต่ลายเซ็นวิธีจะนับรวมกับจำนวนไบต์และฉันต้องการดูลายเซ็นแบบเต็ม (ไม่ใช่ lamdba) อินพุตสำหรับวิธีการนี้เป็นอาร์เรย์จำนวนเต็มที่มีองค์ประกอบ 81 รายการ ค่าเอาต์พุต / ส่งคืนจากเมธอดคือสตริงที่แทนอาร์เรย์เป็นบอร์ด ascii sudoku

หากคุณใช้ภาษาลึกลับหรือบางสิ่งบางอย่างที่ไม่มีวิธีการอย่างใดอย่างหนึ่งคุณสามารถปรับเปลี่ยนได้ แต่ถ้าภาษานั้นสนับสนุนสิ่งนี้ฉันต้องการเห็นบางสิ่งบางอย่างอาจจะเสียบเข้ากับโปรแกรมที่ "ไม่เป็นจริง" แม้ว่า วิธีร่างกายตัวเองเป็นความเจ็บปวดในการทำงานกับ ความต้องการไม่ได้หมายถึงการปิดกั้นภาษาเช่น Jelly หรือ 05AB1E แต่เพื่อให้ง่ายขึ้นสำหรับภาษาเช่น Java เพื่อสร้างสิ่งที่สมเหตุสมผลสำหรับแพลตฟอร์มนั้น

สำหรับอินพุตค่าจำนวนเต็ม 1-9 ควรมีความหมายที่ชัดเจน 0 ควรตีความเป็นเซลล์ว่างเสมอ คุณอาจตีความสิ่งอื่นนอกเหนือจากช่วง 1-9 เป็นเซลล์ว่าง แต่ไม่จำเป็น การจัดตำแหน่งจากอาร์เรย์ไปยังตัวต่อปริศนาจะเริ่มต้นที่ด้านบนซ้ายและเติมแต่ละแถวจากซ้ายไปขวาก่อนที่จะย้ายไปยังแถวถัดไป

สำหรับกล่องฉันต้องการเส้นคู่รอบนอกและระหว่างแต่ละพื้นที่ 3x3 และบรรทัดเดียวระหว่างเซลล์อื่น สิ่งเหล่านี้ควรวาดด้วยอักขระวาดเส้น (หากรูปแบบ I / O ของคุณแทนสตริงเป็นลำดับของไบต์แทนที่จะเป็นลำดับอักขระคุณควรแสดงอักขระเหล่านั้นในการเข้ารหัสที่รู้จักกันดีเช่น UTF-8 หรือ codepage 347)

สำหรับความท้าทายนี้ฉันไม่ได้ขอให้คุณสร้างตัวต่อซูโดกุ นั่นคืออินพุตสำหรับฟังก์ชัน ฉันไม่ได้ขอให้คุณแก้ปริศนา ฉันแค่ขอให้คุณสร้างสตริงเพื่อ "วาด" สิ่งที่คุณได้รับ (ในไม่กี่ไบต์เท่าที่จะทำได้)

อินพุตตัวอย่าง:

ค่าสำหรับอาร์เรย์:

{ 8, 5, 0, 0, 0, 2, 4, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 2, 3, 0, 5, 0, 0, 0, 9, 0, 0 ,0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 7, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 0, 4, 0}

ค่าสามารถใช้กลไกใดก็ได้ที่เป็นธรรมชาติสำหรับภาษาของคุณ: int [], ArrayList, ลำดับ, tuple, สตริงของตัวเลข, อะไรก็ได้ตราบใดที่คุณมีค่าในอินพุตสำหรับทุกเซลล์ (ไม่มีแผนที่สำหรับเซลล์ที่มีประชากรเท่านั้นไปยังตำแหน่ง ) โปรดจำไว้ว่าการป้อนข้อมูลจะให้ ... มันไม่ได้เป็นส่วนหนึ่งของการนับไบต์ของคุณ แต่การป้อนข้อมูลที่อาจเป็นตัวแทนใด ๆปริศนาซูโดกุและปริศนาอาจไม่ได้มีวิธีการแก้ปัญหาที่ถูกต้อง คุณต้องสมมุติว่าตัวต่อนั้นสามารถพิมพ์ได้ คุณจะไม่ได้อะไรกับองค์ประกอบ 82 อย่าง

คุณจะได้รับแบบอักษรที่มีความกว้างคงที่ที่เหมาะสม

เอาท์พุทที่สอดคล้องกัน:

╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗
║ 8 │ 5 │║││ 2 ║ 4 ││║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ 7 │ 2 │║││║││║ 9 ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
│││ 4 ║││║││║
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
║││║ 1 ││ 7 ║││ 2 ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ 3 ││ 5 ║││║ 9 ││║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
││ 4 │║││║││║
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
║││║│ 8 │║│ 7 │║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
││ 1 │ 7 ║││║│││
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║││║│ 3 │ 6 ║│ 4 │║
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝

4
คุณแน่ใจเกี่ยวกับส่วนวิธีหรือไม่ ไม่เหมาะสมกับภาษาจำนวนมาก (เช่นภาษาที่ไม่มีวิธีการ)
Cyoce

1
สำหรับภาษาที่ไม่มีวิธีคุณสามารถปรับได้ แต่ถ้าพวกเขาทำฉันกำลังมองหาบางสิ่งที่อาจมีประโยชน์จริง ๆ ที่จะเสียบเข้ากับโปรแกรม "ของจริง" ฉันจะเพิ่มคำถามนั้น
Joel Coehoorn

2
อะไรคือเหตุผลที่ไม่ยอมให้ลูกแกะ? ผู้ที่สามารถเสียบเข้ากับโปรแกรม "ของจริง" เช่นเดียวกับฟังก์ชั่น / วิธีการที่มีชื่อ
Julian Wolf

2
Nitpicky แต่สำคัญ: ไม่มีสิ่งเช่น "อักขระวาดกล่อง ASCII" ASCII ครอบคลุมรหัส 0 ถึง 127 ไม่มีตัวอักษรใด ๆ ที่จะวาดกล่อง ในครั้งล่าสุด Unicode เป็นมาตรฐาน แต่มีการเข้ารหัสที่แตกต่างกันหลายประการ: UTF-8, UTF-16 และอื่น ๆ ทั้งหมดนี้ใช้มากกว่า 1 ไบต์ต่ออักขระการถอนกล่อง การเข้ารหัสที่เก่ากว่าเช่น Codepage 437 รองรับอักขระการวาดกล่องไบต์เดียว เมื่อคุณใช้อักขระที่อยู่นอกช่วง ASCII คุณควรระบุการเข้ารหัสที่ถูกต้อง en.wikipedia.org/wiki/Box-drawing_character en.wikipedia.org/wiki/Unicode
Level River St

2
"วิธีการ" น่าจะเป็น "ชื่อฟังก์ชั่น" เพื่อให้ได้เทียบเท่ากับวิธีการในภาษาที่ไม่ใช่เชิงวัตถุ (ตัวอย่างเช่น C ซึ่งเป็นภาษาที่ใช้กันอย่างแพร่หลายไม่มีวิธีการ แต่มีฟังก์ชั่นที่มีชื่อ) ในภาษาส่วนใหญ่ที่ฉันรู้ว่ามีวิธีใดพวกเขาเป็นภาษาที่เทียบเท่ากับฟังก์ชันที่มีชื่อ (ข้อยกเว้นที่รู้จักกันดีที่สุดที่ฉันรู้คือ C ++ ซึ่งการใช้ฟังก์ชั่นที่ตั้งชื่อจะมีความน่าเชื่อถือมากสำหรับงานนี้มากกว่าการใช้วิธีการเพราะมันชัดเจนว่าวัตถุประเภทใดที่คุณเชื่อมโยงวิธีด้วย .)

คำตอบ:


9

Python 3 , 232 ไบต์

ขอบคุณผู้ที่ช่วยลงสนามกอล์ฟนี้

การเข้ารหัสภายในการเข้ารหัส ...

q=lambda x,y:x+y+x+y+x
r=lambda a,b,c,d,e:a+q(q(b*3,c),d)+e+"\n"
print(((r(*"╔═╤╦╗")+q(q("║ %d │ %d │ %d "*3+"║\n",r(*"╟─┼╫╢")),r(*"╠═╪╬╣"))+r(*"╚═╧╩╝"))%eval(input())).replace(*"0 "))

ลองออนไลน์!

ที่จะต้องตีกอล์ฟ


ฉันไม่ได้สังเกตว่า ... นั่นเป็นเหตุผลทั้งหมดที่ฉันใช้ Python 2 แต่ขอบคุณ
Leun Nun

1
ที่จริงแล้วคุณควรใช้ Python 3 ดีกว่าเพราะคุณไม่จำเป็นต้องใช้บรรทัดแรก
Erik the Outgolfer

1
คุณสามารถลบ parens เพิ่มเติมได้ในบรรทัดสุดท้าย: tio
Conor O'Brien

ลบคำจำกัดความของ f และกำหนด i เป็นการi=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]ประหยัด 4 ไบต์
เป็นทางการเรียกร้อง

7

C (gcc) , 398 395 291 ไบต์

บันทึก 3 ไบต์โดยทำงานผ่านสตริงที่กลับด้านและ 104 (!) ไบต์ขอบคุณ Leaky Nun

#include<locale.h>
#define q(x,y) x y x y x
#define D L"╝"q(q("═══","╧"),"╩")"╚"q(q("\n║"q(q(" & ","│"),"║")"║","\n╢"q(q("───","┼"),"╫")"╟"),"\n╣"q(q("═══","╪"),"╬")"╠")"\n╗"q(q("═══","╤"),"╦")"╔"
i;f(int*t){setlocale(LC_ALL,"");for(i=721;i--;)wprintf(L"%lc",D[i]%19?D[i]:*t++?48+t[-1]:32);}

ลองออนไลน์!

C (gcc) , 395 ไบต์

ฉันจะเก็บไว้ที่นี่เพื่อให้เห็นได้ชัดว่าโปรแกรมทำงานอย่างไร

#include<locale.h>
#define A L"\n╢───┼───┼───╫───┼───┼───╫───┼───┼───╟"
#define B L"\n║ & │ & │ & ║ & │ & │ & ║ & │ & │ & ║"
#define C L"\n╣═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╠"
#define E B A B A B
#define D L"╝═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╚"E C E C E L"\n╗═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╔"
i;f(int*t){setlocale(LC_ALL,"");for(i=721;i--;)wprintf(L"%lc",D[i]%19?D[i]:*t++?48+t[-1]:32);}

ลองออนไลน์!

การทำงานกับ unicode ใน C คือ ... มีค่าใช้จ่ายสูง ใช้อินพุตตามint*ที่แสดงในลิงก์และในข้อกำหนด

ฉันจะดูว่าฉันสามารถบันทึกไบต์โดยใช้เวทย์มนตร์ตัวเลขแทนการเข้ารหัสสตริงได้ไหม



@LeakyNun Huh ขอบคุณ! มันคือ 291 ไบต์ตาม TIO
Conor O'Brien

TIO จะนับโดยใช้SBCS
Leun Nun

6

PHP , 297 ไบต์

<?for(;$l<19;$l++)echo$l&1?strtr(vsprintf(str_pad("",67,"║ %d │ %d │ %d "),array_slice($_GET,9*($l/2^0)-9,9)),0," "):str_pad([╔,╟,╠,╚][$b=$l?$l<18?$l%6<1?2:1:3:0],108,strtr("11101110111".[╦,╫,╬,╩][$b],[[╤,═],[┼,─],[╪,═],[╧,═]][$b])).[╗,╢,╣,╝][$b],"
";

ลองออนไลน์!

ขยาย

for(;$l<19;$l++)  # loop thrpugh lines
  echo$l&1 # Output
    ?strtr(
        vsprintf(str_pad("",67,"║ %d │ %d │ %d ") # formated string for lines with numbers
        ,array_slice($_GET,9*($l/2^0)-9,9)) # nine items of the input array
      ,0," ") #replace zeros with space
    :str_pad([╔,╟,╠,╚][$b=$l?$l<18?$l%6<1?2:1:3:0] # start character non number lines and switch number four cases
      ,108 # fill too 108 bytes
      ,strtr("11101110111".[╦,╫,╬,╩][$b] # with string 
        ,[[╤,═],[┼,─],[╪,═],[╧,═]][$b]))  #replace ones and zero with the two character in array chosed 
    .[╗,╢,╣,╝][$b] # end row with chosen character
  ,"
    "; # end line with new line

ฟังก์ชั่นที่ใช้สำหรับทั้งสองรุ่น

vsprintf , strtr , str_pad , array_slice , array_chunk

PHP , 313 ไบต์

<?$r=($s=str_pad)(╔,108,($t=strtr)(($p=11101110111).╦,[╤,═])).╗;foreach(array_chunk($_GET,9)as$v)$r.=$t(vsprintf($s("
",68,"║ %d │ %d │ %d "),$v),0," ").(++$k%9?$k%3?$s("
╟",109,$t($p.╫,[┼,─])).╢:$s("
╠",109,$t($p.╬,[╪,═])).╣:"");echo$r.$s("
╚",109,$t($p.╩,[╧,═])).╝;

ลองออนไลน์!


มันทำงานอย่างไร
Cyoce

@Cyoce ฉันได้เพิ่มคำอธิบายสำหรับเวอร์ชั่นใหม่ของฉันแล้ว
JörgHülsermann

5

T-SQL, 445 437 ไบต์ (ใน 381 ตัวอักษร)

DECLARE @r INT=0,@ NVARCHAR(999)=N'╔=╤=╤=╦=╤=╤=╦=╤=╤=╗P'p:SELECT @+=FORMAT(CAST(SUBSTRING(a,@r*9+1,9)AS INT),N'║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║P')FROM t
SET @r+=1IF @r=9SET @+=N'╚=╧=╧=╩=╧=╧=╩=╧=╧=╝P'ELSE IF @r%3=0SET @+=N'╠=╪=╪=╬=╪=╪=╬=╪=╪=╣P'ELSE SET @+=N'╟-┼-┼-╫-┼-┼-╫-┼-┼-╢P'IF @r<9GOTO p
PRINT REPLACE(REPLACE(REPLACE(REPLACE(@,'=',N'═══'),'-',N'───'),'0',' '),'P',CHAR(13))

การป้อนข้อมูลผ่านทางสายหลักที่เก็บไว้ในคอลัมน์ของที่มีอยู่ก่อนตารางที , ต่อวิธีการที่ได้รับอนุมัติ

รูปแบบและคำอธิบาย :

DECLARE @r INT=0, @ NVARCHAR(999)= N'╔=╤=╤=╦=╤=╤=╦=╤=╤=╗P'
p:
    SELECT @+= FORMAT(CAST(SUBSTRING(a, @r*9+1, 9) AS INT),
        N'║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║P') FROM t
    SET @r+=1
    IF @r=9 SET @+= N'╚=╧=╧=╩=╧=╧=╩=╧=╧=╝P'
    ELSE IF @r%3=0 SET @+= N'╠=╪=╪=╬=╪=╪=╬=╪=╪=╣P'
    ELSE SET @+= N'╟-┼-┼-╫-┼-┼-╫-┼-┼-╢P'
IF @r<9 GOTO p
PRINT REPLACE(REPLACE(REPLACE(REPLACE(@, '=',N'═══'), '-',N'───'), '0',' '), 'P',CHAR(13))

ในบรรทัดด้านบนสุดของห่วงฉันได้รับที่อยู่ถัดจาก 9 หลักของสายป้อนจากคอลัมน์ของที่มีอยู่ก่อนตารางที

ฉันจะแปลงสตริงของตัวเลขที่เป็นจำนวนเต็มและใช้สุทธิฟังก์ชั่นที่จะแสดงให้พวกเขาใช้แม่แบบข้อความที่กำหนดเองFORMAT'║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║P'

หลังจากนั้นฉันเพิ่งต่อสายตัวแบ่งที่เหมาะสมและทำการแทนที่ไบต์ที่ประหยัดก่อนที่จะส่งออก

ผลลัพธ์จะปรากฏในบานหน้าต่างผลลัพธ์:

╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗
║ 8 │ 5 │   ║   │   │ 2 ║ 4 │   │   ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ 7 │ 2 │   ║   │   │   ║   │   │ 9 ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║   │   │ 4 ║   │   │   ║   │   │   ║
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
║   │   │   ║ 1 │   │ 7 ║   │   │ 2 ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ 3 │   │ 5 ║   │   │   ║ 9 │   │   ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║   │ 4 │   ║   │   │   ║   │   │   ║
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
║   │   │   ║   │ 8 │   ║   │ 7 │   ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║   │ 1 │ 7 ║   │   │   ║   │   │   ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║   │   │   ║   │ 3 │ 6 ║   │ 4 │   ║
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝

ก่อนหน้านี้ฉันมีการแทนที่เพิ่มเติมสำหรับอักขระการวาดอื่น ๆ บางส่วน แต่ในที่สุดพวกเขาก็ไม่ได้ช่วยฉันไบต์

แก้ไข 1 : บันทึกไว้ 8 ไบต์โดยเริ่มต้น@rที่ศูนย์แทน 1 และลบช่องว่างที่ไม่ต้องการออก


4

เรติน่า , 196 167 ไบต์

.{27}
¶N#=XZ#Q¶|$&
\d{9}\B
$&¶M#─┼Y#P¶|
\d{3}
 $& |
\B\d
 │ $&
^¶.*
B#=RT#E
$
¶H#=UW#K
+`#([^#¶]+)([^#¶])#
#$1#$2#$1#$2#$1#
#(.)#
$1$1$1
T`0=|#L` ═-╬

ลองออนไลน์! รับอินพุตเป็นสตริงที่มีความยาว 81 คำอธิบาย: เนื่องจากอักขระการวาดกล่องมีราคาสามไบต์จุดโค้ดยูนิโค้ด═-╬จะแสดงในรหัสโดยใช้=|#A-Z(ไม่ใช่อักขระทั้งหมดที่ใช้ นอกจากนี้แถวที่มีการบีบอัดโดยใช้#สัญญาณ: ขยายไปa#bcd#eabbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe

.{27}
¶N#=XZ#Q¶|$&

ส่วนแทรก╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣สำหรับแถวที่สามทุก ๆ บวก a เมื่อเริ่มต้นกลุ่ม 27 ทุกกลุ่ม

\d{9}\B
$&¶M#─┼Y#P¶|

แทรก╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ระหว่างแถวอื่นบวกs ที่จุดเริ่มต้นของแถวเหล่านั้น

\d{3}
 $& |

ส่วนแทรกของทุกๆสามหลัก ตอนนี้ทั้งหมดได้ถูกแทรก

\B\d
 │ $&

แทรก|s ระหว่างคู่ตัวเลขที่เหลือทั้งหมด (อันนี้เป็นตัวละครในการวาดกล่องจริง ๆ แทนที่จะเป็นไปป์โชคไม่ดีที่ตัวละคร─│┼มีรหัสที่อยู่ห่างจากกันมากเกินไปและตัวละครกล่องคู่จะทำให้มันคุ้มค่าในขณะที่ใช้ตัวยึดตำแหน่ง)

^¶.*
B#=RT#E

เปลี่ยนแถวแรกเป็น╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗(ซึ่งจะช่วยประหยัด 1 ไบต์ในการไม่เพิ่มแถวแรกในตำแหน่งแรก)

$
¶H#=UW#K

เพิ่ม╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝หลังจากแถวสุดท้าย

+`#([^#¶]+)([^#¶])#
#$1#$2#$1#$2#$1#

ขยายa#bcd#eแรกแล้วa#bc#d#bc#d#bc#ea#b#c#b#c#b#d#b#c#b#c#b#d#b#c#b#c#b#e

#(.)#
$1$1$1

การเปลี่ยนแปลงไป#b# bbbการบีบอัดข้อมูลเสร็จสมบูรณ์

T`0=|#L` ═-╬

ลบรายการศูนย์ทั้งหมดและแทนที่ตัวยึดด้วยอักขระวาดกล่อง


คุณลืมแทนที่0ด้วยช่องว่าง
Leun Nun

นอกจากนี้ยังมีสองบรรทัดรอบ ๆ ทุกแถวแทนที่จะเป็นเพียงแค่เส้นขอบและภูมิภาค 3x3
Joel Coehoorn

@JoelCoehoorn แก้ไขแล้วขออภัย
Neil

@LeakyNun ขอบคุณฉันจะมองข้ามสิ่งนั้น (นอกจากนี้ฉันต้องการหลีกเลี่ยงบรรทัดที่ลงท้ายด้วยหรือเว้นวรรคโดยเฉพาะอย่างยิ่งซึ่งเป็นสาเหตุที่ฉันค้นหาการประหยัดแบบ 2 ไบต์ทางเลือก)
Neil

3

SOGL V0.12 , 174 172 164 160 158 ไบต์

«ž#>]Wž²6√±_ΕΨ╥╬]v←ē⅓ZΗ⌡z∫◄‽q   §↑╗∑Ολ[Μ↕z↓/∆Yn⁄:Ο║χ≥¾▓g*≈]═+π℮─6⁽SE/⁷,0+►Ƨ⌡u\^⁄-▼0cΦ“╤─┼╬│║═╔╗╚╝”Φ⅜nΡ¡ΞΨīŗ(`½│uģ“ ╬ζ─{ζ} 6Δ¹∑A'⁄─{IaW}¹∑#¶ŗ3 ¶ŗ ”+Ƨøp+!!┌d0@ŗčŗ

คำอธิบายที่ยาวเกินไป:

...“                          push a big base-43 encoded number; will be used later. It's pushed here to save a byte on a quote
    ...”                      push "╤─┼╬│║═╔╗╚╝" - the chars in SOGLs encoding
        ...“                  push 679301851737965572513837476350078477
             ╬                push "╬"
              ζ               convert it to its codepoint (9580)
               ─              convert that number to an array of base-9580 numbers
                {ζ}           convert each number to a character (pushing each on the stack)
                    6Δ        push all ascii chars up to 6 (" !"#$%&'()*+,-./0123456")
                      ¹∑      join all the strings on the stack together ("╤─┼╬│║═╔╗╚╝╦╟╫╢╠╪╣╧╩ !"#$%&'()*+,-./0123456")
                        A     save on variable `A`. Now ontop of the stack is the 1st big number
                         '⁄─  onvert from base 43

{   }                           for each number do
 I                                increase
  aW                              get its position in the variable A
     ¹∑                         join all the strings ontop of the stack (the loop above pushed each char separately)
       #¶ŗ                      replace quote (") characters with newlines
          3 ¶ŗ                  replace 3s with "¶"
               ”+               append "”"
                 Ƨøp+           append "øp"
                     !!         execute the created code as SOGL
                       ┌        push "-"
                        d       push variable d - defaults to string input. In a full program could be set as an input
                         0@ŗ    replace zeroes with spaces
                            č   chop into an array
                             ŗ  replace ["-" with input chopped - so each iteratively]

โปรแกรมที่ดำเนินการ:

───!#
 - $
¶%&¶'(
)╪)╪)+
)╤)╤),
)╧)╧).
┼#
+╬+/
0!╫0!1
,╦,2
.╩.4
5│$║&
#0
═══)
$│$5
║&&%
╠/╬+╣6'*
╟1╫0!╢(
(6
╔2╦,╗6'**╚4╩.╝”øp

ซึ่งทั้งหมด in the entire program replace occurrences of the last char of this line with the rest of this lineแต่บรรทัดสุดท้ายเป็นเพียง นี่คือเหตุผลที่เป็นไปได้ที่จะสร้างครึ่งหนึ่งของตัวอักษรเพียงแค่ ASCII แบบสุ่ม (แต่การทำให้ช่องว่างขีดกลางและเครื่องหมายคำพูดถูกใช้อย่างมีประโยชน์ใช้เวลาสักครู่เพื่อคิดออก)

...”    push the whole sudoku grid
    øp  print nothing (prevents bug that this code would already print and pop the result)

ลองที่นี่!
รหัสล่ามออนไลน์นั้นถูกต้องมากขึ้นเนื่องจากแท็บไม่ทำงานกับ SE

-8 ไบต์: การแทนที่เดรัจฉานแบบแรงบีบอัดทั้งบอร์ดจากนั้นแทนที่ตัวอักษรแปลกปลอม (ไปยังเพจเพจ) ด้วยโค้ดเพจของพวกเขา การทำเช่นนี้ใช้เวลาน้อยกว่าหนึ่งชั่วโมงโปรแกรมเก่า ...
-4 ไบต์: การบีบอัดสตริงที่บีบอัด ...
-2 ไบต์: การใช้ตัวแปร + สตริงแทนอาร์เรย์


2

JavaScript (ES6), 246 ไบต์ / 198 ตัวอักษร

(n,r=(x,y)=>x+y+x+y+x,q=s=>([u,w,x,y,z]=[...s[0]],u+r(r(w+w+w,x),y)+z+`
`))=>q`╔═╤╦╗`+n.reduce((o,v,i)=>o+"║││"[i++%3]+` ${v||" "} `+(i%9?e:`║
`+(i-27&&i-54?i<81?q`╟─┼╫╢`:e:q`╠═╪╬╣`)),e="")+q`╚═╧╩╝`

อินพุตเป็นอาร์เรย์ของจำนวนเต็ม ลงเอยด้วยการใช้ฟังก์ชันผู้ช่วยสองแบบเดียวกับคำตอบ Python ของ Leaky Nunดังนั้นเครดิตจึงไปที่นั่น

หากfunctionจำเป็นต้องใช้ 263 ไบต์ / 215 ตัวอักษร

function g(n,r=(x,y)=>x+y+x+y+x,q=s=>([u,w,x,y,z]=[...s[0]],u+r(r(w+w+w,x),y)+z+`
`)){return q`╔═╤╦╗`+n.reduce((o,v,i)=>o+"║││"[i++%3]+` ${v||" "} `+(i%9?e:`║
`+(i-27&&i-54?i<81?q`╟─┼╫╢`:e:q`╠═╪╬╣`)),e="")+q`╚═╧╩╝`}

ตัวอย่างการทดสอบ

รองรับอินพุตใดก็ได้ที่มี 81 หมายเลข ( 1234, 1, 2, 3, 4. [1 2 3 4], ฯลฯ ) ดูได้ดีที่สุดแบบเต็มหน้า

f=
(n,r=(x,y)=>x+y+x+y+x,q=s=>([u,w,x,y,z]=[...s[0]],u+r(r(w+w+w,x),y)+z+`
`))=>q`╔═╤╦╗`+n.reduce((o,v,i)=>o+"║││"[i++%3]+` ${v||" "} `+(i%9?e:`║
`+(i-27&&i-54?i<81?q`╟─┼╫╢`:e:q`╠═╪╬╣`)),e="")+q`╚═╧╩╝`

onload=I.oninput=_=>O.innerHTML=(m=I.value.match(/\d/g))&&m.length==81?f(m.map(x=>+x)):''
<textarea id=I rows=3 style="width:95%">8, 5, 0, 0, 0, 2, 4, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 2, 3, 0, 5, 0, 0, 0, 9, 0, 0 ,0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 7, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 0, 4, 0</textarea>
<pre id=O>


2

รุ่นที่ 332 ไบต์

@echo off
set/ps=
set s=%s:0= %
call:l É Í Ñ Ë »
set t="Ç Ä Å × ¶"
for %%i in (%t% %t% "Ì Í Ø Î ¹" %t% %t% "Ì Í Ø Î ¹" %t% %t% "È Í Ï Ê ¼")do call:c %%~i
exit/b
:c
set t=º
for %%j in (³ ³ º ³ ³ º ³ ³ º)do call set t=%%t%% %%s:~,1%% %%j&call set s=%%s:~1%%
echo %t%
:l
set t=%2%2%2%3%2%2%2%3%2%2%2
echo %1%t%%4%t%%4%t%%5

ต้องการคอนโซลที่จะอยู่ใน CP437 หากไม่ใช่ค่าเริ่มต้นของคุณคุณสามารถเปลี่ยนได้โดยใช้CHCP 437คำสั่งหากคอนโซลของคุณตั้งค่าเป็นแบบอักษร TrueType (มันจะใช้งานได้เฉพาะกับแบบอักษรแรสเตอร์เท่านั้นหาก CP437 เป็นหน้ารหัสเริ่มต้นของคุณอยู่แล้ว) นี่คือลักษณะของรหัสใน CP437:

@echo off
set/ps=
set s=%s:0= %
call:l ╔ ═ ╤ ╦ ╗
set t="╟ ─ ┼ ╫ ╢"
for %%i in (%t% %t% "╠ ═ ╪ ╬ ╣" %t% %t% "╠ ═ ╪ ╬ ╣" %t% %t% "╚ ═ ╧ ╩ ╝")do call:c %%~i
exit/b
:c
set t=║
for %%j in (│ │ ║ │ │ ║ │ │ ║)do call set t=%%t%% %%s:~,1%% %%j&call set s=%%s:~1%%
echo %t%
:l
set t=%2%2%2%3%2%2%2%3%2%2%2
echo %1%t%%4%t%%4%t%%5

2

ด้วยแนวคิดที่เก็บเกี่ยวจากคำตอบอื่น ๆ :

C # (. NET Core) , 401 ไบต์, 349 ตัวอักษร

string s(string x){Func<string,string,string>q=(m,n)=>m+n+m+n+m;var a="╔"+q(q("=","╤"),"╦")+"╗";for(var i=0;i<9;) {a+=int.Parse(x.Substring(i*9,9)).ToString("\n║"+q(q(" 0 ","│"),"║")+"║\n")+(i++<8?(i%3>0?"╟"+q(q("-","┼"),"╫")+"╢":"╠"+q(q("=","╪"),"╬")+"╣"):"╚"+q(q("=","╧"),"╩")+"╝");}return a.Replace("=","═══").Replace("-","───").Replace("0"," ");}

Ungolfed:

static public string s(string x)
{
    Func<string,string,string>q=(m,n)=>m+n+m+n+m;
    var a="╔"+q(q("=","╤"),"╦")+"╗";
    for (var i=0;i<9;) //once per row
    {
        //parse that row to an int, then spit out a formatted string
        a += int.Parse(x.Substring(i*9,9)).ToString("\n║"+q(q(" 0 ","│"),"║")+"║\n") 
          // as well as a trailing row for the box
          + (i++<8?(i%3>0?"╟"+q(q("-","┼"),"╫")+"╢":"╠"+q(q("=","╪"),"╬")+"╣"):"╚"+q(q("=","╧"),"╩")+"╝");
    }
    //expand placeholder characters before returning
    return a.Replace("=","═══").Replace("-","───").Replace("0"," ");
}

ลองออนไลน์!

คำตอบของฉัน:

C # (.NET Core) , 509 430 418 ไบต์, 328 ตัวอักษร

string b(string x){var a="╔=╤=╤=╦=╤=╤=╦=╤=╤=╗\n║";for(int i=0,j=0,k,l,m;j<3;j++)for(k=0;k<3;k++){for(l=0;l<3;l++)for(m=0;m<3;)a+=" "+x[i++]+(m++<2?" │":" ║");a+=i<80?(k<2?"\n╟-┼-┼-╫-┼-┼-╫-┼-┼-╢\n║":"\n╠=╪=╪=╬=╪=╪=╬=╪=╪=╣\n║"):"\n╚=╧=╧=╩=╧=╧=╩=╧=╧=╝";}return a.Replace("=","═══").Replace("-","───").Replace("0"," ");}

Ungolfed:

public string s(string x)
{
    var a = "╔=╤=╤=╦=╤=╤=╦=╤=╤=╗\n║";
    for (int i=0,j=0,k,l,m;j<3;j++)
    {
        for (k = 0; k < 3;k++)
        {
            for (l = 0; l < 3; l++)
            {
                for (m = 0; m < 3;)
                    a += " " + x[i++] + (m++ < 2 ? " │" : " ║");
            }
            a += i < 80 ? (k < 2 ? "\n╟-┼-┼-╫-┼-┼-╫-┼-┼-╢\n║": "\n╠=╪=╪=╬=╪=╪=╬=╪=╪=╣\n║") 
                        : "\n╚=╧=╧=╩=╧=╧=╩=╧=╧=╝";
        }
    }
    return a.Replace("=", "═══").Replace("-","───").Replace("0"," ");
}

I also looked at using a lambda for the `for` loops here, but it actually cost me one byte (saved 10 bytes per loop, with 41 bytes of overhead).

ลองออนไลน์!


คุณจำเป็นต้องนับอักขระการวาดภาพแต่ละตัวเป็นสองไบต์หรือไม่?
BradC

ฉันทำแล้วตอนนี้ ฉันหมายถึงที่อยู่ที่เป็นปัญหาและนับตัวอักษรมากกว่าไบต์เนื่องจากตัวละครเหล่านั้น แต่ฉันคิดว่ามันสายเกินไปแล้ว
Joel Coehoorn

ใช่ไบต์ยากขึ้นการแทนที่ ASCII บางส่วนจะช่วยประหยัดไบต์ แต่จะไม่ส่งผลกระทบต่อตัวละคร (หรือแม้กระทั่งทำร้ายตัวละคร) ฉันทำงานกับ T-SQL และ char vs nchar นั้นแตกต่างกันมาก
BradC

1

ชิป 3645 ไบต์

... นั่นไม่ใช่การพิมพ์ผิด ...

ooooooZZ-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-).
|`xxxx-x--(x---x---x---x---x-v-x---x---x---x---x---x-.`K-)-K-)-K-)-K-).
|b|`xx-x--(x-v-x---x-v-x---x-x-x---x-v-x---x-v-x---x-x-x---x-v-x---x-.`K-).
|>xd`x-x(v-x-x-x-v-x-x-x-v-x-x-x-v-x-x-x-v-x-x-x-v-x-x-x-v-x-x-x-v-x-x-x-.|
||`--x-x-x(x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x/.
|`--z',/\',/\',/\',/\',/\',/\',/\',/\',/\',/\',/\',/\',/\',/\',/\',/\',/\','
`-. |,< >.| >.| >.| >.| >.| >.| >.| >.| >.| >.| >.| >.| >.| >.| >.| >.| >.|
*-x-/xZ/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ^/xZ'
Z~' |`'|`' |`' |`' |`' |`' |`' |`' |`' |`' |`' |`' |`' |`' |`' |`' |`','`'
    `)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)-K-)'
=
oooooo).h
`)))--^M^Zh
=
oooooo
|    `(--------------------------------------------------------------------------------------------------------va
KZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ^cg
)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx-xKZvvZ
xxxxxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxxx-Kxxxx}e
)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)x))xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)x))xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)x)b`feac
  c
=
oooooo
,'   `(--------------------------------------------------------------------------------------------------------.cba
KZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ^x^^)v--.
xx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxxx-xK-'f e`.
)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx-x-K-+Z+Z}e
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxK^}b gac
xxxxxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxxx-K^d
=
oooooo
,-'
KZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZtabgfv------.
)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx-xK^^x-Zv-vZ}e
xxxxxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxxxK^---^}cade,]b
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)-K----^-^^~'
,v'
db
=
oooooo
,--' `(--------------------------------------------------------------------------------------------------------v-.,-v-ZZZZZZZZZZZZf
KZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'a{x.df
)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xx)xxKx-xxv+Zc
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)x-KZx+bge
xx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxx)xxxxxxxxxxxx---K\--^c
 a^b
=
oooooo
,---'`(--------------------------------------------------.
KZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'gf
)xxxxx)xxxxx)xxxxx)xxxxx)xxxxx)xxxxx)xxxxx)xxxxx)xxxxx)xx-^KZc
)xxxxx)x)xxx)x)xxx)xxxxx)x)xxx)x)xxx)xxxxx)x)xxx)x)xxx)xxbahKZ\ZZZ
x))xxxxxxxxxxxxxxxx))xxxxxxxxxxxxxxxx))xxxxxxxxxxxxxxxx))-K-eh|fff
 ,--K-v-v-K--v-vK-v---K-----K-----K-----K-----K-----K `--Z-Z--'
A/ab/B/e/C/cd/D/-e/A
*}s

ลองออนไลน์! ประเภทของ รุ่น TIO มีทางลัดประมาณหนึ่งในสามของทางเข้า ( tหลังจากวันที่ 4oooooo ) ดังนั้นจึงควรยุติในเวลาไม่ถึง 60 วินาที เวอร์ชันเต็มใช้เวลาประมาณ 1m25s บนเครื่องของฉันและ TIO นั้นเร็วกว่าครึ่งหนึ่ง สิ่งนี้หมายความว่า TIO แสดงเฉพาะเอาต์พุต 7 บรรทัดแรกเท่านั้น

ร่างแรกของฉันชั่งน้ำหนักที่ไบต์ขนาดใหญ่ 19758 และเอาฉันไปประมาณ 8m30s ในการทำงาน ทางออกสุดท้ายคือการเล่นกอล์ฟล่วงหน้ามีขนาด 5980 ไบต์ใช้เวลาเพียง 2m07s

แล้วมันเป็นยังไงบ้าง?

สิ่งนี้ใช้สตริง 82 ไบต์, 81 หลักตามด้วยตัวยุติ \0หรือ\nหรือแม้แต่หมายเลขอื่นจะทำ (การนำไปปฏิบัติจริง ๆ แล้วดูที่ 81 ครั้งแรกเท่านั้น แต่ต้องมีอย่างน้อยหนึ่งรายการเนื่องจากชิปจะยุติหากอินพุตของตนหมดลงหากไม่สามารถยอมรับได้-zอาจมีการใช้การตั้งค่าสถานะซึ่งจะผนวกจำนวน\0ไบต์ที่ไม่มีที่สิ้นสุดในตอนท้ายของอินพุต) รหัส TIO ที่สั้นลงไม่ได้ไปถึง 81 ไบต์ทั้งหมด

วิธีที่ฉันใช้งานนี้มันจะดูเพียง 4 บิตต่ำของอินพุตดังนั้นอะไรก็ตามจริงๆอาจเป็น 'ปริศนา' ซูโดกุจากข้อมูลไบนารีดิบไปจนถึงงานที่รู้จักกันน้อยกว่าของเชคสเปียร์ อักขระใด ๆ ที่มีบิตต่ำ 4 บิตจะมีศูนย์ทั้งหมดจะปรากฏเป็นช่องว่าง (กรณีพิเศษ) อักขระอื่น ๆ ทั้งหมดจะจับคู่123456789:;<=>?กัน (ดังนั้นตัวเลขสองสามตัวสุดท้ายไม่ใช่ตัวเลข แต่ไม่ใช่ตัวเลข 10 ที่ถูกต้องในซูโดกุปกติ)

สำหรับตัวละครแบบกล่องมันจะสร้าง UTF-8 ซึ่งเท่ากับ 3 ไบต์ต่อตัว

สิ่งที่เกี่ยวกับการใช้งานจริง?

ชิพเป็นภาษา 3 มิติที่ได้รับแรงบันดาลใจจากวงจรรวม มันมีสายประตูตรรกะและเซลล์หน่วยความจำ สิ่งต่าง ๆ ส่วนใหญ่จะทำบนเครื่องบิน 2 มิติ แต่เครื่องบินเหล่านี้อาจถูกซ้อนทับกัน นั่นคือวิธีการสร้างโปรแกรมนี้

บรรทัดที่ขึ้นต้นด้วย=เป็นตัวคั่นเลเยอร์ จากนั้นเลเยอร์จะซ้อนกันโดยจัดด้านบนและด้านซ้ายชิด o's ทำหน้าที่เป็นขาที่ช่วยให้สัญญาณที่จะผ่านจากชั้นหนึ่งไปยังอีก

แต่ละเลเยอร์ที่นี่มีจุดประสงค์คุณสามารถคิดว่ามันเป็นหน้าที่ ชั้นแรกจะควบคุมทุกอย่าง มัน 'เรียก' แต่ละเลเยอร์อื่น ๆ ในทางกลับกัน มีรูปแบบซ้ำซากจากซ้ายไปขวาที่นี่ รูปแบบนั้นติดตามว่าเราพิมพ์งานใดใน 19 บรรทัด

เลเยอร์ที่สองนั้นค่อนข้างเล็กและมีงานเล็กมาก มันตั้งค่า0x80บิตสำหรับทุกบรรทัดของการส่งออกยกเว้นบรรทัดที่มีตัวเลข hเป็นองค์ประกอบชิปที่สอดคล้องกับ0x80บิต (จุดต่ำสุดของตัวอักษรhผ่านการaกำหนดเอาต์พุตแปดบิตทั้งหมด)

เลเยอร์สามคือที่ที่เราเข้าสู่เนื้อของการพิมพ์ เลเยอร์นี้อยู่ในความดูแลของหนึ่งบรรทัด เวอร์ชันที่ไม่ได้รับการอวดนั้นมีแปดแถวของxและ)ของแมปกับ 0 และ 1 สำหรับแต่ละแปดบิตของแต่ละไบต์ อย่างไรก็ตามเราสามารถใช้ประโยชน์จากรูปแบบในบิตเพื่อให้งานเดียวกันสำเร็จในแถวที่น้อยลง

เลเยอร์ที่สี่นั้นเหมือนกับที่สาม มันจัดการเส้นคู่แนวนอน

ชั้นที่ห้าจัดการกับบรรทัดสุดท้าย โปรดสังเกตว่ามันขาดสายตามด้านบนที่ชั้นอื่น ๆ มี นี่เป็นเพราะเราไม่จำเป็นต้องกลับไปควบคุมซีเควนเซอร์ tแต่เราก็สามารถยุติการดำเนินการที่นี่ด้วย

เลเยอร์หกจัดการกับเส้นเดี่ยวแนวนอน

Layer เจ็ดเป็นที่ที่พิมพ์ตัวเลข มันคือ 'เรียกว่า' สำหรับแต่ละบรรทัดที่เก้าตัวเลข มันใช้ 9 ไบต์ของอินพุตเป็นส่วนหนึ่งของการดำเนินการ


1

JavaScript (ES6), 222 ไบต์

การใช้ไวยากรณ์แบบสั้นสำหรับฟังก์ชั่น ES6 - 174 ตัวอักษรที่เข้ารหัสใน utf8, 222 ไบต์ ( https://mothereff.in/byte-counter ) การใช้function ...ต้องมี 16 ไบต์เพิ่มเติม

F=v=>[1,...v].map((x,i)=>'│║│'[i%3]+` ${x||' '} `+(i%9?'':`║
${[h,r,s,u,t]=i%27?'─╟╫┼╢':i>80?'═╚╩╧╝':i?'═╠╬╪╣':'═╔╦╤╗',r+(s=(u=(h+=h+h)+u+h+u+h)+s)+s+u+t}
`)).join``.slice(6)

น้อย golfed

F=v=>{
   // horizontal lines are appended after each 9th element
   // so I need to prepend a dummy first element to draw the top horizontal line
   v = [1, ...v];
   return v.map( (x,i) => 
     '│║│'[i % 3] + ` ${x||' '} ` // left bar and cell value
     + ( i % 9 ? '' // add horizontal line after each 9th element
       // the line drawing characters are chosen according to the value of i
       : `║\n${ [h, r, s, u, t] = 
         i % 27 != 0
         ? '─╟╫┼╢'
         : i > 80 
           ? '═╚╩╧╝' // i==81, bottom row
           : i != 0
             ? '═╠╬╪╣'
             : '═╔╦╤╗', // i==0, top row
         r + (s = (u = (h += h + h) + u + h + u + h) + s) + s + u + t
         }\n`
       )
   ).join``
   .slice(6) // cut the first cell (the dummy element)
}

F=v=>[1,...v].map((x,i)=>'│║│'[i%3]+` ${x||' '} `+(i%9?'':`║
${[h,r,s,u,t]=i%27?'─╟╫┼╢':i>80?'═╚╩╧╝':i?'═╠╬╪╣':'═╔╦╤╗',r+(s=(u=(h+=h+h)+u+h+u+h)+s)+s+u+t}
`)).join``.slice(6)

function go() {
  var i=I.value
  i = i.match(/\d+/g).map(x => +x); // convert strings to numbers
  O.textContent = F(i)
}
#I { width: 90% }
<input id=I value='8 5 0 0 0 2 4 0 0 7 2 0 0 0 0 0 0 9 0 0 4 0 0 0 0 0 0 0 0 0 1 0 7 0 0 2 3 0 5 0 0 0 9 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 7 0 0 1 7 0 0 0 0 0 0 0 0 0 0 3 6 0 4 0'>
<button onclick='go()'>go</button>
<pre id=O></pre>


1

Java (OpenJDK 8) , 279 ไบต์

String f(int[]a){String P="0121213121213121214",R[]={"╔═╤╦╗","║ │║║x","╟─┼╫╢","╠═╪╬╣","╚═╧╩╝"},r="";for(int X:P.getBytes()){for(int x:P.replace("1",R[X-=48].length()>5?"151":"111").getBytes())r+=R[X].charAt(x-48);r+="\n";}for(int i:a)r=r.replaceFirst("x",i>0?""+i:" ");return r;}

ลองออนไลน์!

สำหรับจำนวนไบต์ให้ใช้ CP-437 ซึ่งได้รับการสนับสนุนโดย JavaในฐานะIBM437(API ล่าสุด) หรือCp437(API ที่เก่ากว่า); ดังนั้นใช้ระบบที่มีชุดอักขระนี้มีชุดอักขระนี้เป็นชุดอักขระเริ่มต้น

รหัสนี้เข้ากันได้กับ Java 5 เป็นต้นไป แต่ได้รับการทดสอบบน Java 8 เท่านั้น

คำอธิบาย

String f(int[]a){
  String P="0121213121213121214",                         // Both lines and rows are repeated according to this pattern.
         R[]={"╔═╤╦╗","║ │║║x","╟─┼╫╢","╠═╪╬╣","╚═╧╩╝"},  // Characters found on each line.
                                                          //   (note the 'x')
         r="";                                            // The string under construction
  for (int X: P.getBytes()) {                             // For each line,
    for (int x:                                           //  For each character in the pattern,
         P.replace("1",R[X-=48].length()>5?"151":"111")   //    *but* with a cell width of 3,
                                                          //    and with an optional character ('x')
         .getBytes())
      r+=R[X].charAt(x-48);                               //   append the real mapped character
    r+="\n";                                              //  then append a new line
  }
  for(int i:a)                                            // For each number in the input
    r = r.replaceFirst("x",i>0?""+i:" ");                 //  replace the first 'x' with that number.
                                                          //    (or space if zero)
  return r;                                               // Return the constructed string.
}

1

Tcl , 599 ไบต์ (295 ตัวอักษร)

วิธีการที่ไร้เดียงสามาก แต่ฉันต้องทำมันแม้ว่ามันจะไม่ได้เป็นผู้ชนะโดยวิธีการใด ๆ :

puts ╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗
set r ║ 
lmap x $L {if !$x {set x \ }
set r $r\ $x\ [expr [incr i]%3?"│":"║"]
if ![expr $i%9] {puts $r\n[expr $i%27?"╟───┼───┼───╫───┼───┼───╫───┼───┼───╢":$i<72?"╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣":"╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝"]
set r ║}}

ลองออนไลน์!


นั่นคือ 599 UTF-8 ไบต์ คุณควรลองนำอักขระกล่องทั่วไปมาใช้ซ้ำเพื่อบันทึกไบต์
dzaima

@dzaima: ฉันรู้ว่าฉันสามารถทำสิ่งที่ฉันทำบนแป้นพิมพ์เพื่อให้คุณสามารถเกือบจะเป็นจริง
sergiol

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