Один пиксель движется по круговой траектории

45

Это задача графического вывода, где задача состоит в том, чтобы дать самый короткий код для каждого языка.

задача

Ваш код должен построить один фиолетовый пиксель (шестнадцатеричное значение # 800080 или rgb (128, 0, 128)), двигаясь по часовой стрелке вокруг круга. Полное путешествие по кругу должно занять ровно 60 секунд и продолжаться бесконечно. Ничто другое не должно отображаться на экране или в окне, кроме пикселя. Ширина круга должна составлять 0,75 (подходящее округление), ширина экрана или окна, а фон должен быть белым. Чтобы избежать глупых решений, экран или окно должны иметь ширину не менее 100 пикселей.

Ваш код должен быть полной программой .

Языки и библиотеки

Вы можете использовать любой язык или библиотеку, которая вам нравится. Тем не менее, я хотел бы иметь возможность протестировать ваш код, если это возможно, поэтому, если вы можете предоставить четкие инструкции по его запуску в Ubuntu, это было бы очень полезно.

Пропал двадцать лучших языков. Нужна помощь.

Следующие двадцать лучших языков программирования в настоящее время вообще не имеют решения.

  • C , C ++, C # , Python , PHP , Visual Basic .NET , Perl, Delphi / Object Pascal, Сборка , Objective-C , Swift, Pascal, Matlab / Octave , PL / SQL, OpenEdge ABL, R

Каталог

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## 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
1
@Fatalize, это не значит, что вы не можете добавить цвета в программу каким-то умным творческим способом сэкономить байты.
Тимоти Грут
3
@TimothyGroote TI-BASIC имеет в основном только один цвет: черный. Все остальное не в пикселях. Есть калькуляторы C (SE), которые имеют цвета, но не у всех есть.
Конор О'Брайен
10
Я уверен, что фиолетовое целое надписи на экране не увеличивает размер кода в байтах. я имею в виду, что это сработало в vectrex;)
Тимоти Гроот

Ответы:

23

Обработка , 101 97 96 байт

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 на 100 пикселей с необходимой анимацией.

окно вывода

Отказ от ответственности: это изображение не GIF. Не смотрите на это ни на минуту.

PurkkaKoodari
источник
2
Это реализует правило 60 секунд?
2
@Lembik Да. Частота кадров по умолчанию составляет 60 кадров в секунду , и я увеличиваю угловые π/1800радианы за раз. (Это было π/360010 секунд назад из-за моего пердеть мозга.)
PurkkaKoodari
5
@ Pietu1998 Этот бред был связан с тем, что пи ошибался
Cruncher
2
@ Кранчер должен любить Харт!
Тим
17
Эй, твой GIF не работает, я смотрел на него минуту, но ничего не произошло
Beta Decay
16

QB64, 79 байт

QB64 - это эмулятор QBasic, который добавляет некоторые приятные функции. Эта программа использует one ( CLS,15), который не поддерживается vanilla 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.

Вот оно в действии:

программа

Я взял некоторые уловки ( SCREEN 7вместо SCREEN 13и PSETвместо POKE) из ответа @ DLosc, так что кредит заслуживает. Как и в его ответе, мой пурпурный на самом деле #8B008B, который был признан приемлемым ОП.

(Константа 9.55является приблизительной 30/π = 9.54929658551. Достаточно ли она близка?)

Линн
источник
Ха! Никогда не думал об использовании PLAYдля задержки. Мог бы поклясться, что был код для отдыха, но я не вижу его сейчас в файле справки. Я рассматривал возможность использования (функции) TIMERв качестве параметра, но никогда не пытался его проверить, не короче ли он. Престижность!
DLosc
4
Поблагодарить! Я беззастенчиво оторвался PSETот тебя, так что похвала назад :) Похоже, отдых n0это дольше, чем c. Кроме того, мне нравится, что это немного нарушает правила: OP сказал, что больше ничего не может быть показано в окне, но никогда не говорил, что моя программа не может громко звучать как BEEP BEEP BEEP BEEP .
Линн
1
Я ничего не имею против звуковых сигналов, но на самом деле я не могу видеть пиксель, движущийся по кругу, когда я пытаюсь в Linux.
1
Вот оно в действии на моей машине, что должно быть достаточно доказательств.
Линн
12
Некоторое время я смотрел на изображение, потому что вы сказали «вот оно в действии ».
mbomb007
14

Ява, 449 443 439 байт

Потому что у меня всегда были глупые идеи. Люблю играть в гольф на Яве;).

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
- Вам не нужно инициализировать переменные-члены равными нулю, поэтому вы можете сохранить два байта (~ 0,45%), преобразовав "c = 0" в "c".
Франц Д.
1
И вы можете сохранить еще один байт, инициализируя цвет в шестнадцатеричном формате, т.е. новый цвет (0x800080).
Франц Д.
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π. DefaultDurationОпция Mathematica позволяет мне устанавливать цикл каждые 60 секунд.

Вот ускоренная версия вывода:

РЕДАКТИРОВАТЬ: Изменить, Circleчтобы Diskсохранить 2 символа, добавил отрицательный знак, tчтобы заставить его двигаться по часовой стрелке.

РЕДАКТИРОВАТЬ: Сохранено 7 байтов с помощью ~оператора (благодаря Mauris).

tjq
источник
14
Еще одно доказательство того, что Mathematica - это просто язык программирования, где вы пишете нечеткие английские слова, которые означают, что вы хотите, а затем добавляете знаки препинания. (Я слышал, что вы можете использовать a~f~bвместо f[a,b], разве это не сделает ваш Rotateкороче?)
Линн
1
Вы также можете использовать префиксную нотацию для, Point@{0,1}и я не думаю, что вам нужен список вокруг Purple,Point....
Мартин Эндер
1
@Mauris. На первый взгляд Mathematica может выглядеть как расплывчатые английские слова и знаки препинания. В действительности это названия конкретных, четко определенных функций, настроек и операторов. Вероятность того, что непрограммист сможет раскрутить работоспособный код, равна нулю.
DavidC
3
@ Дэвид: Хаха, конечно, я в курсе - я просто пошутил :)
Линн
@Mauris, ты обманул меня!
DavidC
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%; }

Ungolfed

Это негольфированная версия с чистой разметкой:

<!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 байт благодаря массовому рефакторингу, также учтено множество комментариев. Большое спасибо за все вклады.
insertusernamehere
источник
1
Я просто хотел прокомментировать пост, я хотел бы видеть чистое решение html / css (ты для отправки одного)
dwana
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 мс) между тем, когда отображается пиксель и когда он снова выключается.

Установите калькулятор в режим радиан перед запуском этой программы; Я не считаю это по размеру, потому что это состояние по умолчанию. Также установите Ans0, введя 0 перед программой; это также по умолчанию.

Спасибо @quartata за тестирование этой программы (у меня нет калькулятора цветов).

lirtosiast
источник
Наивная идея: можете ли вы сделать сам вызов программы вместо использования цикла while, и это будет короче?
Линн
@Mauris цикл while - это 3 токена, а имя программы обычно длиннее
TheDoctor
1
@Mauris Цикл while на самом деле составляет 4 байта, и его можно выполнить в 3, но стек заканчивается очень быстро, после менее чем 300 вызовов.
Lirtosiast
@Lembik Поскольку вы в порядке с [ codegolf.stackexchange.com/a/62203/39328] , я не буду менять это, чтобы быть более плавным.
lirtosiast
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, чье замечательное решение помогло мне начать работу, и чей цикл я беззастенчиво скопировал!

Основная экономия была связана с переключением на чистый AWT и рендерингом непосредственно во фрейме - нет необходимости в JPanel (или Canvas). Я также сделал счетчик целочисленной переменной, обновленной простым инкрементом, и сохранил несколько байтов, изменяя константы, чтобы иметь возможность вырезать цифру здесь и там.

РЕДАКТИРОВАТЬ: Спасибо @Peter Lenkefi и @tobii за их предложения в комментариях. Побеждать HTML было бы неплохо - кто-нибудь знает, как надежно приостановить выполнение в Java без использования sleep () и необходимости отлавливать исключения?

РЕДАКТИРОВАТЬ 2: JAVA БИТ HTML (в настоящее время на 290 байтов!): D Время теперь зависит от машины, но ~ 60 секунд для полного круга на моей машине, что нормально, согласно @Lembik. Еще раз спасибо @PeterLenkefi за его предложение - мой ответ - больше чем половина его :)

РЕДАКТИРОВАТЬ 3: @Ajay предложил удалить «re» из «перекрасить». На два байта меньше. Мы добираемся туда :)

Франц Д.
источник
1
Мы должны получить его под HTML (сейчас <290)
Питер Ленкефи
1
@PeterLenkefi: К сожалению, я не могу сохранить скобки броска; приведение результата sin / cos напрямую нарушает вычисления. Ваш перекрас в краске () невероятно грязный :)
Франц Д.
1
@Troyseph Я имел в виду для игры в гольф;) Я не использую Java ни для чего.
Петр Ленкефи
1
Использование int c,iи пропуск intв for(int i=..должно сохранить еще немного.
Marco13
1
Вам даже не нужно объявление класса для F, то можно просто расширить класс инлайн рамы: new Frame(){...}.
Волшебная Урна Осьминога
9

Haskell, 143 136 байт

Это использует глянцевый пакет:

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
Фрерих Раабе
источник
Вы можете удалить некоторые пробелы.
правостороннее
@ Elyse Действительно, спасибо. Я также удалил два ненужных .0.
Фрерих Раабе
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

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

Лахлан Артур
источник
Просто к сведению, HTML + CSSобычно не считается языком программирования, однако это до ОП.
GamrCorps
1
Это ничего не делает на Firefox 41.0.2.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
1
Только что протестировал на Firefox 41.0.2, Win 10. У меня отлично работает.
Лахлан Артур
1
У меня работает в 41.0.2 в убунту.
1
+1 Хорошая мысль просто оживить bodyсебя. :)
insertusername здесь
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 = CLear Screen.
  • PSET Устанавливает точку на цвет, цвет переднего плана по умолчанию.
  • iначинается с нуля и подсчитывается на pi / 300 каждый раз в цикле, таким образом, завершая полный круг после 600 повторений. Мы вычисляем пи как 4 * арктан (1).
  • Последняя строка ожидает, пока не пройдет 0,1 секунды. Идиома, которую я узнал из моих книг QBasic, была t# = TIMER: WHILE TIMER < t# + 0.1: WEND. Но нам не нужны числа с двойной точностью (помеченные #) для разницы в 0,1 секунды, и получается, что IF cond THEN [GOTO] lineсинтаксис на 1 символ короче WHILE ... WENDцикла.

Цикл повторяется 600 раз за 60 секунд, завершая полный цикл.

Предостережения

  • Цвет 5, темно-пурпурный, #8B008Bвместо запрошенного #800080(очищается с помощью OP).
  • Режим экрана 7 имеет размер 320x200, поэтому круг имеет диаметр 198, который не> 0,75 ширины, а> 0,75 высоты (также очищается с помощью OP).
  • Если вы запустите это на DOS QBasic, он будет полноэкранным, так что «пиксель» на самом деле не является одним пикселем на мониторе (если у вас нет монитора с разрешением 320х200). Но это должно быть достаточно близко. QB64 запускается в окне, которое использует точные размеры, и, таким образом, пиксель является буквальным пикселем.
  • По крайней мере, в QB64 для полной революции требуется больше 65 секунд. Я действительно не знаю почему; это должно быть либо ошибки округления, либо издержки в цикле, хотя я пытался смягчить оба без успеха. Теоретически код должен работать правильно, как есть. На практике можно изменять величину, на которую iувеличивается, пока оборот не станет достаточно близким к 60 секундам. (Попробуйте знаменатель 69 или 68.)
  • Здесь нет красивой картинки. :( Качество LICEcap было недостаточно хорошим для точного захвата одного пикселя.
DLosc
источник
Этот код прекрасно работает для меня в Linux. Спасибо.
Это на самом деле работает в QBasic 4.5, но фон на самом деле не белый :). Вот GIF- файл
mınxomaτ
@ mınxomaτ Странно, цвет 15 должен давать либо белый, либо светло-серый цвет в зависимости от всего, что, как я думал, я знал ... это выглядит как светло-голубой (цвет 11). Что SCREEN 8вместо этого 7делать?
DLosc
Тот же зеленоватый фон. Но вы правы, согласно спецификации он должен быть белым. Я также попробовал цвет 7 (серый), и он получился серым. Итак, ваше решение абсолютно нормально, но с моей DOS что-то не так.
mynxomaτ
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
}

Это оптимизировано для mIRC в Wine. Запустите mIRC, нажмите, Alt + Rзатем вставьте его, закройте редактор и запустите/g

предварительный просмотр

Время на GIF может быть выключено.

Варис
источник
Это новый на меня! Было бы здорово, если бы вы могли сделать анимированный GIF из этого бега.
Это был один из первых языков, которые я использовал / заинтересовал меня кодированием!
Варис
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()}

Это зависит от пакета 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
источник
Это здорово, однако ... задача требует кода для записи на экран / окно.
О, я не понял этого.
plannapus
2
Вот оно, в окне.
plannapus
6

Рубин с Обуви, 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}}

Пиксель на самом деле является наконечником секундной стрелки аналоговых часов. Так что это абсолютно точно.

Рубин с Обуви, 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 и может быть изменено.

manatwork
источник
Очень приятно видеть решение Ruby! Теперь нам нужен Python, Perl, ....
5

D 286 280 байт

(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скомпилируйте, а затем просто запустите его.

Моя маленькая библиотека была написана для того, чтобы сделать такие быстрые анимации довольно простыми, так что это хорошо работает на своих сильных сторонах! Увы, мне нравятся длинные имена идентификаторов, и я не предоставляю Pointконструктор, который принимает floatтак, что добавляет 18-байтовое приведение и .... Идем пару десятков, прописывая имена моих методов.

Адам Д. Руппе
источник
1
Первый аргумент для EventLoop, кстати, является таймером миллисекунды. Если он не равен нулю, он автоматически создает таймер и вызывает функцию с нулевыми аргументами, указанными в этом интервале. (EventLoop также может принимать функции с аргументами MouseEvent или KeyEvent для обработки пользовательского ввода). Таким образом, интервал в 50 миллисекунд = 20 кадров в секунду, поэтому 20 * 60 = цикл за 60 секунд.
Адам Д. Руппе
Я думаю, как вы написали ответ, код лидеров набирает 392 вместо 280.
5

C #, 379 365 байт

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.Formsи System.Drawingбежать. Вывод в окне 1000x1000.

LegionMammal978
источник
Можно сохранить несколько байтов с помощьюvar
pinkfloydx33
Сохраните еще один байт, используя статический импорт в системной математике
pinkfloydx33
Вы можете объявить свой код в пространстве имен System и удалить все другие ссылки на систему и сохранить, я думаю, 10 байт
JustinM - Восстановить Monica
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. Исправил это, но также обнаружил, что 0.5работает как раз .5, так что никаких изменений в количестве байтов.

Flambino
источник
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.

enhzflep
источник
Это здорово! Проверено и работает отлично.
1
О, хватит! Просто понял, что вы указали цвет для использования, и я полностью проигнорировал его. : oops: исправлю чуть позже. Цветовой индекс должен быть 0x5C, а не 0x09 (при условии, что dosbox правильно устанавливает палитру, в противном случае я просто переназначу цвет 1)
Improzflep
4

Mathematica 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]

Метод 2 154 байта

Наносит пиксель вдоль круговой траектории за 60 секунд.

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

Метод 3 193 байта

Это рисует часы с галочками и метками белого цвета, для которых секундная стрелка является пикселем.

Dynamic@Refresh[ClockGauge[AbsoluteTime[],TicksStyle->White, 
GaugeMarkers->{None,None,Graphics[{White,Disk[],Purple, 
AbsolutePointSize[.01],Point@{3,0}}]},PlotTheme->"Minimal"],UpdateInterval->1]
DavidC
источник
Я вижу, основная путаница LTR ... Но в любом случае, вы можете удалить пространство между 30и t.
LegionMammal978
4

Obj-C ++ / Какао, 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 (мой в любом случае) g++ -framework Cocoa file.mmи запущен из терминала ( ctrl-Cчтобы выйти, так как это не приложение).

Скриншот

Редактировать: Сохранено 99 байт: Исправлено main()для запуска на OS X 10.10 (1-я версия работала только на 10.8), пропущен перевод / поворот в пользу простых вычислений триггера, перестал беспокоиться о размещении окна и другие мелочи.

Изменить: Сохранено еще 10 байтов: Изменено только orderFrontдля отображения окна. Хотя на самом деле это не переднее окно, но ни один не сделал orderFrontAndMakeKey, так что ...

Редактировать: Сохранено еще 11 байтов: пропущено NSMakeRectи найдена цифра, которая просто должна была идти.

Редактировать: Сохранено еще 14 байтов: не нужно было назначать NSTimerэкземпляр чему-либо, и, очевидно, может пропустить инициализацию rдо нуля.

Редактировать: Сохранено еще 15 байтов: я не могу остановиться. Отправить помощь.

Flambino
источник
Спасибо. 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, либо загрузите обработку 2.0 с processing.org , вставьте код в IDE обработки, выберите режим Javascript и посмотрите это пошло.

Тимоти Грут
источник
Lol, вы отправили Обработка за 20 секунд до меня.
PurkkaKoodari
В этом ответе неправильный заголовок? Это не отображается в таблице лидеров.
1
Пропустил это, я на этом сейчас.
Тимоти Грут
1
теперь он должен соответствовать требованию 60 секунд
Тимоти Гроот
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
источник
Ой, исправлено! Я получил нетерпеливы во время тестирования
jmite
1
Это очень хорошо, и это здорово - получить что-то на функциональном языке. Нам просто нужны Хаскель и Скала сейчас!
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);
user12864
источник
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 с фиксированными координатами, поскольку размер окна в любом случае не изменяется.

manatwork
источник
Первый ответ Луа! Спасибо.
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()
Dieter
источник
1
Pythontastically здорово!
Теперь нам просто нужно решение Python + Turtle.
3

С (с использованием 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

Dieter
источник
Потрясающе здорово! Я думал, что никто не сделает это.
2

ActionScript 2.0, 151 байт

К сожалению, Adobe Flash не является бесплатной, и Google сообщает, что он не работает в Linux без виртуальной машины или Wine (и даже с 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), а затем нарисовать точку 2 на 200 пикселей дальше вправо. Теперь видеоклип имеет ширину 200 пикселей и высоту 1 пиксель. Точка поворота - это исходные координаты, с которых мы начали, поэтому, когда мы изменяем _rotationсвойство, точка перемещается по кругу вокруг точки (200, 200). Удобно, _rotationв градусах; 0,25 градуса / кадр * 24 кадра / секунда * 60 секунд / минута = 360 градусов / минута.

Для запуска с нуля, если у вас есть Flash, создайте новый документ Flash 1 , откройте панель «Действия» и вставьте приведенный выше код. Никакой дополнительной настройки не требуется, если принять во внимание белый фон по умолчанию, холст 550x400 и 24 кадра в секунду. Нажмите Ctrl-Enter и смотрите.

Если у вас нет самой Flash, вы все равно можете просматривать результаты с помощью бесплатного Flash Player, который должен поставляться с большинством современных браузеров. Загрузите SWF-файл здесь . Если вы не можете воспроизвести его, попробуйте также загрузить и открыть эту HTML-страницу с SWF-файлом в том же каталоге.

1 Протестировано в Adobe Flash CS4 Professional, выбрав «Flash File (ActionScript 2.0)», когда его спросят, какой тип нового файла создать.

2 На самом деле маленький треугольник, как вы увидите, достаточно ли увеличить его. Это был самый лучший способ нарисовать точку.

DLosc
источник
2

JavaScript с jQuery, 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. Я мог бы отцентрировать его на 150х75 и сделать его радиус 113px (~ 75% ширины), но иногда он был бы вне холста, поэтому я выбрал ~ 75% высоты.

Но это не так уж и мало, так что

Flambino
источник
2

Blitz 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, так как по умолчанию размер элементов canvas равен 300x150, как определено спецификациями HTML.

Dendrobium
источник
2

Матлаб, 141 136

Я просто отправляю это тебе, Лембик, чтобы получить полный список.

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
flawr
источник