Un singolo pixel che si muove in un percorso circolare


45

Questa è una sfida di output grafico in cui il compito è quello di fornire il codice più breve per lingua.

Compito

Il codice dovrebbe tracciare un singolo pixel viola (valore esadecimale # 800080 o rgb (128, 0, 128)), spostandosi in senso orario attorno a un cerchio. Dovrebbero essere necessari esattamente 60 secondi per compiere un viaggio completo attorno al cerchio e continuare all'infinito. Nient'altro dovrebbe essere mostrato sullo schermo o sulla finestra tranne il pixel. La larghezza del cerchio dovrebbe essere 0,75 (arrotondando opportunamente) la larghezza dello schermo o della finestra e lo sfondo dovrebbe essere bianco. Per evitare soluzioni sciocche, lo schermo o la finestra devono avere una larghezza di almeno 100 pixel.

Il tuo codice dovrebbe essere un programma completo .

Lingue e biblioteche

Puoi usare qualsiasi lingua o biblioteca che ti piace. Tuttavia, vorrei essere in grado di testare il tuo codice, se possibile, quindi se puoi fornire istruzioni chiare su come eseguirlo in Ubuntu sarebbe molto apprezzato.

Le venti lingue principali mancanti. Aiuto richiesto.

I seguenti venti principali linguaggi di programmazione attualmente non hanno alcuna soluzione.

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

Catalogare

Lo snippet di stack nella parte inferiore di questo post genera il catalogo dalle risposte a) come elenco della soluzione più breve per lingua eb) come classifica generale.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet:

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


1
quale raggio dovrebbe essere il cerchio?
Timothy Groote,

19
Perché il pixel dovrebbe essere viola? Suppongo che alcune lingue come TI-Basic non abbiano capacità di colore, il che significa che non possono essere utilizzate per la sfida per un motivo piuttosto abitativo
Fatalizza il

1
@Fatalizza ciò non significa che non puoi golfare il colore nel programma in un modo creativo intelligente per salvare byte.
Timothy Groote,

3
@TimothyGroote TI-BASIC ha principalmente un solo colore: il nero. Tutto il resto è un pixel off. Esistono calcolatori C (SE) che hanno colori, ma non tutti ne hanno uno.
Conor O'Brien,

10
Sono sicuro che mettere un cellofane viola sullo schermo non aumenta la dimensione del codice in byte. Voglio dire, ha funzionato vor il vectrex;)
Timothy Groote,

Risposte:


23

Elaborazione , 101 97 96 byte

4 byte grazie a Flambino.

1 byte grazie a Kritixi Lithos.

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

Ciò crea una finestra predefinita di 100 per 100 pixel con l'animazione richiesta.

finestra di output

Disclaimer: quell'immagine non è una GIF. Non fissarlo per un minuto.


2
Questo implementa la regola dei 60 secondi?

2
@Lembik Sì. Il framerate predefinito è 60 fps e sto incrementando i π/1800radianti angolari alla volta. (È stato π/360010 secondi fa a causa della mia scoreggia cerebrale.)
PurkkaKoodari,

5
@ Pietu1998 Quel brainfart era dovuto al fatto che pi è sbagliato
Cruncher,

2
@Cruncher devi amare vi hart!
Tim

17
Ehi, la tua GIF non funziona, l'ho fissata per un minuto ma non è successo nulla
Decadimento beta

16

QB64, 79 byte

QB64 è un emulatore QBasic che aggiunge alcune belle funzionalità. Questo programma utilizza uno ( CLS,15) che non è supportato da QBasic vanilla.

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

Questo è molto rumoroso. Usa il PLAYcomando per interrompere l'esecuzione per un breve periodo prima di cancellare lo schermo; altrimenti il ​​pixel tremolerà e diventerà invisibile.

Scarica QB64 , carica questo file, fai clic su Rune quindi Start.

Eccolo in azione:

il programma

Ho preso alcuni trucchi ( SCREEN 7invece di SCREEN 13e PSETinvece di POKE) dalla risposta di @ DLosc, quindi il merito è dovuto. Come nella sua risposta, il mio magenta è in realtà #8B008B, il che è stato ritenuto accettabile dall'OP.

(La costante 9.55è un'approssimazione di 30/π = 9.54929658551. È abbastanza vicina?)


Ha! Non ho mai pensato di utilizzare PLAYper un ritardo. Avrei potuto giurare che c'era un codice per riposare, ma non lo vedo ora nel file di aiuto. Ho preso in considerazione l'utilizzo di (una funzione di) TIMERcome parametro, ma non l'ho mai provato per vedere se era più corto. Complimenti!
DLosc,

4
Grazie! Mi sono spudoratamente sollevato PSETda te, quindi complimenti :) Sembra che un riposo n0sia più lungo di c. Inoltre, mi piace un po 'di flessione delle regole: l'OP ha detto che nient'altro poteva essere mostrato nella finestra, ma non ha mai detto che il mio programma non poteva andare rumorosamente BEEP BEEP BEEP BEEP .
Lynn,

1
Non ho nulla contro i segnali acustici, ma in realtà non riesco a vedere un pixel che si muove attorno a un cerchio quando provo in Linux.

1
Qui è in azione sulla mia macchina, che dovrebbe essere una prova sufficiente.
Lynn,

12
Ho fissato l'immagine per un po ', perché hai detto "eccolo in azione ".
mbomb007,

14

Java, 449 443 439 byte

Perché ho sempre avuto idee stupide. Come giocare a golf in 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();}}

Modifica: grazie per @Ypnypn per il golf 7 byte!

Edit2: Grazie per @Franz D. per aver salvato 3 byte!


7
Java sta vincendo il concorso di codice più corto più lungo finora :)

1
- Non è necessario inizializzare le variabili membro su zero, quindi è possibile salvare due byte (~ 0,45%) convertendo "c = 0" in "c".
Franz D.

1
E puoi salvare un altro byte inizializzando il colore in esadecimale, ovvero nuovo colore (0x800080).
Franz D.

1
@FranzD. Ancora meglio: basta usare il numero decimale 8388736.
Ypnypn,

1
Sbarazzarsi di JFrame, utilizzare Frame, consente di rimuovere l'importazione javax.
Magic Octopus Urn,

14

Mathematica, 102 101 94 byte

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

Crea un cerchio bianco nascosto e posiziona un punto che segue il suo bordo da 0 a 2π. L' DefaultDurationopzione di Mathematica mi permette di impostarlo per completare un ciclo ogni 60 secondi.

Ecco una versione accelerata dell'output:

EDIT: Cambia Circlein Diskper salvare 2 caratteri, aggiunto un segno negativo tper farlo muovere in senso orario.

EDIT: salvato 7 byte utilizzando l' ~operatore (grazie a Mauris).


14
Ulteriore prova che Mathematica è solo un linguaggio di programmazione in cui scrivi alcune vaghe parole inglesi che in qualche modo significano ciò che vuoi, quindi aggiungi la punteggiatura. (Ho sentito che puoi usare a~f~binvece di f[a,b], non ti renderebbe Rotatepiù breve?)
Lynn,

1
Puoi anche usare la notazione con prefisso per Point@{0,1}e non penso che tu abbia bisogno dell'elenco in giro Purple,Point....
Martin Ender,

1
@Mauris. A un occhio non allenato, Mathematica può effettivamente sembrare vaghe parole inglesi e punteggiatura. In realtà, sono i nomi di funzioni, impostazioni e operatori specifici e ben definiti. La probabilità che un non programmatore possa estrarre codice praticabile è zilch.
DavidC

3
@David: Haha, certo che ne sono consapevole - stavo solo scherzando :)
Lynn,

@Mauris, mi hai preso in giro!
DavidC

14

HTML, 235 290 295 354 347 byte

<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

Salvare come .htmlfile e aprirlo in un browser che non necessita di prefissi del fornitore, come Chrome o Firefox. O prova questo violino .


Questa è una nuova versione che è molto più breve del mio primo tentativo, che avevo scritto 5 minuti prima di una riunione. La nuova dimensione della tela è un quadrato basato sull'altezza della finestra. Funziona abbastanza bene e non è limitato a una certa altezza definita. Sono molto preciso sulle impostazioni della sfida (75% delle dimensioni del suo genitore, viola e 1px). Pertanto ho bisogno e non posso scartare o semplificare le seguenti regole:

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

Ungolfed

Questa è la versione non golfata con markup pulito:

<!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>

Le modifiche

  • Aggiunti 7 byte . Pensavo che nessuno se ne sarebbe accorto, che c'è un allentamento predefinito nell'animazione. ;) L'ho impostato linearora.
  • Hai salvato 59 byte lanciando tutto ciò che il browser gestirà automaticamente.
  • Salvato 3 byte rimuovendo il trailing )}}. Grazie allo spazzolino .
  • Salvato 2 byte usando 12%invece del 12pxquale è lo stesso valore corrispondente alla dimensione dell'elemento genitore.
  • Risparmiato 55 byte a causa del massiccio refactoring, anche preso in considerazione molti commenti. Grazie mille per tutti i contributi.

1
Volevo solo commentare il post, mi piacerebbe vedere una soluzione html / css pura (ty per l'invio di uno)
dwana

1
Usando il violino la velocità del pixel in movimento è molto irregolare. Si interrompe quasi quando il pixel si trova all'estrema sinistra. Qualche idea sul perché?

1
@inserireusernamehere :) Penso che la versione non giocata debba essere aggiornata troppo adesso.

5
Dovresti cercare il codice di lavoro più piccolo indipendentemente dalla validità. Cose come l'inquinamento dello spazio dei nomi globale sono alla portata del campo da golf.
John Dvorak,

2
Puoi rilasciarlo )}}dalla fine (il parser CSS terminerà automaticamente i blocchi)
Spazzolino da denti

14

TI-BASIC, 44 byte

Per i calcolatori TI-84 + CSE / CE, che supportano alcune grafiche a colori BASIC limitate.

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

Il colore qui è magenta, o colore 13 (si può anche usare il MAGENTAtoken).

Uso randinvece 1la condizione di ciclo infinito per fornire un piccolo ritardo (~ 15 ms) tra quando il pixel viene visualizzato e quando viene nuovamente spento.

Impostare la calcolatrice in modalità radiante prima di eseguire questo programma; Non conto questo nella dimensione perché è lo stato predefinito. Impostare anche Anssu 0 inserendo uno 0 prima del programma; questo è anche il valore predefinito.

Grazie a @quartata per aver testato questo programma (non possiedo un calcolatore di colori).


Idea ingenua: puoi fare chiamare il programma stesso invece di usare un ciclo while, e sarebbe più breve?
Lynn,

@Mauris il ciclo while è di 3 token, mentre il nome di un programma è generalmente più lungo
TheDoctor

1
@Mauris Il ciclo While è in realtà di 4 byte ed è possibile ricorrere in 3, ma lo stack si esaurisce molto rapidamente, dopo meno di 300 chiamate.
lirtosiast

@Lembik Perché stai bene con [ codegolf.stackexchange.com/a/62203/39328] , non lo cambierò per renderlo più fluido.
lirtosiast

13

Java, 339 308 289 287 byte

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();}}

Grazie a @Peter Lenkefi, la cui grande soluzione mi ha dato il via, e di cui ho copiato spudoratamente il for-loop!

Il principale risparmio è stato dovuto al passaggio ad AWT puro e al rendering direttamente nel Frame, senza bisogno di JPanel (o Canvas). Ho anche trasformato il contatore in una variabile intera, aggiornata con un semplice incremento, e salvato alcuni byte twiddling le costanti per poter strisciare una cifra qua e là.

EDIT: Grazie a @Peter Lenkefi e @tobii per i loro suggerimenti nei commenti. Battere l'HTML sarebbe bello - qualcuno sa come mettere in pausa in modo affidabile l'esecuzione in Java senza usare sleep () e dover catturare eccezioni?

EDIT 2: JAVA BEATS HTML (attualmente a 290 byte!): D Il timing è ora dipendente dalla macchina, ma ~ 60 secondi per un cerchio completo sulla mia macchina, che è OK secondo @Lembik. Grazie ancora a @PeterLenkefi per il suo suggerimento - la mia risposta è più della metà della sua :)

EDIT 3: @Ajay ha suggerito di rimuovere il "re" da "ridipingere". Due byte in meno. Ci stiamo arrivando :)


1
Dobbiamo ottenerlo in HTML (quindi <290 in questo momento)
Peter Lenkefi,

1
@PeterLenkefi: Sfortunatamente, non riesco a salvare le parentesi graffe del cast; il lancio del risultato sin / cos interrompe direttamente il calcolo. La tua riverniciatura all'interno della vernice () è incredibilmente sporca :)
Franz D.

1
@Troyseph intendevo giocare a golf;) Non uso java per nulla.
Peter Lenkefi,

1
L'uso int c,ie l'omissione di intin for(int i=..dovrebbe risparmiare ancora un po '.
Marco13,

1
Non hai nemmeno bisogno della dichiarazione di classe per F, si può solo estendere la classe in linea Telaio: new Frame(){...}.
Magic Octopus Urn

9

Haskell, 143 136 byte

Questo utilizza il pacchetto gloss :

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 versione più carina è

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

È possibile rimuovere alcuni spazi bianchi.
bendaggio

@Elyse In effetti, grazie. Ho anche rimosso due non necessari .0.
Frerich Raabe,

8

HTML (CSS?), 167 byte

Ispirato dalla risposta di insertusernamequi

<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

Ungolfed:

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 una FYI, di HTML + CSSsolito non è considerata un linguaggio di programmazione, tuttavia dipende dall'OP.
GamrCorps,

1
Non fa nulla su Firefox 41.0.2.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Appena testato su Firefox 41.0.2, Win 10. Funziona bene per me.
Lachlan Arthur,

1
Funziona per me in 41.0.2 in Ubuntu.

1
+1 Buona idea solo per animare bodyse stesso. :)
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

Testato su QB64 , che dice che ha una versione Linux (anche se l'ho provato solo su Windows).

  • SCREEN 7 imposta la modalità grafica.
  • COLOR 5,15 imposta il magenta scuro come colore di primo piano e il bianco brillante come colore di sfondo.
  • DO ... LOOPè un ciclo infinito. Di solito la vedresti come DO WHILE ... LOOP(o puoi LOOP WHILEinvece mettere , o usare UNTILper una condizione negata), ma puoi anche lasciare la condizione fuori, nel qual caso si avvolge per sempre.
  • TIMER è il numero di secondi dalla mezzanotte, come valore in virgola mobile.
  • CLS = Schermata chiara.
  • PSET Imposta un punto su un colore, colore di primo piano per impostazione predefinita.
  • iinizia da zero e conta ogni volta di pi / 300 attraverso il ciclo, completando così un cerchio completo dopo 600 ripetizioni. Calcoliamo pi come 4 * arctan (1).
  • L'ultima riga attende che siano trascorsi 0,1 secondi. Il linguaggio che ho imparato dai miei libri di QBasic era t# = TIMER: WHILE TIMER < t# + 0.1: WEND. Ma non abbiamo bisogno di numeri a doppia precisione (contrassegnati con #) per una differenza di 0,1 secondi e si scopre che la IF cond THEN [GOTO] linesintassi è più corta di 1 carattere di un WHILE ... WENDciclo.

Il loop si ripete 600 volte in 60 secondi, completando così un cerchio completo.

Avvertenze

  • Il colore 5, magenta scuro, è #8B008Binvece del richiesto #800080(cancellato con l'OP).
  • La modalità schermo 7 è 320x200, quindi il cerchio ha un diametro 198, che non è> = 0,75 della larghezza ma è> = 0,75 dell'altezza (anche cancellato con l'OP).
  • Se lo esegui su DOS QBasic, è a schermo intero, quindi il "pixel" non è in realtà un singolo pixel sul monitor (a meno che tu non abbia un monitor 320x200). Ma dovrebbe essere abbastanza vicino. QB64 viene eseguito in una finestra che utilizza le dimensioni esatte e quindi il pixel è un pixel letterale.
  • Almeno nel QB64, ci vogliono più di 65 secondi per fare una rivoluzione completa. Non so davvero perché; deve trattarsi di errori di arrotondamento o di sovraccarico nel ciclo, anche se ho provato a mitigarli entrambi senza successo. In teoria, il codice dovrebbe funzionare correttamente così com'è. In pratica, si può modificare la quantità che iviene incrementata fino a quando un giro è abbastanza vicino a 60 secondi. (Prova un denominatore di 69 o 68.)
  • Nessuna bella immagine qui. :( La qualità di LICEcap non era abbastanza buona per catturare con precisione un singolo pixel.

Questo codice funziona perfettamente per me in Linux. Grazie.

Questo in realtà funziona in QBasic 4.5, ma lo sfondo non è veramente bianco :). Ecco una GIF per la compilazione e l'esecuzione: codegolf.square7.ch/altqb.gif
mınxomaτ

@ mınxomaτ Strano, il colore 15 dovrebbe dare bianco o grigio chiaro in base a tutto ciò che pensavo di sapere ... che sembra ciano chiaro (colore 11). Cosa fa SCREEN 8invece di 7fare?
DLosc,

Lo stesso sfondo verdastro. Ma hai ragione, secondo le specifiche dovrebbe essere bianco. Ho anche provato il colore 7 (grigio) ed è risultato grigio. Quindi la tua soluzione è assolutamente ok, ma c'è qualcosa che non va nel mio DOS.
mınxomaτ,

7

script mIRC, 184 byte

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
}

Questo è ottimizzato per mIRC in Wine. Avviare mIRC, premere Alt + Rquindi incollarlo, chiudere l'editor ed eseguirlo/g

Anteprima

Il tempismo sulla gif potrebbe essere spento.


Questo è nuovo per me! Sarebbe bello se riuscissi a farne girare una gif animata.

È stata una delle prime lingue che ho usato / mi ha interessato alla programmazione!
Varis,

6

R, 170 byte

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()}

Si basa sul pacchetto animation. E qui è una gif per mostrare che funziona:

In una finestra

Soluzione non valida che salva in un GIF (139 byte):

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")}})

Questo richiede l'installazione di ImageMagick. Il risultato viene salvato in una gif.

! [Va e viene


Questo è fantastico comunque ... la sfida ha bisogno del codice per scrivere sullo schermo / finestra.

Oh, non l'ho capito.
plannapus,

2
Eccolo, in una finestra.
plannapus,

6

Rubino con scarpe, 159 byte

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}}

Il pixel è in realtà la punta della lancetta dei secondi di un orologio analogico. Quindi questo è assolutamente preciso.

Rubino con scarpe, 134 byte

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}}

Questa è un'alternativa basata su frame al secondo, ispirata alle altre risposte. Sebbene la documentazione affermi che il valore predefinito fps è 10, i test pratici mostrano che in realtà è 12.

Entrambe le soluzioni prendono letteralmente "La larghezza del cerchio dovrebbe essere 0,75 (arrotondando opportunamente) la larghezza dello schermo o della finestra": calcola in base alla larghezza della finestra, quindi il pixel occasionalmente può lasciare il fondo di una finestra non quadrata. Non sono sicuro di come dovrebbe essere gestito questo caso. (Usa minimo di larghezza e altezza? Cammina su un percorso ovale?) La finestra inizia con le dimensioni predefinite di 600 x 500 ed è ridimensionabile.


Molto contento di vedere una soluzione Ruby! Ora abbiamo bisogno di Python, Perl, ....

5

D, 286 280 byte

(392 se scritto 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 il modo in cui l'ho scritto inizialmente senza giocare a 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;
        });
}

Dipende da simpledisplay.d e color.d situati qui: https://github.com/adamdruppe/arsd

Basta scaricare quei due singoli file e inserirli nella stessa directory del codice sopra, quindi: dmd yourfile.d simpledisplay.d color.dper compilare e quindi eseguirlo.

La mia piccola biblioteca è stata scritta per rendere le animazioni rapide come questa abbastanza semplici, in modo da giocare bene ai suoi punti di forza! Ahimè, mi piacciono i nomi di identificatori lunghi e non ho fornito un Pointcostruttore che impieghi in floatmodo da aggiungere 18 byte di casting e .... idk un paio di dozzine che spiegano i miei nomi dei metodi.


1
Il primo argomento di eventLoop btw è un timer di millisecondi. Se è diverso da zero, crea automaticamente un timer per te e chiama la funzione con zero argomenti forniti a tale intervallo. (eventLoop può anche assumere funzioni con gli argomenti MouseEvent o KeyEvent per gestire l'input dell'utente). Quindi intervallo di 50 millisecondi = 20 fotogrammi al secondo, quindi 20 * 60 = ciclo in 60 secondi.
Adam D. Ruppe,

Penso che nel modo in cui hai scritto la risposta il codice della classifica

5

C #, 379 365 byte

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);}}}

Dipende da System.Windows.Formsed System.Drawingeseguire. L'output è in una finestra 1000x1000.


Puoi salvare alcuni byte usandovar
pinkfloydx33 il

Salva un altro byte usando l'importazione statica in matematica di sistema
pinkfloydx33

puoi dichiarare il tuo codice nello spazio dei nomi di sistema e rimuovere tutti gli altri riferimenti al sistema e salvare penso 10 byte
JustinM - Reinstate Monica

5

SVG, 177 byte

<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

Markup non valido dall'inferno a colazione, ma funziona (almeno in Chrome). Come una tela HTML5, la dimensione predefinita per un file SVG sembra essere 300x150, quindi questo è ciò che assume.

Modifica: Whoops, avevo lasciato accidentalmente per una durata di 6 invece di 60. Risolto il problema, ma ho anche scoperto che 0.5funziona come giusto .5, quindi nessuna modifica nel conteggio dei byte.


5

X86 Codice macchina - 150 146 149 133 127 byte

Versione golfizzata:

        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', versione sorgente:

; 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

Versione codificabile base64 scaricabile

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

Copia e incolla questo indirizzo nel tuo browser. Rinominare il file risultante golfcrcl.comed eseguirlo in un ambiente DOS, ovvero DosBox.


Questo è fantastico! Testato e funziona perfettamente.

1
Oh schiocco! Ho appena realizzato che hai specificato un colore da usare e l'ho totalmente ignorato. : oops: lo aggiusterò un po 'più tardi. L'indice di colore dovrebbe essere 0x5C, anziché 0x09 (supponendo che dosbox imposti correttamente la pallette, altrimenti
rimpiazzerò il

4

Mathematica 208 185 139 byte

Sposta un pixel viola attorno a un array usato come immagine.

Metodo 1 139 byte

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

Metodo 2 154 byte

Traccia un pixel lungo un percorso circolare in 60 secondi.

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

Metodo 3 193 byte

Questo disegna un orologio, con segni di spunta ed etichette in bianco, per cui la lancetta dei secondi è un pixel.

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

Vedo, confusione LTR di base ... Ma comunque, puoi rimuovere lo spazio tra 30e t.
LegionMammal978,

4

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

#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;}

Quindi questo è probabilmente il modo peggiore per fare qualsiasi cosa, ma ho pensato di provare.

Può essere compilato su un Mac (il mio comunque) con g++ -framework Cocoa file.mmed eseguito dal terminale ( ctrl-Cper uscire, dal momento che non è un'app).

immagine dello schermo

Modifica: 99 byte salvati: risolto main()per essere eseguito su OS X 10.10 (la prima versione funzionava solo su 10.8), ha saltato la traduzione / rotazione a favore di semplici calcoli di trigge, ha smesso di disturbare con il posizionamento della finestra e altre piccole cose.

Modifica: salvato altri 10 byte: modificato solo orderFrontper visualizzare la finestra. In realtà non lo rende la finestra principale, ma non lo è nemmeno orderFrontAndMakeKey, quindi ...

Modifica: salvato altri 11 byte: saltato NSMakeRecte trovato una cifra che doveva solo andare.

Modifica: salvato altri 14 byte: non è stato necessario assegnare l' NSTimeristanza a nulla e, a quanto pare, è possibile saltare l'inizializzazione ra zero.

Modifica: salvato altri 15 byte: non riesco a smettere. Invia aiuto


Grazie. Obj-C ++ è il chiaro vincitore della competizione di codici brevi più lunga attualmente!

14
+1 per aver vinto anche il concorso di immagini non animate più animato .
Lynn,

4

Javascript / Processingjs, 175 173 156 153 152 byte

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);}

Per eseguire: visitare http://www.openprocessing.org/sketch/226733 per vederlo in azione utilizzando processing.js o scaricare processing 2.0 da processing.org , incollare il codice nell'IDE di elaborazione, selezionare la modalità Javascript e guardare va.


Lol, hai pubblicato Elaborazione 20 secondi prima di me.
PurkkaKoodari,

L'intestazione è sbagliata in questa risposta? Non compare nella classifica.

1
Mi mancava, ci sono adesso.
Timothy Groote,

1
ora dovrebbe soddisfare il requisito dei 60 secondi
Timoteo Groote,

1
background(-1)è un byte più breve dibackground(255)
Kritixi Lithos il

3

Olmo , 274 byte

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))

Prova o modificalo nel tuo browser:

Nota che se ci liberiamo delle importazioni e disegniamo il contorno attorno alla tela, siamo scesi a 149 byte, ma probabilmente è un imbroglio!


Whoops, fixed! Sono diventato impaziente durante i test
jmite,

1
Questo è molto bello ed è bello avere qualcosa in un linguaggio funzionale. Abbiamo solo bisogno di Haskell e Scala ora!

2
@Lembik Ho appena aggiunto una versione di Haskell
Frerich Raabe,

3

C #, 301 byte

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();};}}

Dipende dalle metriche sulle dimensioni predefinite; le dimensioni e la posizione potrebbero essere leggermente diverse a seconda di una serie di fattori. Può tremare orribilmente o meno; per risolverlo, aggiungi quanto segue:

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

3

Lua + Löve, 189 personaggi

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()riceve come parametro il tempo trascorso dal fotogramma precedente. Disegna la finestra predefinita 800 x 600 a coordinate fisse, poiché la finestra non è comunque ridimensionabile.


La prima risposta lua! Grazie.

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
Pitontasticamente fantastico!

Ora abbiamo solo bisogno di una soluzione Python + Turtle.

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 ed esegui utilizzando gcc -I/usr/include/SDL snippet.c -lSDL -lm && ./a.out


Incredibilmente fantastico! Pensavo che nessuno l'avrebbe fatto.

2

ActionScript 2.0, 151 byte

Sfortunatamente, Adobe Flash non è freeware e Google informa che non funziona su Linux senza VM o Wine (e anche con Wine, funziona solo per lo più ). Tuttavia, volevo vedere quanto sarebbe andato bene in questo compito. Abbastanza bene, si scopre.

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}

L'idea di base: crea un nuovo oggetto clip filmato, posizionalo su (200, 200), quindi disegna un punto 2 al suo interno di 200 pixel più a destra. Ora il clip filmato è largo 200 pixel e alto 1 pixel. Il punto pivot è le coordinate originali da cui siamo partiti, quindi quando modifichiamo la _rotationproprietà, il punto si sposta in un cerchio attorno al punto (200, 200). Convenientemente, _rotationè in gradi; 0,25 gradi / fotogramma * 24 fotogrammi / secondo * 60 secondi / minuto = 360 gradi / minuto.

Per eseguire da zero se si dispone di Flash, creare un nuovo documento Flash 1 , aprire il pannello Azioni e incollare il codice sopra. Non è richiesta alcuna ulteriore personalizzazione, supponendo lo sfondo bianco predefinito, tela 550x400 e 24 fps. Premi Ctrl-Invio e guardalo andare.

Se non hai Flash stesso, puoi comunque visualizzare i risultati con Flash Player gratuito, che dovrebbe venire con la maggior parte dei browser moderni. Scarica qui il file SWF . Se non riesci a riprodurlo, prova a scaricare anche questa pagina HTML e aprirla, con il file SWF nella stessa directory.

1 Testato su Adobe Flash CS4 Professional, scegliendo "File Flash (ActionScript 2.0)" quando viene chiesto quale tipo di nuovo file creare.

2 In realtà un piccolo triangolo, come vedrai se lo ingrandisci abbastanza. Era il modo più golfistico che potessi trovare per disegnare un punto.


2

JavaScript con jQuery, 205 byte

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 , frammento di seguito

Questo forse non è abbastanza dal libro. La dimensione predefinita di una tela (almeno in Chrome) è 300x150, quindi ho centrato il cerchio su 75x75. Potrei centrarlo su 150x75 e fare il suo raggio di 113px (~ 75% di larghezza), ma sarebbe stato fuori dalla tela qualche volta, quindi ho scelto invece ~ 75% di altezza.

Ma non è particolarmente breve, quindi meh '


2

Blitz 2D / 3D , 126 byte

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

Sfortunatamente, questa lingua è supportata solo su Windows (sebbene possa essere eseguita su Wine).


2

Javascript ES6, 202 byte

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)

Testato in Firefox 41.

Come l'altra (quasi) pura risposta Javascript, il cerchio è centrato su 75x75 poiché la dimensione predefinita degli elementi tela è 300x150 come definito dalle specifiche HTML.


2

Matlab, 141 136

Ho appena inviato questo per te, Lembik, per avere un elenco completo.

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

Vecchia versione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.