Desenhe um quadro de sudoku usando caracteres de desenho de linha


20

Isso é código de golfe. Para esse desafio, aceitarei um método (você não precisa de um programa completo), mas a assinatura do método conta para a contagem de bytes e eu quero ver a assinatura completa (não um lamdba). A entrada para o método é uma matriz inteira com 81 elementos. O valor de saída / retorno do método é uma string que representa a matriz como uma placa ascii sudoku.

Se você estiver usando uma linguagem esotérica ou algo que absolutamente não possui métodos, poderá se adaptar, mas se a linguagem suportar isso, quero ver que alguma coisa pode estar realmente conectada a um programa não-destruído "real", mesmo que o método próprio corpo é uma dor para trabalhar. O requisito não visa bloquear linguagens como Jelly ou 05AB1E, mas facilitar para linguagens como Java a construção de algo que faça sentido para essa plataforma.

Para a entrada, os valores inteiros 1 a 9 devem ter significados óbvios. Um 0 deve sempre ser interpretado como uma célula em branco. Você também pode interpretar qualquer outra coisa fora do intervalo de 1 a 9 como uma célula em branco, mas isso não é necessário. O posicionamento da matriz para o quebra-cabeça começa no canto superior esquerdo e preenche cada linha da esquerda para a direita antes de passar para a próxima linha.

Para as caixas, quero linhas duplas ao redor do exterior e entre cada região 3x3 e linhas únicas entre outras células. Eles devem ser desenhados com caracteres de desenho de linha (se o seu formato de E / S representar seqüências de caracteres como uma sequência de bytes em vez de uma sequência de caracteres, você deve representá-las em uma codificação conhecida como UTF-8 ou página de código 347).

Para esse desafio, NÃO estou pedindo para você gerar o quebra-cabeça sudoku. Essa é a entrada para a função. Eu não estou pedindo para você resolver o quebra-cabeça. Estou apenas pedindo que você produza uma string para "desenhar" o que você recebe (no menor número de bytes possível).

Exemplo de entrada:

Valores para a matriz:

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

Os valores podem usar qualquer mecanismo que seja natural para o seu idioma: int [], ArrayList, sequência, tupla, sequência de dígitos, qualquer que seja, desde que você tenha um valor na entrada para cada célula (não há mapas apenas para células preenchidas para posições ) Lembre-se de que a entrada é fornecida ... não faz parte da sua contagem de bytes. Mas a entrada pode representar qualquer quebra-cabeça sudoku, e talvez nem tenha uma solução válida . Você assume que o quebra - cabeça é imprimível. Você não terá algo com 82 elementos, por exemplo.

Você também assume uma fonte de largura fixa razoável.

Saída correspondente:

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

4
Você tem certeza da parte do método? Isso não faz sentido para muitos idiomas (isto é, idiomas sem métodos).
Cyoce 16/06

1
Para idiomas que não possuem métodos, você pode se adaptar. Mas, se o fizerem, estou procurando algo que possa realmente ser útil para conectar a um programa "real". Vou acrescentar isso à pergunta.
Joel Coehoorn

2
Qual o motivo para não permitir lambdas? Aqueles certamente poderia ser conectado a um programa de "real" tão bem como funções nomeadas / métodos
Julian Lobo

2
Nitpicky, mas importante: não existe um "caractere de desenho de caixa ASCII". O ASCII abrange os códigos de 0 a 127, nenhum dos quais são caracteres de desenho de caixa. Nos últimos tempos, o Unicode é o padrão, mas possui várias codificações diferentes: UTF-8, UTF-16, etc., que usam mais de 1 byte por caractere de desenho de caixa. Codificações mais antigas, como a página de código 437, suportam caracteres de desenho de caixa de byte único. Ao usar caracteres fora do intervalo ASCII, você deve especificar quais codificações são válidas. en.wikipedia.org/wiki/Box-drawing_character en.wikipedia.org/wiki/Unicode
Level River St

2
"Método" provavelmente deve ser "função nomeada" para obter o equivalente mais próximo possível de um método em linguagens não orientadas a objetos. (Por exemplo, C, uma linguagem amplamente usada, não possui métodos, mas possui funções nomeadas.) Na maioria dos idiomas que conheço, os métodos têm métodos, eles equivalem a uma função nomeada. (A exceção mais conhecida que conheço é o C ++, onde o uso de uma função nomeada seria muito mais plausível para esta tarefa do que o uso de um método, pois não está claro com que tipo de objeto você associaria o método. )

Respostas:


9

Python 3 , 232 bytes

Obrigado a todos que ajudaram a jogar golfe.

Criptografia na criptografia ...

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

Experimente online!

Para ser jogado golfe.


Como eu não percebi isso ... essa é toda a razão pela qual eu usei o Python 2, mas obrigado.
Leaky Nun

1
Na verdade, você está melhor usando o Python 3 desde então, não precisará da primeira linha.
Erik the Outgolfer

1
Você pode remover mais parênteses na última linha: tio
Conor O'Brien

Remova a definição de f e defina i como i=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]salva 4 bytes #
officialaimm

7

C (GCC) , 398 395 291 bytes

Economizou 3 bytes trabalhando na string invertida e 104 (!) Bytes graças a 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);}

Experimente online!

C (gcc) , 395 bytes

Vou manter isso aqui, para que fique mais evidente como o programa funciona.

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

Experimente online!

Trabalhar com unicode em C é ... caro. Recebe a entrada como int*mostrado no link e na especificação.

Vou ver se consigo salvar bytes usando algum número mágico em vez de codificar a string.



@LeakyNun Huh, obrigado! É 291 bytes de acordo com o TIO
Conor O'Brien

O TIO está contando usando o SBCS .
Freira vazada

6

PHP , 297 bytes

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

Experimente online!

Expandido

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

funções usadas para ambas as versões

vsprintf , strtr , str_pad , array_slice , array_chunk

PHP , 313 bytes

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

Experimente online!


Como é que isso funciona?
Cyoce

@Cyoce Eu adicionei uma explicação para a minha nova versão
Jörg Hülsermann

5

T-SQL, 445 437 bytes (em 381 caracteres)

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 entrada é feita através de uma sequência de dígitos armazenados na coluna a da tabela t existente , por métodos aprovados .

Formato e explicação :

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

Na linha superior do loop, estou obtendo os próximos 9 dígitos da string de entrada da coluna a da tabela t existente .

Eu converto essa sequência de dígitos em um número inteiro e uso a FORMATfunção .Net para exibi-los usando um modelo de texto personalizado '║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║P'.

Depois disso, basta anexar a linha divisória apropriada e fazer algumas substituições de economia de bytes antes da saída.

A saída é exibida no painel de resultados:

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

Eu anteriormente tinha algumas substituições adicionais para alguns dos outros caracteres de desenho, mas eles não me salvaram em bytes.

EDIT 1 : Salva 8 bytes iniciando @rem zero em vez de 1 e removendo alguns espaços desnecessários.


4

Retina , 196 167 bytes

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

Experimente online! Recebe a entrada como uma sequência de comprimento 81. Explicação: Como os caracteres de desenho da caixa custam três bytes, os pontos de código unicode ═-╬são representados no código usando =|#A-Z(nem todos os caracteres são usados, mas a adesão a intervalos salva bytes). Além disso, as linhas são compactadas usando #sinais: a#bcd#eexpande para abbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe.

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

Inserções ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣para cada terceira linha, mais uma no início de cada grupo de 27.

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

Insere ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢entre as outras linhas, mais s no início dessas linhas.

\d{3}
 $& |

Insere s após cada três dígitos. Todos os s foram inseridos.

\B\d
 │ $&

Insere |s entre todos os pares restantes de dígitos. (Esse é o caractere de desenho da caixa real, e não um tubo. Infelizmente, os caracteres ─│┼têm códigos muito distantes entre si e os caracteres de caixa dupla para fazer valer a pena ao usar espaços reservados.)

^¶.*
B#=RT#E

Altera a primeira linha para ╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗(isso economiza 1 byte ao não adicionar a primeira linha em primeiro lugar).

$
¶H#=UW#K

Adiciona ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝após a última linha.

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

Expande a#bcd#e, primeiro para a#bc#d#bc#d#bc#e, depois para a#b#c#b#c#b#d#b#c#b#c#b#d#b#c#b#c#b#e.

#(.)#
$1$1$1

Muda #b#para bbb. Isso completa a descompressão.

T`0=|#L` ═-╬

Exclui todas as entradas zero e substitui os espaços reservados pelos caracteres de desenho da caixa.


Você esqueceu de substituir 0pelo espaço.
Freira vazada

Também possui linhas duplas em todas as linhas, em vez de apenas nas regiões de borda e 3x3.
Joel Coehoorn

@JoelCoehoorn Corrigido, desculpe.
187 Neil

@LeakyNun Obrigado, eu tinha esquecido isso. (Também, como para evitar linhas terminando com, ou especialmente única contendo, espaços, que é por isso que procuraram uma poupança alternativa de 2 bytes.)
Neil

3

SOGL V0.12 , 174 172 164 160 158 bytes

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

Explicação excessivamente longa:

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

O programa que é executado:

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

onde todos, exceto a última linha, são justos in the entire program replace occurrences of the last char of this line with the rest of this line. Esta é a razão pela qual foi possível transformar metade dos caracteres aleatórios em ASCII (mas obter espaços, traços e aspas é útil levou um tempo para descobrir)

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

Experimente aqui!
O código do intérprete online está mais correto porque as guias não funcionam com o SE

-8 bytes: substituição da força bruta compactando toda a placa e substituindo caracteres estrangeiros (para a página de códigos) por seus pontos de código. Isso demorou uma hora a menos que o programa antigo ...
-4 bytes: compactando a sequência compactada ...
-2 bytes: usando uma variável + string em vez de array


2

JavaScript (ES6), 246 bytes / 198 caracteres

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

Entrada é uma matriz de números inteiros. Acabou usando as mesmas duas funções auxiliares da resposta em Python do Leaky Nun , então o crédito vai para lá.

Se functionnecessário, 263 bytes / 215 caracteres

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

Snippet de teste

Qualquer entrada de 81 números é suportada ( 1234, 1, 2, 3, 4. [1 2 3 4], Etc). Melhor visualizado como página inteira.

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

Lote, 332 bytes

@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

Precisa que o console esteja no CP437. Se esse não for o padrão, você poderá alterá-lo usando o CHCP 437comando se o console estiver definido como fontes TrueType. (Ele funcionará apenas com fontes rasterizadas se o CP437 já for sua página de código padrão.) É assim que o código se parece no 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

Com idéias colhidas de outras respostas:

C # (.NET Core) , 401 bytes, 349 caracteres

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

Experimente online!

Minha resposta:

C # (.NET Core) , 509 430 418 bytes, 328 caracteres

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

Experimente online!


Você precisa contar cada caractere de desenho como dois bytes?
BradC

Eu fiz, consertado agora. Eu pretendia resolver isso em questão e contar caracteres em vez de bytes, por causa desses caracteres, mas suponho que seja tarde demais agora.
Joel Coehoorn

Sim, bytes são mais difíceis, algumas substituições ascii salvam bytes, mas não afetam os caracteres (ou mesmo os prejudicam). Estou trabalhando no T-SQL, e char vs nchar é uma grande diferença.
BradC

1

Chip , 3645 bytes

... isso não é um erro de digitação ...

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

Experimente online! , tipo de. A versão do TIO contém um ponto de corte cerca de um terço do caminho ( tdepois do 4ºoooooo ), para que ele termine em menos de 60 segundos. A versão completa leva cerca de 1m25s na minha máquina e o TIO parece metade da velocidade. Isso também significa que o TIO mostra apenas as 7 primeiras linhas de saída.

Meu primeiro rascunho pesava maciços em 19758 bytes e me levou cerca de 8m30s para rodar. A solução final, antes do golfe, foi de 5980 bytes, levando apenas 2m07s.

Então, como é que funciona?

Isso requer uma sequência de 82 bytes, 81 dígitos, seguida por um terminador. \0ou \nou mesmo outro número serve. (Esta implementação, na verdade, apenas analisa os primeiros 81, mas requer pelo menos mais um, pois o Chip terminará se tiver esgotado sua entrada. Se isso for inaceitável, o sinalizador -zpoderá ser usado, o que efetivamente anexa um número infinito de \0bytes ao arquivo). final da entrada.) O código TIO reduzido não chega a todos os 81 bytes; portanto, o ponto é discutível.

Do jeito que eu implementei isso, ele olha apenas para os 4 bits baixos da entrada, então qualquer coisa pode realmente ser um 'quebra-cabeça' do sudoku, desde dados binários brutos até os trabalhos menos conhecidos de Shakespeare. Qualquer caractere cujos 4 bits baixos sejam zero aparecerá como um espaço (um caso especial), para o qual todos os outros caracteres serão mapeados 123456789:;<=>?. (Portanto, os últimos não são dígitos, mas nem 10 é um número válido no sudoku normal).

Para os caracteres de desenho de caixa, ele produz UTF-8, equivalente a 3 bytes cada.

E a implementação real?

Chip é uma linguagem 3D inspirada em circuitos integrados. Possui fios, portas lógicas e células de memória. A maioria das coisas é feita em planos 2D, mas esses planos podem ser empilhados um sobre o outro. É assim que este programa é criado.

As linhas que começam com =são os separadores de camada. Em seguida, as camadas são empilhadas, com os lados superior e esquerdo alinhados. Os oservem como pinos, permitindo que os sinais passem de uma camada para outra.

Cada camada aqui tem um propósito, você pode pensar nelas como funções. A primeira camada controla tudo; ele 'chama' cada uma das outras camadas, por sua vez. Há um padrão repetido da esquerda para a direita aqui. Esse padrão controla quais das 19 linhas de saída estamos imprimindo atualmente.

A segunda camada é bastante pequena e possui um trabalho muito pequeno. Ele define o 0x80bit para todas as linhas de saída, exceto as linhas que contêm números. hé o elemento Chip que corresponde ao 0x80bit. (A extremidade mais baixa do alfabeto hatravés adefinir todos os oito bits de saída.)

A camada três é onde realmente entramos na carne da impressão. Essa camada é responsável pela linha um. A versão ungolfed possui oito linhas de x'e )', mapeadas para 0 e 1 para cada um dos oito bits de cada byte. No entanto, podemos tirar proveito dos padrões nos bits para realizar a mesma tarefa em menos linhas.

A camada quatro é muito parecida com a terceira. Ele lida com as linhas duplas horizontais.

A camada cinco lida com a última linha. Observe que falta o fio na parte superior que as outras camadas possuem. Isso ocorre porque não precisamos retornar o controle ao seqüenciador. Em vez disso, podemos simplesmente encerrar a execução aqui com t.

A camada seis lida com as linhas horizontais simples.

A camada sete é onde os números são impressos. É 'chamado' para cada uma das nove linhas numéricas. Consome 9 bytes de entrada como parte de sua execução.


1

JavaScript (ES6), 222 bytes

Usando sintaxe curta para funções ES6 - 174 caracteres codificados em utf8, 222 bytes ( https://mothereff.in/byte-counter ). O uso function ...requer mais 16 bytes.

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)

Menos golfe

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 bytes

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

Experimente online!

Para a contagem de bytes, use o CP-437, que é suportado nativamente pelo Java como IBM437(APIs recentes) ou Cp437(APIs mais antigas); portanto, use um sistema que tenha esse conjunto de caracteres como esse conjunto de caracteres padrão.

Este código é compatível a partir do Java 5, mas foi testado apenas no Java 8.

Explicação

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 bytes (295 caracteres)

Abordagem muito ingênua, mas eu só precisava fazê-lo, mesmo que não fosse um vencedor em nenhuma medida:

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

Experimente online!


são 599 bytes UTF-8. Você deve tentar reutilizar os caracteres de caixa comuns para salvar bytes
dzaima

@dzaima: Eu sei, eu posso fazer o que eu fiz em um teclado tão reais que você quase pode provar
sergiol

@dzaima: É por isso que eu disse abordagem muito ingênuo
sergiol
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.