Прото космические захватчики
Это задача графического вывода, где задача состоит в том, чтобы дать самый короткий код для каждого языка.
задача
Ваш код должен позволять пользователю перемещать следующего иностранца по экрану / окну.
Ваш код может просто загрузить его из локального файла. Не стесняйтесь преобразовать его в другой стандартный формат изображения или даже исправить небольшие пиксельные ошибки в изображении, которые были указаны в комментариях.
Фон должен быть белым, а окно / экран должно быть не менее 400 на 400 пикселей. Если ваш язык не поддерживает такие большие окна / экраны, используйте самый большой размер, который он поддерживает, если он не меньше 200 на 200.
Для перемещения иностранца по экрану код должен поддерживать вверх / вниз / влево / вправо с помощью клавиш со стрелками на стандартной клавиатуре.
Ваш код должен быть полной программой .
Ограничения / ограничения
Инопланетянин должен остановиться на границах. Он также должен плавно двигаться с одинаковой скоростью, без видимого мерцания или заикания, и должен отображаться со скоростью не менее 24 кадров в секунду. Переход от одной стороны экрана / окна к другой должен занимать от 2 до 5 секунд.
Языки и библиотеки
Вы можете использовать любой язык или библиотеку, которая вам нравится (которая не была разработана для этой задачи). Тем не менее, я хотел бы иметь возможность протестировать ваш код, если это возможно, поэтому, если вы можете предоставить четкие инструкции по его запуску в Ubuntu, это было бы очень полезно.
Каталог
Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## 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
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 62426; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 9206; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Ответы:
Царапина ,
221217 байтНажмите на изображение, чтобы увидеть его в действии. Движение определяется нажатиями клавиш , поэтому оно будет более плавным, чем быстрее будет установлено повторение нажатия клавиш .
Изображение включено в проект, но байты Царапины обычно считаются из текстового представления в гольфе , согласно этому мета-посту . Если есть разногласия относительно того, является ли это приемлемым (или достаточно ли плавное движение), дайте мне знать, и я постараюсь обойти это.
источник
Обработка 2,
219 199 241 220219 байтТребуется изображение, сохраненное
.png
в том же каталоге, что и .pdeисточник
Python 2,
262253246240 байтВау. Как много хакерства.
Использует модуль 'pygame', найденный на http://pygame.org .
объяснение
key.set_repeat(1)
- Отправлять повторяющиеся ключевые события через систему событий каждую миллисекундуc=d.set_mode((400,)*2)
- Создайте поверхность дисплея 400x400while c.fill((255,)*3):
- Эффективно,while 1:
но также очищает экранe=event.get(2);c.blit(image.load("I"),p);d.flip()
- Собирайте только события клавиатуры, загружайте изображение из png-файлаI
и рисуйте его. Обновить экранif e:x=e[0].key+1;q=x&2;b=q/2;p[b]=max(0,min(336+b*16,p[b]+(1-q)*(1-(2*x&2))))
- Если произошло событие, определите, какая клавиша со стрелкой была нажата (странные вещи, если вы нажимаете другие клавиши), а затем измените положение поверхности в зависимости от того, какую клавишу вы нажали.источник
Haskell, 410 байт
Изображение иностранца ожидается в файле с именем
b
в.bmp
формате.Я новичок в библиотеке Gloss, так что, возможно, это не оптимально. Кто-нибудь знает, могу ли я проверить, нажата ли клавиша вместо отслеживания
KeyUp
/KeyDown
событий?Как это работает: последними четырьмя параметрами
play
являются состояние мира (инициализируется с((0,0),id)
помощью, функция для рисования изображения из состояния (#
), обработчик события (e
) и функция, которая изменяет состояние с течением времени (%
).Состояние представляет собой пару координат xy и функцию их изменения при каждом
%
вызове.#
перемещает растровое изображение (b
) к текущим координатам и рисует его.e
ищет либоKeyDown
события клавиш курсора и устанавливает соответствующие функции в состоянии, либо дляKeyUp
любой клавиши для сброса функции в состоянии на функцию идентичности.%
применяет функцию из состояния к текущим координатам и проверяет границы.источник
Вяз, 240 байт
Попробуй это здесь . Количество байтов указывается после замены URL на
.png
.источник
AutoIt ,
269267 байтТребует, чтобы изображение было сохранено как b.bmp в каталоге скриптов. Если вы хотите использовать изображение с реальной прозрачностью, вам нужно преобразовать его из PNG в 32-битное растровое изображение (OT: действительно недооцененный формат).
объяснение
Нам нужно импортировать,
Misc.au3
чтобы получить доступ к_IsPressed
. Функция, которая принимает код клавиши и возвращаетTrue
илиFalse
когда клавиша нажата.Спецификация задачи довольно крутая в том смысле, что нам нужно создать квадратное окно размером 400 пикселей. Параметры размера по умолчанию (обозначены как
-1
илиDefault
) 400x400. Расширенный стиль окна устанавливается в34078728
. Это заставляет окно быть двойной буферизацией и рисуется снизу вверх. Это необходимо для устранения мерцания в соответствии с требованием вызова. В Windows 10 эта необычная (и несколько недокументированная) комбинация стилей нарушает заголовок окна (все эффекты зависания отключены).$1
и$2
объявлены и будут содержать смещение x и y изображения, загруженного элементом управления$0
.$3
становится указателем на функцию,_IsPressed
чтобы значительно сократить код.Поскольку нет необходимости иметь возможность выхода из программы, этот скрипт выполняется в бесконечном цикле (
Until 0
).$1+=$3("27")-$3("25")
нарушает тип данных в AutoIt, динамически приводя логическое значение, возвращаемое из_IsPressed
целого числа, которое может быть добавлено или добавлено из смещения x. То же самое для вас.$1=($1>336)?336:($1<0)?0:$1
использует троичный оператор, известный из C-подобных языков, чтобы выполнить проверку границ, чтобы остановить иностранца на границах.GuiCtrlSetPos
перемещает элемент управления изображением на новые координаты.Вот скриншот с прозрачным инопланетянином (вы можете даже перемещаться по диагонали):
источник
Lua + LÖVE, 291 персонажа
Это использует неизменяемое окно 400 x 400. У меня не было успеха в настройке
love.keyboard.setKeyRepeat()
для ускорения чтения ключа, поэтому я сделал рекомендуемый способ, опросив состояние каждой клавиши.Поскольку мои отношения с Lua
for
не самые лучшие, на этот раз не удалось сделать цикл короче, чем жесткое кодирование дампа состояния каждого ключа.источник
SpecBAS -
285255 байтЗагружает изображение - цвет 15 ярко-белый, поэтому он становится прозрачным.
Использование исходного изображения и палитры SpecBAS по умолчанию сделало его немного странным, поэтому строка 2 переключает их в соответствии с входным изображением. На рисунке ниже показано, как это выглядит без строки 2 и после.
Команда CLAMP ограничивает изображение от 1 до 400 в обоих направлениях, экономит на нескольких операторах IF ... THEN.
Линия 9 просто ждет, когда что-то настанет, и предотвращает мерцание.
Он перемещается по одному пикселю за раз, основываясь на логической проверке, какая клавиша нажата, поэтому переход из стороны в сторону занимает чуть более 5 секунд.
источник
Ruby with Shoes,
252243 персонажаПри этом используется окно с изменяемым размером, начинающееся с размера по умолчанию 600 x 500. Если вы измените размер окна, чтобы захватчик был пропущен, он вернется при нажатии следующей клавиши перемещения.
Хитрость для удовлетворения требований заключается в том, что позиция захватчика изменяется с шагом 4, но фактическое движение выполняется с шагом 1 при 99 кадрах в секунду.
источник
Tcl / Tk , 242 байта
источник
invaders.tcl
; Вам также необходимо сохранить изображение как.png
в той же папке. Для запуска скрипта наберитеwish invaders.tcl
в оболочке. PS: он может быть более удачным, если код вместо этого вставляется в интерактивную оболочку, так как он поддерживает сокращенные команды по умолчанию.JavaScript (с использованием paper.js), 215 байт
paper.js - это графическая среда JS, что означает, что она имеет много полезных функций, касающихся манипулирования изображениями. Для запуска просто скопируйте вышеупомянутое в раздел слева здесь , затем, чтобы переместить инопланетянина, щелкните один раз в правом разделе, чтобы выделить его. Если ваш браузер может с этим справиться, он должен работать со скоростью 60 кадров в секунду.
источник