Нарисуйте доску судоку, используя символы рисования линий


20

Это код гольф. Для этой задачи я приму метод (вам не нужна полная программа), но сигнатура метода действительно учитывается в счетчике байтов, и я хочу увидеть полную сигнатуру (не lamdba). Вход для метода представляет собой целочисленный массив с 81 элементом. Выходное / возвращаемое значение метода представляет собой строку, которая представляет массив как доску ascii sudoku.

Если вы используете эзотерический язык или что-то, что абсолютно не имеет методов, вы можете адаптироваться, но если язык вообще поддерживает это, я хочу видеть, что что-то может быть действительно подключено к «настоящей» неигровой программе, даже если Сам метод тела - боль, с которой нужно работать. Это требование не предназначено для блокировки языков, таких как Jelly или 05AB1E, а для того, чтобы языки, такие как Java, могли создавать что-то, что имеет смысл для этой платформы.

Для ввода целочисленные значения 1-9 должны иметь очевидные значения. 0 всегда следует интерпретировать как пустую ячейку. Вы также можете интерпретировать что-либо еще вне диапазона 1-9 как пустую ячейку, но это не обязательно. Позиционирование от массива до головоломки начинается в верхнем левом углу и заполняет каждый ряд слева направо, прежде чем перейти к следующему ряду.

Для ящиков я хочу двойные линии вокруг внешней стороны и между каждой областью 3х3, а также одиночные линии между другими ячейками. Они должны быть нарисованы с помощью символов рисования линий (если ваш формат ввода-вывода представляет строки в виде последовательности байтов, а не последовательности символов, вы должны представлять их в хорошо известной кодировке, такой как 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
Вы уверены в методической части? Это не имеет смысла для многих языков (т.е. языков без методов).
Cyoce

1
Для языков, у которых нет методов, вы можете адаптироваться. Но если они это сделают, я ищу что-то, что может быть полезно для вставки в «настоящую» программу. Я добавлю это к вопросу.
Джоэл Коухорн

2
В чем причина запрета лямбд? Их, безусловно, можно подключить к «настоящей» программе так же, как и к именованным функциям / методам
Джулиан Вольф,

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, так как тогда вам не понадобится первая строка.
Эрик Outgolfer

1
Вы можете удалить больше паренов в последней строке: tio
Conor O'Brien

Удалите определение f и определите i как i=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]сохраняющее 4 байта
officialaimm

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 Да, спасибо! Это 291 байт согласно TIO
Конор О'Брайен

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

используемые функции для обеих версий

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 Я добавил объяснение моей новой версии
Йорг Хюльсерманн,

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

Ввод осуществляется через строку цифр, сохраненную в столбце a существующей таблицы t , согласно утвержденным методам .

Формат и объяснение :

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 цифр входной строки из столбца a существующей таблицы t .

Я преобразую эту строку цифр в целое число и использую FORMATфункцию .Net, чтобы отобразить их с помощью пользовательского текстового шаблона '║ 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#eрасширяется до abbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe.

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

Вставки ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣для каждого третьего ряда, плюс в начале каждой группы из 27.

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

Вставляет ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢между другими строками, плюс s в начале этих строк.

\d{3}
 $& |

Вставляет s после каждых трех цифр. Все 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на пробел.
Утренняя монахиня

Также имеет двойные линии вокруг каждого ряда, а не только границы и области 3х3.
Джоэл Коухорн

@JoelCoehoorn Исправлено, извините.
Нил

@LeakyNun Спасибо, я не заметила этого. (Кроме того, мне нравится избегать строк, заканчивающихся или, в особенности, только пробелами, поэтому я искал альтернативное 2-байтовое сохранение.)
Нейл

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

Я сделал, исправил сейчас. Я хотел решить этот вопрос и подсчитать количество символов, а не байтов, из-за этих символов, но, полагаю, сейчас уже слишком поздно.
Джоэл Коухорн

Да, байты сложнее, некоторые замены ascii сохраняют байты, но не влияют на символы (или даже на поврежденные символы). Я работаю над T-SQL, и char против 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 после 4-гоoooooo ), так что оно должно завершиться менее чем за 60 секунд. Полная версия занимает около 1м25 с на моей машине, а TIO кажется примерно вдвое быстрее. Это также означает, что TIO показывает только первые 7 строк вывода.

Мой первый черновик весил 19758 байтов, и мне потребовалось около 830-х. Окончательное решение, перед игрой в гольф, было spry 5980 байт, занимая только 2m07s.

Так как же это работает?

Для этого требуется строка из 82 байтов, 81 цифра, за которой следует терминатор. \0или \nдаже другой номер подойдет. (Эта реализация на самом деле рассматривает только первые 81, но требует как минимум еще одного, поскольку Chip прекратит работу, если исчерпал свой ввод. Если это недопустимо, -zможно использовать флаг , который фактически добавляет бесконечное число\0 байтов к конец ввода.) Сокращенный код TIO на самом деле не доходит до всех 81 байта, так что вопрос здесь спорный.

Как я это реализовал, он рассматривает только 4 младших бита ввода, поэтому все, что угодно, может быть «загадкой» судоку, от необработанных двоичных данных до менее известных работ Шекспира. Любой символ, чьи младшие 4 бита равны нулю, будет отображаться как пробел (особый случай), все остальные символы отображаются в123456789:;<=>? . (Итак, последние несколько не являются цифрами, но ни 10 не является действительным числом в обычной судоку).

Для символов рисования ячеек он выдает UTF-8, равный 3 байта каждый.

Как насчет фактической реализации?

Чип - это трехмерный язык, основанный на интегральных схемах. У него есть провода, логические элементы и ячейки памяти. Большая часть материала выполняется на двухмерных плоскостях, но эти плоскости могут накладываться друг на друга. Вот как эта программа построена.

Строки, начинающиеся с, =являются разделителями слоев. Затем слои накладываются друг на друга с выравниванием верхней и левой сторон. o служат контактами, позволяя сигналам переходить с одного слоя на другой.

У каждого слоя здесь есть цель, вы можете думать о них как о функциях. Первый слой контролирует все; он «вызывает» каждый из остальных слоев по очереди. Здесь повторяющийся рисунок слева направо. Этот шаблон отслеживает, какие из 19 строк вывода мы печатаем в данный момент.

Второй слой довольно крошечный, и у него очень маленькая работа. Он устанавливает 0x80бит для всех строк вывода, кроме строк, содержащих числа. hэлемент Chip, соответствующий 0x80биту (Нижний конец алфавита до hконца aопределяет все восемь выходных битов.)

Слой три - это то, где мы действительно погружаемся в суть печати. Этот слой отвечает за первую линию. Безгольфовая версия имеет восемь строк x«и )», отображая «0» и «1» для каждого из восьми бит каждого байта. Однако мы можем воспользоваться шаблонами в битах, чтобы выполнить ту же задачу в меньшем количестве строк.

Слой четыре очень похож на третий. Он обрабатывает горизонтальные двойные линии.

Слой пять обрабатывает последнюю строку. Обратите внимание, что отсутствует верхний провод, который есть у других слоев. Это потому, что нам не нужно возвращать управление секвенсору. Вместо этого мы можем просто прекратить выполнение здесь с помощью t.

Слой шесть обрабатывает горизонтальные одиночные линии.

Слой семь - это место, где печатаются цифры. Он вызывается для каждой из девяти числовых строк. Он потребляет 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)

Меньше гольфа

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.