Proto invasores do espaço (você pode ceder?)

18

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.

insira a descrição da imagem aqui

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 Nestá 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


fonte
2
Podemos construir o alienígena nós mesmos? Se sim, temos que incluir os erros de pixel (eu acho?) Da imagem?
mınxomaτ 31/10/2015
@ mınxomaτ Não se limita ao linux! Observe "se possível".
@nimi Obrigado. Adicionado que você pode carregá-lo de um arquivo local.
@ mınxomaτ Você pode construí-lo sozinho ou simplesmente carregá-lo de um arquivo local. Eu não tinha notado os erros de pixel, mas presumo que carregá-lo terá menos código em qualquer caso.
Você pode definir "parar nas fronteiras"? O alienígena inteiro precisa estar visível o tempo todo, ou pode parar parcialmente fora da fronteira?
timothymh

Respostas:

12

Arranhão , 221 217 bytes

Clique 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.

timothim
fonte
Esta resposta é muito divertida!
Como você mediu o tamanho deste programa?
@Lembik veja o segundo parágrafo.
timothymh
1
gera em 217 bytes: scratchblocks.github.io/…
ev3commander
1
@Mauris Sim, é disso que trata o comando "if on edge, bounce". Você pode jogar a demo clicando na imagem!
timothymh
7

Processando 2, 219 199241 220 219 bytes

int a,x=0,y=0;void setup(){size(500,500);}void draw(){background(-1);image(loadImage(".png"),x,y);if(keyPressed){a=keyCode;if(a==38)y--;if(a==37)x--;if(a==40)y++;if(a==39)x++;}x=constrain(x,0,436);y=constrain(y,0,454);}

Requer a imagem salva como .pngno mesmo diretório que o arquivo .pde

O médico
fonte
6

Python 2, 262 253 246 240 bytes

from pygame import*
init()
key.set_repeat(1)
p=[0,0]
d=display
c=d.set_mode((400,)*2)
while c.fill((255,)*3):
 e=event.get(2);c.blit(image.load("I"),p);d.flip()
 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))))

Uau. 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 milissegundo

c=d.set_mode((400,)*2) - Crie a superfície da tela de 400x400

while c.fill((255,)*3): - Efetivamente while 1: mas limpa a tela também

e=event.get(2);c.blit(image.load("I"),p);d.flip() - Apenas colete eventos do teclado, carregue a imagem armazenada em um arquivo png chamado I e desenhe-o. Atualize a tela

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)))) - 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.

Azul
fonte
Eu realmente gosto da sua solução.
@Lembik Então, um nome de arquivo de byte único é permitido? (Ou seja, sem extensão?). Nesse caso, sugiro excluir completamente os nomes de arquivos da contagem de bytes.
mınxomaτ
@ mınxomaτ O nome do arquivo de byte único é permitido, mas não quero inventar um novo esquema de pontuação.
O @Lembik Processing não pode lidar com nomes de arquivos de byte único ... então isso é injusto.
TheDoctor
2
@TheDoctor Isto apenas em: Idiomas diferentes são diferentes! Proponho que os desafios também impedirá que levam entrada de stdin, você sabe, porque é injusto que leva tantos personagens para fazer isso em Python ...
Aleksi Torhamo
5

Haskell, 410 bytes

import Graphics.Gloss
import Graphics.Gloss.Interface.Pure.Game
main=do b<-loadBMP"b";play(InWindow""(400,400)(0,0))white 200((0,0),id)(b#)e(%)
e(EventKey(SpecialKey k)Down _ _)(c,_)|k==KeyUp=(c,fmap(+1))|k==KeyDown=(c,fmap(+(-1)))|k==KeyLeft=(c,((+(-1))?))|k==KeyRight=(c,((+1)?))
e(EventKey _ Up _ _)(c,_)=(c,id)
e _ w=w
_%(c,f)=(s?(s<$>f c),f)
s=min 200.max(-200)
b#((x,y),_)=Translate x y b
f?(a,b)=(f a,b)

A imagem do alienígena é esperada em um arquivo nomeado bem .bmpformato.

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 playsã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.

eprocura KeyDowneventos 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.

nimi
fonte
Sempre fico surpreso que você possa fazer esse tipo de coisa em Haskell. Obrigado!
4

Olmo, 240 bytes

import Graphics.Element as G
import Keyboard as K
import Time
import Signal exposing(..)
c=min 800>>max 64
i(x,y)=G.container x y G.middle(G.image 64 48"http://i.stack.imgur.com/CUweU.png")
main=i<~foldp(\{x,y}(v,w)->(c v+x,c w-y))(99,99)(sampleOn(Time.fps 200)K.arrows)

Experimente aqui . A contagem de bytes é depois de substituir o URL por .png.

Lynn
fonte
Talvez eu tenha que aprender Elm agora. Obrigado.
3

AutoIt , 269 267 bytes

#include<Misc.au3>
GUICreate(0,-1,-1,-1,-1,-1,34078728)
$0=GUICtrlCreatePic("b.bmp",0,0,64,48)
GUISetState()
Dim $1,$2
$3=_IsPressed
Do
$1+=$3("27")-$3("25")
$2+=$3("28")-$3("26")
$1=($1>336)?336:($1<0)?0:$1
$2=($2>352)?352:($2<0)?0:$2
GUICtrlSetPos($0,$1,$2)
Until 0

Requer 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.au3para ter acesso _IsPressed. Uma função que aceita um código de tecla e retorna Trueou Falsequando 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-1Default parâmetros de tamanho ou ) são 400x400. O estilo de janelas estendidas está definido como 34078728. 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. $3torna-se um ponteiro para a função _IsPressedpara 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 _IsPressedpara um número inteiro que pode ser adicionado ou subado do deslocamento x. O mesmo para y.$1=($1>336)?336:($1<0)?0:$1usa 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):

captura de tela

mınxomaτ
fonte
Seu fundo não é branco!
sergiol 14/12
2

Lua + LÖVE, 291 caracteres

x=0
y=0
l=love
g=l.graphics
l.window.setMode(400,400)
i=g.newImage("i")
function l.update()d=l.keyboard.isDown
if d("left")and x>0 then x=x-1 end
if d("right")and x<336 then x=x+1 end
if d("up")and y>0 then y=y-1 end
if d("down")and y<352 then y=y+1 end
end
function l.draw()g.draw(i,x,y)end

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 fornã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.

homem a trabalhar
fonte
2

SpecBAS - 285 255 bytes

1 GRAPHIC NEW v LOAD "inv8.bmp" TRANSPARENT 15
2 PALETTE COPY v,0,1 TO 5: GRAPHIC REMAP v
3 LET x,y=100
4 CLS : WINDOW PUT GRAPHIC v,0,x,y
5 LET x=x+KEYST(39)-KEYST(37),y=y+KEYST(40)-KEYST(38)
6 LET x=CLAMP(x,1 TO 400),y=CLAMP(y,1 TO 400)
7 WAIT SCREEN 
8 GO TO 4

Carrega 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.

insira a descrição da imagem aqui

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.

Brian
fonte
2

Rubi com sapatos, 252 243 caracteres

Shoes.app{background white
i=image'i'
m=[0,0]
a=[:width,:height]
animate(99){i.left+=m[0]<=>i.left
i.top+=m[1]<=>i.top}
keypress{|k|d,v={?u=>[1,-1],?d=>[1,1],?l=>[0,-1],?r=>[0,1]}[k[0]];m[d]=[[m[d]+v*4,self.send(p=a[d])-i.send(p)].min,0].max}}

Isso 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.

homem a trabalhar
fonte
2

Tcl / Tk , 242 bytes

grid [canvas .c -w 400 -he 403 -bg #FFF -highlightt 0]
.c cr i 30 24 -i [image c photo -fi .png] -t p
lmap {k b x y} "Up 1]>25 0 -5 Right 0]<368 5 0 Down 1]<376 0 5 Left 0]>30 -5 0" {bind . <$k> "if \[lindex \[.c coo p] $b {.c move p $x $y}"}
sergiol
fonte
Para executá-lo em qualquer Linux: você deve ter o Tcl e o Tk instalados; copie o código para um arquivo, digamos invaders.tcl; você também precisa salvar a imagem como .pngna mesma pasta. Para executar o tipo de script wish 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.
sergiol
1

JavaScript (usando paper.js), 215 bytes

v=new Raster("http://i.stack.imgur.com/CUweU.png",99,99);p=new Size(4,0)
onFrame=e=>{if(!v.isInside(view.bounds)){p=-p};v.position+=p}
onKeyDown=e=>{p=new Size([[0,-4],[0,4],[-4,0],[4,0]]["udlr".indexOf(e.key[0])])}

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.

ivzem
fonte