Un píxel en movimiento circular.


45

Este es un desafío de salida gráfica donde la tarea es dar el código más corto por idioma.

Tarea

Su código debe trazar un solo píxel púrpura (valor hexadecimal # 800080 o rgb (128, 0, 128)), moviéndose en el sentido de las agujas del reloj alrededor de un círculo. Debería llevar exactamente 60 segundos hacer un recorrido completo alrededor del círculo y debería continuar indefinidamente. No se debe mostrar nada más en la pantalla o ventana, excepto el píxel. El ancho del círculo debe ser 0,75 (redondeando adecuadamente) el ancho de la pantalla o ventana y el fondo debe ser blanco. Para evitar soluciones tontas, la pantalla o ventana debe tener al menos 100 píxeles de ancho.

Su código debe ser un programa completo .

Idiomas y bibliotecas

Puede usar cualquier idioma o biblioteca que desee. Sin embargo, me gustaría poder probar su código si es posible, así que si puede proporcionar instrucciones claras sobre cómo ejecutarlo en Ubuntu, sería muy apreciado.

Faltan los veinte idiomas principales. Se necesita ayuda.

Los siguientes veinte principales lenguajes de programación no tienen ninguna solución.

  • C , C ++, C # , Python , PHP , Visual Basic .NET , Perl, Delphi / Object Pascal, Assembly , Objective-C , Swift, Pascal, Matlab / Octave , PL / SQL, OpenEdge ABL, R

Catalogar

El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

## Perl, 43 + 2 (-p flag) = 45 bytes

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
¿Qué radio debe ser el círculo?
Timothy Groote

19
¿Por qué el píxel debería ser morado? Supongo que algunos idiomas como TI-Basic no tienen capacidades de color, lo que significa que no se pueden usar para el desafío por una razón bastante abrupta
Fatalize

1
@Fatalize, eso no significa que no puedas jugar el color en el programa de alguna manera creativa e inteligente para guardar bytes.
Timothy Groote

3
@TimothyGroote TI-BASIC tiene principalmente un solo color: negro. Todo lo demás es un píxel fuera. Hay calculadoras C (SE) que tienen colores, pero no todos tienen uno.
Conor O'Brien

10
Estoy seguro de que poner un cellofane púrpura sobre su pantalla no aumenta el tamaño de su código en bytes. quiero decir que funcionó para el vectrex;)
Timothy Groote

Respuestas:


23

Procesamiento , 101 97 96 bytes

4 bytes gracias a Flambino.

1 byte gracias a Kritixi Lithos.

float d;void draw(){background(-1);stroke(#800080);d+=PI/1800;point(50+cos(d)*38,50+sin(d)*38);}

Esto crea una ventana predeterminada de 100 por 100 píxeles con la animación requerida.

ventana de salida

Descargo de responsabilidad: esa imagen no es un GIF. No lo mires por un minuto.


2
¿Implementa esto la regla de los 60 segundos?

2
@Lembik Sí. La velocidad de fotogramas predeterminada es de 60 fps , y estoy incrementando el ángulo de π/1800radianes a la vez. (Fue π/3600hace 10 segundos debido a mi pedo cerebral).
PurkkaKoodari

55
@ Pietu1998 Ese brainfart se debió al hecho de que pi está mal
Cruncher

2
@Cruncher tiene que amar vi hart!
Tim

17
Hola, tu GIF no funciona, lo miré por un minuto pero no pasó nada
Beta Decay

16

QB64, 79 bytes

QB64 es un emulador QBasic que agrega algunas características agradables. Este programa utiliza uno ( CLS,15) que no es compatible con vanilla QBasic.

SCREEN 7
DO
T=TIMER/9.55
PSET(COS(T)*75+99,SIN(T)*75+99),5
PLAY"c8"
CLS,15
LOOP

Esto es muy ruidoso. Utiliza el PLAYcomando para detener la ejecución por un corto tiempo antes de borrar la pantalla; de lo contrario, el píxel parpadeará y se volverá invisible.

Descargue QB64 , cargue este archivo, haga clic Runy luego Start.

Aquí está en acción:

el programa

Tomé algunos trucos (en SCREEN 7lugar de SCREEN 13, y en PSETlugar de POKE) de la respuesta de @ DLosc, por lo que el crédito se debe. Como en su respuesta, mi magenta es en realidad #8B008B, lo que fue considerado aceptable por el OP.

(La constante 9.55es una aproximación de 30/π = 9.54929658551. ¿Está lo suficientemente cerca?)


¡Decir ah! Nunca pensé en usar PLAYpor un retraso. Podría haber jurado que había un código para descansar, pero ahora no lo veo en el archivo de ayuda. Pensé en usar (una función de) TIMERcomo parámetro, pero nunca lo intenté para ver si era más corto. ¡Prestigio!
DLosc

44
¡Gracias! Me levanté descaradamente PSETde ti, así que felicitaciones :) Parece que un descanso n0es más largo que c. Además, me gusta como un poco de flexión de reglas: el OP dijo que no se podía mostrar nada más en la ventana, pero nunca dijo que mi programa no podía ir en voz alta BEEP BEEP BEEP BEEP .
Lynn

1
No tengo nada en contra de los pitidos, pero en realidad no puedo ver un píxel moviéndose alrededor de un círculo cuando lo intento en Linux.

1
Aquí está en acción en mi máquina, lo que debería ser suficiente prueba.
Lynn

12
Observé la imagen por un momento, porque dijiste "aquí está en acción ".
mbomb007

14

Java, 449 443 439 bytes

Porque siempre he tenido ideas estúpidas. Como jugar al golf en Java;).

import java.awt.*;import javax.swing.*;class F extends JFrame{F()throws Exception{setContentPane(new P());setSize(400,400);setVisible(0<1);for(;;Thread.sleep(100))repaint();}class P extends JPanel{double c;public void paintComponent(Graphics g){g.setColor(new Color(8388736));c=(c-0.1)%60;double t=0.104*c;g.fillRect((int)(180+Math.sin(t)*120),(int)(180+Math.cos(t)*120),1,1);}}public static void main(String[]x)throws Exception{new F();}}

Editar: ¡Gracias por @Ypnypn por jugar al golf 7 bytes!

Edit2: ¡Gracias por @Franz D. por guardar 3 bytes!


77
Java está ganando el concurso de código más corto más largo hasta ahora :)

1
- No necesita inicializar las variables miembro a cero, por lo que puede guardar dos bytes (~ 0.45%) al convertir "c = 0" a "c".
Franz D.

1
Y puede guardar un byte más inicializando el color en hexadecimal, es decir, nuevo Color (0x800080).
Franz D.

1
@FranzD. Aún mejor, solo usa el número decimal 8388736.
Ypnypn

1
Deshacerse de JFrame, usar Frame, le permite eliminar la importación de Java.
Urna de pulpo mágico

14

Mathematica, 102 101 94 bytes

Animate[Graphics[{White,Disk[],{Purple,Point[{0,1}]}}~Rotate~-t],{t,0,2π},DefaultDuration->60]

Crea un círculo blanco que está oculto y coloca un punto que sigue su borde de 0 a 2π. La DefaultDurationopción de Mathematica me permite configurarlo para completar un ciclo cada 60 segundos.

Aquí hay una versión acelerada de la salida:

EDITAR: cambie Circlea Diskpara guardar 2 caracteres, agregó un signo negativo tpara que se mueva en el sentido de las agujas del reloj.

EDITAR: guardado 7 bytes utilizando el ~operador (gracias a Mauris).


14
Prueba adicional de que Mathematica es solo un lenguaje de programación en el que escribes algunas palabras vagas en inglés que significan lo que quieres y luego agregan puntuación. (Escuché que puedes usar en a~f~blugar de f[a,b], ¿eso no te haría Rotatemás corto?)
Lynn

1
También puede usar la notación de prefijo para Point@{0,1}y no creo que necesite la lista Purple,Point....
Martin Ender

1
@Mauris. Para el ojo inexperto, Mathematica puede parecer palabras vagas en inglés y signos de puntuación. En realidad, son los nombres de funciones, configuraciones y operadores específicos y bien definidos. La probabilidad de que un no programador pueda desarrollar código viable es cero.
DavidC

3
@David: Jaja, por supuesto que lo sé, solo bromeaba :)
Lynn el

@Mauris, ¡me engañaste!
DavidC

14

HTML, 235 290 295 354 347 bytes

<a><style>*{position:absolute;margin:0;box-sizing:border-box}body{height:100vh;width:100vh}a{left:12.5%;top:50%;width:75%;height:1px;border-left:1px solid purple;animation:r 60s infinite linear}@keyframes r{100%{transform:rotate(360deg

Guarde como un .htmlarchivo y ábralo en un navegador que no necesite prefijos de proveedor, como Chrome o Firefox. O prueba este violín .


Esta es una nueva versión que es mucho más corta que mi primer intento, que había escrito 5 minutos antes de una reunión. El nuevo tamaño del lienzo es un cuadrado basado en la altura de la ventana gráfica. Eso funciona bastante bien y no está restringido a una determinada altura definida. Soy muy preciso sobre la configuración en el desafío (75% del tamaño de su padre, púrpura y 1px). Por lo tanto, necesito y no puedo descartar o simplificar las siguientes reglas:

* { margin: 0; box-sizing:border-box; }
a { left: 12.5%; }

Sin golf

Esta es la versión sin golf con marcado limpio:

<!DOCTYPE html>
<html>

<head>
    <style>
        * {
            position: absolute;
        }

        body {
            margin: 0;
            height: 100vh;
            width: 100vh;
        }

        a {
            left: 12.5%;
            top: 50%;
            width: 75%;
            height: 1px;
            border-left: 1px solid purple;
            box-sizing: border-box;
            animation: r 60s infinite linear;
        }

        @keyframes r {
            100%{
                transform: rotate(360deg)
            }
        }
    </style>    
</head>
<body>
    <a></a>
</body>

Ediciones

  • Se agregaron 7 bytes . Pensé que nadie se daría cuenta, que hay una relajación predeterminada en la animación. ;) Lo configuré linearahora.
  • Se guardaron 59 bytes arrojando todo lo que el navegador manejará automáticamente.
  • Guardado 3 bytes eliminando el final )}}. Gracias al cepillo de dientes .
  • Se guardaron 2 bytes utilizando en 12%lugar de 12pxcuál es el mismo valor correspondiente al tamaño del elemento padre.
  • Guardado 55 bytes debido a una refactorización masiva, también tuvo en cuenta muchos comentarios. Muchas gracias por todas las contribuciones.

1
Solo quería comentar sobre la publicación, me gustaría ver una solución html / css pura (tipo para enviar una)
dwana

1
Usando violín, la velocidad del píxel en movimiento es muy desigual. Casi se detiene cuando el píxel está en el extremo izquierdo. Alguna idea de por qué?

1
@insertusernamehere :) Creo que la versión no protegida también necesita actualizarse ahora.

55
Debe elegir el código de trabajo más pequeño independientemente de su validez. Cosas como contaminar el espacio de nombres global son parte del campo mientras se juega golf.
John Dvorak

2
Puede soltar )}}desde el final (el analizador CSS finalizará automáticamente los bloques)
Cepillo de dientes

14

TI-BASIC, 44 bytes

Para las calculadoras TI-84 + CSE / CE, que admiten algunos gráficos en color BASIC limitados.

AxesOff
ZSquare
While rand
Pt-Off(imag(Ans),real(Ans
7.5e^(-i6startTmr°
Pt-On(imag(Ans),real(Ans),13
End

El color aquí es magenta o color 13 (también se puede usar el MAGENTAtoken).

Utilizo en randlugar de 1la condición de bucle infinito para proporcionar un pequeño retraso (~ 15 ms) entre el momento en que se muestra el píxel y cuando se apaga nuevamente.

Configure su calculadora en modo radianes antes de ejecutar este programa; No cuento esto en el tamaño porque es el estado predeterminado. También se establece Ansen 0 ingresando un 0 antes del programa; Este es también el valor predeterminado.

Gracias a @quartata por probar este programa (no tengo una calculadora de color).


Idea ingenua: ¿puede hacer que el programa se llame a sí mismo en lugar de usar un bucle while, y sería más corto?
Lynn

@Mauris el bucle while es de 3 tokens, mientras que el nombre de un programa suele ser más largo
TheDoctor

1
@Mauris El ciclo While es en realidad de 4 bytes, y es posible repetir en 3, pero la pila se agota muy rápidamente, después de menos de 300 llamadas.
lirtosiast

@Lembik Como estás de acuerdo con [ codegolf.stackexchange.com/a/62203/39328] , no cambiaré esto para que sea más fluido.
lirtosiast

13

Java, 339 308 289 287 bytes

import java.awt.*;class F extends Frame{{setSize(200,200);show();}int c;public void paint(Graphics g){g.setColor(new Color(8388736));g.fillRect((int)(99+Math.sin(--c*.01)*75),(int)(99+Math.cos(c*.01)*75),1,1);for(int i=0;++i<62864;)paint();}public static void main(String[] x){new F();}}

¡Gracias a @Peter Lenkefi, cuya gran solución me ayudó a comenzar, y cuyo for-loop copié descaradamente!

El ahorro principal se debió a cambiar a AWT puro y renderizar directamente en el Marco, sin necesidad de un JPanel (o Canvas). También convertí el contador en una variable entera, actualizada mediante un simple incremento, y guardé unos pocos bytes girando las constantes para poder quitar un dígito aquí y allá.

EDITAR: Gracias a @Peter Lenkefi y @tobii por sus sugerencias en los comentarios. Vencer HTML sería bueno: ¿alguien sabe cómo pausar de manera confiable la ejecución en Java sin usar sleep () y tener que detectar excepciones?

EDIT 2: JAVA BEATS HTML (¡actualmente en 290 bytes!): D El tiempo ahora depende de la máquina, pero ~ 60 segundos para un círculo completo en mi máquina, lo cual está bien según @Lembik. Gracias de nuevo a @PeterLenkefi por su sugerencia: mi respuesta es más de la mitad de la suya :)

EDITAR 3: @Ajay sugirió eliminar el "re" de "repintar". Dos bytes menos. Estamos llegando allí :)


1
Tenemos que obtenerlo en HTML (<290 en este momento)
Peter Lenkefi

1
@PeterLenkefi: Desafortunadamente, no puedo guardar las llaves del elenco; emitir el resultado sin / cos directamente rompe el cálculo. Tu pintura dentro de la pintura () está increíblemente sucia :)
Franz D.

1
@Troyseph, me refería al golf;) No uso java para nada.
Peter Lenkefi

1
El uso int c,iy omitiendo el intde for(int i=..debe ahorrar un poco más.
Marco13

1
Ni siquiera necesita la declaración de clase para F, sólo puede extender la línea de clase del marco: new Frame(){...}.
Urna de pulpo mágico

9

Haskell, 143 136 bytes

Esto usa el paquete de brillo :

import Graphics.Gloss
main=animate(InWindow""(100,100)(0,0))white$ \t->color(makeColor 0.5 0 0.5 1).rotate(t*6).translate 38 0$circle 1

La versión más bonita es

import Graphics.Gloss

purple :: Color
purple = makeColor 0.5 0.0 0.5 1.0

main :: IO ()
main = animate (InWindow "" (100,100) (0,0)) white $ \t ->
    color purple . rotate (t * 6) . translate 38 0 $ circle 1

Puede eliminar algunos espacios en blanco.
derecha el

@Elyse De hecho, gracias. También eliminé dos innecesarios .0.
Frerich Raabe

8

HTML (CSS?), 167 bytes

Inspirado por la respuesta de insertusernamehere

<style>body{position:fixed;left:50%;top:12%;width:1px;height:75vmin;border-top:1px solid #800080;animation:r 60s infinite linear}@keyframes r{to{transform:rotate(1turn

Sin golf:

body {
    position: fixed;
    left: 50%;
    top: 12%;
    width: 1px;
    height: 75vmin;
    border-top: 1px solid #800080;
    animation: r 60s infinite linear;
}
@keyframes r {
    to {
        transform: rotate(1turn);
    }
}


Solo un FYI, HTML + CSSgeneralmente no se considera un lenguaje de programación, sin embargo, depende del OP.
GamrCorps

1
No hace nada en Firefox 41.0.2.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Acabo de probar en Firefox 41.0.2, Win 10. Funciona bien para mí.
Lachlan Arthur

1
Funciona para mí en 41.0.2 en ubuntu.

1
+1 Buen pensamiento para animar a bodysí mismo. :)
insertusernamehere

7

QBasic, 106

SCREEN 7
COLOR 5,15
DO
t=TIMER
CLS
PSET(99+99*COS(i),99+99*SIN(i))
i=i+ATN(1)/75
1IF TIMER<t+.1THEN 1
LOOP

Probado en QB64 , que dice que tiene una versión de Linux (aunque solo lo he probado en Windows).

  • SCREEN 7 establece el modo de gráficos.
  • COLOR 5,15 establece magenta oscuro como color de primer plano y blanco brillante como color de fondo.
  • DO ... LOOPEs un bucle infinito. Por lo general, lo vería como DO WHILE ... LOOP(o puede ponerlo en su LOOP WHILElugar o usarlo UNTILpara una condición negada), pero también puede omitir la condición, en cuyo caso se repite para siempre.
  • TIMER es el número de segundos desde la medianoche, como un valor de punto flotante.
  • CLS = Pantalla CLear.
  • PSET ESTABLECE un punto a un color, color de primer plano de forma predeterminada.
  • icomienza en cero y cuenta por pi / 300 cada vez a través del ciclo, completando así un círculo completo después de 600 repeticiones. Calculamos pi como 4 * arctan (1).
  • La última línea espera hasta que hayan transcurrido 0,1 segundos. El idioma que aprendí de mis libros de QBasic fue t# = TIMER: WHILE TIMER < t# + 0.1: WEND. Pero no necesitamos números de doble precisión (marcados con #) para una diferencia de 0.1 segundos, y resulta que la IF cond THEN [GOTO] linesintaxis es 1 carácter más corta que un WHILE ... WENDbucle.

El ciclo se repite 600 veces en 60 segundos, completando así un círculo completo.

Advertencias

  • El color 5, magenta oscuro, es en #8B008Blugar del solicitado #800080(se borra con el OP).
  • El modo de pantalla 7 es 320x200, por lo que el círculo tiene un diámetro 198, que no es> = 0.75 del ancho pero es> = 0.75 de la altura (también se borra con el OP).
  • Si ejecuta esto en DOS QBasic, es de pantalla completa, por lo que el "píxel" no es en realidad un solo píxel en el monitor (a menos que tenga un monitor de 320x200). Pero debería estar lo suficientemente cerca. QB64 se ejecuta en una ventana que usa las dimensiones exactas y, por lo tanto, el píxel es un píxel literal.
  • Al menos en QB64, esto lleva más de 65 segundos para hacer una revolución completa. Realmente no sé por qué; deben ser errores de redondeo o sobrecarga en el ciclo, aunque he intentado mitigar ambos sin éxito. En teoría, el código debería funcionar correctamente tal cual. En la práctica, uno puede ajustar la cantidad que ise incrementa hasta que una revolución esté lo suficientemente cerca de 60 segundos. (Pruebe con un denominador de 69 o 68.)
  • No hay una bonita foto aquí. :( La calidad de LICEcap no fue lo suficientemente buena como para capturar un solo píxel con precisión.

Este código funciona perfectamente para mí en Linux. Gracias.

Esto realmente se ejecuta en QBasic 4.5, pero el fondo no es realmente blanco :). Aquí hay un GIF de compilación y ejecución: codegolf.square7.ch/altqb.gif
mınxomaτ

@ mınxomaτ Odd, el color 15 debería dar blanco o gris claro de acuerdo con todo lo que creía saber ... que parece cian claro (color 11). ¿Qué hace en SCREEN 8lugar de 7hacer?
DLosc

El mismo fondo verdoso. Pero tienes razón, de acuerdo con las especificaciones, debe ser blanco. También probé el color 7 (gris) y salió como gris. Entonces su solución está absolutamente bien, pero hay algo mal con mi DOS.
mınxomaτ

7

script mIRC, 184 bytes

alias g {
window -p @m -1 -1 100 128
f
}
alias f {
inc %s 1
set %o $calc(%s *38/360)
clear @m
drawdot -r @m $rgb(128,0,128) 1 $calc($cos(%o)*38+50) $calc($sin(%o)*38+52)
.timer 1 1 f
}

Esto está optimizado para mIRC en Wine. Inicie mIRC, presione y Alt + Rluego pegue esto, cierre el editor y ejecútelo con/g

Avance

El momento en el gif podría estar apagado.


¡Esto es algo nuevo para mí! Sería genial si pudieras hacer un gif animado de él corriendo.

¡Fue uno de los primeros idiomas que utilicé / me interesó en la codificación!
Varis

6

R, 170 bytes

library(animation);for(i in 1:60){par(mar=rep(0,4));plot.new();t=2*pi*(1-i)/60;points(3*cos(t)/8+.5,3*sin(t)/8+.5,pch=19,col="#800080");ani.record()};repeat{ani.replay()}

Se basa en el paquete animation. Y aquí hay un gif para mostrar que funciona:

En una ventana

Solución no válida guardando en un gif (139 bytes):

animation::saveGIF({for(i in 1:60){par(mar=rep(0,4));plot.new();t=2*pi*(1-i)/60;points(3*cos(t)/8+.5,3*sin(t)/8+.5,pch=19,col="#800080")}})

Este requiere que ImageMagick esté instalado. El resultado se guarda en un gif.

! [Vueltas y vueltas va


Sin embargo, esto es genial ... el desafío necesita el código para escribir en la pantalla / ventana.

Oh, no entendí eso.
plannapus

2
Aquí está, en una ventana.
plannapus

6

Rubí con zapatos, 159 bytes

Shoes.app{animate{background stroke white
fill purple
r=0.75*c=self.width/2
t=Time.now
m=Math
rect c+r*m.sin(a=(t.sec+t.usec*1e-6)*m::PI/30),c-r*m.cos(a),2,2}}

El píxel es en realidad la punta del segundero de un reloj analógico. Entonces este es absolutamente preciso.

Rubí con zapatos, 134 bytes

m=Math
Shoes.app{animate{|f|r=0.75*c=self.width/2
background stroke white
fill purple
rect c+r*m.sin(a=f*m::PI/360),c-r*m.cos(a),2,2}}

Esta es una alternativa basada en cuadros por segundo, inspirada en las otras respuestas. Aunque la documentación dice que el fps predeterminado es 10, las pruebas prácticas muestran que en realidad es 12.

Ambas soluciones toman "El ancho del círculo debe ser 0.75 (redondeando adecuadamente) el ancho de la pantalla o ventana" literalmente: calcule en función del ancho de la ventana, por lo que el píxel ocasionalmente puede salir de la parte inferior de una ventana no cuadrada. No estoy seguro de cómo se espera que se maneje tal caso. (¿Usar un mínimo de ancho y alto? ¿Caminar en una ruta ovalada?) La ventana comienza con un tamaño predeterminado de 600 x 500 y es redimensionable.


Muy contento de ver una solución Ruby! Ahora necesitamos Python, Perl, ....

5

D, 286 280 bytes

(392 si se escribe normalmente)

import simpledisplay,std.math;void main(){auto w=new SimpleWindow(100,100);auto c=50;auto r=c*2/3;int t;auto y=600/PI;w.eventLoop(50,{auto p=w.draw();p.clear;p.outlineColor=Color(128,0,128);p.drawPixel(Point(c+cast(int)(r*cos(t/y)),c+cast(int)(r*sin(t/y))));if(++t==1200)t=0;});}

O la forma en que lo escribí originalmente sin jugar al golf:

import simpledisplay, std.math;

void main() {
        auto window = new SimpleWindow(100, 100);
        auto c = window.width/2;
        auto r = c*2/3;
        int t;
        float cycle = 20*60/(PI*2);
        window.eventLoop(50, {
                auto p = window.draw();
                p.clear;
                p.outlineColor = Color(128, 0, 128);
                p.drawPixel(Point(c + cast(int) (r*cos(t/cycle)), c + cast(int) (r*sin(t/cycle))));
                if(++t == 20*60)
                        t = 0;
        });
}

Depende de simpledisplay.d y color.d ubicados aquí: https://github.com/adamdruppe/arsd

Simplemente descargue esos dos archivos individuales y colóquelos en su mismo directorio que el código anterior, luego: dmd yourfile.d simpledisplay.d color.dpara compilar y luego simplemente ejecutarlo.

¡Mi pequeña biblioteca fue escrita para hacer animaciones rápidas como esta bastante simple, por lo que esto juega bien con sus puntos fuertes! Por desgracia, me gustan los nombres de identificadores largos y no proporcioné un Pointconstructor que tome, floatpor lo que agrega 18 bytes de conversión y ... idk un par de docenas deletreando los nombres de mis métodos.


1
El primer argumento para eventLoop por cierto es un temporizador de milisegundos. Si no es cero, automáticamente crea un temporizador para usted y llama a la función con cero argumentos proporcionados en ese intervalo. (eventLoop también puede tomar funciones con los argumentos MouseEvent o KeyEvent para manejar la entrada del usuario). Entonces, intervalo de 50 milisegundos = 20 cuadros por segundo, entonces 20 * 60 = ciclo en 60 segundos.
Adam D. Ruppe

Creo que de la forma en que ha escrito la respuesta, el código de la tabla de clasificación recoge 392 en lugar de 280.

5

C #, 379 365 bytes

using System.Windows.Forms;using static System.Math;class P:Form{static void Main(){var f=new P();var p=new PictureBox();f.SetBounds(0,0,1000,1000);f.Controls.Add(p);f.Show();for(var i=0d;;i+=PI/3000){p.SetBounds((int)(Cos(i)*375+500),(int)(Sin(i)*375+500),1,1);p.CreateGraphics().Clear(System.Drawing.Color.FromArgb(-8388480));System.Threading.Thread.Sleep(10);}}}

Depende de System.Windows.Formsy System.Drawingpara correr. La salida está en una ventana de 1000x1000.


Puede guardar algunos bytes usandovar
pinkfloydx33

Ahorre otro byte usando importación estática en matemática del sistema
pinkfloydx33

puede declarar su código en el espacio de nombres del Sistema y eliminar todas las demás referencias al sistema y guardar, creo, 10 bytes
JustinM - Reinstalar Monica

5

SVG, 177 bytes

<svg><g transform=translate(75,75)><circle id=x r=.5 cx=56 fill=#800080><animateTransform xlink:href=#x attributeName=transform type=rotate to=360 dur=60s repeatCount=indefinite

Marcado no válido desde el infierno hasta el desayuno, pero se ejecuta (al menos en Chrome). Al igual que un lienzo HTML5, el tamaño predeterminado para un SVG parece ser 300x150, así que eso es lo que se supone.

Editar: Vaya, accidentalmente me fui con una duración de 6 en lugar de 60. Se corrigió eso, pero también descubrí que 0.5funciona de la misma .5manera, por lo que no hay cambios en el conteo de bytes.


5

X86 Machine-código - 150 146 149 133 127 bytes

Versión de golf:

        00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
        --------------------------------------------------------------------
0000    B0 13 CD 10 BA C9 03 88 F1 BE 76 01 F3 6E B0 0F - °.Í.ºÉ.ˆñ¾v.ón°.
0010    49 68 00 A0 07 F3 AA 64 66 A1 6C 04 66 A3 80 01 - Ih. .óªdf¡l.f£€.
0020    64 66 A1 6C 04 66 2B 06 80 01 66 50 89 E5 D9 EB - df¡l.f+.€.fP‰åÙë
0030    D8 C0 DA 4E 00 DE 34 D9 FB BB 7D 01 DE 0F DE 47 - ØÀÚN.Þ4Ùû»}.Þ.ÞG
0040    FE DF 5E 02 DE 0F DE 47 FE DF 5E 00 5F 69 FF 40 - þß^.Þ.ÞGþß^._iÿ@
0050    01 58 01 C7 BB 88 01 8B 0F 39 CF 74 C3 30 C0 AA - .X.Ç»ˆ.‹.9ÏtÃ0Àª
0060    4F 89 3F 89 CF B0 0F AA 31 C0 FE C4 CD 16 74 B0 - O‰?‰Ï°.ª1ÀþÄÍ.t°
0070    B8 03 00 CD 10 C3 20 00 20 44 04 64 00 4B 00    - ¸..Í.Ã . D.d.K.

'Ungolfed', versión de origen:

; golfCrcl.asm
;
; - 16 bit implementation of an animated pixel that circumscribes a circle.
; - 127 bytes .COM file
;
;   - enhzflep -
;   31 Oct 2015 - initial
;               - set closest colour to desired #800080
;    2/3 Nov 2015 - removed unnecessary instuctions, used BX register to index mem by fpu
;               - removed .data section alignment, better register use in curPixel/lastPixel compares and calcs, reusing value of si after palette setting
[section .text]
[bits 16]
[org 0x100]
EntryPoint:
;   mov     fs, bx          ; bx is 0 on entry. Set fs seg register to this

    ; set graphics mode 320x200
    mov     al, 0x13
    int     0x10

    ; set colour #0 to be as close to the desired one as possible
    ; the vga palette registers are 6 bits by default (some models allow switching to 8 bits)
    ; therefore, we cant represent all of the 16.7m colours that we can in 24bit modes
    ; we're limited to 'just' 64*64*64 = 262,144 (256k) colours. Unfortunately, #800080 is not
    ; a colour we can represent exactly in mode13 or any other mode with 6 bit regs.
    mov     dx, 0x3c9
    mov     cl, dh
    mov     si, desiredCol
    rep     outsb                           ; cx now=0 and si now points to totalTicksNeeded

    ; clear the screen to white
    mov     al, 0x0f                        ; index of a colour thats already FF,FF,FF
;   xor     cx, cx                          ; cx = 0 - its zeroed by the rep outsb instruction above.
    dec     cx                              ; cx = FFFF
    push    word 0xA000                     ; segment of video memory
    pop     es                              ; pop it into es
    rep     stosb                           ; es:[di] = 0F, inc di, dec cx. If cx != 0 then repeat.

    ; setup the timing stuff
    mov     eax, [fs:0x046C]                ; 32 bit value updated at 18.2Hz by bios
    mov     [initialTicks], eax

.drawLoop:
    mov     eax, [fs:0x046C]                ; 32 bit value updated at 18.2Hz by bios
    sub     eax, [initialTicks]             ; eax = curTime-startTime (in increments of 1/18.2 of a second --- 182 = 10 seconds)

    push    eax                             ; number of elapsed clock ticks - ready to be loaded by fpu. Also stack space for calc result
    mov     bp, sp                          ; get pointer to last element pushed onto the stack
    fldpi                                   ; st0 = pi
    fadd    st0                             ; st0 = 2pi
    fimul   long [bp]                       ; (currentTick/requiredTicks) * 2pi
;   fidiv   word [totalTicksNeeded]
    fidiv   word [si]                       ; si still points to totalTicksNeeded after setting the palette earlier
    fsincos                                 ; st0 = cos(old_st0), st1 = sin(old_st0)

    mov     bx, radius
    fimul   word [bx]                       ;   fimul word [radius] -  cos(angle)*radius
    fiadd   word [bx-2]                     ;   fiadd word [origin] -  origin + cos(angle)*radius
    fistp   word [bp+2]                     ; ---- X-coord -------

    fimul   word [bx]                       ;   fimul   word [radius]
    fiadd   word [bx-2]                     ;   fiadd   word [origin]
    fistp   word [bp+0]                     ;  ---- Y-coord -------

    ;---------------
    pop     di                              ; calculated Y-coord
    imul    di, 320                         ; multiply it by the screen width
    pop     ax                              ; calculated X-coord
    add     di, ax                          ; di = x + (pixels_per_row * y_coord)

    mov     bx, lastIndex
    mov     cx, [bx]                        ; get the mem index for the last pixel
    cmp     di, cx                          ; check if we're indexing the same pixel as last time through the loop
    je      .drawLoop                       ; if so, return to start of loop - no need to delete and redraw the pixel in the same spot.

    xor     al, al                          ; col index 0
    stosb                                   ; draw our purple pixel
    dec     di                              ; stosb advanced di to the next pixel, undo this (stosb followed by dec di is still shorter than mov es:[di], al)
    mov     [bx], di                        ; save the pixel's mem address
    mov     di, cx                          ; restore index of pixel drawn last time through the loop
    mov     al, 0x0f                        ; pal index of white
    stosb                                   ; erase the last pixel

    ; check for a keystroke
    xor     ax, ax
    inc     ah
    int     0x16
    jz      .drawLoop                           ; loop if no keys pressed

.drawingDone:
    ; set text mode 80x25
    mov     ax, 0x3
    int     0x10

    ; program exit
    ret                                     ; Dos pushes a 0000 onto the stack and copies CD 20 to offset 0 of our code-seg
                                            ; before it invokes our program. ret jumps back to that CD 20 (int 0x20) instruction

; Since this is a .COM file, all program, data and stack exist in the same segment. 
; Using .text and .data sections only improves program readability - doing so only has minor effects on the binary produced.
;
; In this case, the assembler word aligns anything in the data section. This may have the effect of adding a padding byte,
; which we really dont need/want here. Data is machine-word aligned to improve the speed of access for the hardware. Machine-word
; is used to refer to the size of an int. In the case of 16 bit code, this will generally be 16 bits, 32 bit code has 32 bit words
; and so on. This code is 16 bit, so things should be aligned to word boundaries for maximum execution speed
;
;[section .data]
desiredCol          db  0x80/4, 0x00, 0x80/4        ; palette registers are only 6 bit.
totalTicksNeeded    dw  1092
origin              dw  100
radius              dw  75

; ticks/second = 18.2
; totalTime = 60 seconds
; totalTicks = 1092 (18.2 * 60)
; degreesPerTick = 360 / 1092 = 0.3296703
; timerTicksAddr = 0040:006C (0000:046C) dword
[section .bss]
initialTicks    resd    1
lastTickValue   resd    1
lastIndex       resw    1

Versión descargable, codificada en base64

data:application/octet-stream;base64,sBPNELrJA4jxvnYB826wD0loAKAH86pkZqFsBGajgAFkZqFsBGYrBoABZlCJ5dnr2MDaTgDeNNn7u30B3g/eR/7fXgLeD95H/t9eAF9p/0ABWAHHu4gBiw85z3TDMMCqT4k/ic+wD6oxwP7EzRZ0sLgDAM0QwyAAIEQEZABLAA==

Copie y pegue esta dirección en su navegador. Cambie el nombre del archivo resultante golfcrcl.comy ejecútelo en un entorno DOS, es decir, DosBox.


¡Esto es genial! Probado y funciona perfectamente.

1
Oh chasquido! Me acabo de dar cuenta de que especificaste un color para usar y lo ignoré por completo. : oops: lo arreglaré un poco más tarde. El índice de color debe ser 0x5C, en lugar de 0x09 (suponiendo que dosbox configure la paleta correctamente, de lo contrario, simplemente reasignaré el color 1)
enhzflep

4

Mathematica 208185139 bytes

Mueve un píxel morado alrededor de una matriz utilizada como imagen.

Método 1 139 bytes

n=900;Dynamic@Refresh[t=DateValue@"Second";ReplacePixelValue[Image@Array[1&,{n,n}],
400{Cos[z=Pi/30t],Sin@z}+450->Purple],UpdateInterval->1]

Método 2 154 bytes

Traza un píxel a lo largo de una ruta circular en 60 segundos.

Dynamic@Refresh[t=DateValue@"Second";Graphics[{AbsolutePointSize@.01,Purple, 
Point[{Cos[z=Pi/30t],Sin@z}]},PlotRange->1,ImageSize->Full],UpdateInterval->1]

Método 3 193 bytes

Esto dibuja un reloj, con marcas y etiquetas en blanco, para las cuales la manecilla de segundos es un píxel.

Dynamic@Refresh[ClockGauge[AbsoluteTime[],TicksStyle->White, 
GaugeMarkers->{None,None,Graphics[{White,Disk[],Purple, 
AbsolutePointSize[.01],Point@{3,0}}]},PlotTheme->"Minimal"],UpdateInterval->1]

Ya veo, confusión básica de LTR ... Pero de todos modos, puedes eliminar el espacio entre 30y t.
LegionMammal978

4

Obj-C ++ / Cocoa, 777 678 668 657 643 628 bytes

#include <Cocoa/Cocoa.h>
float r;@implementation V:NSView-(void)drawRect:(NSRect)d{CGContext*c=(CGContext*)NSGraphicsContext.currentContext.graphicsPort;CGContextSetRGBFillColor(c,.5,0,.5,1);CGContextFillRect(c,(CGRect){cos(r)*38+50,sin(r-=pi/300)*38+50,1,1});[NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(x)userInfo:0 repeats:0];}-(void)x{self.needsDisplay=1;}@end
int main(){NSRect b={0,0,100,100};NSWindow*w=[[NSWindow alloc]initWithContentRect:b styleMask:1 backing:2 defer:0];[w orderFront:0];w.backgroundColor=[NSColor whiteColor];w.contentView=[[V alloc]initWithFrame:b];[NSApp run];return 0;}

Así que esta es probablemente la peor manera de hacer algo, pero pensé que lo intentaría.

Se puede compilar en una Mac (la mía de todos modos) con g++ -framework Cocoa file.mmy ejecutar desde la terminal ( ctrl-Cpara salir, ya que no es una aplicación).

captura de pantalla

Editar: 99 bytes guardados: corregido main()para ejecutarse en OS X 10.10 (la primera versión solo se ejecutó en 10.8), omitió traducir / rotar a favor de cálculos trigonométricos simples, dejó de molestarse con la colocación de ventanas y otras cosas pequeñas.

Editar: guardado otros 10 bytes: cambiado solo orderFrontpara mostrar la ventana. Sin embargo, en realidad no lo convierte en la ventana frontal, pero tampoco lo hizo orderFrontAndMakeKey, así que ...

Editar: guardó otros 11 bytes: se omitió NSMakeRecty encontró un dígito que solo tenía que ir.

Editar: guardó otros 14 bytes: no necesité asignar la NSTimerinstancia a nada, y aparentemente puede omitir la inicialización ra cero.

Editar: guardado otros 15 bytes: no puedo parar. Enviar ayuda.


Gracias. ¡Obj-C ++ es el claro ganador en la competencia de código más corta más larga actualmente!

14
+1 por ganar también el concurso de imágenes no animadas más animado .
Lynn el

4

Javascript / Processingjs, 175 173 156 153 152 bytes

var s=256,e,h,m;void setup(){size(s,s);h=s/2;}void draw(){background(-1);m=-millis()*(PI/36000);stroke(h,0,h);e=s/2*0.75;point(h+sin(m)*e,h+cos(m)*e);}

Para ejecutar: visite http://www.openprocessing.org/sketch/226733 para verlo en acción usando processing.js, o descargue el procesamiento 2.0 de processing.org , pegue el código en el IDE de procesamiento, seleccione el modo Javascript y mire ir.


Lol, publicaste Processing 20 segundos antes que yo.
PurkkaKoodari

¿Está mal el encabezado en esta respuesta? No aparece en la tabla de clasificación.

1
Me perdí eso, estoy en eso ahora.
Timothy Groote

1
ahora debe cumplir con el requisito de 60 segundos
Timothy Groote

1
background(-1)es un byte más corto quebackground(255)
Kritixi Lithos

3

Olmo , 274 bytes

import Color exposing (..)
import Graphics.Collage exposing (..)
import Time exposing (..)
main=Signal.map((\t->collage 200 200 [move(75*cos(-2*pi*t/60),75*sin(-2*pi*t/60))(filled(rgb 128 0 128)(circle 2)),outlined(solid black)(square 200)])<<inSeconds)(every(0.01*second))

Intente o edítelo en su navegador:

Tenga en cuenta que si nos deshacemos de las importaciones y dibujamos el contorno alrededor del lienzo, tenemos 149 bytes, ¡pero eso probablemente sea una trampa!


¡Vaya, arreglado! Me impaciente durante las pruebas
jmite

1
Esto es muy bueno y es genial obtener algo en un lenguaje funcional. ¡Solo necesitamos a Haskell y Scala ahora!

2
@Lembik Acabo de agregar una versión de Haskell
Frerich Raabe

3

C #, 301 bytes

using System.Windows.Forms;using System.Drawing;class P:Form{static void Main(){Application.Run(new P());}P(){Paint+=(o,e)=>{var g=e.Graphics;g.Clear(Color.White);g.TranslateTransform(150,150);g.RotateTransform(System.DateTime.Now.Second*6);g.FillRectangle(Brushes.Purple,105,0,1,1);Invalidate();};}}

Depende de las métricas de tamaño predeterminadas; El tamaño y la posición pueden variar un poco dependiendo de varios factores. Puede o no parpadear horriblemente; para resolver eso, agregue lo siguiente:

SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.AllPaintingInWmPaint,true);

3

Lua + Löve, 189 caracteres

t=0
m=math
l=love
g=l.graphics
function l.update(d)t=t+d end
function l.draw()a=t*m.pi/30
g.setBackgroundColor(255,255,255)g.setColor(127,0,127)g.point(400+225*m.cos(a),300+225*m.sin(a))end

love.update()recibe como parámetro el tiempo transcurrido desde el cuadro anterior. Dibuja en la ventana predeterminada de 800 x 600 en coordenadas fijas, ya que la ventana no es redimensionable de todos modos.


La primera respuesta lua! Gracias.

3

Python 2 + Pygame, 221 198 193

exec'from %s import*;'*3%('math','pygame','time')
_,p,D=[255],128,display
S=D.set_mode(_*2)
while 1:S.fill(_*3);S.set_at(map(lambda f:int(p+f(pi*(time()%60)/30)*96),(cos,sin)),(p,0,p));D.flip()

1
Pythontastically impresionante!

Ahora solo necesitamos una solución python + turtle también.

3

C (usando SDL1.2), 237 233

#include <SDL.h>
#define P(f)(int)(128+96.0*f(3.14*((int)(.001*SDL_GetTicks())%60)/30))
main(){SDL_Surface*s=SDL_SetVideoMode(255,255,32,0);while(1){int*p=s->pixels;memset(p,255,260100);p[P(cos)+s->w*P(sin)]=0x800080FF;SDL_Flip(s);}}

Compila y ejecuta usando gcc -I/usr/include/SDL snippet.c -lSDL -lm && ./a.out


Increíblemente genial! Pensé que nadie lo haría.

2

ActionScript 2.0, 151 bytes

Desafortunadamente, Adobe Flash no es freeware, y Google informa que no funciona en Linux sin una VM o Wine (e incluso con Wine, solo funciona principalmente ). Aún así, quería ver qué tan bien le iría en esta tarea. Bastante bien, resulta.

createEmptyMovieClip("p",0)
p._x=p._y=r=200
p.beginFill(0x800080)
p.moveTo(r,0)
p.lineTo(r-1,0)
p.lineTo(r,1)
onEnterFrame=function(){p._rotation+=.25}

La idea básica: crear un nuevo objeto de clip de película, colocarlo en (200, 200) y luego dibujar un punto 2 en él 200 píxeles más a la derecha. Ahora el clip de película tiene 200 píxeles de ancho y 1 píxel de alto. El punto de pivote son las coordenadas originales donde comenzamos, por lo que cuando modificamos la _rotationpropiedad, el punto se mueve en un círculo alrededor del punto (200, 200). Convenientemente, _rotationestá en grados; 0.25 grados / cuadro * 24 cuadros / segundo * 60 segundos / minuto = 360 grados / minuto.

Para ejecutar desde cero si tiene Flash, cree un nuevo documento Flash 1 , abra el panel Acciones y pegue el código anterior. No se requiere más personalización, asumiendo el fondo blanco predeterminado, el lienzo 550x400 y 24 fps. Presiona Ctrl-Enter y mira cómo se va.

Si no tiene Flash, aún puede ver los resultados con el Flash Player gratuito, que debería venir con la mayoría de los navegadores modernos. Descargue el archivo SWF aquí . Si no puede reproducirlo, intente descargar también esta página HTML y abrirla, con el archivo SWF en el mismo directorio.

1 Probado en Adobe Flash CS4 Professional, eligiendo "Archivo Flash (ActionScript 2.0)" cuando se le preguntó qué tipo de archivo nuevo crear.

2 En realidad, un pequeño triángulo, como verás si lo acercas lo suficiente. Fue la forma más golfica que pude encontrar para dibujar un punto.


2

JavaScript con jQuery, 205 bytes

y=75;with($('<canvas/>').appendTo(document.body)[0].getContext('2d')){fillStyle='#800080';translate(y,y);(f=function(){clearRect(-y,-y,y*2,y*2);fillRect(0,56,1,1);rotate(Math.PI/300);setTimeout(f,100)})()}

jsfiddle , fragmento a continuación

Tal vez esto no esté del todo en el libro. El tamaño predeterminado de un lienzo (al menos en Chrome) es 300x150, por lo que he centrado el círculo en 75x75. Podría centrarlo en 150x75 y hacer que su radio sea de 113px (~ 75% del ancho), pero estaría fuera del lienzo algunas veces, así que elegí ~ 75% de la altura.

Pero no es particularmente corto de todos modos, así que meh '


2

Blitz 2D / 3D , 126 bytes

Graphics 180,180
ClsColor 255,255,255
Color 128,0,128
While 1
Cls
ang#=ang+3
Plot 90+67*Cos(ang),90+67*Sin(ang)
Delay 500
Wend

Desafortunadamente, este idioma solo es compatible con Windows (aunque puede ejecutarse en Wine).


2

Javascript ES6, 202 bytes

a=0;with((D=document).body.appendChild(D.createElement`canvas`).getContext`2d`)with(Math)setInterval((f=t=>t(a+=PI/6e3)*60+75)=>fillRect(f(cos,clearRect(0,0,150,150),fillStyle=`#800080`),f(sin),1,1),10)

Probado en Firefox 41.

Al igual que la otra respuesta (casi) pura de Javascript, el círculo está centrado en 75x75 ya que el tamaño predeterminado de los elementos del lienzo es 300x150 según lo definido por las especificaciones HTML.


2

Matlab, 141 136

Le envío esto, Lembik, para que tenga una lista completa.

v=-100:100;
[y,x,m]=ndgrid(v,v,0);
n=75;
while 1;
    pause(1);
    c=m;
    c(x+i*y==round(n))=1;
    imshow(c);
    colormap([1,1,1;.5,0,.5]);
    n=n*exp(pi*i/30);
end

Versión antigua:

v=-100:100;
[x,y,m]=ndgrid(v,v,0);
while 1;
c=m;
c(x+i*y==round(75*(-1)^(s/30)))=1;
imshow(c);
colormap([1,1,1;.5,0,.5]);
s=mod(s-1,60);
pause(1);
end
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.