Imprimez une onde sinusoïdale continue défilant verticalement sur un terminal. Le programme ne doit pas se terminer et doit faire défiler la vague en continu (sauf jusqu'à ce qu'elle soit interrompue). Vous pouvez supposer que le dépassement de capacité n'est pas un problème (vous pouvez utiliser des boucles infinies avec des compteurs incrémentiels ou une récursion infinie).
La vague devrait satisfaire les propriétés suivantes:
- Amplitude = 20 caractères (amplitude maximale)
- Période = 60 à 65 lignes (inclus)
- La sortie ne doit contenir que des espaces, une nouvelle ligne et
|
- Après chaque ligne de sortie, pause pendant 50ms
Exemple de sortie:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
La sortie ci-dessus doit rester ininterrompue sauf interruption, par exemple SIGINT ou SIGKILL, ou la fermeture de la fenêtre du terminal, la mise hors tension de votre machine, le soleil avalant la Terre, etc.
Le code le plus court gagne.
Remarque. Je suis conscient d'un problème similaire sur Display Scrolling Waves mais ce n'est pas exactement le même. Dans mon problème, il ne faut pas faire défiler la vague "en place" - il suffit de la sortir sur un terminal. En outre, il s’agit d’un problème d’art ascii, n’utilisez donc pas Mathematica pour le représenter.
la source
Réponses:
APL (35)
(Oui, il tient dans 35 octets, voici un codage APL à 1 octet )
Explication:
{
...}
1: appelle la fonction avec 1 au début1○⍵×.1
: assez proche pour que le gouvernement travaillesin(⍵×π÷30)
. (1○
estsin
).-21+⌈20
: normaliser à la plage1..40
et nier'|'↑⍨
: prend les derniersN
caractères de la chaîne'|'
(ce qui donne une chaîne d'espaces avec un|
fin⎕←
: afficher⌈⎕DL.05
: attendez 50 ms et revenez1
. (⎕DL
Retourne le temps qu'il a réellement attendu, ce qui va être proche0.05
, en arrondissant cette valeur vers le haut1
).∇⍵+
: ajoutez ce nombre (1
) à⍵
et exécutez à nouveau la fonction.la source
{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
C
7473706967 caractèresSolution de 67 personnages avec beaucoup de bonnes idées de @ugoren & others:
Solution à 69 caractères avec boucle while au lieu de récursion:
En approchant du territoire perl. :)
la source
5E4
au lieu de50000
.usleep()
prototype du compilateur , vous devez explicitement lancer le 5E4.printf("%*s\n",j=21+sin(i++*.1)*20,"|")
. Le type résultant est toujours int, il s'agit donc d'un argument de largeur de champ valide.Mathematica
121 104 80 6764la source
x=20*sin(pi*y/30)+20
ou quelque chose de similaire.Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";[email protected],{n,18!}]
1 == 1
à0 < 1
diminuer 1 car.Perl, 48 (68)
Version de sommeil GNU: 48
Plate-forme transversale: 68
Suppression de l'utilisation du module Time :: HiRes à l'aide de la fonction de veille du shell. Incrément raccourci selon l'exemple Ruby. Raccourci avec $ "et $ 0, voir des allusions dans le travail de Primo Merci pour ces allusions à Primo.
la source
test.pl
et l' ai exécutéperl ./test.pl
, mais le temps d'attente ne correspond pas à la spécification. En outre, l'amplitude de la vague est trop petite. (Cette amplitude fait référence à la longueur entre le sommet et la position d'équilibre.)man sleep
→unsigned int sleep(unsigned int seconds);
. Cela ne provoquera pas d'erreur, mais l'intervalle de sommeil réel est zéro. Quelques suggestions pour raccourcir le vôtre: changez$d
pour$_
, puis utilisez(25+20*sin)
et changez le\n
pour un saut de ligne littéral.man 1 sleep
sur un shell bash GNU / Linux nous dit queUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
Perl - 64 (ou 60) octets
Ce qui suit utilise une commande shell spécifique à Windows:
Ce qui suit utilise une commande shell spécifique à GNU / Linux:
Les deux à 64 octets.
Notez que ce n'est pas exactement une onde sinusoïdale, mais plutôt une interpolation quadratique. Complot contre un péché actuel:
À la granularité requise, il est impossible de les distinguer visuellement.
Si l'esthétique n'est pas si importante, je propose une alternative de 60 octets , avec une longueur de période de 62 secondes, une amplitude maximale de ~ 20,02 et de légères asymétries:
la source
Ruby 56
la source
p
ajoutera des guillemets autour de chaque ligne et modifiera le "dessin".Befunge 98 -
103100Bravo pour un programme qui le fait, dans une langue sans capacités trigonométriques; le premier programme en fait. La deuxième ligne est simplement des données; le caractère correspondant à la valeur ascii du péché, ajouté à un caractère d'espacement.
EDIT: J'ai enregistré 3 caractères en ne soustrayant pas l'espace; la sinusoïde est traduite de 32 unités à droite (ce qui est valide).
Befunge n'a pas non plus de commande de veille, ou quelque chose de similaire. Il serait agréable de trouver une empreinte digitale, mais je ne pouvais pas trouver un, alors
ff*:*8*
pousse8*225**2
(405000
) etkz
gère un noop que plusieurs fois (bien que plusieurs fois + 1). Sur la ligne de commande Windows avec pyfunge , cela s’avère être d’environ 50 millisecondes, alors je dis que je vais bien. Remarque: si quelqu'un connaît une bonne empreinte digitale, veuillez me le faire savoir.La dernière partie du code vérifie simplement si le compteur (pour la ligne de données) a dépassé les données. Si tel est le cas, le compteur est réinitialisé à 0.
J'ai utilisé cela pour générer les données.
Série Taylor
Bien que cette version ait 105 caractères, je devais simplement l'inclure:
J'essayais de raccourcir mon programme et j'ai décidé de regarder la série taylor pour le cosinus (le sinus est plus difficile à calculer). J'ai changé
x
pourpi * x / 30
correspondre à la période demandée ici, puis multiplié par20
pour correspondre à l'amplitude. J'ai fait quelques simplifications (facteurs ajustés pour l'annulation, sans trop modifier la valeur de la fonction). Puis je l'ai implémenté. Malheureusement, la mise en œuvre n'est pas plus courte.vérifie si les valeurs de la série taylor deviennent inexactes (environ
x = 15
). Si tel est le cas, je calcule la série taylor pourx - 30
au lieu dex
.est mon implémentation de la série taylor à
x = 0
, oùx
est la valeur sur la pile.annule la valeur de la série taylor si la série taylor doit être ajustée.
rendre l'onde cosinus positive; sinon, l'impression ne fonctionnerait pas.
imprime la vague
attente improvisée pendant 50 millisecondes, puis incrémentation
x
Si
x
est supérieur à 45, réglez-le sur -14 (à nouveau, réglage d'erreur en série de Taylor).la source
Python,
108,93,90,89, 88Maintenant avec le défilement infini :)
Edit: ok, 90. Assez?
Modifier: Modifier: non, 89.
Edit: Edit: Edit: 88 grâce à boothby .
la source
a=0.
->a=0
vous amène à 88PHP, 59 caractères
la source
echo ...;
à la place defwrite(STDOUT,...);
.<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
~ƒõ
est juste un raccourci pour"|\n"
.C64 BASIC, 64 caractères PETSCII
Sur un PAL C64,
For i=0 to 2:next i
cycles d’env. 0,05 seconde, le délai est donc respecté.la source
Javascript
887678 caractèresBasé sur le code de Kendall Frey.
la source
i
, donc il imprime une ligne droite au lieu d'une onde.C - 86 + 3 caractères
Merci shiona et josh pour l'édition
i; main (j) {pour (j = 0; j ++ <20 + sin (i / 10.) * 20;) putchar (32); met ("|"); usleep (50000); i ++; main () ;}float i; main (j) {pour (j = 0; j ++ <20 + sin (i) * 20;) putchar (32); met ("|"); usleep (50000); i + =. 1; main ( );}Compilé avec le
-lm
drapeau, je suppose que je dois ajouter 3 caractèresla source
i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
j=0
:i;main(j){for(;j++<21+sin(i/10.)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}
. Cela repose sur l'hypothèse que le programme est appelé avec 0 argument.Ti-Basic, 33 octets
Les mises en garde suivantes existent :
En raison de la limitation d'écran de 16x8, cette onde sinusoïdale n'a qu'une amplitude de 7 (la période de 60 est toujours maintenue)
En raison de l'absence d'un moyen facile d'accéder au caractère
|
,!
est utilisé à la placeEn raison du manque de minuterie système précise, le délai n’est pas appliqué. Cependant, la vitesse d'exécution semble à peu près correcte.
la source
JavaScript - 88
Je suis sûr que quelqu'un peut proposer quelque chose d'intelligent.
la source
J -
103,58,57, 54Merci à des gars géniaux d'IRC
En mots de droite à gauche, on lit: à partir de 0 temps infinis, faites: péché, ajoutez 1, multipliez par 20, étage, ajoutez 1 (de sorte qu'il devienne un tableau de 2 éléments), copiez deux octets '|' en conséquence, imprimez-le, attendez 0.05s et ajoutez 0.1
Au lieu de boucle infinie, nous pouvons utiliser la récursivité, cela économiserait 2 caractères, mais produirait également une erreur de pile après un certain nombre d'itérations
Où
$:
est un appel récursif.la source
(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0
. La version récursive n'enregistre que 1 caractère cette fois-ci,$:@(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0
bien qu'elle semble durer plus longtemps avant de descendre.Haskell - 75
Malheureusement, je ne pouvais pas obtenir une pause de 50 ms du programme sans doubler le nombre de caractères, ce qui inonde la console, mais génère une onde sinusoïdale.
Voici le code complet avec pause (138 caractères avec nouvelles lignes):
la source
20+20*sin x
vous qualifier.Perl 6: 46 caractères
Créez une plage infinie de lazy en utilisant
0,0.1 ... *
, boucle par dessus.say
renvoieBool::True
ce qui représente 1 dans la multiplication, ainsi je peux le conserver dans une seule déclaration.la source
sleep
et.05
doivent être séparés. Mais je me demande si l'espace entresay
et' '
est obligatoire?say' '
On peut utilisersay(' ')
mais c'est 1 caractère en plus dans ce cas ...fugly Javascript - 77
et si on le fait dans Firefox - 73
et si nous sommes méchants - 67
la source
Scala,
92,89, 87la source
(20+20*math.sin(i*.1))
le réduit d'un caractère, en supposant que cette syntaxe est valide (je n'ai aucune expérience de Scala)Python 3, 103
Stupid frikk'n importations ...
Plutôt que de "dormir", cette implémentation gâche le cpu car python facilite l'obtention d'une horloge cpu à virgule flottante par rapport à une horloge murale. Cette approche ne battra pas les friol , mais c'est amusant donc je le laisse en place.
la source
C #
[152] Personnages
Je ne pouvais pas obtenir la réponse C # existante à Run et je ne pouvais pas annuler le vote parce que je n’avais pas assez de réputation
il en manquait quelques-uns
{
et il en manquait un)
après la déclaration de boucle For.Je suppose que la variance dans l'apparence de la vague lorsqu'elle est exécutée est due à la façon dont nous essayons d'afficher cette vague.
si nous ne comptons pas l'espace de noms et la déclaration de méthode, il s'agirait de [104] caractères pour la version de travail
la source
VB
[236][178]je ne sais pas comment vous comptez les onglets, je viens de prendre le compte de Notepadd ++ avant de coller ici. les nouvelles lignes sont obligatoires, probablement pourquoi personne n'aime l'utiliser pour le golf de code.
la source
C #
La ligne magique [91] Personnages
Programme de travail ci-dessous. [148] Caractères
la source
using System;class P{static void Main(){for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Thread.Sleep(50);}}
Threading.Thread.Sleep(50)
je fais quelque chose de mal?Bash + bc (faire le calcul), 80
la source
TI-BASIC, 30 octets
Amélioration de petite taille par rapport à l’autre réponse, au prix d’une certaine précision. Notez que TI-Basic a techniquement le | caractère, mais vous devez le transférer via un ordinateur ou utiliser un programme d'assemblage pour y accéder.
la source
.03π
peut être.1
, ce qui est toujours dans l'intervalle requis.Julia - 68
Edit: merci à ML et ace.
Eh bien, il ne peut pas rivaliser avec APL, mais voici ma tentative.
Sortie:
la source
.05
lieu de0.05
danssleep
?i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end
———sin(i/10)*20
est égal à20sin(.1i)
MATLAB, 81 octets
J'ai abusé du fait que
i
est toujours initialisé dans MATLAB, ce qui signifie que je pouvais le mettrefprintf
dans lawhile
déclaration sans l'initialiser aui
préalable. Cela signifie que le programme génère d'abord une ligne vide, mais je pense que cela n'est pas interdit dans la spécification.De plus, cela abuse du fait que Matlab ignore la plupart des caractères de contrôle ASCII, en imprimant un espace au lieu de NULL (également pour la première ligne vide).
la source
F # -
90797776Voici une solution utilisant la récursivité
Il pourrait probablement être amélioré davantage.
la source
AutoHotkey 176
Exécutez le script. Il ouvre le Bloc-notes et imprime les caractères. Appuyez sur Echap à tout moment pour quitter.
la source
Clojure, 121
Version courte:
Jolie version:
Période est 64.
Tapez ceci dans
lein repl
ou sauvegardez dans un fichiersin.clj
et lancez-le aveclein exec sin.clj
(nécessite le plugin lein-exec).la source