Gambar papan sudoku menggunakan karakter menggambar garis


20

Ini kode golf. Untuk tantangan ini, saya akan menerima metode (Anda tidak perlu program lengkap), tetapi metode signature tidak dihitung terhadap jumlah byte dan saya ingin melihat tanda tangan penuh (bukan lamdba). Input untuk metode ini adalah array integer dengan 81 elemen. Nilai output / return dari metode adalah string yang mewakili array sebagai papan sudoku ascii.

Jika Anda menggunakan bahasa esoterik atau sesuatu yang sama sekali tidak memiliki metode, Anda dapat beradaptasi, tetapi jika bahasa tersebut mendukung hal ini, saya ingin melihat sesuatu yang mungkin benar-benar dicolokkan ke dalam program ungolfed "nyata", bahkan jika Metode tubuh itu sendiri adalah rasa sakit untuk bekerja dengan. Persyaratan ini tidak dimaksudkan untuk memblokir bahasa seperti Jelly atau 05AB1E, tetapi untuk membuatnya lebih mudah bagi bahasa seperti Java untuk membangun sesuatu yang masuk akal untuk platform itu.

Untuk input, nilai integer 1-9 harus memiliki makna yang jelas. A 0 harus selalu ditafsirkan sebagai sel kosong. Anda juga dapat menafsirkan hal lain di luar rentang 1-9 sebagai sel kosong, tetapi ini tidak wajib. Posisi dari array ke puzzle dimulai di kiri atas dan mengisi setiap baris dari kiri ke kanan sebelum pindah ke baris berikutnya.

Untuk kotak, saya ingin garis ganda di luar dan di antara setiap wilayah 3x3, dan garis tunggal di antara sel lainnya. Ini harus digambar dengan karakter menggambar garis (jika format I / O Anda mewakili string sebagai urutan byte daripada urutan karakter, Anda harus mewakili mereka dalam pengkodean terkenal seperti UTF-8 atau codepage 347).

Untuk tantangan ini, saya TIDAK meminta Anda untuk menghasilkan teka-teki sudoku. Itu adalah input untuk fungsi. Saya TIDAK meminta Anda untuk memecahkan teka-teki. Saya hanya meminta Anda untuk menghasilkan string untuk "menggambar" apa yang Anda berikan (sesedikit mungkin byte).

Input Contoh:

Nilai untuk array:

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

Nilai-nilai dapat menggunakan mekanisme apa pun yang alami untuk bahasa Anda: int [], ArrayList, urutan, tuple, string digit, apa pun, asalkan Anda memiliki nilai dalam input untuk setiap sel (tidak ada peta untuk hanya sel yang terisi ke posisi ). Ingat bahwa input diberikan ... itu bukan bagian dari jumlah byte Anda. Tapi input mungkin mewakili setiap sudoku puzzle, dan teka-teki bahkan mungkin tidak memiliki solusi yang valid . Anda dapat mengasumsikan bahwa puzzle dapat dicetak. Anda tidak akan mendapatkan sesuatu dengan 82 elemen, misalnya.

Anda juga bisa menganggap font dengan lebar tetap yang masuk akal.

Output yang sesuai:

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

4
Apakah Anda yakin tentang bagian metode? Itu tidak masuk akal untuk banyak bahasa (yaitu, bahasa tanpa metode).
Cyoce

1
Untuk bahasa yang tidak memiliki metode, Anda dapat beradaptasi. Tetapi jika mereka melakukannya, saya mencari sesuatu yang mungkin sebenarnya berguna untuk dihubungkan ke program "nyata". Saya akan menambahkan itu ke pertanyaan.
Joel Coehoorn

2
Apa alasan untuk tidak mengizinkan lambda? Itu pasti bisa dicolokkan ke dalam program "nyata" seperti halnya fungsi / metode
Julian Wolf

2
Nitpicky tapi penting: Tidak ada yang namanya "karakter menggambar kotak ASCII." ASCII mencakup kode 0 hingga 127, tidak ada yang merupakan karakter menggambar kotak. Dalam beberapa kali, Unicode adalah standar, tetapi memiliki beberapa pengkodean yang berbeda: UTF-8, UTF-16 dll, yang semuanya menggunakan lebih dari 1 byte per karakter kotak-menggambar. Pengkodean yang lebih lama seperti Codepage 437 mendukung karakter menggambar kotak byte tunggal. Saat Anda menggunakan karakter di luar rentang ASCII, Anda harus menentukan pengkodean mana yang valid. en.wikipedia.org/wiki/Box-drawing_character en.wikipedia.org/wiki/Unicode
Level River St

2
"Metode" mungkin harus "dinamai fungsi" untuk mendapatkan yang setara dengan metode dalam bahasa yang tidak berorientasi objek. (Misalnya, C, bahasa yang digunakan secara luas, tidak memiliki metode tetapi memiliki fungsi yang dinamai.) Dalam sebagian besar bahasa yang saya ketahui memiliki metode, mereka adalah bahasa yang setara dengan fungsi yang disebutkan. (Pengecualian paling terkenal yang saya ketahui adalah C ++, di mana menggunakan fungsi bernama akan jauh lebih masuk akal untuk tugas ini daripada menggunakan metode, karena benar-benar tidak jelas objek seperti apa yang akan Anda kaitkan dengan metode ini. .)

Jawaban:


9

Python 3 , 232 byte

Terima kasih kepada mereka yang telah membantu menurunkan golf ini.

Enkripsi dalam enkripsi ...

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

Cobalah online!

Untuk golf.


Bagaimana saya tidak menyadari bahwa ... itu seperti seluruh alasan mengapa saya menggunakan Python 2, tapi terima kasih.
Leaky Nun

1
Sebenarnya Anda lebih baik menggunakan Python 3 sejak itu Anda tidak perlu baris pertama.
Erik the Outgolfer

1
Anda dapat menghapus lebih banyak parens di baris terakhir: tio
Conor O'Brien

Hapus definisi f dan definisikan i as i=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]save 4 bytes
officialaimm

7

C (gcc) , 398 395 291 byte

Disimpan 3 byte dengan bekerja melalui string terbalik, dan 104 (!) Byte terima kasih kepada 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);}

Cobalah online!

C (gcc) , 395 byte

Saya akan menyimpan ini di sini sehingga lebih jelas bagaimana program bekerja.

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

Cobalah online!

Bekerja dengan unicode di C adalah ... mahal. Mengambil input seperti yang int*ditunjukkan pada tautan dan dalam spesifikasi.

Saya akan melihat apakah saya dapat menyimpan byte menggunakan sejumlah angka alih-alih hardcoding string.



@ LeakyNun Huh, terima kasih! Ini 291 byte menurut TIO
Conor O'Brien

TIO sedang menghitung menggunakan SBCS .
Leaky Nun

6

PHP , 297 byte

<?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],"
";

Cobalah online!

Diperluas

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

fungsi yang digunakan untuk kedua versi

vsprintf , strtr , str_pad , array_slice , array_chunk

PHP , 313 byte

<?$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.╩,[╧,═])).╝;

Cobalah online!


Bagaimana cara kerjanya?
Cyoce

@Cyoce Saya telah menambahkan penjelasan untuk versi baru saya
Jörg Hülsermann

5

T-SQL, 445 437 byte (dalam 381 karakter)

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

Input adalah melalui serangkaian digit yang disimpan dalam kolom a dari tabel t yang sudah ada , per metode yang disetujui .

Format dan Penjelasan :

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

Pada baris teratas loop saya mendapatkan 9 digit berikutnya dari string input dari kolom a dari tabel yang sudah ada t .

Saya mengonversi string angka itu menjadi bilangan bulat, dan menggunakan FORMATfungsi .Net untuk menampilkannya menggunakan templat teks khusus '║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║P'.

Setelah itu saya hanya menambahkan garis pembagi yang sesuai, dan membuat beberapa penggantian byte-saving sebelum output.

Output ditampilkan di panel hasil:

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

Saya sebelumnya memiliki beberapa penggantian tambahan untuk beberapa karakter menggambar lainnya, tetapi mereka akhirnya tidak menyelamatkan saya byte.

EDIT 1 : Disimpan 8 byte dengan mulai @rdari nol, bukan 1, dan menghapus beberapa ruang yang tidak dibutuhkan.


4

Retina , 196 167 byte

.{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` ═-╬

Cobalah online! Mengambil input sebagai string dengan panjang 81. Penjelasan: Karena karakter menggambar kotak harganya tiga byte, titik kode unicode ═-╬diwakili dalam kode menggunakan =|#A-Z(tidak semua karakter digunakan tetapi tetap dengan rentang menghemat byte byte). Selain itu baris dikompresi menggunakan #tanda: a#bcd#eexpands to abbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe.

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

Sisipan ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣untuk setiap baris ketiga, ditambah pada awal setiap grup yang beranggotakan 27 orang.

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

Menyisipkan di ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢antara baris-baris lain, plus di awal baris-baris itu.

\d{3}
 $& |

Sisipan setelah setiap tiga digit. Semua s sekarang telah dimasukkan.

\B\d
 │ $&

Sisipan |di antara semua pasangan digit yang tersisa. (Yang ini adalah karakter menggambar kotak yang sebenarnya daripada pipa. Sayangnya karakter ─│┼memiliki kode yang terlalu jauh satu sama lain dan karakter kotak ganda untuk membuatnya bernilai saat menggunakan placeholder.)

^¶.*
B#=RT#E

Mengubah baris pertama menjadi ╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗(ini menghemat 1 byte lebih dari tidak menambahkan baris pertama di tempat pertama).

$
¶H#=UW#K

Menambahkan ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝setelah baris terakhir.

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

Perluas a#bcd#e, pertama ke a#bc#d#bc#d#bc#e, lalu ke a#b#c#b#c#b#d#b#c#b#c#b#d#b#c#b#c#b#e.

#(.)#
$1$1$1

Perubahan #b#ke bbb. Ini melengkapi dekompresi.

T`0=|#L` ═-╬

Menghapus semua entri nol, dan mengganti placeholder dengan karakter menggambar kotak.


Anda lupa mengganti 0dengan spasi.
Leaky Nun

Juga memiliki garis ganda di setiap baris, bukan hanya wilayah perbatasan dan 3x3.
Joel Coehoorn

@ JoelCoehoorn Diperbaiki, maaf.
Neil

@ LeakyNun Terima kasih, saya telah mengabaikan itu. (Juga, saya suka menghindari garis yang diakhiri dengan, atau terutama hanya berisi spasi, itulah sebabnya saya mencari alternatif penghematan 2-byte.)
Neil

3

SOGL V0.12 , 174 172 164 160 158 byte

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

Penjelasan yang terlalu panjang:

...“                          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]

Program yang dijalankan:

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

di mana semua kecuali baris terakhir adalah adil in the entire program replace occurrences of the last char of this line with the rest of this line. Inilah alasan mengapa dimungkinkan untuk membuat setengah dari karakter hanya ascii acak (tetapi mendapatkan sehingga spasi, tanda hubung, dan kutipan yang berguna perlu waktu untuk mencari tahu)

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

Coba Di Sini!
Kode penerjemah online lebih tepat karena tab tidak berfungsi dengan SE

-8 byte: penggantian brute force mengompresi seluruh papan, kemudian mengganti karakter asing (ke codepage) dengan codepoint mereka. Melakukan hal ini memakan waktu kurang dari satu jam dari program lama ...
-4 byte: mengompresi string terkompresi ...
-2 byte: menggunakan variabel + string sebagai ganti array


2

JavaScript (ES6), 246 byte / 198 karakter

(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`╚═╧╩╝`

Input adalah array bilangan bulat. Akhirnya menggunakan dua fungsi pembantu yang sama dengan jawaban Python Leaky Nun , jadi kredit diberikan di sana.

Jika functiondiperlukan, 263 byte / 215 karakter

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`╚═╧╩╝`}

Cuplikan Tes

Setiap input dari 81 angka didukung ( 1234, 1, 2, 3, 4. [1 2 3 4], Dll). Paling baik dilihat sebagai halaman penuh.

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

Batch, 332 byte

@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

Membutuhkan konsol berada di CP437. Jika itu bukan default Anda, maka Anda dapat mengubahnya menggunakan CHCP 437perintah jika konsol Anda disetel ke font TrueType. (Ini hanya akan bekerja dengan font raster jika CP437 sudah menjadi halaman kode default Anda.) Seperti inilah kode di 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

Dengan ide-ide yang diambil dari jawaban lain:

C # (.NET Core) , 401 byte, 349 Karakter

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"," ");}

Tidak Terkumpul:

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"," ");
}

Cobalah online!

Jawabanku:

C # (.NET Core) , 509 430 418 byte, 328 karakter

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"," ");}

Tidak Terkumpul:

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

Cobalah online!


Apakah Anda perlu menghitung setiap karakter gambar sebagai dua byte?
BradC

Saya lakukan, diperbaiki sekarang. Saya bermaksud membahasnya dalam pertanyaan dan menghitung karakter daripada byte, karena karakter-karakter itu, tapi saya kira sudah terlambat sekarang.
Joel Coehoorn

Yap, byte lebih sulit, beberapa penggantian ascii menghemat byte tetapi tidak mempengaruhi karakter (atau bahkan melukai karakter). Saya sedang mengerjakan T-SQL, dan char vs nchar adalah perbedaan yang cukup besar.
BradC

1

Chip , 3645 byte

... itu bukan salah ketik ...

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

Cobalah online! , semacam. Versi TIO berisi cutoff sekitar sepertiga dari jalan masuk ( tsetelah 4 oooooo), sehingga harus berhenti dalam waktu kurang dari 60 detik. Versi lengkapnya memakan waktu sekitar 1m25s di mesin saya, dan TIO tampaknya sekitar setengah lebih cepat. Ini juga berarti TIO hanya menampilkan 7 baris pertama output.

Draf pertama saya berbobot pada tahun 19758 byte besar, dan membawa saya sekitar 8m30s untuk menjalankan. Solusi terakhir, pra-golf, adalah 5980 byte sigap, hanya mengambil 2m07s.

Jadi, bagaimana cara kerjanya?

Ini membutuhkan string 82 byte, 81 digit, diikuti oleh terminator. \0atau \natau bahkan nomor lain akan melakukannya. (Implementasi ini sebenarnya hanya terlihat pada 81 yang pertama, tetapi membutuhkan setidaknya satu lagi, karena Chip akan mengakhiri jika telah kehabisan inputnya. Jika ini tidak dapat diterima, flag -zdapat digunakan, yang secara efektif menambahkan jumlah \0byte yang tak terbatas ke akhir input.) Kode TIO yang disingkat tidak benar-benar mencapai semua 81 byte, jadi intinya diperdebatkan di sana.

Cara saya menerapkan ini, hanya terlihat pada input 4 bit yang rendah, jadi apapun, sungguh, bisa menjadi 'teka-teki' sudoku, dari data biner mentah, hingga karya Shakespeare yang kurang dikenal. Setiap karakter dengan 4 bit rendah semuanya nol akan muncul sebagai spasi (case khusus), semua karakter lain dipetakan 123456789:;<=>?. (Jadi, beberapa terakhir bukan digit, tetapi juga bukan 10 angka yang valid dalam sudoku normal).

Untuk karakter menggambar kotak, ia menghasilkan UTF-8, masing-masing setara dengan 3 byte.

Bagaimana dengan implementasi yang sebenarnya?

Chip adalah bahasa 3D yang terinspirasi oleh sirkuit terintegrasi. Ini memiliki kabel, gerbang logika, dan sel memori. Kebanyakan hal dilakukan pada pesawat 2D, tetapi pesawat ini dapat ditumpuk di atas satu sama lain. Begitulah cara program ini dibangun.

Garis-garis yang dimulai dengan =adalah pemisah lapisan. Kemudian, lapisan-lapisan ditumpuk, dengan sisi atas dan kiri sejajar. Ini oberfungsi sebagai pin, memungkinkan sinyal untuk berpindah dari satu lapisan ke lapisan lainnya.

Setiap lapisan di sini memiliki tujuan, Anda bisa menganggapnya sebagai fungsi. Lapisan pertama mengontrol segalanya; itu 'memanggil' masing-masing lapisan lainnya pada gilirannya. Ada pola dari kiri ke kanan berulang di sini. Pola itu melacak dari 19 garis output yang sedang kami cetak.

Lapisan kedua agak kecil, dan ia memiliki pekerjaan yang sangat kecil. Ini mengatur 0x80bit untuk semua lini output kecuali baris yang berisi angka. hadalah elemen Chip yang sesuai dengan 0x80bit. (Akhir rendah dari alfabet hhingga amenentukan semua delapan bit output.)

Lapisan tiga adalah tempat kita benar-benar masuk ke dalam daging percetakan. Lapisan ini bertanggung jawab atas baris satu. Versi ungolfed memiliki delapan baris x's dan )' s, pemetaan ke 0 dan 1 untuk masing-masing dari delapan bit dari setiap byte. Namun, kita dapat memanfaatkan pola dalam bit untuk menyelesaikan tugas yang sama dalam lebih sedikit baris.

Lapisan empat sangat mirip dengan yang ketiga. Ini menangani garis ganda horisontal.

Lapisan lima menangani baris terakhir. Perhatikan bahwa tidak ada kabel di sepanjang bagian atas yang dimiliki lapisan lain. Ini karena kita tidak perlu mengembalikan kontrol ke sequencer. Sebagai gantinya, kami dapat menghentikan eksekusi di sini dengan t.

Lapisan enam menangani garis tunggal horizontal.

Lapisan tujuh adalah tempat nomor dicetak. Ini disebut 'untuk masing-masing sembilan garis numerik. Ini mengkonsumsi 9 byte input sebagai bagian dari pelaksanaannya.


1

JavaScript (ES6), 222 byte

Menggunakan sintaks pendek untuk fungsi ES6 - 174 karakter disandikan dalam utf8, 222 byte ( https://mothereff.in/byte-counter ). Penggunaan function ...membutuhkan 16 byte lagi.

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)

Kurang golf

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 byte

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

Cobalah online!

Untuk jumlah byte, gunakan CP-437, yang secara asli didukung oleh Java sebagai IBM437(API terbaru) atauCp437 (API lama); jadi gunakan sistem yang memiliki charset ini memiliki charset ini sebagai default charset.

Kode ini kompatibel dari Java 5 dan seterusnya, tetapi hanya diuji pada Java 8.

Penjelasan

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 byte (295 karakter)

Pendekatan yang sangat naif, tetapi saya hanya harus melakukannya meskipun tidak menjadi pemenang dengan ukuran apa pun:

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

Cobalah online!


itu 599 UTF-8 byte. Anda harus mencoba menggunakan kembali karakter kotak umum untuk menyimpan byte
dzaima

@dzaima: Saya tahu, saya bisa melakukan apa yang saya lakukan di papan ketik sangat nyata sehingga Anda hampir bisa
MENGASANG

@zaza: Itu sebabnya saya mengatakan pendekatan yang sangat naif
sergiol
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.