Один піксель, що рухається круговою доріжкою


45

Це виклик графічного виводу, де завданням є дати найкоротший код на кожній мові.

Завдання

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

Ваш код повинен бути повноцінною програмою .

Мови та бібліотеки

Ви можете використовувати будь-яку мову чи бібліотеку, яка вам подобається. Однак я хотів би мати можливість протестувати ваш код, якщо це можливо, тому якщо ви можете надати чіткі інструкції щодо його запуску в Ubuntu, що буде дуже вдячно.

Відсутнє двадцять мов. Потрібна допомога.

У наступних двадцяти мовах програмування на даний момент взагалі відсутнє рішення.

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

Каталог

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон 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

1
@ Фаталізуйте, що не означає, що ви не можете переграти кольори в програмі якось розумним творчим способом, щоб зберегти байти.
Тимофій Гроот

3
@TimothyGroote TI-BASIC має в основному лише один колір: чорний. Все інше - це піксель. Є калькулятори C (SE), які мають кольори, але не у кожного є.
Conor O'Brien

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. Не дивись на це ні хвилини.


2
Це реалізує правило 60 секунд?

2
@ Лембік Так. За замовчуванням частота кадрів становить 60 кадрів в секунду , і я збільшую кутові π/1800радіани за один раз. (Це було π/360010 секунд тому через мого мозку пердеть.)
PurkkaKoodari

5
@ Pietu1998 Цей мозковий піст був пов’язаний з тим, що пі помиляється
Cruncher

2
@Cruncher має любити вірт!
Тім

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.

Ось це в дії:

Програма

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

(Константа 9.55- це наближення 30/π = 9.54929658551. Чи достатньо близько вона?)


Га! Ніколи не думав використовувати PLAYдля затримки. Могли б присягнути, що був код для відпочинку, але я його зараз не бачу у файлі довідки. Я розглядав можливість використання (функції) TIMERв якості параметра, але ніколи не намагався перевірити, чи він коротший. Кудо!
DLosc

4
Спасибі! Я безсоромно піднявся PSETвід тебе, так кудо назад ... Схоже, відпочинок n0довший, ніж c. Крім того, мені це подобається як трохи згинання правил: ОП сказав, що нічого іншого не може бути показано у вікні, але ніколи не сказав, що моя програма не могла голосно пройти BEEP BEEP BEEP BEEP .
Лін

1
Я не маю нічого проти звукових сигналів, але насправді я не бачу пікселя, що рухається по колу, коли я намагаюся в Linux.

1
Ось це діє на моїй машині, що повинно бути достатньо доказів.
Лінн

12
Я деякий час дивився на образ, бо ти сказав "ось воно в дії ".
mbomb007

14

Java, 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
І ви можете зберегти ще один байт, ініціалізуючи колір у шістнадцятковій версії, тобто новий Color (0x800080).
Франц Д.

1
@FranzD. Ще краще - просто скористайтеся десятковим числом 8388736.
Ypnypn

1
Позбавлення JFrame, використання Frame, дозволяє видалити імпорт javax.
Чарівний восьминіг Урна

14

Математика, 102 101 94 байт

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

Створюється біле коло, яке є прихованим, і розміщує крапку, яка йде за його краєм від 0 до 2π. DefaultDurationОпція Mathematica дозволить мені встановити цикл кожні 60 секунд.

Ось прискорена версія виводу:

EDIT: Змініть, Circleщоб Diskзберегти 2 символи, додав негативний знак, tщоб змусити його рухатися за годинниковою стрілкою.

EDIT: Збережено 7 байт за допомогою ~оператора (завдяки Маврису).


14
Подальше підтвердження того, що Mathematica - це просто мова програмування, де ви пишете якісь неясні англійські слова, які означають те, що ви хочете, а потім додайте розділові знаки. (Я чую, що ви можете використовувати a~f~bзамість цього f[a,b], чи не Rotateскоротить це?)
Лінн

1
Ви також можете використовувати позначення префіксів для, Point@{0,1}і я не думаю, що вам не потрібен список Purple,Point....
Мартін Ендер

1
@Mauris. На непідготовлене око, Mathematica дійсно може виглядати як розпливчасті англійські слова та пунктуація. Насправді це назви конкретних, чітко визначених функцій, налаштувань та операторів. Ймовірність того, що непрограміст може розкрутити працездатний код, - це пшик.
DavidC

3
@David: Ха-ха, я, звичайно, знаю - я просто жартував :)
Лінн

@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% розміру його батьківського, фіолетового та 1 пікселя). Тому мені потрібно і не можу відмовитись або спростити такі правила:

* { 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

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 мс) між тим, коли піксель відображається, і коли він знову вимикається.

Встановіть калькулятор в радіальному режимі перед запуском програми; Я не рахую це за розміром, оскільки це стан за замовчуванням. Також встановіть Ansзначення 0, ввівши 0 перед програмою; це також за замовчуванням.

Завдяки @quartata за тестування цієї програми (я не володію кольоровим калькулятором).


Наївна ідея: чи можете ви зробити програмний дзвінок сам, а не використовувати цикл час, і чи буде він коротшим?
Лінн

@Mauris цикл while становить 3 жетони, а назва програми зазвичай довша
TheDoctor

1
@Mauris Цикл "Хоча" насправді становить 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). Я також зробив лічильник цілочисленною змінною, оновленою простим збільшенням, і врятував кілька байт, подвійних констант, щоб можна було розкреслити цифру тут і там.

EDIT: Дякую @Peter Lenkefi та @tobii за їх пропозиції в коментарях. Перемогти HTML було б непогано - хтось знає, як надійно призупинити виконання в Java, не використовуючи сон () та не вдається ловити винятки?

EDIT 2: HTML JAVA BEATS HTML (наразі становить 290 байт!): D Час тепер залежить від машини, але ~ 60 секунд для повного кола на моїй машині, що нормально відповідно до @Lembik. Ще раз дякую @PeterLenkefi за його пропозицію - моя відповідь більше половини його :)

EDIT 3: @Ajay запропонував видалити "re" з "перефарбувати". На два байти менше. Ми туди потрапляємо :)


1
Ми повинні отримати його під HTML (так <290 зараз)
Пітер Ленкефі

1
@PeterLenkefi: На жаль, я не можу зберегти фігурні дужки акторського складу; викидання результату sin / cos безпосередньо порушує обчислення. Ваша перефарбування всередині фарби () неймовірно брудна :)
Франц Д.

1
@Troyseph Я мав на увазі для гольфу;) Я не використовую ні для чого.
Пітер Ленкефі

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 байт

Натхненний вставкоюкористувача

<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

1
Він не робить нічого на Firefox 41.0.2.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Щойно перевірений на Firefox 41.0.2, Win 10. Для мене добре працює.
Лаклан Артур

1
Для мене працює в 41.0.2 в ubuntu.

1
+1 Гарне мислення, щоб просто оживити bodyсебе. :)
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

Тестовано на QB64 , де йдеться про версію Linux (хоча я спробував це лише в Windows).

  • SCREEN 7 встановлює графічний режим.
  • COLOR 5,15 встановлює темну пурпурову як колір переднього плану, а яскравий білий - як колір тла.
  • DO ... LOOPє нескінченною петлею. Зазвичай ви бачите це як DO WHILE ... LOOP(або можете LOOP WHILEзамість цього поставити або використовувати UNTILдля заперечення умови), але ви також можете залишити його умовою, і в такому випадку воно зациклюється назавжди.
  • TIMER - це кількість секунд з півночі як значення з плаваючою комою.
  • CLS = Екран CLear.
  • PSET Встановлює точку на колір, колір переднього плану за замовчуванням.
  • iпочинається з нуля і підраховується на pi / 300 кожного разу через цикл, таким чином завершуючи повне коло після 600 повторень. Обчислюємо pi як арктан 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(очищається за допомогою ОП).
  • Екранний режим 7 становить 320x200, і тому коло має діаметр 198, що не> = 0,75 ширини, але становить> = 0,75 висоти (також очищається за допомогою ОП).
  • Якщо ви запускаєте це на DOS QBasic, це повноекранний екран, тому "піксель" насправді не є одним пікселем на моніторі (якщо у вас немає монітора 320х200). Але воно повинно бути досить близько. 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
}

Це оптимізовано для mIRC у вині. Запустіть 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.

! [Кругом і кругом він іде


Це чудово, однак .. виклик потребує коду для запису на екран / вікно.

О, я цього не зрозумів.
планнапус

2
Ось воно, у вікні.
планнапус

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

Піксель насправді є кінчиком секундної руки аналогового годинника. Тож ця абсолютно точна.

Рубін з взуттям, 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}}

Це альтернатива кадру на секунду, натхненна іншими відповідями. Хоча в документації сказано, що за замовчуванням кадрів в секунду 10, практичні тести показують, що це фактично 12.

Обидва рішення приймають "Ширина кола повинна бути 0,75 (відповідне округлення) ширина екрана чи вікна" буквально: обчислюйте на основі ширини вікна, тому піксель час від часу може залишати нижню частину неквадратного вікна. Не впевнений, як очікується розгляд такого випадку. (Використовуйте мінімум ширини та висоти? Ходьба по овальній доріжці?) Вікно починається з розміру 600 x 500 за замовчуванням і може змінювати розмір.


Дуже приємно бачити рішення 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 байт кастингу і .... idk пару десятків, що викладають мої назви методів.


1
Перший аргумент eventLoop btw - це мілісекундний таймер. Якщо він не дорівнює нулю, він автоматично робить таймер для вас і викликає функцію з нульовими аргументами, наданими на цьому інтервалі. (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бігти. Вихід є у вікні 1000х1000.


Можна зберегти кілька байт за допомогоюvar
pinkfloydx33

Збережіть ще один байт, використовуючи статичний імпорт у системній математиці
pinkfloydx33

ви можете оголосити свій код у просторі імен системи та видалити всі інші посилання на систему та зберегти, я думаю, 10 байт
JustinM - Поновіть Моніку

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, так що жодних змін у кількості байтів немає.


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.

'Безголовка', версія джерела:

; 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

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]

Я бачу, основна плутанина 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()для запуску в ОС X 10.10 (перша версія працює лише на 10.8), пропустила перекладати / обертати на користь простих обчислень триггерів, перестала турбуватися з розміщенням вікон та іншими дрібними речами.

Редагувати: збережено ще 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, щоб побачити його в дії за допомогою Process.js, або завантажте обробку 2.0 з Process.org , вставте код у IDE для обробки, виберіть режим Javascript і дивіться це піде.


Лол, ти опублікував Обробку за 20 секунд до мене.
PurkkaKoodari

Чи помилковий заголовок у цій відповіді? Він не відображається в таблиці лідерів.

1
Пропустив це, я зараз на цьому.
Тімоті Гроот

1
Тепер він повинен відповідати вимозі 60 секунд
Тимофі Гроот

1
background(-1)на один байт коротший заbackground(255)
Крітіксі Літос,

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

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 за замовчуванням за фіксованими координатами, оскільки вікно все одно не може змінюватись.


Перша відповідь луа! Дякую.

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
Пітонтастично приголомшливий!

Тепер нам просто потрібен розчин пітон + черепаха.

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 повідомляє, що він не працює в Linux без VM або 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 Насправді невеликий трикутник, як ви побачите, чи достатньо збільшити його. Це був найголовніший спосіб, який я міг знайти, щоб намалювати крапку.


2

JavaScript w / 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 і робити його радіус 113 пікселів (~ 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, оскільки розмір елементів за замовчуванням елементів полотна становить 300x150, як визначено специфікаціями HTML.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.