单个像素沿圆形路径移动


45

这是一个图形输出挑战,任务是提供每种语言最短的代码。

任务

您的代码应绘制一个紫色像素(十六进制值#800080或rgb(128,0,128)),顺时针旋转一个圆圈。绕一圈完整的旅程大约需要60秒,并且应无限期地继续。除像素外,其他任何内容都不应显示在屏幕或窗口上。圆的宽度应为屏幕或窗口的宽度的0.75(适当舍入),背景应为白色。为了防止出现笨拙的溶液,屏幕或窗口的宽度至少应为100像素。

您的代码应为完整程序

语言和图书馆

您可以使用任何喜欢的语言或库。但是,我希望能够在可能的情况下对您的代码进行测试,因此,如果您可以提供有关如何在Ubuntu中运行代码的明确说明,将不胜感激。

缺少前二十种语言。需要帮助。

以下前二十种编程语言目前根本没有任何解决方案。

  • C,C ++,C#PythonPHPVisual Basic .NET,Perl,Delphi / Object Pascal,AssemblyObjective-C,Swift,Pascal,Matlab / Octave,PL / SQL,OpenEdge ABL,R

目录

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以将旧分数保留在标题中,方法是将它们打掉。例如:

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

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

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

您还可以将语言名称设置为链接,然后该链接将显示在代码段中:

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


1
圆应该是什么半径?
蒂莫西·格罗特

19
为什么像素应该是紫色的?我会假设像TI-Basic这样的某些语言没有颜色功能,这意味着出于种种任意理由,它们不能用于挑战
Fatalize 2015年

1
@Fatalize并不意味着您不能以某种巧妙的创意方式将颜色融入程序中以节省字节。
蒂莫西·格罗特

3
@TimothyGroote TI-BASIC主要只有一种颜色:黑色。其他所有内容均不正确。有一些具有颜色的C(SE)计算器,但并不是每个人都有一个。
Conor O'Brien

10
我确定在屏幕上放一个紫色的玻璃纤维不会增加您的代码大小(以字节为单位)。我的意思是说它对vectrex有用;)
Timothy Groote

Answers:


23

处理中101 97 96字节

感谢Flambino提供4个字节

1字节感谢Kritixi Lithos。

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

这将创建具有所需动画的默认100 x 100像素窗口。

输出窗口

免责声明:该图像不是GIF。不要盯着它一分钟。


2
这是否执行60秒规则?

2
@Lembik是的。默认帧速率为60 fps,并且我一次增加角度π/1800弧度。(那是π/3600因为我的屁才10秒钟前。)
PurkkaKoodari 2015年

5
@ Pietu1998那次放屁是由于pi错误
Cruncher

2
@Cruncher得爱VI哈特!
蒂姆(Tim)

17
嘿,您的GIF无法正常工作,我凝视了片刻,但没有任何反应
Beta Decay

16

QB64,79个字节

QB64是一个QBasic模拟器,它添加了一些不错的功能。该程序使用的CLS,15是香草QBasic不支持的()。

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

很大声 PLAY在清除屏幕之前,它使用命令将执行暂停一会儿。否则像素将闪烁并变得不可见。

下载QB64,加载此文件,单击Run,然后单击Start

它在起作用:

该程序

我从@DLosc的答案中获得了一些技巧(SCREEN 7而不是和SCREEN 13,而PSET不是POKE),因此值得称赞。就像他的回答一样,我的洋红色实际上#8B008B是OP认为可以接受的。

(常数9.55是的近似值30/π = 9.54929658551。是否足够接近?)


哈!从来没有想过PLAY要延迟使用。本来可以发誓休息的代码,但现在在帮助文件中没有看到它。我确实考虑过使用(的功能)TIMER作为参数,但从未尝试过看它是否更短。荣誉!
DLosc

4
谢谢!我毫不掩饰地PSET从您身上抬起头,向您致以敬意:)看起来n0比更长的休息时间c。另外,我喜欢它有点规则化:OP表示窗口中什么也看不到,但从未说过我的程序不能大声地响起BEEP BEEP BEEP BEEP
林恩

1
我对蜂鸣声一无所获,但是当我在linux上尝试时,实际上看不到像素围绕圆圈移动。

1
在我的机器上起作用,应该足够证明。
林恩

12
我盯着图像看了一会儿,因为您说“它在起作用 ”。
mbomb007'2015-10-29

14

Java中,449个 443 439字节

因为我一直有愚蠢的想法。就像在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();}}

编辑:感谢@Ypnypn打高尔夫球7个字节!

Edit2:感谢@Franz D.节省了3个字节!


7
Java赢得了迄今为止最长的最短代码竞赛:)

1
-您不需要将成员变量初始化为零,因此可以通过将“ c = 0”转换为“ c”来节省两个字节(〜0.45%)。
Franz D.

1
您还可以通过以十六进制初始化颜色来节省一个字节,即新的Color(0x800080)。
Franz D.

1
@FranzD。更好-只需使用十进制数字即可8388736
Ypnypn

1
摆脱JFrame使用Frame可以删除javax导入。
魔术章鱼缸

14

Mathematica,102 101 94字节

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

创建一个隐藏的白色圆圈,并放置一个沿其边缘从0到2π的点。Mathematica的DefaultDuration选项让我将其设置为每60秒完成一次循环。

这是输出的加速版本:

编辑:更改CircleDisk保存2个字符,添加了一个负号t以使其顺时针移动。

编辑:通过使用~运算符(感谢毛里斯)保存了7个字节。


14
进一步证明Mathematica只是一种编程语言,您可以在其中编写一些含糊的英语单词,以表示您想要的含义,然后添加标点符号。(我听说您可以使用a~f~b代替f[a,b],这会使您的Rotate文字更短吗?)
Lynn

1
您也可以使用前缀表示法Point@{0,1},我认为您不需要列表Purple,Point...
马丁·恩德

1
@毛里斯 在未经训练的人看来,Mathematica确实看起来像是模糊的英语单词和标点符号。实际上,它们是特定的,定义明确的功能,设置和运算符的名称。非程序员可以衍生出可行代码的可能性非常小。
DavidC

3
@David:哈哈,我当然知道了-我只是在开玩笑:)
Lynn

@毛里斯,你骗了我!
DavidC 2015年

14

HTML,235个290 295 354 347字节

<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

另存为.html文件并在不需要供应商前缀的浏览器中打开,例如Chrome或Firefox。或者尝试这个小提琴


这是一个新版本,比我在开会前5分钟写的第一次尝试要短得多。画布的新大小是基于视口高度的正方形。效果很好,并且不限于特定的定义高度。对于挑战中的设置,我非常准确(其父级大小为75%,紫色和1px)。因此,我需要并且不能放弃或简化以下规则:

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

不打高尔夫球

这是带有干净标记的非公开版本:

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

编辑

  • 增加了 7个字节。我以为没人会注意到,动画有默认的缓动。;)我将其设置为linear现在。
  • 通过抛出浏览器将自动处理的所有异常终止来节省59字节
  • 通过删除结尾节省了3个字节)}}。多亏了牙刷
  • 通过使用节省的2个字节12%而不是12px与父元素的大小相对应的相同值。
  • 由于进行了大规模重构,因此节省了55个字节,并且还考虑了很多注释。非常感谢您的所有贡献。

1
我只想在帖子中发表评论,我想看到一个纯html / css解决方案(提交一个ty)
dwana 2015年

1
使用小提琴,移动像素的速度非常不均匀。当像素位于最左侧时,它几乎停止运转。有什么想法吗?

1
@insertusernamehere :)我认为非高尔夫版本现在也需要更新。

5
无论有效性如何,都应使用最小的工作代码。打高尔夫球时,像污染全局名称空间之类的事情对于球场来说是一样的。
约翰·德沃夏克

2
您可以)}}从头开始拖放(CSS解析器将自动结束块)
牙刷

14

TI-BASIC,44字节

对于TI-84 + CSE / CE计算器,它支持一些有限的BASIC彩色图形。

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

这里的颜色是洋红色或13号颜色(也可以使用MAGENTA标记)。

我使用rand而不是1无限循环条件在显示像素和再次关闭像素之间提供一点点延迟(〜15 ms)。

运行此程序之前,将计算器设置为弧度模式。我没有在大小上算这,因为它是默认状态。也Ans可以通过在程序前输入0来将其设置为0;这也是默认值。

感谢@quartata测试此程序(我没有色彩计算器)。


天真的想法:您可以使程序本身调用而不是使用while循环吗,那会更短吗?
Lynn

@Mauris while循环是3个令牌,而程序名称通常会更长
TheDoctor 2015年

1
@Mauris While循环实际上是4个字节,可以递归3个字节,但是在少于300次调用之后,堆栈很快就用完了。
lirtosiast 2015年

@Lembik因为您对[ codegolf.stackexchange.com/a/62203/39328]没问题,所以我不会将其更改为更平滑。
lirtosiast,2015年

13

Java中,339个 308 289 287字节

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

感谢@Peter Lenkefi,他的出色解决方案使我开始工作,我为自己的for-loop无耻地复制了!

主要的节省是由于切换到纯AWT并直接在Frame中进行渲染-不需要JPanel(或Canvas)。我还使计数器成为一个整数变量,并通过简单的增量进行更新,并保存了一些字节来使常量纠缠不清,以便能够在此处和此处去除数字。

编辑:感谢@Peter Lenkefi和@tobii在评论中的建议。击败HTML会很好-有人知道如何在不使用sleep()且不必捕获异常的情况下可靠地暂停Java中的执行吗?

编辑2: JAVA BEATS HTML(当前为290字节!):D计时现在与机器有关,但是我的机器上整整圈约60秒,根据@Lembik可以确定。再次感谢@PeterLenkefi的建议-我的回答是他的一半以上:)

编辑3: @Ajay建议从“重新绘制”中删除“重新”。少两个字节。我们到了:)


1
我们必须在HTML下获取它(所以现在<290)
Peter Lenkefi

1
@PeterLenkefi:不幸的是,我无法保存演员表的牙套;投放sin / cos结果直接破坏了计算。您内部paint()中的重绘非常脏:)
Franz D.

1
@Troyseph我的意思是打高尔夫球;)我什么都没用Java。
Peter Lenkefi

1
使用int c,i和省略intin for(int i=..应该节省更多。
Marco13

1
您甚至不需要F的类声明,您只需内联扩展Frame类即可new Frame(){...}
魔术八达通Ur

9

Haskell,143136字节

这使用了光泽包装:

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

更漂亮的版本是

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

您可以删除一些空格。
2015年

@Elyse确实,谢谢。我还删除了两个不需要的.0
Frerich Raabe 2015年

8

HTML(CSS?),167个字节

受到insertusername的启发

<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

取消高尔夫:

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


只是FYI,HTML + CSS通常不被认为是一种编程语言,但这取决于OP。
GamrCorps 2015年

1
它在Firefox 41.0.2上不执行任何操作。
n̴̖̋h̷͉̃a̷̭̿h 7ẗ̵̨́d̷̰̀ĥ̷̳

1
刚刚在Firefox 41.0.2,Win 10上测试过。对我来说很好。
Lachlan Arthur

1
在Ubuntu 41.0.2中为我工作。

1
+1想好让body自己动起来的想法。:)
insertusername此处,2015年

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

QB64上测试,它说它具有Linux版本(尽管我只在Windows上尝试过)。

  • SCREEN 7 设置图形模式。
  • COLOR 5,15 将深洋红色设置为前景色,将亮白色设置为背景色。
  • DO ... LOOP是一个无限循环。通常,您会将其视为DO WHILE ... LOOP(或可以放进去LOOP WHILE,或UNTIL用于否定条件),但也可以不考虑条件,在这种情况下,它将永远循环。
  • TIMER 是自午夜以来的秒数,以浮点值表示。
  • CLS =清除屏幕。
  • PSET 默认情况下,将Point设置为一种颜色,即前景色。
  • i从零开始,每次通过循环递增pi / 300,因此在重复600次后完成一个完整的循环。我们将pi计算为4 * arctan(1)。
  • 最后一行等待直到0.1秒过去。我从QBasic书籍中学到的成语是t# = TIMER: WHILE TIMER < t# + 0.1: WEND。但是,#对于0.1秒的差异,我们不需要双精度数字(标有),结果表明IF cond THEN [GOTO] line语法比WHILE ... WEND循环短1个字符。

循环在60秒内重复600次,从而完成一个完整的循环。

注意事项

  • 颜色5(深洋红色)已#8B008B代替要求#800080(已通过OP清除)。
  • 屏幕模式7为320x200,因此圆的直径为198,该直径不是> = 0.75的宽度,而是> = 0.75的高度(也可以用OP清除)。
  • 如果您在DOS QBasic上运行它,则它是全屏显示,因此“像素”实际上并不是监视器上的单个像素(除非您碰巧拥有320x200监视器)。但是它应该足够接近。QB64在使用精确尺寸的窗口中运行,因此像素是文字像素。
  • 至少在QB64中,完成一次完整的旋转大约需要65秒。我真的不知道为什么;尽管我试图缓解这两种方法都没有成功,但它要么是舍入错误,要么是循环开销。从理论上讲,代码应按原样正常工作。在实践中,可以调整i增量,直到旋转足够接近60秒。(尝试使用分母69或68。)
  • 这里没有漂亮的图片。:( LICEcap的质量不足以精确地捕获单个像素。

这段代码对我在Linux中非常有效。谢谢。

实际上在QBasic 4.5中运行,但是背景不是真的白色:)。下面是它编译和运行的GIF:codegolf.square7.ch/altqb.gif
mınxomaτ

@mınxomaτ奇怪,根据我以为我知道的一切,颜色15应该为白色或浅灰色...看起来像是浅青色(颜色11)。这是什么SCREEN 8来代替7呢?
DLosc

相同的绿色背景。但是您说得对,根据规范,它应该是白色的。我还尝试了7号(灰色),结果显示为灰色。因此,您的解决方案绝对可以,但是我的DOS有问题。
mınxomaτ

7

mIRC脚本,184个字节

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
}

这是针对Wine中的mIRC优化的。启动mIRC,按Alt + R然后粘贴,关闭编辑器并运行/g

预习

gif上的计时可能已关闭。


这是我的新手!如果您可以对其进行动画制作,那就太好了。

这是我使用过的第一种语言,对编码很感兴趣!
Varis

6

R,170字节

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

它依赖于package animation。这是一个gif来显示它的工作原理:

在一个窗口

无效的解决方案保存为gif(139字节):

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

这需要安装ImageMagick。结果保存为gif。

!!


但是,这很棒..挑战需要将代码写入屏幕/窗口。

哦,我不明白。
plannapus 2015年

2
在这里,在一个窗口中。
plannapus 2015年

6

Ruby with Shoes,159字节

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

像素实际上是模拟时钟秒针的尖端。因此,这一点绝对准确。

Ruby with Shoes,134字节

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

受其他答案的启发,这是基于每秒帧数的替代方法。尽管文档说默认fps是10,但实际测试表明它实际上是12。

两种解决方案的字面意思都是:“圆的宽度应为屏幕或窗口的宽度的0.75(适当地四舍五入)”:根据窗口宽度进行计算,因此像素有时可能会离开非正方形窗口的底部。不确定如何处理这种情况。(使用最小的宽度和高度?在椭圆形路径上走吗?)该窗口以默认的600 x 500尺寸开始,并且可调整大小。


非常高兴看到Ruby解决方案!现在我们需要Python,Perl等...

5

D,286280字节

(如果正常书写,则为392)

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

还是我最初没有打高尔夫球的方式:

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

取决于位于此处的simpledisplay.d和color.d:https//github.com/adamdruppe/arsd

只需下载这两个文件,然后将它们放在与上述代码相同的目录中即可:然后dmd yourfile.d simpledisplay.d color.d进行编译,然后运行它。

我的小资料库旨在使像这样的快速动画变得相当简单,因此可以发挥其优势!las,我有点喜欢长标识符名称,并且没有提供一个Point构造函数,该构造函数需要占用float18个字节的转换,并且.... idk会打出几十个拼写我的方法名称。


1
eventLoop btw的第一个参数是毫秒计时器。如果它不为零,它将自动为您创建一个计时器,并以该间隔提供的零个args调用该函数。(eventLoop还可以使用带有MouseEvent或KeyEvent args的函数来处理用户输入)。因此50毫秒间隔=每秒20帧,因此20 * 60 = 60秒内的周期。
亚当·鲁珀

我觉得你写的答案领先代码拾起392,而不是280的方式

5

C#,379365字节

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

取决于System.Windows.FormsSystem.Drawing运行。输出在1000x1000窗口中。


可以使用var
pinkfloydx33

在系统数学上使用静态导入保存另一个字节
pinkfloydx33

您可以在系统名称空间中声明您的代码,并删除对系统的所有其他引用并保存10字节
Phaeze

5

SVG,177个字节

<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

从地狱到早餐的标记无效,但可以运行(至少在Chrome中)。就像HTML5画布一样,SVG的默认大小似乎为300x150,这就是我们的假设。

编辑:糟糕,我意外地将持续时间从6延长到60,而不是60。修复了该问题,但也发现它的0.5工作原理只是.5,所以字节数没有变化。


5

X86机器代码- 150个 146 149 133 127字节

高尔夫球版:

        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',源版本:

; 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

可下载的base64编码版本

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

将此地址复制并粘贴到浏览器中。重命名生成的文件golfcrcl.com并在DOS环境(即DosBox)中运行。


这很棒!经过测试,完美运行。

1
哦,快点!刚刚意识到您指定了要使用的颜色,而我完全忽略了它。:oops:我待会再解决。颜色索引应为0x5C,而不是0x09(假设dosbox正确设置了调色板,否则,我将重新映射颜色1)
enhzflep

4

数学208 185 139字节

在用作图像的数组周围移动紫色像素。

方法1 139字节

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

方法 2154个字节

在60秒内沿圆形路径绘制像素。

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

方法 3193字节

这将画一个时钟,刻度和标签为白色,秒针是一个像素。

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

我看,基本LTR混乱......但不管怎么说,你可以删除之间的空间30t
LegionMammal978

4

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

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

因此,这可能是最糟糕的方法,但我想我会尝试的。

可以在Mac上(无论如何还是在Mac上)进行编译g++ -framework Cocoa file.mm并从终端运行(ctrl-C退出,因为它不是应用程序)。

屏幕截图

编辑:保存99个字节:修复main()了在OS X 10.10上运行的问题(仅第一个版本在10.8上运行),跳过了平移/旋转以支持简单的trig计算,停止了对窗口放置的困扰,以及其他一些小任务。

编辑:保存了另外10个字节:更改为仅orderFront显示窗口。虽然实际上并没有使其成为前窗,但是也没有使其成为前窗orderFrontAndMakeKey,所以...

编辑:保存了另外11个字节:跳过NSMakeRect并找到了一个必须去的数字。

编辑:保存了另外14个字节:不需要将NSTimer实例分配给任何东西,并且显然可以跳过初始化r为零的情况。

编辑:保存了另外15个字节:我无法停止。发送帮助。


谢谢。Obj-C ++是目前最长的最短代码竞赛中的明显赢家!

14
+1也赢得了最动画的非动画图像竞赛。
林恩

4

使用Javascript / Processingjs,175个 173 156 153 152字节

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

要运行:请访问http://www.openprocessing.org/sketch/226733以使用processing.js进行操作,或从processing.org下载processing 2.0 ,将代码粘贴到处理IDE中,选择Javascript模式并观看它走了。


大声笑,您在我之前20秒发布了正在处理。
PurkkaKoodari 2015年

这个答案中的标题是否错误?它不会出现在排行榜中。

1
错过了,我现在就开始。
蒂莫西·格罗特

1
它现在应该满足60秒的要求
Timothy Groote 2015年

1
background(-1)background(255)
Kritixi Lithos

3

榆树,274字节

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

在浏览器中尝试或编辑它:

请注意,如果我们摆脱了导入并在画布上绘制轮廓,那么我们将减少到149个字节,但这很可能是作弊!


哎呀,固定!我在测试过程中不耐烦
jmite 2015年

1
这非常好,用功能语言获取内容也很棒。我们现在只需要Haskell和Scala!

2
@Lembik我刚刚添加了一个Haskell版本
Frerich Raabe

3

C#,301个字节

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

取决于默认大小指标;大小和位置可能会因一些因素而有所偏离。可能会或可能不会可怕地闪烁;要解决此问题,请添加以下内容:

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

3

Lua +Löve,189个字符

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()接收自上一帧以来经过的时间作为参数。在固定坐标处绘制默认的800 x 600窗口,因为该窗口始终无法调整大小。


第一个lua的答案!谢谢。

3

蟒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
Python很棒!

现在我们也需要一个python + turtle解决方案。

3

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

编译并使用 gcc -I/usr/include/SDL snippet.c -lSDL -lm && ./a.out


太棒了!我以为没有人会这样做。

2

ActionScript 2.0,151个字节

不幸的是,Adobe Flash不是免费软件,而Google告知没有VM或Wine的Linux无法使用Linux(即使使用Wine,大多数情况下也无法使用)。不过,我想看看它在这项任务上做得如何。很好,事实证明。

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}

基本思想是:创建一个新的影片剪辑对象,将其放置在(200,200),然后在其中向右200像素绘制一个点2。现在,影片剪辑的宽度为200像素,高度为1像素。枢轴点是我们开始的原始坐标,因此,当我们修改_rotation属性时,圆点将围绕该点(200,200)旋转一圈。方便地_rotation以度为单位;0.25度/帧* 24帧/秒* 60秒/分钟= 360度/分钟。

要使用Flash从头开始,请创建一个新的Flash文档1,打开“动作”面板,然后粘贴上面的代码。假设默认的白色背景,550x400画布和24 fps,则无需进一步自定义。按Ctrl-Enter观看。

如果您本身没有Flash,则仍然可以使用免费的Flash Player查看结果,该Flash Player应该随大多数现代浏览器一起提供。在此处下载SWF文件。如果无法播放,请尝试同时下载此HTML页面并打开它,并将SWF文件放在同一目录中。

1在Adobe Flash CS4 Professional上进行了测试,当系统询问您要创建什么类型的新文件时,选择“ Flash File(ActionScript 2.0)”。

2实际上是一个小三角形,您会看到是否足够放大。这是我发现圆点的最高尔夫方式。


2

带jQuery的JavaScript,205个字节

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,以下代码段

这本书可能还不够。画布的默认大小(至少在Chrome中为300x150),因此我将圆圈的中心设置为75x75。我可以将其居中放置在150x75上,并将其半径设置为113px(宽度的〜75%),但是有时它会在画布之外,所以我选择了高度的〜75%。

但这并不是特别短,所以


2

闪电战2D / 3D,126字节

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

不幸的是,该语言仅在Windows上受支持(尽管它可以在Wine中运行)。


2

Javascript ES6,202字节

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)

在Firefox 41中测试。

像其他(几乎)纯Javascript答案一样,圆圈以75x75居中,这是因为HTML规范定义的canvas元素的默认大小为300x150。


2

MATLAB,141 136

我只是为您Lembik提交了这份完整清单。

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

旧版本:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.