Dans le roman Steampunk très sous-estimé The Difference Engine , l'équivalent des salles de cinéma a fourni une image animée pixellisée affichée par des carreaux qui pouvaient être retournés mécaniquement. Le moteur de contrôle pour orchestrer le mouvement de ces tuiles était une grande machine bruyante contrôlée par un jeu de cartes perforées.
Votre tâche consiste à émuler un tel moteur et à afficher une animation pixelisée comme spécifié par un fichier d'entrée. L'entrée se compose de lignes dans un format à largeur fixe, mais vous pouvez supposer tout ce qui convient pour une indication de fin de ligne. Le format est:
SSSSYYxxXXOA
SSSS: 4 digit sequence no. may be padded by blanks or all blank
YY: the y coordinate affected by this line (descending, top is 0, bottom is m-1)
xx: the starting x coordinate
XX: the ending x coordinate
O: hexadecimal opcode
A: argument (0 or 1)
L'entrée est explicitement séquencée (si jamais vous déposez votre jeu de cartes sur le sol, vous me remercierez pour cette partie). Cela signifie que le programme doit effectuer un tri stable des lignes d'entrée en utilisant le champ de séquence comme clé de tri. Les lignes avec le même numéro de séquence doivent conserver leur ordre relatif d'origine. (Il devrait fonctionner avec un tri instable, si vous ajoutez le numéro de ligne réel à la clé.) Un champ de séquence vide doit être interprété comme inférieur à n'importe quel nombre (séquence de classement ascii).
Une seule ligne d'instruction ne peut affecter qu'une seule coordonnée y, mais peut spécifier une plage contiguë de valeurs x. La valeur x finale peut être laissée en blanc ou peut être identique à la valeur initiale afin d'affecter un seul pixel.
L'opcode est un chiffre hexadécimal qui spécifie le code de fonction binaire universel qui est utilisé comme rasterop. L'argument est 0 ou 1. L'opération de raster effectuée est
pixel = pixel OP argument infix expression
--or--
OP(pixel, argument) function call expression
Ainsi, la valeur d'origine du pixel entre comme X dans la table UBF et la valeur d'argument de l'instruction entre comme Y. Le résultat de cette fonction est la nouvelle valeur du pixel. Et cette opération est effectuée sur chaque paire x, y de xx, YY à XX, YY spécifiée dans l'instruction. La plage spécifiée par xx et XX comprend les deux points d'extrémité. Donc
0000 0 010F1
doit définir les pixels 0,1,2,3,4,5,6,7,8,9,10 sur la ligne 0.
Les dimensions de sortie ( m x n ) doivent être de 20 x 20 au minimum, mais peuvent être plus grandes si vous le souhaitez. Mais le grain devrait apparaître, vous savez? Il est censé être pixélisé . Les sorties graphiques et ASCII sont acceptables.
Si par exemple, nous voulions faire une image d'une figure pixélisée:
# #
###
##
####
#
#### ####
# #
###
# #
# #
Si nous le dessinons avec une opération de retournement, comme XOR, elle peut être dessinée et effacée, que l'écran soit noir ou blanc.
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
Dupliquer cette séquence fera apparaître et disparaître la figure.
Une animation plus grande peut être composée dans le désordre, en spécifiant différents "plans" dans le champ de séquence.
100 016F0
101 016F0
102 016F0
103 016F0
104 016F0
105 016F0
106 016F0
107 016F0
108 016F0
109 016F0
110 016F0
111 016F0
112 016F0
113 016F0
114 016F0
115 016F0
200020261
2 0 6 661
2 1 3 561
2 2 3 461
2 3 3 661
2 4 4 461
2 5 0 361
2 5 5 861
2 6 3 361
2 6 5 561
2 8 3 561
2 9 3 361
2 9 5 561
210 3 361
210 5 561
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
300020261
3 0 6 661
3 1 3 561
3 2 3 461
3 3 3 661
3 4 4 461
3 5 0 361
3 5 5 861
3 6 3 361
3 6 5 561
3 8 3 561
3 9 3 361
3 9 5 561
310 3 361
310 5 561
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
Produire:
C'est le code-golf donc le programme le plus court (par nombre d'octets) gagne. Bonus (-50) si le moteur fait des bruits de cliquetis.
la source
x
coordonnée finale est-elle toujours inclusive?Réponses:
Mathematica,
306281 octetsCela attend que la chaîne d'entrée soit stockée dans une variable
i
Et ici avec un espace:
Ça a été sacrément long. Ce défi contenait de nombreux détails délicats, et en particulier l'analyse en entrée prend beaucoup de code dans Mathematica (près de la moitié, 137 octets, analysent simplement l'entrée). J'ai fini par changer de langue deux fois avant de m'installer sur Mathematica (je pensais pouvoir économiser sur l'analyse des entrées en utilisant Ruby, mais j'ai réalisé que le résultat devait être animé , alors je suis retourné à Mathematica).
la source
Exemple Postscript non golfé
Il s'agit d'un programme de style "protocole-prologue", donc les données suivent immédiatement dans le même fichier source. Fichiers GIF animés peuvent être produits avec de ImageMagick
convert
utilitaire (utilisations de Ghostscript):convert clack.ps clack.gif
.la source
gs -sDEVICE=bbox clack.ps
.