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 │ ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
Respostas:
Python 3 , 232 bytes
Obrigado a todos que ajudaram a jogar golfe.
Criptografia na criptografia ...
Experimente online!
Para ser jogado golfe.
fonte
i=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]
salva 4 bytes #C (GCC) ,
398395291 bytesEconomizou 3 bytes trabalhando na string invertida e 104 (!) Bytes graças a Leaky Nun.
Experimente online!
C (gcc) , 395 bytes
Vou manter isso aqui, para que fique mais evidente como o programa funciona.
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.
fonte
PHP , 297 bytes
Experimente online!
Expandido
funções usadas para ambas as versões
vsprintf , strtr , str_pad , array_slice , array_chunk
PHP , 313 bytes
Experimente online!
fonte
T-SQL,
445437 bytes (em 381 caracteres)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 :
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
FORMAT
funçã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:
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
@r
em zero em vez de 1 e removendo alguns espaços desnecessários.fonte
Retina ,
196167 bytesExperimente 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#e
expande paraabbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe
.Inserções
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
para cada terceira linha, mais uma║
no início de cada grupo de 27.Insere
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
entre as outras linhas, mais║
s no início dessas linhas.Insere
║
s após cada três dígitos. Todos os║
s foram inseridos.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.)Altera a primeira linha para
╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗
(isso economiza 1 byte ao não adicionar a primeira linha em primeiro lugar).Adiciona
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
após a última linha.Expande
a#bcd#e
, primeiro paraa#bc#d#bc#d#bc#e
, depois paraa#b#c#b#c#b#d#b#c#b#c#b#d#b#c#b#c#b#e
.Muda
#b#
parabbb
. Isso completa a descompressão.Exclui todas as entradas zero e substitui os espaços reservados pelos caracteres de desenho da caixa.
fonte
0
pelo espaço.SOGL V0.12 ,
174172164160158 bytesExplicação excessivamente longa:
O programa que é executado:
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)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
fonte
JavaScript (ES6), 246 bytes / 198 caracteres
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
function
necessário, 263 bytes / 215 caracteresSnippet 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.fonte
Lote, 332 bytes
Precisa que o console esteja no CP437. Se esse não for o padrão, você poderá alterá-lo usando o
CHCP 437
comando 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:fonte
Com idéias colhidas de outras respostas:
C # (.NET Core) , 401 bytes, 349 caracteres
Ungolfed:
Experimente online!
Minha resposta:
C # (.NET Core) ,
509 430418 bytes, 328 caracteresUngolfed:
Experimente online!
fonte
Chip , 3645 bytes
... isso não é um erro de digitação ...
Experimente online! , tipo de. A versão do TIO contém um ponto de corte cerca de um terço do caminho (
t
depois 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.
\0
ou\n
ou 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-z
poderá ser usado, o que efetivamente anexa um número infinito de\0
bytes 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. Oso
servem 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
0x80
bit para todas as linhas de saída, exceto as linhas que contêm números.h
é o elemento Chip que corresponde ao0x80
bit. (A extremidade mais baixa do alfabetoh
atravésa
definir 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.
fonte
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.Menos golfe
fonte
Java (OpenJDK 8) , 279 bytes
Experimente online!
Para a contagem de bytes, use o CP-437, que é suportado nativamente pelo Java como
IBM437
(APIs recentes) ouCp437
(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
fonte
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:
Experimente online!
fonte