Dessinez un tableau sudoku à l'aide de caractères de dessin au trait

20

C'est le golf de code. Pour ce défi, j'accepterai une méthode (vous n'avez pas besoin d'un programme complet), mais la signature de la méthode compte pour le nombre d'octets et je veux voir la signature complète (pas un lamdba). L'entrée de la méthode est un tableau d'entiers avec 81 éléments. La valeur de sortie / retour de la méthode est une chaîne qui représente le tableau comme une carte ascii sudoku.

Si vous utilisez un langage ésotérique ou quelque chose qui n'a absolument pas de méthodes, vous pouvez vous adapter, mais si le langage le supporte du tout, je veux voir quelque chose pourrait en fait être connecté à un "vrai" programme non golfé, même si le méthode corps lui-même est une douleur à travailler avec. Cette exigence n'est pas destinée à bloquer des langages tels que Jelly ou 05AB1E, mais à faciliter la création par des langages comme Java de quelque chose de logique pour cette plate-forme.

Pour l'entrée, les valeurs entières 1-9 doivent avoir des significations évidentes. Un 0 doit toujours être interprété comme une cellule vide. Vous pouvez également interpréter toute autre chose en dehors de la plage 1-9 comme une cellule vide, mais cela n'est pas obligatoire. Le positionnement du tableau au puzzle commence en haut à gauche et remplit chaque ligne de gauche à droite avant de passer à la ligne suivante.

Pour les boîtes, je veux des lignes doubles autour de l'extérieur et entre chaque région 3x3, et des lignes simples entre les autres cellules. Ceux-ci doivent être dessinés avec des caractères de dessin au trait (si votre format d'E / S représente des chaînes comme une séquence d'octets plutôt qu'une séquence de caractères, vous devez les représenter dans un codage bien connu tel que UTF-8 ou la page de code 347).

Pour ce défi, je ne vous demande PAS de générer le puzzle sudoku. C'est l'entrée pour la fonction. Je ne vous demande PAS de résoudre le puzzle. Je vous demande juste de produire une chaîne pour "dessiner" ce qui vous est donné (en aussi peu d'octets que possible).

Exemple d'entrée:

Valeurs du tableau:

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

Les valeurs peuvent utiliser n'importe quel mécanisme naturel pour votre langage: int [], ArrayList, séquence, tuple, chaîne de chiffres, peu importe, tant que vous avez une valeur en entrée pour chaque cellule (pas de mappage uniquement pour les cellules remplies aux positions) ). N'oubliez pas que l'entrée est fournie ... elle ne fait pas partie de votre nombre d'octets. Mais l'entrée peut représenter n'importe quel puzzle sudoku, et le puzzle peut même ne pas avoir de solution valide . Vous devez supposer que le puzzle est imprimable. Vous n'obtiendrez pas quelque chose avec 82 éléments, par exemple.

Vous pouvez également assumer une police à largeur fixe raisonnable.

Sortie correspondante:

╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗
║ 8 │ 5 │ ║ │ │ 2 ║ 4 │ │ ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ 7 │ 2 │ ║ │ │ ║ │ │ 9 ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ │ │ 4 ║ │ │ ║ │ │ ║
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
║ │ │ ║ 1 │ │ 7 ║ │ │ 2 ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ 3 │ │ 5 ║ │ │ ║ 9 │ │ ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ │ 4 │ ║ │ │ ║ │ │ ║
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
║ │ │ ║ │ 8 │ ║ │ 7 │ ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ │ 1 │ 7 ║ │ │ ║ │ │ ║
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
║ │ │ ║ │ 3 │ 6 ║ │ 4 │ ║
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
Joel Coehoorn
la source
4
Êtes-vous sûr de la partie méthode? Cela n'a pas de sens pour beaucoup de langues (c'est-à-dire les langues sans méthodes).
Cyoce
1
Pour les langues qui n'ont pas de méthodes, vous pouvez vous adapter. Mais s'ils le font, je cherche quelque chose qui pourrait être utile pour se connecter à un "vrai" programme. Je vais ajouter cela à la question.
Joel Coehoorn
2
Quel est le raisonnement pour ne pas autoriser les lambdas? Celles-ci pourraient certainement être connectées à un "vrai" programme aussi bien que des fonctions / méthodes nommées
Julian Wolf
2
Nitpicky mais important: il n'y a pas de "personnage de dessin de boîte ASCII". ASCII couvre les codes 0 à 127, dont aucun n'est un caractère de dessin de boîte. Ces derniers temps, Unicode est la norme, mais il a plusieurs encodages différents: UTF-8, UTF-16, etc., qui utilisent tous plus de 1 octet par caractère de tirage. Les codages plus anciens tels que Codepage 437 prennent en charge les caractères de dessin de boîte à un octet. Lorsque vous utilisez des caractères en dehors de la plage ASCII, vous devez spécifier les encodages valides. en.wikipedia.org/wiki/Box-drawing_character en.wikipedia.org/wiki/Unicode
Level River St
2
La "méthode" devrait probablement être une "fonction nommée" pour obtenir l'équivalent le plus proche possible d'une méthode dans des langages non orientés objet. (Par exemple, C, un langage largement utilisé, n'a pas de méthodes mais a des fonctions nommées.) Dans la plupart des langages que je connais qui ont des méthodes, ils sont l'équivalent de ce langage d'une fonction nommée. (L'exception la plus connue que je connaisse est C ++, où l'utilisation d'une fonction nommée serait beaucoup plus plausible pour cette tâche que l'utilisation d'une méthode, car il est très difficile de savoir à quel type d'objet vous associeriez la méthode. .)

Réponses:

9

Python 3 , 232 octets

Merci à ceux qui ont aidé à jouer au golf.

Chiffrement dans le chiffrement ...

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

Essayez-le en ligne!

Pour être joué au golf.

Leaky Nun
la source
Comment n'ai-je pas remarqué que ... c'est comme la raison pour laquelle j'ai utilisé Python 2, mais merci.
Leaky Nun
1
En fait, il vaut mieux utiliser Python 3, car vous n'aurez plus besoin de la première ligne.
Erik the Outgolfer
1
Vous pouvez supprimer plus de parens sur la dernière ligne: tio
Conor O'Brien
Supprimer la définition de f et définir i comme i=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]économise 4 octets
officialaimm
7

C (gcc) , 398 395 291 octets

Sauvegardé 3 octets en travaillant à travers la chaîne inversée et 104 (!) Octets grâce à 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);}

Essayez-le en ligne!

C (gcc) , 395 octets

Je vais garder ceci ici afin que son plus évident sur la façon dont le programme fonctionne.

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

Essayez-le en ligne!

Travailler avec unicode en C est ... coûteux. Prend l'entrée comme un int*comme indiqué dans le lien et dans la spécification.

Je vais voir si je peux enregistrer des octets en utilisant un nombre magique au lieu de coder en dur la chaîne.

Conor O'Brien
la source
355 octets
Leaky Nun
@LeakyNun Huh, merci! C'est 291 octets selon TIO
Conor O'Brien
TIO compte à l'aide de SBCS .
Leaky Nun
6

PHP , 297 octets

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

Essayez-le en ligne!

Étendu

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

fonctions utilisées pour les deux versions

vsprintf , strtr , str_pad , array_slice , array_chunk

PHP , 313 octets

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

Essayez-le en ligne!

Jörg Hülsermann
la source
Comment cela marche-t-il?
Cyoce
@Cyoce J'ai ajouté une explication pour ma nouvelle version
Jörg Hülsermann
5

T-SQL, 445 437 octets (en 381 caractères)

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

L'entrée se fait via une chaîne de chiffres stockée dans la colonne a du tableau préexistant t , selon les méthodes approuvées .

Format et explication :

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

Dans la ligne supérieure de la boucle, je reçois les 9 prochains chiffres de la chaîne d'entrée de la colonne a de la table préexistante t .

Je convertis cette chaîne de chiffres en un entier et j'utilise la FORMATfonction .Net pour les afficher à l'aide d'un modèle de texte personnalisé '║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║P'.

Après cela, j'ajoute simplement la ligne de séparation appropriée et je fais des remplacements d'économie d'octets avant la sortie.

La sortie est affichée dans le volet des résultats:

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

J'avais auparavant des remplacements supplémentaires pour certains des autres personnages de dessin, mais ils ne m'ont finalement pas économisé d'octets.

EDIT 1 : 8 octets enregistrés en commençant @rà zéro au lieu de 1 et en supprimant certains espaces inutiles.

BradC
la source
4

Rétine , 196 167 octets

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

Essayez-le en ligne! Prend l'entrée sous la forme d'une chaîne de longueur 81. Explication: Étant donné que les caractères de dessin de boîte coûtent trois octets, les points de code unicode ═-╬sont représentés dans le code à l'aide de =|#A-Z(tous les caractères ne sont pas utilisés, mais le respect des plages économise des octets). De plus, les lignes sont compressées à l'aide de #signes: se a#bcd#edéveloppe en abbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe.

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

Inserts ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣pour chaque troisième rangée, plus un au début de chaque groupe de 27.

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

Insère ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢entre les autres lignes, plus s au début de ces lignes.

\d{3}
 $& |

Insère s tous les trois chiffres. Tous les s sont maintenant insérés.

\B\d
 │ $&

Insère |s entre toutes les paires de chiffres restantes. (Celui-ci est le caractère de dessin de boîte réel plutôt qu'un tuyau. Malheureusement, les caractères ─│┼ont des codes trop éloignés les uns des autres et les caractères de boîte double pour que cela en vaille la peine tout en utilisant des espaces réservés.)

^¶.*
B#=RT#E

Remplace la première ligne par ╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗(cela économise 1 octet de plus sans ajouter la première ligne en premier lieu).

$
¶H#=UW#K

Ajoute ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝après la dernière ligne.

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

S'élargit a#bcd#e, d'abord à a#bc#d#bc#d#bc#e, puis à a#b#c#b#c#b#d#b#c#b#c#b#d#b#c#b#c#b#e.

#(.)#
$1$1$1

Modifications apportées #b#à bbb. Ceci termine la décompression.

T`0=|#L` ═-╬

Supprime toutes les entrées nulles et remplace les espaces réservés par les caractères de dessin de boîte.

Neil
la source
Vous avez oublié de remplacer 0par l'espace.
Leaky Nun
A également des lignes doubles autour de chaque ligne, plutôt que juste la frontière et les régions 3x3.
Joel Coehoorn
@JoelCoehoorn Fixed, désolé.
Neil
@LeakyNun Merci, j'avais oublié ça. (De plus, j'aime éviter que les lignes se terminent par, ou surtout ne contiennent que des espaces, c'est pourquoi j'ai cherché une économie alternative sur 2 octets.)
Neil
3

SOGL V0.12 , 174 172 164 160 160 158 octets

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

Explication trop longue:

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

Le programme exécuté:

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

où tout sauf la dernière ligne est juste in the entire program replace occurrences of the last char of this line with the rest of this line. C'est la raison pour laquelle il a été possible de créer la moitié des caractères uniquement au hasard ascii (mais pour que les espaces, les tirets et les guillemets soient utilement utilisés, il a fallu un certain temps pour comprendre)

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

Essayez-le ici!
Le code d'interprète en ligne est plus correct car les onglets ne fonctionnent pas avec SE

-8 octets: remplacement par force brute compressant toute la carte, puis remplaçant les caractères étrangers (à la page de code) par leurs points de code. Cela a pris une heure de moins que l'ancien programme ...
-4 octets: compression de la chaîne compressée ...
-2 octets: utilisation d'une variable + chaîne au lieu d'un tableau

dzaima
la source
2

JavaScript (ES6), 246 octets / 198 caractères

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

L'entrée est un tableau d'entiers. Nous avons fini par utiliser les deux mêmes fonctions d'aide que la réponse Python de Leaky Nun , donc le mérite y va.

Si functionnécessaire, 263 octets / 215 caractères

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

Extrait de test

Toute entrée de 81 numéros est prise en charge ( 1234, 1, 2, 3, 4. [1 2 3 4], Etc.). Mieux vu en pleine page.

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>

Justin Mariner
la source
2

Lot, 332 octets

@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

Nécessite que la console soit en CP437. Si ce n'est pas votre valeur par défaut, vous pouvez le modifier à l'aide de la CHCP 437commande si votre console est définie sur les polices TrueType. (Cela ne fonctionnera avec les polices raster que si CP437 est déjà votre page de codes par défaut.) Voici à quoi ressemble le code dans 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
Neil
la source
2

Avec des idées récoltées à partir d'autres réponses:

C # (.NET Core) , 401 octets, 349 caractères

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

Non golfé:

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

Essayez-le en ligne!

Ma réponse:

C # (.NET Core) , 509430418 octets, 328 caractères

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

Non golfé:

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

Essayez-le en ligne!

Joel Coehoorn
la source
Avez-vous besoin de compter chaque caractère de dessin comme deux octets?
BradC
Je l'ai fait, réparé maintenant. J'avais voulu répondre à cela en question et compter les caractères plutôt que les octets, à cause de ces caractères, mais je suppose qu'il est trop tard maintenant.
Joel Coehoorn
Oui, les octets sont plus difficiles, certaines substitutions ascii économisent des octets mais n'affectent pas les caractères (ou même les caractères blessés). Je travaille sur T-SQL, et char vs nchar est une assez grande différence.
BradC
1

Puce , 3645 octets

... ce n'est pas une faute de frappe ...

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

Essayez-le en ligne! , sorte de. La version TIO contient un seuil de coupure d'environ un tiers de lat après le 4 oooooo), de sorte qu'elle devrait se terminer en moins de 60 secondes. La version complète prend environ 1m25s sur ma machine, et TIO semble environ la moitié plus rapide. Cela signifie également que le TIO n'affiche que les 7 premières lignes de sortie.

Mon premier brouillon pesait un énorme 19758 octets et m'a pris environ 8m30 pour courir. La solution finale, avant le golf, était un 5980 octets vif, ne prenant que 2m07s.

Alors, comment ça marche, alors?

Cela prend une chaîne de 82 octets, 81 chiffres, suivie d'un terminateur. \0ou \nou même un autre numéro fera l'affaire. (Cette implémentation ne regarde en fait que les 81 premiers, mais en requiert au moins un de plus, car Chip se terminera s'il a épuisé ses entrées. Si cela est inacceptable, le drapeau-z peut être utilisé, ce qui ajoute effectivement un nombre infini d' \0octets à la fin de l'entrée.) Le code TIO raccourci n'atteint pas réellement les 81 octets, donc le point est discutable.

De la façon dont j'ai implémenté cela, il ne regarde que les 4 bits les plus bas de l'entrée, donc tout peut vraiment être un `` puzzle '' de sudoku, des données binaires brutes aux œuvres moins connues de Shakespeare. Tout caractère dont les 4 bits les plus faibles sont tous nuls apparaîtra comme un espace (un cas spécial), tous les autres caractères123456789:;<=>? . (Donc, les derniers ne sont pas des chiffres, mais 10 n'est pas non plus un nombre valide dans le sudoku normal).

Pour les caractères de dessin de boîte, il produit UTF-8, équivalant à 3 octets chacun.

Qu'en est-il de la mise en œuvre réelle?

Chip est un langage 3D inspiré des circuits intégrés. Il a des fils, des portes logiques et des cellules de mémoire. La plupart des choses se font sur des plans 2D, mais ces plans peuvent être empilés les uns sur les autres. C'est ainsi que ce programme est construit.

Les lignes qui commencent par =sont les séparateurs de calques. Ensuite, les couches sont empilées, les côtés supérieur et gauche étant alignés. leo servent de broches, permettant aux signaux de passer d'une couche à l'autre.

Chaque couche ici a un but, vous pouvez les considérer comme des fonctions. La première couche contrôle tout; il «appelle» tour à tour chacune des autres couches. Il y a un motif répétitif de gauche à droite ici. Ce modèle garde une trace des 19 lignes de sortie que nous imprimons actuellement.

La deuxième couche est plutôt minuscule et a un très petit travail. Il définit le 0x80bit pour toutes les lignes de sortie à l'exception des lignes qui contiennent des nombres. hest l'élément Chip qui correspond au 0x80bit. (La limite inférieure de l'alphabet hpar adéfinir les huit bits de sortie).

La troisième couche est l'endroit où nous entrons vraiment dans la viande d'impression. Cette couche est en charge de la première ligne. La version non golfée a huit rangées de x'et )', mappant sur des 0 et des 1 pour chacun des huit bits de chaque octet. Cependant, nous pouvons tirer parti des modèles dans les bits pour accomplir la même tâche en moins de lignes.

La couche quatre ressemble beaucoup à la troisième. Il gère les doubles lignes horizontales.

Le calque cinq gère la dernière ligne. Notez qu'il manque le fil le long du dessus des autres couches. C'est parce que nous n'avons pas besoin de retourner le contrôle au séquenceur. Au lieu de cela, nous pouvons simplement terminer l'exécution ici avec t.

Le calque six gère les lignes horizontales simples.

La couche sept est l'endroit où les numéros sont imprimés. Il est «appelé» pour chacune des neuf lignes numériques. Il consomme 9 octets d'entrée dans le cadre de son exécution.

Phlarx
la source
1

JavaScript (ES6), 222 octets

Utilisation d'une syntaxe courte pour les fonctions ES6 - 174 caractères codés en utf8, 222 octets ( https://mothereff.in/byte-counter ). L'utilisation function ...nécessite 16 octets supplémentaires.

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)

Moins golfé

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>

edc65
la source
1

Java (OpenJDK 8) , 279 octets

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

Essayez-le en ligne!

Pour le nombre d'octets, utilisez CP-437, qui est pris en charge nativement par Java en tant que IBM437(API récentes) ou Cp437(API plus anciennes); utilisez donc un système qui a ce jeu de caractères a ce jeu de caractères comme jeu de caractères par défaut.

Ce code est compatible à partir de Java 5, mais a été testé sur Java 8 uniquement.

Explication

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.
}
Olivier Grégoire
la source
1

Tcl , 599 octets (295 caractères)

Approche très naïve, mais je devais juste le faire même sans être gagnant par aucune mesure:

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

Essayez-le en ligne!

sergiol
la source
c'est 599 octets UTF-8. Vous devriez essayer de réutiliser les caractères de la boîte commune pour économiser des octets
dzaima
@dzaima: Je sais, je peux faire ce que j'ai fait sur un clavier si réel que vous pouvez presque le
goûter
@dzaima: C'est pourquoi j'ai dit Approche très naïve
sergiol