Qui n'aime pas les films d'action avec des voitures rapides et bruyantes, en particulier celles avec beaucoup d'accidents? Qui n'aime pas les plans d'action dans l'art ascii?
La scène est:
Deux voitures partent sur les côtés opposés d'une route droite (avec 60 espaces entre les deux). Ils commencent à se rapprocher à vitesse constante. La voiture de gauche roule à 1 espace par seconde et celle de droite roule à 2 espaces par seconde.
Évidemment, les voitures ne peuvent pas se traverser, donc pour n ≥ 20
la scène, il y aura deux voitures écrasées avec des capots à l'endroit où l'accident s'est produit.
En tant que cinéphile, je veux faire une pause de temps en temps, juste pour en apprécier la beauté.
Étant donné un entier n
(argument de fonction ou STDIN), représentant le nombre de secondes depuis le début de la scène, affichez la scène à ce moment.
Voici la scène de départ, avec 60 espaces entre les roues avant:
__ __
_/ \_ _/ \_
o o o o
voici la scène après 11 secondes:
__ __
_/ \_ _/ \_
o o o o
et voici à quoi ça ressemble après le crash (notez que les bonnets sont en place après le crash):
__ __
_/ \/\/ \_
o oo o
Je suis seulement intéressé à regarder deux voitures s'écraser, donc les espaces, les nouvelles lignes, ++ n'ont pas d'importance.
Il s'agit du code golf, donc le code le plus court en octets l'emporte. Les réponses ajoutées plus tard peuvent toujours gagner si elles sont plus courtes que la réponse actuellement acceptée.
/ \
plutôt qu'en baisse_ _
?Réponses:
CJam,
6866 octetsEssayez-le en ligne
Quiconque voit le début du code en sera sûr
liKe
!Explication:
la source
Labyrinthe ,
394386 octetsJe vous présente fièrement ...
... mon nouveau Labyrinthe Esolang en deux dimensions! Le code ci-dessus n'est pas incroyablement bien joué (il y a 161 espaces et 25 NOP, donc une meilleure disposition pourrait raccourcir cela beaucoup), mais au moins j'ai réussi à montrer que le langage est utilisable pour des tâches non triviales. :)
Comment ça marche
Tout d'abord, un bref aperçu de la langue:
"
est un NOP qui n'est pas un mur et peut être utile pour remplir certains chemins dans le code. Contrairement à de nombreux autres langages 2D, les bords ne s'enroulent pas .@
termine le programme.>v<^
qui décaleront une ligne ou une colonne du code source de façon cyclique d'une cellule. La ligne ou la colonne affectée dépend du haut de la pile. Si la propre ligne ou colonne de l'IP est décalée, elle se déplacera avec le décalage. Cela permet de sauter d'un bord du code source à l'autre.Maintenant, pour ce défi particulier, voici l'idée générale de l'algorithme:
/ \_o oo o
) Sur la pile auxiliaire.__
ou/\
continuer.__ __ _/ \
-à- dire et deux espaces de tête) sur la pile auxiliaire.20
, Appelons cette N .Enfin, regardons quelques parties du code. L'IP commence dans le coin supérieur gauche, sur une commande de décalage de grille. Le haut de la pile principale est
0
(qui est utilisé comme index relatif), de sorte que la première ligne est décalée vers la gauche, ce qui déplace également l'IP à l'extrémité droite de la grille. Maintenant, la première ligne est simplement exécutée de droite à gauche, ce qui pousse le premier jeu de caractères fixes sur la pile auxiliaire:Ce décalage de ligne est utile pour le golf lorsque vous souhaitez commencer avec une grande quantité de code linéaire.
Ensuite, nous lisons l'entrée et poussons les bons bonnets:
Le bit à gauche avec les trois NOP envoie des résultats négatifs le long de la branche supérieure et des résultats non négatifs le long de la branche inférieure. À droite, ils sont réunis.
Suit maintenant une autre grande section linéaire (qui pourrait probablement être beaucoup jouée avec une autre astuce de changement de ligne):
Cela pousse le reste des voitures sur la pile auxiliaire.
Ensuite, nous calculons
min(20, input)
, qui est similaire à la première branche:Enfin, nous avons la boucle qui s'exécute trois fois pour imprimer les lignes. Chaque itération de la boucle contient deux petites boucles (3x3) pour imprimer les espaces, ainsi que deux sections pour imprimer 6 caractères de la pile auxiliaire:
Une astuce astucieuse sur laquelle je voudrais attirer l'attention est
.{.{.
le côté droit. C'est une impasse, donc à part.
à la fin, le code est exécuté deux fois, une fois en avant et une en arrière. Cela donne un moyen pratique de raccourcir le code palindromique (le problème est que vous devez vous assurer que l'IP prend le bon virage lorsque vous sortez à nouveau de l'impasse).la source
Python 2.7,
167164159 octetsCela prend l'entrée de stdin.
Démo ici
Tester ceci -
la source
(n,20)[n>20]
est tout simplementmin(n,20)
.(' \_',' \/')[s<1]
par' \\\\_/'[s<1::2]
.l
nécessaire? Pourriez-vous simplement fairefor e in [' _',"_/ ","o "]:
et supprimerl
complètement?l
n'est plus nécessaire maintenant. J'ai dû l'utiliser dans une version antérieure. Merci :)R, 191 octets
A peu près aussi bien que je peux l'obtenir maintenant. Prend les secondes de STDIN et des chats à STDOUT.
Explication
Les tests
la source
formals()
. :)CJam, 120 octets
Démo
Non golfé:
Démo
la source
J
a une valeur de 19,K
a une valeur de 20, enregistrant chacune un caractère pour ces constantes. Si vous avez besoin d'un tableau avec un élément, vous pouvez utiliser l'a
opérateur pour encapsuler l'élément, au lieu d'utiliser une paire de crochets.PHP,
160155 bytesLe code est affiché ici sur 3 lignes pour s'adapter à la disposition de la boîte de code. Ces nouvelles lignes ne sont pas nécessaires.
Le code non golfé:
Il obtient le nombre de secondes de la ligne de commande (premier argument):
L'option PHP CLI
-d error_reporting=0
est nécessaire pour masquer certaines notifications que PHP affiche à propos des constantes non définies (str_repeat
,_
) qu'il convertit en chaînes (2 octets enregistrés pour chaque notification).Un octet supplémentaire peut être enregistré sur PHP 7 en pressant l'initialisation de
$f
dans sa première utilisation ($m=($f=str_repeat)(...)
); il ne compile pas sur PHP 5.Le cas de test et certaines des techniques utilisées pour réduire le code peuvent être trouvés sur github .
Mise à jour:
@ ismail-miguel a pressé l'initialisation de
$left
et a intégré$c
les arguments deecho
sauvegarde de 4 octets (voir le commentaire ci-dessous).En échangeant l'ordre des variables
$m
ets
les initialisant, je me suis débarrassé d'une paire de parenthèses et j'ai économisé 1 octet de plus.la source
$f=str_repeat;$m=$f(' ',$r=60-3*($s=min(max($argv[1],0),20)));echo$l=$f(' ',$s)," __ $m __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
$f=str_repeat;echo$l=$f(' ',$s=min(max($argv[1],0),20))," __ ",$m=$f(' ',$r=60-3*$s)," __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
o o
dans une variable mais j'ai obtenu la même longueur ou pire.\n
par de véritables nouvelles lignes. Je l'ai oublié. Et cela compte pour 1 octet chacunJavaScript (ES6), 121 octets
En utilisant la chaîne de modèle, les 2 sauts de ligne à l'intérieur de la chaîne sont significatifs et comptés.
Pour enregistrer les octets, affichez avec
alert
, même si la police proportionnelle utilisée dansalert
n'est pas bien adaptée à l'art ASCII et que le résultat est moche pour n> = 20 (crash).Test de l'exécution de l'extrait dans FireFox
la source
Python 2, 148 octets
Cela utilise des codes d'échappement ANSI pour positionner le curseur au bon endroit pour dessiner les voitures. Il vérifie ensuite si l'entrée était à 20, si elle l'était, elle remonte et puise dans les capots de la voiture.
Prend un int de stdin, sortie vers stdout.
Non golfé:
la source
Pyth, 67 octets
Essayez-le ici .
la source
C,
180191168 octetsnon golfé:
programme de test:
sortie:
J'ai pu jouer au golf assez fort. Je pense que j'ai commencé avec près de 300 octets.
Mais je ne sais pas si cela répond toujours à toutes les exigences. Comme vous pouvez le voir après 21 secondes, la première voiture pousse la deuxième voiture vers la droite. J'aurais besoin d'ajouter quelques octets si cela n'est pas autorisé.Edit: corrigé. Cela devrait être plus réaliste que Sharknado ;-)
Edit: je pourrais raccourcir considérablement ma solution en jetant un deuxième coup d'œil à la
printf
page de manuel. Si vous utilisez '*', vous pouvez fournir la longueur du champ directement à printf, sans avoir besoin de créer une chaîne de formatage ausprintf
préalable.la source
> <> ,
538276 octetsJ'ai beaucoup baissé la taille, je suis étonné d'avoir réussi à réduire la taille de moitié. L'ancien est en dessous. Celui-ci n'est pas aussi efficace en termes de performances en raison de la largeur de la grille, principalement depuis la toute première ligne.
Vous pouvez le tester ici . Mettez le temps passé dans la "pile initiale", pas "entrée"!
Voici l'ancienne version.
la source
Java, 258 caractères
Non-golfé
Résultats
la source
Python 2, 102 octets
Assez simple. Pour chaque rangée de la voiture, nous imprimons à nouveau les
n
espaces, cette rangée, les60-3*n
espaces et la rangée. Pour arrêter les voitures, plutôt que de le fairemin(n,20)
, c'était un caractère plus court pour limiter la première série d'espaces avec[:20]
, et le second est très bien car un temps négatif une chaîne est la chaîne vide.Pour remonter les ailes, nous faisons juste un
replace
. Puisqu'apparaît__
également sur le toit, nous avons besoin d'un peu de contexte pour identifier les ailes, donc nous vérifions les éléments/
suivants.la source
Java,
270267 octetsJe suis presque sûr qu'il y a une façon meilleure / plus courte de le faire, mais mon cerveau n'est pas correctement engagé.
Pour n = 19:
Pour n = 20:
Non golfé
la source
PHP 7, 140 octets
Usage:
Enregistrez sous ANSI dans
file.php
(il doit y avoir des caractères de largeur nulle$o
) et exécutez:avec
x
comme nombre de secondes.Et une version qui fonctionne sans changer le rapport d'erreur ( 148 octets ):
la source
Javascript, 193 octets
Ce n'est pas un gagnant, mais c'est quelque chose
http://jsfiddle.net/yb703y0p/2/
la source