線画文字を使用して数独ボードを描画する


20

これはコードゴルフです。この課題では、メソッドを受け入れます(完全なプログラムは必要ありません)が、メソッドシグネチャはバイトカウントにカウントされるため、完全なシグネチャ(lamdbaではなく)を表示したいです。メソッドの入力は、81個の要素を持つ整数配列です。メソッドからの出力/戻り値は、ASCII数独ボードとして配列を表す文字列です。

難解な言語またはメソッドをまったく持たないものを使用している場合は、適応できますが、言語がこれをサポートしている場合は、たとえメソッド本体自体は作業が苦痛です。要件は、Jellyや05AB1Eなどの言語をブロックすることではなく、Javaのような言語がそのプラットフォームにとって意味のあるものを簡単に作成できるようにすることです。

入力の場合、整数値1〜9には明確な意味があります。0は常に空白セルとして解釈される必要があります。また、1〜9の範囲外のものを空白セルとして解釈することもできますが、これは必須ではありません。配列からパズルへの配置は左上から始まり、各行を左から右に埋めてから次の行に移動します。

ボックスの場合、外側と各3x3領域の間に二重線が、他のセル間に単一線が必要です。これらは線画文字で描画する必要があります(I / O形式が文字列ではなく文字列をバイト列として表す場合、UTF-8やコードページ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、sequence、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
メソッドの部分について確かですか?これは、多くの言語(つまり、メソッドのない言語)には意味がありません。
チョイス

1
メソッドを持たない言語については、適応できます。しかし、もしそうなら、「本当の」プログラムにプラグインするのに実際に役立つかもしれない何かを探しています。それを質問に追加します。
ジョエルCoehoorn

2
ラムダを許可しない理由は何ですか?これらは、確かに名前の付いた関数/メソッドと同様に「実際の」プログラムにプラグインできます
Julian Wolf

2
気の利いたが重要:「ASCIIボックス描画文字」のようなものはありません。ASCIIはコード0〜127をカバーしますが、いずれもボックス描画文字ではありません。最近では、Unicodeが標準ですが、いくつかの異なるエンコーディングがあります。UTF-8、UTF-16など、ボックス描画文字ごとに1バイト以上を使用します。コードページ437などの古いエンコーディングは、シングルバイトのボックス描画文字をサポートしています。ASCII範囲外の文字を使用する場合、有効なエンコードを指定する必要があります。en.wikipedia.org/wiki/Box-drawing_character en.wikipedia.org/wiki/Unicode
レベルリバーセント

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を使用した理由のすべてのようですが、ありがとう。
リーキー修道女

1
実際には、最初の行は必要ないので、Python 3を使用した方が良いでしょう。
エリックアウトゴルファー

1
最後の行でさらに括弧を削除できます:tio
コナーオブライエン

ように、Fの定義を削除し、Iを定義するi=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]4バイト節約
officialaimmを

7

C(gcc)398 395 291バイト

文字列を逆順に処理することで3バイトを節約し、Leaky Nunのおかげで104(!)バイトを節約しました。

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

オンラインでお試しください!

CでUnicodeを使用すると、コストがかかります。int*リンクおよび仕様に示されているように、入力を受け取ります。

文字列をハードコーディングする代わりに、いくつかのマジックを使用してバイトを保存できるかどうかを確認します。



@LeakyNunええ、ありがとう!TIOによると291バイト
コナーオブライエン

TIOはSBCSを使用してカウントしています。
リーキー修道女

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

両方のバージョンで使用される関数

vsprintfstrtrstr_padarray_slicearray_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
イェルクHü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))

入力は、承認済みのメソッドごとに、既存のテーブルtのaに格納されている数字列を介して行われます

フォーマットと説明

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

ループの一番上の行では、既存のテーブルtのaから入力文字列の次の9桁を取得しています。

その数字列を整数に変換し、.Net 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 │   ║
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝

以前は、他の描画文字の一部を追加で置き換えましたが、最終的にはバイトを節約できませんでした。

編集11@rではなくゼロから開始し、不要なスペースを削除して8バイトを保存しました。


4

網膜196167バイト

.{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の説明の文字列として入力を受け取り:文字の描画ボックスが3つのバイトを要するので、Unicodeコードポイントを═-╬使用してコードで表現されている=|#A-Z(すべてではない文字が使用されるが、範囲に付着すると、バイトを保存しています)。さらに、行は#符号を使用して圧縮さa#bcd#eabbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbeます:に展開されます。

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

╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣3行ごとに挿入し、さらに27のすべてのグループの先頭に挿入します。

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

╟───┼───┼───╫───┼───┼───╫───┼───┼───╢他の行の間に挿入し、それらの行の先頭にsを加えます。

\d{3}
 $& |

3桁ごとにsを挿入します。これですべてのが挿入されました。

\B\d
 │ $&

|残りのすべての数字のペアの間にsを挿入します。(これは、パイプではなく、実際のボックス描画文字です。残念ながら、文字─│┼は互いに離れすぎているコードと、プレースホルダーを使用している間に価値があるようにするためのダブルボックス文字を持っています。)

^¶.*
B#=RT#E

最初の行をに変更します╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗(最初の行を最初に追加しないことで1バイト節約されます)。

$
¶H#=UW#K

╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝最後の行の後に追加します。

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

に展開しa#bcd#e、最初にa#bc#d#bc#d#bc#e、次ににa#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スペースで置き換えるのを忘れました。
リーキー修道女

また、境界線と3x3領域だけでなく、すべての行に二重線があります。
ジョエルCoehoorn

@JoelCoehoorn修正、申し訳ありません。
ニール

@LeakyNunありがとう、見落としていました。(また、スペースで終わる行、特にスペースのみを含む行を避けたいため、代替の2バイトの節約を探しました。)
ニール

3

SOGL V0.12174の 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バイト:ボード全体を圧縮するブルートフォース置換。その後、(コードページへの)外部文字をコードポイントに置換します。これを行うには、古いプログラムよりも1時間もかかりませんでした...
-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`╚═╧╩╝`

入力は整数の配列です。Leaky NunのPython answerと同じ2つのヘルパー関数を使用することになりました。

もし 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の数字の入力がサポートされています(12341, 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"," ");}

ゴルフをしていない:

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

ゴルフをしていない:

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

オンラインでお試しください!


各描画文字を2バイトとしてカウントする必要がありますか?
BradC

修正しました。これらの文字のために、問題のアドレスに対処し、バイトではなく文字をカウントするつもりでしたが、今は手遅れだと思います。
ジョエル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バージョンには、約3分の1のカットオフが含まれています(t4日目以降oooooo)のため、60秒未満で終了するはずです。私のマシンではフルバージョンに約1分25秒かかり、TIOは約半分の速さのようです。これは、TIOが出力の最初の7行のみを表示することも意味します。

最初のドラフトは19758バイトという膨大な量で、実行に約8分30秒かかりました。ゴルフ前の最終的な解決策は、わずか5980バイトで、わずか2m07秒でした。

それでは、それではどのように機能しますか?

これには、82バイト、81桁の文字列と、それに続くターミネータが必要です。\0または\n、さらに別の番号でもかまいません。(この実装は実際には最初の81のみを調べますが、入力を使い果たした場合はChipが終了するため、少なくとももう1つ必要です。これが受け入れられない場合は、フラグ-zを使用\0して、入力の終わり。)短縮されたTIOコードは実際には81バイトすべてに到達しないため、ポイントはそこにありません。

私がこれを実装した方法は、入力の下位4ビットのみを調べるため、実際には、生のバイナリデータからシェークスピアのあまり知られていない作品まで、数独の「パズル」になります。下位4ビットがすべてゼロの文字はすべてスペース(特殊なケース)として表示され、他のすべての文字はにマップされ123456789:;<=>?ます。(したがって、最後の数は数字ではありませんが、通常の数独では10も有効な数字ではありません)。

ボックス描画文字の場合、それぞれ3バイトに相当するUTF-8が生成されます。

実際の実装はどうですか?

チップは、集積回路に触発された3D言語です。ワイヤ、論理ゲート、メモリセルがあります。ほとんどの作業は2D平面で行われますが、これらの平面は互いに積み重ねることができます。それがこのプログラムの構築方法です。

で始まる行=はレイヤーセパレーターです。次に、上部と左側を揃えてレイヤーを積み重ねます。のoのは、信号が一つの層から別のものに通過させ、ピンとして機能します。

ここの各レイヤーには目的があり、それらを関数と考えることができます。最初の層はすべてを制御します。他の各レイヤーを順番に「呼び出し」ます。ここには、左から右への繰り返しパターンがあります。このパターンは、現在出力している19行の出力のどれかを追跡します。

2番目の層はかなり小さく、非常に小さな仕事をしています。0x80数値を含む行を除くすべての出力行にビットを設定します。ビットにh対応するチップ要素0x80です。(アルファベットの下端は、8つの出力ビットすべてha定義します。)

レイヤー3は、実際に印刷の本質を説明する場所です。この層は、ライン1を担当します。未使用バージョンには、の8行がxあり、) 'があり、各バイトの8ビットごとに0と1にマッピングされます。ただし、ビットのパターンを利用して、同じタスクをより少ない行で実行できます。

レイヤー4は3番目に似ています。水平の二重線を処理します。

レイヤー5は最後の行を処理します。他の層が持っている上部に沿ってワイヤが欠落していることに注意してください。これは、シーケンサーに制御を戻す必要がないためです。代わりに、ここで実行を終了できますt

レイヤー6は、水平の単一行を処理します。

レイヤー7は、数字が印刷される場所です。9つの数値行ごとに「呼び出されます」。実行の一部として9バイトの入力を消費します。


1

JavaScript(ES6)、222バイト

ES6関数の短い構文の使用-utf8でエンコードされた174文字、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)

少ないゴルフ

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を使用します。CP-437は、(最近のAPI)または(古いAPI)としてJavaでネイティブにサポートされています。そのため、この文字セットがデフォルトの文字セットとして使用されているシステムを使用してください。IBM437Cp437

このコードは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:知っている、私はキーボードで
味わう

@dzaima:それが私が非常に素朴なアプローチ
セルジオル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.