Après mon entrée dans Obfuscated Hello World, j'ai pensé qu'il pourrait être amusant de partager le code sous-jacent. Mais pourquoi montrer le code, faisons-en aussi un golf!
Défi
Écrivez un script qui fait défiler une chaîne à travers le terminal, de droite à gauche, s'installant sur le côté gauche.
Contribution
Prend une chaîne comme argument.
Résultat
Imprime le cadre de défilement sur STDOUT. Largeur maximale de ~ 50 caractères. Commence par 0 ou 1 caractère affiché. Un peu d'espace entre les lettres lors du défilement. S'arrête une fois réglé (sans espace supplémentaire entre les caractères des mots). Défilement lent, mais pas trop lent (<1 s par itération).
Exemple
Exécution d'un script avec arg 'Hello World'
H
plus tard
H e l l o W o
plus tard
H e l l o W o r l d
plus tard
Hell o W o r l d
enfin
Hello World
Pour un exemple en cours d'exécution, essayez mon code du défi "Hello World". Finalement, je posterai le mien. Il est actuellement de 202 caractères en Perl. Maintenant qu'il y a des concurrents, j'ai posté le mien dans les réponses.
Gagnant
Je ne veux pas que les restrictions soient absolues, c'est pourquoi je les ai laissées un peu vagues. Le script le plus court qui suit l'esprit de mon original l'emportera.
Remarques
Ce jeu suppose un xterm
environnement. Si un autre environnement s'avère utile, seuls des environnements similaires seront comparés et un gagnant distinct pourra être déclaré pour chacun.
Addendum (25 avril 2012)
Pour résoudre certains problèmes naissants, je prends une décision. Votre nombre de caractères doit inclure le code nécessaire pour:
- Flush STDOUT (vous regarde Ruby)
- Mettre
sleep
en œuvre avec un délai de <1 s (vous regarde Perl)
Cela peut être fait lorsque la ligne de commande bascule vers un interpréteur, mais ces caractères comptent dans le total (sans espaces blancs environnants).
xterm
,vt102
...?Réponses:
python 2 - 146 caractères
edit: en a fait une fonction au lieu d'une entrée via stdin. le premier argument est la chaîne, et le deuxième argument est la longueur que vous voulez qu'il soit. ainsi l'invocation serait
f('Hello World', 50)
. Je l'ai également rendu beaucoup plus fluide; quand chaque personnage a 'atterri' il y a eu une pause gênantevieux, 158 caractères:
la source
f("Hello World, 40)
fonctionné pour moi.Rubis,
939189 caractèresLe texte à afficher doit être donné comme argument de ligne de commande, par exemple
pour l'exemple ci-dessus. Malheureusement, je ne peux pas montrer l'animation ici, vous devez donc essayer le code vous-même.
La version précédente:
la source
STDOUT.sync=true;
compris , j'ai dû le régler pour qu'il se nettoie automatiquement. L'équiv Perl est$|++
. C'est 17 caractères supplémentaires, mais toujours bien en dessous du mien. Eh bien, je ne peux pas avoir Ruby battre Perl! Je vais devoir travailler. Joli.ruby1.8 "Hello World"
, j'obtiens, pas exactement à ma grande surprise, une erreur disant:ruby1.8: No such file or directory -- Hello World (LoadError)
ruby foo.rb args
;-)C,
948380173 caractèresEDIT: Ajout de beaucoup de code, implémente toutes les fonctionnalités demandées maintenant. La constante
1e8
peut être modifiée pour contrôler la vitesse. Sur ma machine, c'est assez rapide comme ça.Certains personnages peuvent sûrement être enregistrés ici.
l
peut être statique (sauvegarde l'initialisation),c
peut devenir un pointeur (remplacementb+c
).Ancienne version (80 caractères), avec une fonctionnalité partielle:
enregistré quelques caractères en les remplaçant
char**t
parint*t
. Fonctionne bien en 32 bits (prend enint**t
charge 64 bits).la source
K&R C -
431416 caractèresRespecte la norme à un haut degré. Utilise ncurses, il doit donc être largement indépendant du terminal. Il y a un léger bégaiement lorsque le texte frappe le côté en raison d'une ruse jouée pour préserver l'espace blanc prévu dans la chaîne.
La chaîne à utiliser doit être passée comme premier argument sur la ligne de commande (et doit être échappée si elle contient des espaces, plus encore si elle contient un
!
comme ma chaîne de test (Hello, World!
) l'a fait).Sous une forme plus lisible et commentée:
la source
if
par des opérateurs. Par exemple -if((s-q)%2)s--;else usleep(1e5);
->s-q&1?s--:usleep(1e5);
(ous-=s-q&1||usleep(1e5);
)' '
s par des équivalents numériques.x==32
parx-32
(inverse la signification, donc inversez if-else), ou avecx<33
(en supposant que 0..31 n'a jamais été utilisé). Initialisez avec les valeurs que vous avez (for(curs_set(c=0);...
).*(s+1)
->s[1]
. Retirez les accolades inutiles (les remplacer;
par vous,
aidera).Perl 5.13.2, 96
Volant beaucoup de la réponse de @ Kevin Reid , en particulier l'
/r
astuce disponible dans les nouveaux Perls.Perl, 115
Comme la réponse de @ Joel Berger , cela deviendrait beaucoup plus court si je pouvais utiliser
sleep 1
et être lent, ou passer-MTime::HiRes=sleep
sur la ligne de commande pour l'activersleep.1
. Sinon, le seul moyen intégré pour obtenir de courtes nuits estselect'','','',.1
ce qui est assez long.Perl, 128Perl, 133la source
x
et la forme de blocmap
en sauvera quelques-unes.Javascript
180218 caractèresVersion de production:
Version non golfée:
Voici une démo jsFiddle
Remarque: si vous essayez de le reproduire, assurez-vous que le code est en dessous du corps
la source
Perl 5.13.2, 115 caractères
/r
.Crédits:
$"
comme source de" "
prise de la réponse de l' éphémient , réduction de 1 caractère.la source
r
drapeau, meilleur ajout à la langue depuisstate
bash 234
Usage:
non golfé:
la source
R, 319 caractères
En suivant la philosophie de l'exemple @Blazer (d est le délai en secondes):
Usage:
la source
Perl :
144133Pour obtenir un sommeil <1s, vous devez exécuter en tant que:
Comme je ne me déclarerai pas vainqueur, je ne me disputerai pas sur ce qui compte ou non (mais je ne peux vraiment pas faire gagner ça à Ruby ;-))
la source
s/' '/$"/g
ets/shift/pop/
push
déclaration. Je ne l'avais pas encore posté.Q, 145
Ne répond pas exactement aux exigences car la ligne finale supprime tous les espaces qui se trouvaient dans la chaîne d'entrée d'origine.
Il prend deux arguments, une chaîne d'entrée et une vitesse de défilement
la source
PowerShell, 135
Pas très golfé et probablement une approche horrible, mais je suis malade et je ne peux pas vraiment penser ...
la source
J (116)
Prend la chaîne d'entrée sur la ligne de commande, c.-à-d.
jconsole marquee.ijs 'Hello, world!'
S'il n'a pas besoin d'effacer l'écran, c'est-à-dire de produire comme ceci:
est autorisé, il serait de 12 caractères plus court.
Explication:
s.=>2{ARGV
: récupère la chaîne depuis la ligne de commandek.=50,3#~<:#s
: la quantité de départ d'espace ajoutée avant chaque personnage, 50 avant le premier et 3 avant tous les autres. (donne un tableau, '50 3 3 3 ... ')([-=&0@/:@\:@~:&0)
: étant donné un tableau, décrémente le premier élément différent de zéro dans le tableau^:(i.>:+/k)
: cette fonction appliquée N fois, où N est 0 jusqu'à la somme de la quantité d'espaces ajoutés. (donne une matrice:50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0)
."1
: exécuter la fonction suivante sur chaque ligne de la matrice;@:(([,~#&' '@])@.>)
: ajouter le nombre d'espaces donné avant chaque caractère de la chaîne(50&{.)
: prendre les 50 premiers caractères de la chaîne([[i.@]&2e7)
: une fonction qui génère la liste de 0 à 2 * 10 ^ 7, puis la jette. Cela prend environ un tiers de seconde sur ma machine, cela entraîne le retard.((50#LF)&,)
: ajouter 50 sauts de ligne avant la chaîne, pour effacer l'écranecho
: sortie de la chaînes (...)
: donne la chaîne comme argument de gauche à la fonctionla source
APL (70)
Prend l'entrée du clavier, la sortie est dans la
⎕SM
fenêtre (qui serait le terminal si vous aviez un APL basé sur du texte, je suppose). La taille de la fenêtre est détectée automatiquement, si vous voulez vraiment qu'elle soit de 50, changez la1↓⎕SD
en50
.Explication:
1↓⎕SD,1↓3⍴⍨⍴D←⍞
: lire la chaîne et stockerD
. Générez un vecteur décrivant la quantité d'espace à ajouter avant chaque caractère, c'est-à-dire la largeur de l'écran avant le premier caractère (1↓⎕SD
) et 3 avant les autres (1↓3⍴⍨⍴D
).⎕DL÷8
: attendez 1 / 8ème de secondeP←⍵-{⍵×~×⍺}\×⍵
: dans le vecteur de l'argument de droite, soustrayez 1 de l'élément non nul le plus à gauche et stockez le nouveau vecteur dans P.,/D{⍺,⍨⍵⍴⍕⍬}¨P
: pour chaque caractère en D, préfixez la quantité d'espaces donnée en P.⎕SM∘←1,⍨1,⍨
: affichage à l'écran, dans la colonne la plus à gauche de la ligne supérieure0∨.≠P:∇P
: s'il y a un élément non nul dans P, répéter avec P.la source
PowerShell , 129 octets
Essayez-le en ligne!
Ce script ne supprime pas les espaces des arguments contrairement au script de Joey .
TIO
n'affiche pas correctement la sortie. Avec la console Powershell, vous obtenez la ligne de repère défilante.la source
05AB1E , 42 octets
Essayez-le en ligne (sans dormir). REMARQUE: je n'ai pas 05AB1E installé localement, donc je ne suis pas sûr à 100% si l'
\r
astuce fonctionne (en théorie, cela devrait fonctionner, cependant). Dans TIO, ils\r
sont plutôt interprétés comme des sauts de ligne. En outre, le TIO utilise la version héritée, car il.e
est désactivé dans la nouvelle version TIO (le programme est le même dans l'héritage et la nouvelle version de 05AB1E, cependant).Explication:
Voir cette astuce de la mine de 05AB1E (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi
“…¢('\r')“
est"print('\r')"
.la source
Python, 139 octets
Doit appeler
f('Hello World', 50)
pour commencer.la source