контекст
Это день святого валентина Единственный, кого ты когда-либо любил, оставил тебя вчера для этого парня, которого она всегда находила "глупым и неинтересным" . По дороге домой вы застряли в пробке, слушаете старые песни по радио, дождь, падающий на лобовое стекло, качает вас. Через некоторое время в вашей машине вы обнаруживаете себя одиноким в своей маленькой квартире, неспособным думать о чем-то другом, кроме нее. Там нет света, и вы смотрите через окно, позволяя темноте окружать вас. Не с кем поговорить, твои друзья давно ушли после того, как предупредили тебя об этой новой девушке, преследующей твой разум. Вы запускаете компьютер, поскольку это единственное, что вы можете сделать, открываете браузер и публикуете новую головоломку для программирования в stackexchange, пытаясь изменить свое решение.
Вызов
Напишите программу на выбранном вами языке, имитирующую дождь, падающий на землю. Вывод может состоять из символов ASCII или визуализации 2D / 3D. Камера исправлена: вы выше, смотрите прямо на землю. Ваша программа должна включать какую-то анимацию, например, обновлять консоль или страницу каждый раз, когда вы генерируете новый «фрейм». Это должно быть реалистично, я знаю, что это немного субъективно, но скажем, вы не можете просто заполнить все поле в одной большой капле.
Вывод не обязательно должен быть изображением, но если вы используете загадочный язык, лучше предоставить .gif, чтобы проиллюстрировать, как он выглядит в действии (но, конечно, это не повлияет на ваш счет, если вы этого не сделаете).
правила
- Ваша оценка - это общее количество использованных байтов.
- -20 очков, если вы используете цвета
- -50 если добьешься какого то ветра
- Наименьшее количество побед
пример
Очень простой пример того, что должно быть предоставлено:
Я надеюсь, что вы будете лучше и наслаждаетесь этим испытанием.
Извините за мой английский, не стесняйтесь редактировать мой пост, если вы хотите исправить некоторые ошибки
Таблица лидеров
Если вашего имени нет в списке, это потому, что ваша попытка не соответствует правилам.
Tobia - APL - 35
j6m8 - Processing.js - 38
The Guy with The Hat - Processing - 42
ace - Processing - 74
kelunik - JS/CSS - 89
Riot - Bash - 91
Michael - JS/jQuery - 105
Florent - HTML/JS - 123
David Carraher - Mathematica - 134
Doorknob - HTML/JS - 150
undergroundmonorail - Python - 175
Поздравляем Тобию!
Ответы:
APL, 105 символов / байт * - 20 - 50 = 35 баллов
*: Большинство реализаций APL поддерживают некоторую форму (унаследованного) однобайтовой кодировки, которая отображает символы APL в верхние 128-байтовые значения. Поэтому для целей игры в гольф программа, которая использует только символы ASCII и символы APL, может быть оценена как chars = bytes.
Я проверил это на последнем apl.js Ника на Node.js в терминале OS X. Но я не использовал ничего конкретного для его диалекта, поэтому он должен работать на любом современном APL, который может быть запущен на терминале ANSI и поддерживает d-funs
{...}
, назначение нитей(a b)←...
и коммутирование⍨
, например Dyalog для Linux или для Raspberry PI ( с⎕IO←0
)␛
В строке 1 является буквальным экранирующий символ (который равен 1 байт). Вы можете ввести его, используя Ctrl-V Escтерминал Linux или Vim, или предположительно что-то вроде Alt-027Windows. Кроме того, я не смог найти надежный способ определения размера терминала, поэтому вы можете отредактировать количество строк и столбцов в конце последней строки.Я защищаю бонус 50 тем, что каждая капля дождя проходит через следующие формы:
⍟∘.
которые создают впечатление легкого нисходящего ветра, учитывая, что на сцену смотрят сверху. Фактически, глядя на рисунок ниже, у вас должно сложиться впечатление, что каждая капля плавно движется вниз и влево, прежде чем исчезнуть на земле.Безголовая версия:
Выход:
APL, другой стиль
Вне конкуренции.
Здесь моя цель состояла в том, чтобы создать впечатление, что капли дождя падают с уклоном и накапливаются на земле, в то же время пытаясь поддерживать постоянное количество видимых капель (падающих или разбрызгиваемых) в среднем. Хитрость заключалась в том, чтобы создавать несколько новых падающих капель
/
в каждом цикле, а падающие капли «стирали» брызги, через которые они попадают.Результат странным образом напоминает код Matrix.
Вывод
(рывок каждые 5 секунд - это цикл gif)
источник
Bash: 111 байт - 20 = 91 балл!
Созерцательная нежная морось в вашем терминале. Отрегулируйте числа 819 и 41 для различной высоты и ширины соответственно.
Приятным бонусом является то, как курсор стучит по области дождя.
Изменить: сокращение от 140 байтов до 129 байтов благодаря предложениям @ manatwork. 2-е редактирование: сокращение от 129 байтов до 111 байтов благодаря предложениям @ manatwork's и @ Tobia, а также дополнительное вдохновение - см. Комментарии.
(Примечание: на скриншоте показана предыдущая версия кода с меньшим количеством полей для гольфа, которая функционально идентична)
источник
echo
опциям; 2 символа, используя\e
вместо\033
; 3 символа, используя:
вместоtrue
; 5 символов с помощью арифметической оценки (((…))
):e='echo -ne \e';while :;do for i in {0..19};do for i in {0..40};do ((RANDOM<9))&&$e"[1;36m".||$e[1C;done;$e' ';done;$e[20A;done
.((RANDOM<9))
работает так же хорошо. Кроме того, вы можете попробовать сжать код, объединив два for{0..19}
и{0..40}
в один for{0..819}
, используя что-то вроде$((i%41))
этого.e='printf \e'
на 2 символа корочеe='echo -ne \e'
!$e[C
Питон, 312 байт - 50 (ветер) = 262
Пример вывода (цикл из 50 кадров):
Фактический плейпак значительно быстрее, чем позволяют картинки.
источник
R=__import__("random").randint
вместоfrom random...
строки.HTML / JS, 170 символов - 20 = 150 баллов
(Sidenote: golfed дальше, передавая строку
setInterval
,with
, имена переменных автоматического ID ... он чувствует себя так неправильно! вздрагивает )Он просто рисует случайные синие прямоугольники.
HTML / JS, 309 символов - 20 - 50 = 239 баллов
Теперь с ветром!
источник
<canvas id=c /><script>d=400;with(c)width=height=d,t=getContext('2d');t.fillStyle='blue';setInterval("t.fillRect(Math.random()*d,Math.random()*d,5,5)",50)</script>
AAAHHH! Я использовалwith
! Я чувствую себя грязнее, чем передавая строкуsetInterval
: pcanvas
невозможно автоматически закрыться, но кроме этого он работает отлично! (Кроме того, использование автоматических имен переменных ID также выглядит грязно: D)onload
. Должен сказать, мне нравится, как @ Florent избегает дубликатовMath.random()
canvas
autoclose в Chrome! Мой ответ был разработан / протестирован в этом браузере.JS + jQuery (172-20-50 = 102)
Скопируйте / вставьте эту строку в консоль браузера (обычно нажмите клавишу F12):
Анимированные красные сердца дождь на день Святого Валентина!
источник
Mathematica
134 - 20 = 114
2D
3D
Форма капли дождя создается с помощью графика вращения вокруг оси z.
Первоначально, дождь генерируется для области, которая простирается значительно выше области отображения. Появление падающего дождя достигается смещением точки обзора вверх вдоль оси z. (Это более эффективно, чем пересчет положения каждой капли дождя.)
С ветром
Существуют значительные накладные расходы, чтобы заставить дождь падать с ветром. Но я все равно здесь.
Синий пол в значительной степени удерживает область обзора {x, y}, ограниченную областью интереса. Есть некоторые глюки, ну да ладно,
Прямо сверху
Ближайшие капли дождя обрезаются, но я это пропущу.
источник
HTML / JavaScript,
156123 (143 - 20)Аннотированная версия:
источник
Smalltalk (Smalltalk / X)
со случайным ветром ;-)
вывод в поле зрения:
источник
Обработка, 94 - 20 = 74
(Новая строка добавлена для удобства чтения.)
Нажмите здесь для онлайн-демонстрации.
источник
удар
Я не уверен, что это должен быть кодовый гольф, потому что нет строгих требований к тому, как должен выглядеть «дождь».
РЕДАКТИРОВАТЬ: Если вы хотите, чтобы камера выглядела так, будто камера направлена прямо вниз, используйте это:
источник
while echo \ / / / / /;do echo / / / / /;done
(или еще несколько с рекурсивной функцией, но это быстро взорвет стек). @undergroundmonorail Сильный ветер, диагональ относительно камеры.while echo -e '\e[0;34m / / / / /';do echo / / / / /;done
и снизить его до -13 с бонусами :)Python 2.7: 195 - 20 = 175
Я уверен, что здесь можно сделать еще кое-что, но вот что я получил сейчас:
Я выложу gif результата, когда вспомню, как это сделать.
Это работает на Linux. Замена
'clear'
на'cls'
заставляет это работать на окнах, но тогда цвета ANSI не работают, и я теряю бонус.У меня есть 2D-массив односимвольных строк, инициализированных в
. Каждые 0,05 секунды один из них выбирается случайным образом
.
, и экран перерисовывается.from random import*
сохраняет два символа сноваimport os,time,random
и используетrandom.randint()
дважды, хотя я не уверен, что это лучший способ выбрать ячейку в любом случае. Я хотел использовать,random.choice()
но я не мог придумать способ обойти неизменные строки, которые бы не тратили больше символов, чем они сохранялись.источник
l=[i[:]for i in[[' ']*100]*50]
, согласно stackoverflow.com/a/6688361/1114687 . 198 - 20 = 178l=[[' ']*100]*50
, но это просто создает 50 ссылок на один и тот же список из 100 элементов, поэтому я искал самый короткий из возможных способов обойти это и нашел ответ переполнения стека, связанный выше.132 + 27 - 20 - 50 = 89
Javascript (132)
CSS (27)
Демо: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/
источник
Обработка, 62 - 20 = 42
Создает синие пиксели на белом фоне. Демонстрация на очень похожем языке здесь: https://www.khanacademy.org/cs/rain2/6172053633761280
источник
Processing.js, 86 - 20 = 66
... но он также постепенно исчезает (земля поглощает дождь, естественно). Очки за это?
Бонусные функции включают изменение между зеленоватым и голубоватым (это явно грязный «городской» дождь).
Кроме того, мне было очень приятно, что я использовал здесь хак JavaScript; Обратите внимание, потому что это обработка. js , вы можете добавить такие вещи, как объявление типа g = 99 или псевдоним
r
forrandom
(псевдоним между языками!).Любые другие идеи, чтобы минимизировать?
Читаемая версия:
Все это можно посмотреть здесь .
... плюс еще одна версия без выцветания: 58 - 20 = 38
Если вам не нравится выцветание и вы не против серой грязи:
источник
Tcl / Tk, 139 - 20 = 119
Повторное использование моего собственного ответа http://codegolf.stackexchange.com/a/143018/29325
Должен быть запущен в интерактивной оболочке
К сожалению, преобразование
expr int(rand()*
в aproc
делает скрипт на один байт больше!Чтобы остановиться, нужно просто нажать невыразимую кнопку «Х».
источник