Proto invasores do espaço
Esse é um desafio gráfico de saída em que a tarefa é fornecer o menor código por idioma.
Tarefa
Seu código deve permitir ao usuário mover o seguinte alienígena pela tela / janela.
Seu código pode simplesmente carregá-lo de um arquivo local. Sinta-se à vontade para convertê-lo em outro formato de imagem padrão ou até para corrigir os pequenos erros de pixel na imagem que foram apontados nos comentários.
O fundo deve ser branco e a janela / tela deve ter pelo menos 400 pixels por 400 pixels. Se o seu idioma não suportar janelas / telas tão grandes, use o tamanho maior, pois ele não será menor que 200 por 200.
Para mover o alienígena pela tela, o código deve suportar para cima / baixo / esquerda / direita usando as teclas de setas de um teclado padrão.
Seu código deve ser um programa completo .
Restrições / restrições
O estrangeiro deve parar nas fronteiras. Também deve se mover de maneira uniforme a uma taxa uniforme sem tremulações ou gagueiras visíveis, e ser mostrado a pelo menos 24 qps. Demora entre 2 e 5 segundos para ir de um lado da tela / janela para o outro.
Línguas e bibliotecas
Você pode usar qualquer idioma ou biblioteca que desejar (que não foi projetada para este desafio). No entanto, eu gostaria de poder testar seu código, se possível, se você puder fornecer instruções claras sobre como executá-lo no Ubuntu que seriam muito apreciadas.
Catálogo
O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](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>
Respostas:
Arranhão ,
221217 bytesClique na imagem para vê-la em ação. O movimento é determinado pelo pressionamento de tecla , portanto, será mais suave quanto mais rápido sua repetição de tecla for definida.
A imagem é incluída no projeto, mas os bytes de rascunho geralmente são contados a partir da representação textual em golf , de acordo com esta meta post . Se houver desacordo sobre se isso é aceitável (ou se o movimento é suave o suficiente), avise-me e tentarei contorná-lo.
fonte
Processando 2,
219 199241 220219 bytesRequer a imagem salva como
.png
no mesmo diretório que o arquivo .pdefonte
Python 2,
262253246240 bytesUau. Quanta loucura.
Usa o módulo 'pygame' encontrado em http://pygame.org .
Explicação
key.set_repeat(1)
- Envie eventos chave repetidos pelo sistema de eventos a cada milissegundoc=d.set_mode((400,)*2)
- Crie a superfície da tela de 400x400while c.fill((255,)*3):
- Efetivamentewhile 1:
mas limpa a tela tambéme=event.get(2);c.blit(image.load("I"),p);d.flip()
- Apenas colete eventos do teclado, carregue a imagem armazenada em um arquivo png chamadoI
e desenhe-o. Atualize a telaif 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))))
- Se houve um evento, determine qual tecla de seta foi pressionada (faz coisas estranhas se você pressionar outras teclas) e altere a posição da superfície, dependendo da tecla que você pressionou.fonte
Haskell, 410 bytes
A imagem do alienígena é esperada em um arquivo nomeado
b
em.bmp
formato.Eu sou novo na biblioteca Gloss, então talvez isso não seja o ideal. Alguém sabe se posso verificar se uma tecla foi pressionada em vez de rastrear
KeyUp
/KeyDown
eventos?Como funciona: os quatro últimos parâmetros de
play
são o estado mundial (inicializado com((0,0),id)
, uma função para desenhar uma imagem de um estado (#
), um manipulador de eventos (e
) e uma função que altera o estado ao longo do tempo (%
).O estado é um par de coordenadas xy e uma função de como alterá-las sempre que
%
for chamado.#
move o bitmap (b
) para as coordenadas atuais e o desenha.e
procuraKeyDown
eventos das teclas do cursor e define funções apropriadas no estado ouKeyUp
de qualquer tecla para redefinir a função no estado para a função de identidade.%
aplica a função do estado às coordenadas atuais e verifica os limites.fonte
Olmo, 240 bytes
Experimente aqui . A contagem de bytes é depois de substituir o URL por
.png
.fonte
AutoIt ,
269267 bytesRequer que a imagem seja salva como b.bmp no diretório de scripts. Se você quiser usar uma imagem com transparência real, precisará convertê-la de PNG para um bitmap de 32 bits (OT: um formato realmente não apreciado).
Explicação
Precisamos importar
Misc.au3
para ter acesso_IsPressed
. Uma função que aceita um código de tecla e retornaTrue
ouFalse
quando a tecla é pressionada.As especificações do desafio são bem legais na maneira como precisamos criar uma janela quadrada de 400px. O padrão (indicado como
-1
Default
parâmetros de tamanho ou ) são 400x400. O estilo de janelas estendidas está definido como34078728
. Isso força a janela a ser buffer duplo e desenhada de baixo para cima. Isso é necessário para eliminar a oscilação conforme o requisito do desafio. No Windows 10, essa combinação incomum (e um tanto indocumentada) de estilos quebra a barra de título da janela (todos os efeitos suspensos são desativados).$1
e$2
são declarados e manterão o deslocamento xey da imagem carregada pelo controle$0
.$3
torna-se um ponteiro para a função_IsPressed
para reduzir significativamente o código.Como não é necessário poder sair do programa, esse script é executado em um loop infinito (
Until 0
).$1+=$3("27")-$3("25")
abusa o tipo de dados variante no AutoIt, lançando dinamicamente o valor booleano retornado de_IsPressed
para um número inteiro que pode ser adicionado ou subado do deslocamento x. O mesmo para y.$1=($1>336)?336:($1<0)?0:$1
usa o operador ternário conhecido em idiomas do tipo C para executar uma verificação de limites para parar o alienígena nas fronteiras.GuiCtrlSetPos
move o controle de imagem para as novas coordenadas.Aqui está uma captura de tela com um alienígena transparente (você pode até se mover na diagonal):
fonte
Lua + LÖVE, 291 caracteres
Isso usa uma janela 400 x 400 não redimensionável. Não obtive sucesso com o ajuste
love.keyboard.setKeyRepeat()
para acelerar a leitura das teclas, por isso fiz o caminho recomendado, pesquisando o status de cada tecla.Como minha relação com Lua
for
não é a melhor, nem desta vez conseguimos tornar o loop mais curto do que o código de despejo da condição de cada chave.fonte
SpecBAS -
285255 bytesCarrega a imagem - a cor 15 é branca brilhante, tornando-a transparente.
O uso da imagem original e da paleta SpecBAS padrão tornou a peça um pouco estranha, então a linha 2 as alterna para corresponder à imagem de entrada. A imagem abaixo mostra como fica sem a linha 2 e depois.
O comando CLAMP limita o gráfico entre 1 e 400 em ambas as direções, salva em várias instruções IF ... THEN.
A linha 9 apenas espera que as coisas alcancem e evita oscilações.
Ele move um pixel de cada vez com base em uma verificação booleana de qual tecla é pressionada; portanto, leva um pouco mais de 5 segundos para ir de um lado para o outro.
fonte
Rubi com sapatos,
252243 caracteresIsso usa uma janela redimensionável iniciando no padrão 600 x 500. Se você redimensionar a janela para que o invasor fique de fora, retornará quando a próxima tecla de movimento for pressionada.
O truque para satisfazer os requisitos é que a posição do invasor é alterada em incrementos de 4, mas o movimento real é feito com um incremento de 1 a 99 quadros por segundo.
fonte
Tcl / Tk , 242 bytes
fonte
invaders.tcl
; você também precisa salvar a imagem como.png
na mesma pasta. Para executar o tipo de scriptwish invaders.tcl
em um shell. PS: pode ser mais eficiente se o código for colado em um shell interativo, pois suporta comandos abreviados por padrão.JavaScript (usando paper.js), 215 bytes
paper.js é uma estrutura de gráficos JS, o que significa que possui muitos recursos úteis em relação à manipulação de imagens. Para executar, basta copiar o item acima na seção à esquerda aqui e, para mover o alienígena, clique uma vez na seção direita para focar. Se o seu navegador puder lidar com isso, ele deve rodar a 60fps.
fonte