Намалюйте дошку судоку за допомогою символів для малювання ліній


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, послідовність, кортеж, рядок цифр, будь-що, доки у вас є значення для введення для кожної комірки (немає карт для лише заселених комірок на позиції ). Пам'ятайте, що введення постачається ... це не є частиною вашого байтового числа. Але вхід може представляти будь-яку головоломку судоку, і головоломка може навіть не мати дійсного рішення . Ви отримуєте припустити , що головоломка є печаткою. Ви не отримаєте щось, наприклад, з 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
Для мов, у яких немає методів, ви можете адаптуватися. Але якщо вони є, я шукаю щось, що насправді може бути корисним для підключення до "реальної" програми. Я додам це питання.
Joel Coehoorn

2
Які міркування про заборону лямбда? Їх, безумовно, можна було б включити в "справжню" програму так само, як і названі функції / методи
Julian Wolf

2
Нітпікі, але важливо: Не існує такого поняття, як "символ малювання коробки 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
рівень річки Св.

2
"Метод", ймовірно, повинен бути "іменованою функцією", щоб отримати найближчий можливий еквівалент методу в не об'єктно-орієнтованих мовах. (Наприклад, C, широко використовувана мова, не має методів, але має іменовані функції.) У більшості мов, які я знаю, у яких є методи, вони є цією мовою еквівалентом названої функції. (Найвідоміший виняток, про який я знаю, - це C ++, де використання названої функції було б набагато більш правдоподібним для цієї задачі, ніж використання методу, оскільки це дійсно незрозуміло, з яким об'єктом ви б пов’язали метод. .)

Відповіді:


9

Пітон 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
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
Conor O'Brien

TIO підраховує за допомогою SBCS .
Leaky 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örg 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))

Введення здійснюється через рядок цифр, що зберігаються у колонці 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 .

Я перетворюю цей рядок цифр у ціле число і використовую функцію .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 │   ║
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝

Раніше я мав додаткові заміни для деяких інших символів малювання, але вони, в кінцевому рахунку, не врятували мене на байтах.

EDIT 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. Пояснення: Оскільки символи для малювання коробки коштують три байти, точкові коди unicode ═-╬представлені в коді за допомогою =|#A-Z(не всі символи використовуються, але прилипання до діапазонів зберігає байти). Додатково рядки стискаються за допомогою #знаків: a#bcd#eрозширюється до abbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe.

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

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

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

Вставляє ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢між іншими рядками плюс s на початку цих рядків.

\d{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пробіл.
Leaky Nun

Також є подвійні лінії навколо кожного ряду, а не лише кордон та 3х3 регіони.
Joel Coehoorn

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

Введення - це масив цілих чисел. Закінчився використанням тих же двох помічних функцій, що і відповідь Leaky Nun's Python , тому кредити існують.

Якщо 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"," ");}

Безголівки:

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

Спробуйте в Інтернеті!


Вам потрібно рахувати кожен символ малювання як два байти?
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після 4-гоoooooo ), так що він повинен закінчитися менш ніж за 60 секунд. Повна версія займає близько 1м25 секунди на моїй машині, а TIO здається приблизно вдвічі швидшою. Це також означає, що TIO показує лише перші 7 рядків виводу.

Моя перша чернетка важила в масовому 19758 байті, і я зайняв близько 8 м30, щоб пробігти. Остаточним рішенням, попереднім гольфом, був 5980 байт, що займав лише 2 м07.

Отже, як це працює?

Це займає рядок з 82 байт, 81 цифра, а потім термінатор. \0або \nнавіть навіть інше число зробить. (Ця реальність реально розглядає лише перші 81, але вимагає хоча б ще одного, оскільки Chip припиняється, якщо він вичерпав свої дані. Якщо це неприпустимо, прапор -zможе бути використаний, що фактично додає нескінченну кількість\0 байтів кінець вводу.) Скорочений код TIO насправді не доходить до всіх 81 байт, тому справа там суперечлива.

Як я це реалізував, він розглядає лише низькі 4 біти вхідних даних, так що все, справді, може бути «головоломкою» судоку, від необроблених двійкових даних, до менш відомих творів Шекспіра. Будь-який символ, у якого низькі 4 біти всі нульові, відображатиметься як пробіл (окремий випадок), а всі інші символи відображаються у123456789:;<=>? . (Отже, останні кілька не є цифрами, але ні 10 не є дійсним числом у звичайному судоку).

Для символів, що малюють коробку, він створює UTF-8, що дорівнює 3 байтам кожен.

Що з реальною реалізацією?

Чіп - це 3D-мова, яка надихається інтегральними схемами. Він має дроти, логічні ворота та комірки пам'яті. Більшість матеріалів робиться на двовимірних площинах, але ці літаки можуть складатися один на одного. Саме так будується ця програма.

Лінії, що починаються з =- це роздільники шарів. Потім шари укладаються, при цьому верхня і ліва сторони вирівнюються. Theo служать штифтами, дозволяючи сигналам переходити з одного шару в інший.

Кожен шар тут має мету, ви можете вважати їх функціями. Перший шар контролює все; він по черзі "викликає" кожен з інших шарів. Тут є повторюваний рисунок зліва направо. Ця картина відстежує, який з 19 рядків випуску ми друкуємо в даний час.

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

Третій шар - це те, де ми дійсно потрапляємо в м'ясо друку. Цей шар відповідає за перший рядок. Версія без вогків містить вісім рядів x'і і) ' s, відображаючи 0 і 1 для кожного з восьми біт кожного байта. Однак ми можемо скористатися шаблонами в бітах, щоб виконати те саме завдання в меншій кількості рядків.

Шар чотири схожий на третій. Він обробляє горизонтальні подвійні лінії.

Шар п'ять обробляє останній рядок. Зауважте, що в ньому відсутній провід уздовж верхньої частини, яку мають інші шари. Це тому, що нам не потрібно повертати контроль секвенсору. Натомість ми можемо просто закінчити виконання тут t.

Шар шести обробляє горизонтальні одиничні лінії.

Шар 7 - це друковані цифри. Він називається для кожного з дев'яти числових рядків. Він використовує 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: Я знаю, я можу робити те, що я робив на клавіатурі, так реально, що ти майже
можеш ТЕСТУВАТИ

@dzaima: Тому я сказав дуже наївний підхід
sergiol
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.