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 │ ║ ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
Réponses:
Python 3 , 232 octets
Merci à ceux qui ont aidé à jouer au golf.
Chiffrement dans le chiffrement ...
Essayez-le en ligne!
Pour être joué au golf.
la source
i=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]
économise 4 octetsC (gcc) ,
398395291 octetsSauvegardé 3 octets en travaillant à travers la chaîne inversée et 104 (!) Octets grâce à Leaky Nun.
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.
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.
la source
PHP , 297 octets
Essayez-le en ligne!
Étendu
fonctions utilisées pour les deux versions
vsprintf , strtr , str_pad , array_slice , array_chunk
PHP , 313 octets
Essayez-le en ligne!
la source
T-SQL,
445437 octets (en 381 caractères)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 :
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
FORMAT
fonction .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:
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.la source
Rétine ,
196167 octetsEssayez-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: sea#bcd#e
développe enabbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe
.Inserts
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
pour chaque troisième rangée, plus un║
au début de chaque groupe de 27.Insère
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
entre les autres lignes, plus║
s au début de ces lignes.Insère
║
s tous les trois chiffres. Tous les║
s sont maintenant insérés.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.)Remplace la première ligne par
╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗
(cela économise 1 octet de plus sans ajouter la première ligne en premier lieu).Ajoute
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
après la dernière ligne.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
.Modifications apportées
#b#
àbbb
. Ceci termine la décompression.Supprime toutes les entrées nulles et remplace les espaces réservés par les caractères de dessin de boîte.
la source
0
par l'espace.SOGL V0.12 ,
174172164160 160158 octetsExplication trop longue:
Le programme exécuté:
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)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
la source
JavaScript (ES6), 246 octets / 198 caractères
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
function
nécessaire, 263 octets / 215 caractèresExtrait 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.la source
Lot, 332 octets
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 437
commande 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:la source
Avec des idées récoltées à partir d'autres réponses:
C # (.NET Core) , 401 octets, 349 caractères
Non golfé:
Essayez-le en ligne!
Ma réponse:
C # (.NET Core) ,
509430418octets, 328 caractèresNon golfé:
Essayez-le en ligne!
la source
Puce , 3645 octets
... ce n'est pas une faute de frappe ...
Essayez-le en ligne! , sorte de. La version TIO contient un seuil de coupure d'environ un tiers de la
t
après le 4oooooo
), 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.
\0
ou\n
ou 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'\0
octets à 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ères
123456789:;<=>?
. (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
0x80
bit pour toutes les lignes de sortie à l'exception des lignes qui contiennent des nombres.h
est l'élément Chip qui correspond au0x80
bit. (La limite inférieure de l'alphabeth
para
dé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.
la source
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.Moins golfé
la source
Java (OpenJDK 8) , 279 octets
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) ouCp437
(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
la source
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:
Essayez-le en ligne!
la source