Imprima una onda sinusoidal continua desplazándose verticalmente en un terminal. El programa no debe terminar y debe desplazarse continuamente hacia abajo de la onda (excepto hasta que se interrumpa de alguna manera). Puede suponer que el desbordamiento no es un problema (es decir, puede usar bucles infinitos con contadores incrementales o recursión infinita).
La ola debe satisfacer las siguientes propiedades:
- Amplitud = 20 caracteres (amplitud pico)
- Período = 60 a 65 líneas (inclusive)
- La salida solo debe consistir en espacios, nueva línea y
|
- Después de cada línea de salida, haga una pausa de 50 ms.
Salida de muestra:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
La salida anterior debe continuar para siempre, a menos que se interrumpa, por ejemplo, SIGINT o SIGKILL, o cierre la ventana de terminal, o apague su máquina, o el Sol se trague la Tierra, etc.
El código más corto gana.
Nota. Soy consciente de un problema similar en Display Scrolling Waves pero esto no es exactamente lo mismo. En mi problema, la onda no se debe desplazar "en su lugar", solo se genera en un terminal. Además, este es un problema ascii-art, así que no use Mathematica para trazarlo.
fuente
Respuestas:
APL (35)
(Sí, cabe en 35 bytes, aquí hay una codificación APL de 1 byte )
Explicación:
{
...}
1: llame a la función con 1 al principio1○⍵×.1
: lo suficientemente cerca para el trabajo del gobiernosin(⍵×π÷30)
. (1○
essin
)-21+⌈20
: normalizar al rango1..40
y negar'|'↑⍨
: toma los últimosN
caracteres de la cadena'|'
(lo que da como resultado una cadena de espacios con un|
al final⎕←
: monitor⌈⎕DL.05
: espere 50 ms y regrese1
. (⎕DL
devuelve la cantidad de tiempo que realmente esperó, que estará cerca0.05
, redondeando ese valor1
).∇⍵+
: agregue ese número (1
)⍵
y ejecute la función nuevamente.fuente
{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
DO,
7473706967 caracteresSolución de 67 personajes con muchas buenas ideas de @ugoren y otros:
Solución de 69 caracteres con bucle while en lugar de recursividad:
Acercarse a territorio perl. :)
fuente
5E4
lugar de50000
.usleep()
prototipo del compilador , tendrías que lanzar explícitamente el 5E4.printf("%*s\n",j=21+sin(i++*.1)*20,"|")
. El tipo resultante sigue siendo int, por lo que es un argumento de ancho de campo válido.Mathematica
121104 80 6764fuente
x=20*sin(pi*y/30)+20
o algo similar.Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";[email protected],{n,18!}]
1 == 1
a0 < 1
para disminuir 1 char.Perl, 48 (68)
GNU versión de suspensión: 48
Plataforma cruzada: 68
Se eliminó el uso del módulo Time :: HiRes mediante la función de suspensión de shell. Incremento acortado según el ejemplo de Ruby. Se acortó usando $ "y $ 0 viendo sugerencias del trabajo de Primo Gracias por sugerencias Primo.
fuente
test.pl
y lo ejecutéperl ./test.pl
, sin embargo, el tiempo de espera no coincide con la especificación. Además, la amplitud de la onda es demasiado pequeña. (Esta amplitud se refiere a la longitud entre el pico y la posición de equilibrio).man sleep
→unsigned int sleep(unsigned int seconds);
. No fallará, pero el intervalo de suspensión real es cero. Algunas sugerencias para acortar la suya: cambie$d
a$_
, y luego use(25+20*sin)
, y cambie\n
para una nueva línea literal.man 1 sleep
en un shell bash de GNU / Linux nos dice queUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
Perl - 64 (o 60) bytes
Lo siguiente utiliza un comando de shell específico de Windows:
Lo siguiente usa un comando de shell específico de GNU / Linux:
Ambos a 64 bytes.
Tenga en cuenta que esto no es exactamente una onda sinusoidal, sino más bien una interpolación cuadrática. Conspirado contra un pecado real:
A la granularidad requerida, estos son visualmente indistinguibles.
Si la estética no es tan importante, ofrezco una alternativa de 60 bytes , con una duración de período 62, una amplitud máxima de ~ 20.02 y ligeras asimetrías:
fuente
Rubí 56
fuente
p
agregará comillas dobles alrededor de cada línea y alterará el "dibujo".Befunge 98 -
103100Saludos para un programa que hace esto, en un lenguaje sin capacidades trigonométricas; El primer programa de hecho. La segunda línea es simplemente datos; el carácter correspondiente con el valor ascii del pecado, agregado a un carácter espacial.
EDITAR: ahorré 3 caracteres al no restar el espacio; la sinusoide se traduce 32 unidades a la derecha (lo cual es válido).
Befunge tampoco tiene un comando de suspensión o algo similar. Sería bueno encontrar una huella digital, pero no pude encontrar una, así que
ff*:*8*
presiona8*225**2
(405000
) ykz
ejecuta un noop tantas veces (bueno, tantas veces + 1). En la línea de comando de Windows con pyfunge , esto resulta ser de unos 50 milisegundos, así que digo que estoy bien. Nota: si alguien conoce una buena huella digital para esto, hágamelo saber.La última parte del código simplemente verifica si el contador (para la línea de datos) ha pasado los datos, si es así, el contador se restablece a 0.
Usé esto para generar los datos.
Serie Taylor
Aunque esta versión tiene 105 caracteres, solo tuve que incluirla:
Estaba tratando de acortar mi programa y decidí mirar la serie taylor para coseno (el seno es más difícil de calcular). Cambié
x
parapi * x / 30
coincidir con el período solicitado aquí, luego lo multipliqué por20
para coincidir con la amplitud. Hice algunas simplificaciones (factores ajustados para cancelar, sin cambiar mucho el valor de la función). Luego lo implementé. Lamentablemente, no es una implementación más corta.comprueba si los valores de la serie taylor se están volviendo inexactos (aproximadamente
x = 15
). Si lo son, entonces calculo la serie taylor para enx - 30
lugar dex
.es mi implementación de la serie taylor en
x = 0
, cuandox
es el valor en la pila.niega el valor de la serie taylor si la serie taylor necesitaba un ajuste.
hacer que la onda del coseno sea positiva; de lo contrario, la impresión no funcionaría.
imprime la ola
improvisada espere 50 milisegundos, luego incremente
x
Si
x
es mayor que 45, cámbielo a -14 (nuevamente, ajuste de error de la serie taylor).fuente
Pitón,
108,93,90,8988Ahora con desplazamiento infinito :)
Editar: ok, 90. ¿Suficiente?
Editar: Editar: no, 89.
Editar: Editar: Editar: 88 gracias a boothby .
fuente
a=0.
->a=0
te lleva a 88PHP, 59 caracteres
fuente
echo ...;
en lugar defwrite(STDOUT,...);
.<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
~ƒõ
es solo una abreviatura de"|\n"
.C64 BASIC, 64 caracteres PETSCII
En un PAL C64,
For i=0 to 2:next i
ciclos de aprox. 0,05 segundos, por lo que se respeta el tiempo de retraso.fuente
Javascript
887678 caracteresBasado en el código de Kendall Frey.
fuente
i
, por lo que imprime una línea recta en lugar de una onda.C - 86 + 3 caracteres
Gracias Shiona y Josh por la edición.
i; main (j) {for (j = 0; j ++ <20 + sin (i / 10.) * 20;) putchar (32); put ("|"); usleep (50000); i ++; main () ;}flotante i; principal (j) {para (j = 0; j ++ <20 + sin (i) * 20;) putchar (32); pone ("|"); usleep (50000); i + =. 1; principal ( );}Compilado con la
-lm
bandera, supongo que necesito agregar 3 caracteresfuente
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);}
. Esto se basa en el supuesto de que el programa se llama con 0 argumentos.Ti-Basic, 33 bytes
Existen las siguientes advertencias :
Debido a la limitación de pantalla de 16x8, esta onda sinusoidal solo tiene una amplitud de 7 (el período de 60 aún se mantiene)
Debido a la falta de una manera fácil de acceder al
|
carácter,!
se utiliza en su lugarDebido a la falta de un temporizador preciso del sistema, el retraso no se implementa. Sin embargo, la velocidad de ejecución parece aproximadamente correcta.
fuente
JavaScript - 88
Estoy seguro de que a alguien se le ocurre algo que es realmente inteligente.
fuente
J -
103,58,5754Gracias a los chicos increíbles de IRC
En palabras de derecha a izquierda se lee: a partir de 0 infinitas veces hacer: sin, agregar 1, multiplicar por 20, piso, agregar 1 (por lo que se convierte en una matriz de 2 elementos), copiar dos bytes '|' correspondientemente, imprímalo, espere 0.05s y agregue 0.1
En lugar de bucle infinito, podemos usar la recursión, ahorraría 2 caracteres, pero también producirá un error de pila después de cierto número de iteraciones.
¿Dónde
$:
está una llamada recursiva?fuente
(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0
. La versión de recursión solo ahorra 1 char esta vez,$:@(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0
aunque parece durar más tiempo antes de tocar fondo.Haskell - 75
Desafortunadamente, no pude hacer que el programa detuviera 50 ms sin duplicar mi recuento de caracteres, por lo que simplemente inunda la consola, pero produce la onda sinusoidal.
Aquí está el código completo con pausa (138 caracteres con líneas nuevas):
fuente
20+20*sin x
para calificar.Perl 6: 46 caracteres
Cree un rango perezoso infinito usando
0,0.1 ... *
, repita sobre eso.say
devuelveBool::True
que se numera como 1 en la multiplicación, de esta manera puedo mantenerlo en una sola declaración.fuente
sleep
y.05
tengo que estar separado. Pero me pregunto si el espacio entresay
y' '
es obligatorio?say' '
uno pueda usar,say(' ')
pero eso es 1 char extra en este caso ...Javascript fugly - 77
y si lo hacemos en Firefox - 73
y si somos desagradables - 67
fuente
Scala
92,8987fuente
(20+20*math.sin(i*.1))
lo reduce en 1 carácter, suponiendo que esta es una sintaxis válida (no tengo experiencia con Scala)Pitón 3, 103
Estúpidas importaciones de frikk'n ...
En lugar de "dormir", esta implementación se muele en la CPU porque Python hace que sea más fácil obtener un reloj de CPU de punto flotante que un reloj de pared. Este enfoque no superará al de friol , pero es divertido, así que lo dejo.
fuente
DO#
[152] Personajes
No pude obtener la respuesta existente de C # para ejecutar y no pude votar porque no tengo suficiente reputación
faltaba un par de
{
y faltaba un)
después de la Declaración For Loop.Me imagino que la variación en el aspecto de la ola cuando se ejecuta se debe a la forma en que estamos tratando de mostrar esta ola.
si no contamos el espacio de nombres y la declaración del método, serían [104] caracteres para la versión de trabajo
fuente
VB
[236][178]No estoy seguro de cómo contaría las pestañas, acabo de tomar el recuento de Notepadd ++ antes de pegar aquí. las nuevas líneas son obligatorias, probablemente por qué a nadie le gusta usarlo para golf de código.
fuente
DO#
The Magic Line [91] Personajes
Programa de trabajo a continuación. [148] Personajes
fuente
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)
Estoy haciendo algo mal?Bash + bc (para hacer los cálculos), 80
fuente
TI-BASIC, 30 bytes
Mejora de tamaño pequeño sobre la otra respuesta, a costa de cierta precisión. Tenga en cuenta que TI-Basic técnicamente tiene el | pero debe transferirlo a través de una computadora o usar un programa de ensamblaje para acceder a él.
fuente
.03π
puede ser.1
, que todavía está dentro del intervalo requerido.Julia - 68
Editar: gracias a ML y as.
Bueno, no puede competir contra APL, pero aquí está mi intento.
Salida:
fuente
.05
lugar de0.05
ensleep
?i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end
———sin(i/10)*20
es igual a20sin(.1i)
MATLAB, 81 bytes
Abusé del hecho de que
i
siempre se inicializa en MATLAB, lo que significa que podría poner elfprintf
en lawhile
declaración sin inicializari
primero. Esto significa que el programa primero genera una línea vacía, pero creo que esto no está prohibido en la especificación.Además, abusa del hecho de que Matlab ignorará la mayoría de los caracteres de control ASCII, imprimiendo un espacio en lugar de NULL (también para la primera línea vacía).
fuente
F # -
90797776Aquí hay una solución usando recursividad
Probablemente podría mejorarse aún más.
fuente
AutoHotkey 176
Ejecute el script Abre el Bloc de notas e imprime los caracteres. Presione Esc en cualquier momento para salir.
fuente
Clojure, 121
Version corta:
Versión bonita:
El período es 64.
Escriba esto
lein repl
o guarde en el archivosin.clj
y ejecútelolein exec sin.clj
(requiere el complemento lein-exec).fuente