L'année 2009 tire à sa fin, et avec l'économie et à tous, nous allons sauver notre argent et au lieu d'acheter cher des feux d'artifice, nous allons célébrer en ASCII art cette année.
Le défi
Étant donné un ensemble de feux d'artifice et une heure, prendre une photo du feu d'artifice à ce moment et de le faire à la console.
La meilleure solution est entré avant minuit la Veille du Nouvel An (UTC) recevront une prime de 500 rep. C'est le code de golf, de sorte que le nombre de caractères compte fortement; cependant afin de faire de la communauté voix, et je me réserve la décision finale quant à ce qui est le mieux/cool/plus créatifs/etc.
Les Données D'Entrée
Notez que le système de coordonnées est de gauche à droite, de bas en haut, de sorte que tous les feux d'artifice sont lancés à un y
-coordonner de 0 (zéro).
Les données d'entrée se compose de feux d'artifice de la forme
(x, speed_x, speed_y, launch_time, detonation_time)
où
-
x
est la position (colonne) où le feu d'artifice est lancé, -
speed_x
etspeed_y
sont à l'horizontale et à la verticale de la vitesse du feu d'artifice au moment du lancement, -
launch_time
est le point dans le temps que ce feu d'artifice est lancé, -
detonation_time
est le point dans le temps que ce feu d'artifice explose.
Le feu d'artifice de données peut être codé en dur dans votre programme comme une liste de 5-n-uplets (ou l'équivalent dans votre langue), sans compter vers votre nombre de caractères. Il doit, cependant, être facile de modifier ces données.
Vous pouvez faire les hypothèses suivantes:
- il existe une quantité raisonnable de feux d'artifice (disons, moins d'une centaine)
- pour chaque feu d'artifice, tous les cinq nombres sont des nombres entiers à l'intérieur d'une fourchette raisonnable (disons, 16 bits suffirait pour chaque),
-20 <= x <= 820
-20 <= speed_x <= 20
0 < speed_y <= 20
launch_time >= 0
launch_time < detonation_time < launch_time + 50
Le seul autre morceau de données d'entrée est le point de temps qui est censé être rendu. C'est un entier non négatif qui est donnée à vous par le biais de l'entrée standard, ou argument de ligne de commande (selon votre choix).
L'idée est que (en supposant que votre programme est un script python appelé firework.py
) ce script bash vous donne un joli feu d'artifice animation:
#!/bin/bash
I=0
while (( 1 )) ; do
python firework.py $I
I=$(( $I + 1 ))
done
(n'hésitez pas à mettre l'équivalent .Fichier BAT ici).
La vie d'un feu d'artifice
La vie d'un feu d'artifice est comme suit:
- Avant le lancement, il peut être ignoré.
- Au moment du lancement, la fusée a la position
(x, 0)
et le vecteur vitesse(speed_x, speed_y)
. - Pour chaque pas de temps, le vecteur vitesse est ajouté à la position. Avec un peu de stretch appliquée à des lois de Newton, nous supposons que la vitesse reste constante.
- À la détonation temps, la fusée explose en neuf étincelles. Tous les neuf étincelles ont la même position sur ce point dans le temps (qui est la position que la fusée serait, n'est-ce pas explosé),
mais leurs vitesses différentes. Chaque vitesse est basée sur la fusée de la vitesse, avec -20, 0 ou 20 ajoutés
speed_x
et -10, 0, 10 ajoutésspeed_y
. C'est de neuf combinaisons possibles. - Après la détonation du temps, de la gravité commence à tirer: À chaque pas de temps, la constante gravitationnelle, qui se trouve être de 2 (deux), est soustraite de chaque étincelle de l'
speed_y
. L'horizontalspeed_x
reste constante. - Pour chaque pas de temps après la détonation de temps, vous d'abord ajouter le vecteur vitesse à la position, puis soustraire de 2
speed_y
. - Quand une étincelle de l'
y
position descend en dessous de zéro, vous pouvez l'oublier.
Sortie
Ce que nous voulons, c'est une photo du feu d'artifice de la façon dont il regarde le point donné dans le temps. Nous nous intéressons seulement à la trame 0 <= x <= 789
et 0 <= y <= 239
, de la cartographie à un 79x24 la sortie de caractères.
Donc, si une fusée ou d'étincelle a la position (247, 130), on dessine un personnage dans la colonne 24 (de base zéro, c'est donc le 25 colonne), ligne 13 (de base zéro et le comptage à partir du bas, de sorte que c'est la ligne 23 - 13 = 10, le 11e de ligne de la sortie).
Le personnage pénètre dépend de la vitesse de la fusée / spark:
- Si le mouvement est horizontal*, c'est à dire
speed_y == 0 or abs(speed_x) / abs(speed_y) > 2
, le personnage est "-
". - Si le mouvement est vertical*, c'est à dire
speed_x == 0 or abs(speed_y) / abs(speed_x) > 2
, le personnage est "|
". - Sinon, le mouvement est diagonale, et le caractère "
\
" ou "/
" (vous devinerez celui de droite). - Si la même situation se aspiré à plus d'une fois (même si c'est le même personnage), nous avons mis "
X
" à la place. Donc, en supposant que vous avez une étincelle à l'(536, 119)
et une à l'(531, 115)
, vous dessinez un "X
", quelle que soit leur vitesse.
* mise à jour: ces sont des entiers divisions, de sorte que la pente doit être au moins de 3 ans, ou au plus 1/3, respectivement
La sortie (écrit sur la sortie standard) est de 24 lignes, chacune terminée par un caractère de saut de ligne. Les espaces sont ignorés, de sorte que vous pouvez, mais n'ont pas besoin d', le pad à une largeur de 79. Les lignes ne peut être supérieure à 79 caractères (à l'exclusion du saut de ligne). Tous les espaces intérieurs doivent être en caractères d'espace (ASCII 32).
Les Données De L'Échantillon
Feux d'artifice:
fireworks = [(628, 6, 6, 3, 33),
(586, 7, 11, 11, 23),
(185, -1, 17, 24, 28),
(189, 14, 10, 50, 83),
(180, 7, 5, 70, 77),
(538, -7, 7, 70, 105),
(510, -11, 19, 71, 106),
(220, -9, 7, 77, 100),
(136, 4, 14, 80, 91),
(337, -13, 20, 106, 128)]
Sortie à temps 33:
\ | / / \ - | / - | - / \
Sortie au moment 77:
\ \ X \
Sortie au moment de 93:
\ | / \ / / - - - \ \ / \ \
Mise à jour: j'ai téléchargé la sortie attendue à la fois 0 thru 99 firework.ü-wie-geek.de/NUMBER.html, où NUMÉRO est le temps. Il comprend des informations de débogage, cliquez sur une particule de voir sa position actuelle, la vitesse, etc. Et oui, c'est un tréma domaine. Si votre navigateur ne peut pas gérer (comme de toute évidence ne peut Débordement de Pile), essayez de firework.xn---wie-geek-p9a.de.
Une autre mise à jour: Comme signalé dans les commentaires ci-dessous, une plus longue feu d'artifice est maintenant disponible sur YouTube. Il a été créé avec une version modifiée de MizardX' entrée, avec un total de feux d'artifice comte de 170 (oui, c'est plus que le spec demandé, mais le programme a traité avec élégance). L'exception de la couleur, de la musique et de la fin de l'écran, l'animation peut être recréé par une entrée de ce code de golf. Donc, si vous êtes geek suffit de profiter d'un art ASCII feu d'artifice (vous savez que vous êtes): Avoir du plaisir, et une bonne et heureuse année à tous!