En 2014, le demoscener Jakub 'Ilmenit' Debski a publié une démo de procédure procédurale de 250 octets (1) pour Atari XL, appelée Mona . Cela dessine la photo suivante (2) :
Votre tâche consiste à générer exactement la même image, en utilisant la langue de votre choix.
(1) Répartition: 136 octets de données + 114 octets de code.
(2) La photo d'origine est 128x96. La version ci-dessus a été agrandie à 256x192. Quelques pixels diffèrent de l'original, mais il s'agit de la sortie attendue avec le pseudo-code décrit dans ce défi.
Comment?
C'est du code-golf . Bien que vous soyez autorisé à utiliser n'importe quelle méthode, les meilleurs résultats seront probablement obtenus en utilisant l'algorithme d'origine décrit ci-dessous.
NB : Ce paragraphe n’est pas une spécification, mais une description générale. Veuillez vous référer au pseudo-code et à l'implémentation de référence pour plus de détails sur l'algorithme.
L’image est composée de 64 traits de pinceau pseudo-aléatoires ( voir cette vidéo ), en passant par les couleurs suivantes (au format hexadécimal RRGGBB):
COLOR = [ 0xFFE289, 0xE99E45, 0xA55A00, 0x000000 ]
Le fond est initialement rempli avec la 4ème couleur (noir). Chaque trait est plus court que le précédent.
Le générateur pseudo-aléatoire utilise un registre à décalage à rétroaction linéaire (LFSR) sur un entier de 32 bits initialement défini sur 0x7EC80000
et avec XOR 0x04C11DB7
.
Chaque trait est initialisé avec une valeur de 16 bits qui écrase les octets les plus bas de la graine:
BRUSH = [
0x030A, 0x37BE, 0x2F9B, 0x072B, 0x0E3C, 0xF59B, 0x8A91, 0x1B0B,
0x0EBD, 0x9378, 0xB83E, 0xB05A, 0x70B5, 0x0280, 0xD0B1, 0x9CD2,
0x2093, 0x209C, 0x3D11, 0x26D6, 0xDF19, 0x97F5, 0x90A3, 0xA347,
0x8AF7, 0x0859, 0x29AD, 0xA32C, 0x7DFC, 0x0D7D, 0xD57A, 0x3051,
0xD431, 0x542B, 0xB242, 0xB114, 0x8A96, 0x2914, 0xB0F1, 0x532C,
0x0413, 0x0A09, 0x3EBB, 0xE916, 0x1877, 0xB8E2, 0xAC72, 0x80C7,
0x5240, 0x8D3C, 0x3EAF, 0xAD63, 0x1E14, 0xB23D, 0x238F, 0xC07B,
0xAF9D, 0x312E, 0x96CE, 0x25A7, 0x9E37, 0x2C44, 0x2BB9, 0x2139
];
Ces valeurs sont également utilisés pour définir la nouvelle position (Bx, By) de la brosse , au début de la course: bx est donnée par l'octet le moins significatif et en est donnée par l'octet le plus significatif.
La direction du trait est donnée par les bits n ° 1 et n ° 7 de la graine. (Voir l'instruction SWITCH dans le pseudo-code.)
Pseudo-code
Ci - dessous l'algorithme pseudo-code, en supposant des tableaux 0 indexés, où AND
, OR
et XOR
moyennes opérations binaires.
seed = 0x7EC80000
dir = 0x00
FOR part = 0 TO 63
word = BRUSH[part]
seed = (seed AND 0xFFFF0000) OR word
bx = word AND 0xFF
by = (word >> 8) AND 0xFF
FOR len = 0 TO (64 - part) * 32 - 1
carry = seed AND 0x80000000
seed = (seed << 1) AND 0xFFFFFFFF
IF carry
seed = seed XOR 0x04C11DB7
dir = seed AND 0xFF
ENDIF
SWITCH dir AND 0x82
CASE 0x00:
by = (by + 1) AND 0x7F
ENDCASE
CASE 0x02:
bx = (bx + 1) AND 0x7F
ENDCASE
CASE 0x80:
by = (by - 1) AND 0x7F
ENDCASE
CASE 0x82:
bx = (bx - 1) AND 0x7F
ENDCASE
ENDSWITCH
drawPixel(bx, by, COLOR[part AND 3])
ENDFOR
ENDFOR
Mise en oeuvre de référence
Vous trouverez ci-dessous une implémentation de référence non golfée en JavaScript.
Vous pouvez également voir une version animée ici .
Clarification et règles
- La sortie doit être rognée à 128x96, même si l'algorithme dessine en dehors de cette zone.
- Si votre langue / plate-forme n'est pas en mesure de produire les couleurs exactes décrites ci-dessus, vous devez utiliser des couleurs aussi proches que possible.
- Si vous décidez d'utiliser une autre méthode, vous devez toujours générer exactement le même résultat.
- Juste au cas où: la soumission du code d'assemblage d'origine 6502 ou de toute version légèrement modifiée n'est pas autorisée.
- Pouvez-vous battre 250 octets? Bon dessin!
Réponses:
Opcode x86,
227224223 octetsImage:
la source
0122 6681F7B71DC104 xor edi, 00001DB7
bug trouvé dans W32Dasm8086 Assembly - NASM (MBR) -
248245 octetsla source
xor dx,dx
et remplacezmov bp,0xa000; mov es,bp
parpush 0xa000; pop es
.PUSH imm
Excel VBA 32 bits,
1011720 octetsRévision 49; Δ Score = 291 octets
Golfé
Sub
Routine complète sans entrée et sortie de la Mona Lisa vers l'ActiveSheet
objet de la plage[A1:DX96]
.Il y avait un grand nombre de la magie noire impliqué dans le golf cela à son état actuel, - de la note, quelques - unes des astuces sont impliqués préparation de pixel art , décalage de bits couleurs conversion de type implicite , et la
de compression octets commebase64
compressionString
.Remarque: cette solution a été limitée aux versions 32 bits d'Excel VBA, de même que
^
leLongLong
type littéral des versions 64 bits.Remarque, la seconde: la chaîne est la ligne 3 n'est pas un commentaire car
”
n'est pas équivalent à"
Sortie
Gif indiquant la sortie vers
ActiveSheet
quandM
est appelé dans la fenêtre immédiate de VBE. Notez qu'en raison des limitations de taille de fichier,figgif a moins de cadres que ce qui a été produit.Ungolfed
Routine complète non golfée
sub
qui ne prend aucune entrée et produit le mona lisa en utilisant la méthode décrite ci-dessus sur l'ActiveSheet
objetla source
HTML + CSS + JavaScript (ES6), 499 octets
678...478475473465459455451447449 octetsIl est loin de 250 octets, mais je vais certainement régler moins de 500 octets! Un grand merci à @Arnauld et à @ Firefly de m'avoir aidé à jouer ce monstre au golf.
Pour une plus grande échelle, remplacez le CSS par le suivant:
Histoire annotée!
Je me suis amusé à jouer au code de référence d'Arnauld, et vous pouvez en obtenir une partie ici. Prendre plaisir!
Afficher l'extrait de code
la source
Befunge,
11311052 octetsUn certain nombre de problèmes font de Befunge un problème épineux:
Befunge ne dispose que de 2 000 octets de mémoire (avec le code source), il n’ya donc aucun moyen de restituer l’image entière en mémoire avant de la sortir. La façon dont je travaille est d'exécuter l'algorithme de manière répétée 96 fois, une fois pour chaque ligne. Chaque exécution stocke uniquement les pixels nécessaires à la ligne actuelle, qui sont ensuite affichés à la fin de l'exécution. Cela nous permet de nous en sortir avec un tampon de pixels de 128 octets seulement.
Befunge n'a aucune opération de bit que ce soit. De nombreuses
AND
opérations peuvent simplement être émulées avec un opérateur modulo (par exemple, ellesa AND 0x7F
peuvent être remplacées para % 0x80
). Cependant, celaXOR
nécessite des manipulations de bits assez compliquées, que nous devons traiter un octet à la fois, en utilisant un ensemble de formules personnalisées codées en dur pour gérer les quatre octets dont nous avons besoin. Par exemple, pour calculera XOR 0xC1
, nous utilisons la formule:a + 0xC1 - (a/64%4*64 + a%2)*2
Bien qu'il ne s'agisse pas d'une limitation de Befunge en soi, l'interface de TIO est incapable de gérer des caractères ASCII étendus dans la source, ce qui aurait été le moyen le plus simple de stocker les tables de pinceaux et de couleurs. Je travaille autour de cela en générant ces tables sous forme de liste de nombres sur la pile, puis j'ai une petite boucle d'initialisation qui copie les valeurs de la pile dans la mémoire. J'ai passé une bonne partie de mon temps à jouer au golf sur cette table, qui occupe les cinq premières lignes de code.
Malheureusement, malgré tous mes efforts pour rendre le code compatible avec TIO, et mon choix d’un format de fichier pouvant être extrait de TIO ( PPM ), il est tout simplement trop lent pour terminer dans le délai de 60 secondes (l'exécution de l'algorithme probablement 96 fois). ne aide pas). Mais comme il génère l'image ligne par ligne, vous devez toujours obtenir suffisamment de sortie pour récupérer près de la moitié de l'image.
Essayez-le en ligne!
Si vous ne disposez pas d'un visualiseur de fichiers PPM local, vous pouvez facilement convertir en un autre format à l'aide de l'un des nombreux convertisseurs en ligne. Un exemple est Convertio .
la source
Python 3,
544536523519518 octetsIl s'agit d'une version plus tardive de la traduction Python de l'implémentation de référence par CCB60 . À l'origine, j'avais utilisé un grand nombre hexadécimal pour représenter le pinceau de l'algorithme, mais je me suis rendu compte par la suite que mon hypothèse non fondée selon laquelle une représentation de chaîne Unicode ne fonctionnerait pas en Python était fausse.
Au départ, je pensais que mon nombre d'octets était considérablement inférieur, mais comme l'a souligné ASCII uniquement , je ne me souvenais pas de compter les caractères Unicode comme plus d'un octet.
Sortie (128 x 96)
Identique à la sortie du CCB60.
la source
Java 7,
681677675626612610 octetsÉmet l’image suivante en résolution 128x96:
Je sais que ce n'est même pas près de 250 octets mais bon c'est java
-2 octets grâce à Zacharý
la source
#Language, <s>Old Scores</s> Score Bytes
et 2 vous pouvez rendre votre code un peu plus lisible en ajoutant dans un drapeau de langue du formulaire<!-- language-all: lang-java -->
avant votre bloc de code0x04C11DB7
=>0x4C11DB7
et0x7f
=>127
. Ne devenez pas fou quand ce n'est pas nécessaire.C #,
960850 octetsUne copie simple du pseudo-code avec du golf ajouté. Il y a encore beaucoup de choses qui peuvent être jouées au golf, mais je voulais poster ma réponse pour que tout se passe bien.
Version complète / formatée:
la source
var m = new Bitmap(128,96)
AE IU WAUGH WYPython 2.7;
880876 octets au total (incluant les données)-4 octets à 876 grâce à ZacharyT. (Mon interprète python n'a pas aimé sa suggestion de supprimer les espaces entre les années 80 et les autres).
La suggestion de Taylor Scott de placer le pinceau dans la base 10 est excellente, mais notjagan (dans un commentaire) a poussé plus loin sa suggestion, en utilisant le format entier étendu de python au format hexadécimal. La réponse de notjagan se trouve dans Python 3 et constitue une telle amélioration par rapport à ce que j’ai fait qu’il mérite le crédit. J'espère qu'il l'affichera comme réponse séparée.
Sortie dans une fenêtre Tkinter. Sans mise à l'échelle, l'image est très petite, mais la mise à l'échelle ajoute environ une douzaine d'octets au nombre.
Il n'y a pas grand-chose à faire ici, à part la traduction en Python et quelques notions de golf. Parfois, les manipulations au niveau des bits sont plus courtes, parfois les calculs entiers. Je ne pouvais pas trouver un moyen d'incorporer plus de logique dans des listes ou des tableaux. L'algorithme de base est déjà assez dense.
la source
<!-- language-all: lang-py -->
80
et leelse
. Et,0x00
est-ce la même chose0
, non?import
et*
.Tcl / Tk, 805
808815816819826839840843Toujours le perdant, maisje devais le faire! peut-être que je peux jouer au golf plus tard!Pas le perdant maintenant!
Tcl / Tk, 1370
Une translittération du pseudo-code très peu gaie avant le début de la fête du golf! La
update
ligne permet de voir le dessin se faire progressivement!la source
Python 3 + matplotlib, 541
Cela enregistre l'image sous forme de fichier png "i". Pour afficher l'image, vous pouvez remplacer l'imsave par un imshow et un spectacle de 545 octets.
la source
SmileBASIC,
454447444 octetsLa chaîne de "x" contient des caractères unicode non valides. Je ne suis donc pas en mesure de la publier ici. Voici les codes de caractère en décimal (juste le tableau BRUSH en sens inverse):
8505, 11193, 11332, 40503, 9639, 38606, 12590, 44957, 49275, 9103, 45629, 7700, 44387, 16047, 36156, 21056, 32967, 44146, 47330, 6263, 59670, 16059, 2569, 1043, 21292, 45297, 10516, 35478, 45332, 45634, 21547, 54321, 12369, 54650, 3453, 32252, 41772, 10669, 2137, 35575, 41799, 37027, 38901, 57113, 9942, 15633, 8348, 8339, 40146, 53425, 640, 28853, 45146, 47166, 37752, 3773, 6923, 35473, 62875, 3644, 1835, 12187, 14270, 778
la source
"xx...xx"
chaîne?: r4, 764 octets
la source d'exécution : r4 github
J'utilise une astuce pour effectuer le déplacement sans condition, transformer le bit 8 en signe et le déplacer avec le bit 2. version avec noms de pile:
la source
Yabasic,
790779 octetsUne réponse de base qui ne prend pas d’entrée et qui sort vers une nouvelle fenêtre graphique.
Sortie
Ce qui suit est mis à l'échelle par un facteur de 8
la source