Envahisseurs de l'espace proto (pouvez-vous le blit?)

18

Envahisseurs de l'espace proto

Il s'agit d'un défi de sortie graphique où la tâche consiste à donner le code le plus court par langue.

Tâche

Votre code doit permettre à l'utilisateur de déplacer l'étranger suivant sur l'écran / la fenêtre.

entrez la description de l'image ici

Votre code peut simplement le charger à partir d'un fichier local. N'hésitez pas à le convertir dans un autre format d'image standard ou même à corriger les petites erreurs de pixels de l'image qui ont été signalées dans les commentaires.

L'arrière-plan doit être blanc et la fenêtre / l'écran doit mesurer au moins 400 pixels sur 400 pixels. Si votre langue ne prend pas en charge les fenêtres / écrans de cette taille, utilisez la plus grande taille qu'elle prend en charge tant qu'elle n'est pas inférieure à 200 par 200.

Pour déplacer l'étranger sur l'écran, le code doit prendre en charge haut / bas / gauche / droite en utilisant les touches fléchées d'un clavier standard.

Votre code doit être un programme complet .

Restrictions / contraintes

L'étranger devrait s'arrêter aux frontières. Il doit également se déplacer à une vitesse uniforme en douceur sans scintillement ni bégaiement visible et être affiché à au moins 24 images par seconde. Cela devrait prendre entre 2 et 5 secondes pour passer d'un côté de l'écran / fenêtre à l'autre.

Langues et bibliothèques

Vous pouvez utiliser n'importe quelle langue ou bibliothèque que vous aimez (qui n'a pas été conçue pour ce défi). Cependant, j'aimerais pouvoir tester votre code si possible, donc si vous pouvez fournir des instructions claires sur la façon de l'exécuter dans Ubuntu, ce serait très apprécié.

Catalogue

L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) en tant que liste des solutions les plus courtes par langue et b) en tant que classement général.

Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

## Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

## Perl, 43 + 2 (-p flag) = 45 bytes

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


la source
2
Pouvons-nous construire l'étranger nous-mêmes? Si oui, devons-nous inclure les erreurs de pixels (je suppose?) De l'image?
mınxomaτ
@ mınxomaτ Ce n'est pas limité à Linux! Notez "si possible".
@nimi Merci. Ajouté que vous pouvez le charger à partir d'un fichier local.
@ mınxomaτ Vous pouvez le construire vous-même ou simplement le charger à partir d'un fichier local. Je n'avais pas remarqué les erreurs de pixels mais je suppose que le charger sera en tout cas moins de code.
Pouvez-vous définir "arrêter aux frontières"? L'étranger tout entier doit-il être visible à tout moment, ou peut-il s'arrêter partiellement en dehors de la frontière?
timothymh

Réponses:

12

Scratch , 221 217 octets

Cliquez sur l'image pour la voir en action. Le mouvement est déterminé par les frappes , il sera donc plus fluide plus la répétition des touches est rapide.

L'image est incluse dans le projet, mais les octets de grattage sont généralement comptés à partir de la représentation textuelle du golf , par cette méta-publication . S'il y a désaccord quant à savoir si cela est acceptable (ou si le mouvement est assez fluide), faites-le moi savoir et j'essaierai de le contourner.

timothymh
la source
Cette réponse est très amusante!
Comment avez-vous mesuré la taille de ce programme?
@Lembik voir le deuxième paragraphe.
timothymh
1
génère en 217 octets: scratchblocks.github.io/…
ev3commander
1
@Mauris Oui, c'est ce dont s'occupe la commande "if on edge, bounce". Vous pouvez jouer la démo en cliquant sur l'image!
timothymh
7

Traitement 2, 219 199 241 220 219 octets

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

Nécessite l'image enregistrée comme .pngdans le même répertoire que le .pde

Le docteur
la source
6

Python 2, 262 253 246 240 octets

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

Sensationnel. Quel beaucoup de piratage.

Utilise le module 'pygame' disponible sur http://pygame.org .

Explication

key.set_repeat(1) - Envoyer des événements clés répétés via le système d'événements toutes les millisecondes

c=d.set_mode((400,)*2) - Créez la surface d'affichage 400x400

while c.fill((255,)*3):- Effectivement while 1:mais efface également l'écran

e=event.get(2);c.blit(image.load("I"),p);d.flip()- Ne collectez que les événements du clavier, chargez l'image stockée dans un fichier png appelé Iet dessinez-la. Mettre à jour l'écran

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)))) - S'il y a eu un événement, déterminez quelle touche fléchée a été enfoncée (fait des trucs bizarres si vous appuyez sur d'autres touches), puis changez la position de la surface en fonction de la touche sur laquelle vous avez appuyé.

Bleu
la source
J'aime vraiment ta solution.
@Lembik Un nom de fichier à un seul octet est donc autorisé? (C'est à dire sans extension?). Si c'est le cas, je suggère d'exclure complètement les noms de fichiers du nombre d'octets.
mınxomaτ
@ mınxomaτ I le nom de fichier à un octet est autorisé mais je ne veux pas inventer un nouveau schéma de notation.
@Lembik Processing ne peut pas gérer les noms de fichiers à un octet ... c'est donc injuste.
TheDoctor
2
@TheDoctor Cela vient de: Différentes langues sont différentes! Je propose que nous interdisons également les défis qui prennent la contribution de stdin, vous savez, car il est injuste qu'il faut autant de personnages pour le faire en Python ...
Aleksi Torhamo
5

Haskell, 410 octets

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)

L'image de l'étranger est attendue dans un fichier nommé bau .bmpformat.

Je suis nouveau dans la bibliothèque Gloss, donc ce n'est peut-être pas optimal. Est-ce que quelqu'un sait si je peux vérifier si une touche est enfoncée au lieu du suivi KeyUp/ des KeyDownévénements?

Comment ça marche: les quatre derniers paramètres de playsont l'état du monde (initialisé avec ((0,0),id), une fonction pour dessiner une image d'un état ( #), un gestionnaire d'événements ( e) et une fonction qui change l'état au fil du temps ( %).

L'état est une paire de coordonnées xy et une fonction sur la façon de les changer à chaque %appel.

#déplace le bitmap ( b) vers les coordonnées actuelles et le dessine.

erecherche les KeyDownévénements des touches de curseur et définit les fonctions appropriées dans l'état ou pour KeyUpn'importe quelle touche pour réinitialiser la fonction dans l'état à la fonction d'identité.

% applique la fonction de l'état aux coordonnées actuelles et vérifie les limites.

nimi
la source
Je suis toujours étonné que vous puissiez même faire ce genre de choses à Haskell. Je vous remercie!
4

Orme, 240 octets

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)

Essayez-le ici . Le nombre d'octets est après avoir remplacé l'URL par .png.

Lynn
la source
Je devrais peut-être apprendre l'orme maintenant. Je vous remercie.
3

AutoIt , 269 267 octets

#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

Nécessite que l'image soit enregistrée en tant que b.bmp dans le répertoire de script. Si vous souhaitez utiliser une image avec une transparence réelle, vous devez la convertir du PNG en un bitmap 32 bits (OT: un format vraiment peu apprécié).

Explication

Nous devons importer Misc.au3pour y accéder _IsPressed. Une fonction qui accepte un code de touche et renvoie Trueou Falselorsque la touche est enfoncée.

La spécification du défi est assez cool dans la façon dont nous devons créer une fenêtre carrée de 400 pixels. Les paramètres de taille par défaut (désignés par -1ou Default) sont 400x400. Le style de fenêtres étendues est défini sur 34078728. Cela force la fenêtre à être tamponnée deux fois et dessinée de bas en haut. Ceci est nécessaire pour éliminer le scintillement selon l'exigence de défi. Dans Windows 10, cette combinaison inhabituelle (et quelque peu non documentée) de styles brise la barre de titre de la fenêtre (tous les effets de survol sont désactivés).

$1et $2sont déclarés et contiendront les décalages x et y de l'image chargée par le contrôle $0. $3devient un pointeur sur la fonction _IsPressedpour raccourcir considérablement le code.

Puisqu'il n'est pas nécessaire de pouvoir quitter le programme, ce script s'exécute dans une boucle infinie ( Until 0).

$1+=$3("27")-$3("25")abuse du type de données variant dans AutoIt en transtypant dynamiquement la valeur booléenne renvoyée de _IsPresseden un entier qui peut être ajouté ou remplacé par le décalage x. Idem pour y. $1=($1>336)?336:($1<0)?0:$1utilise l'opérateur ternaire connu des langages de type C pour effectuer une vérification des limites afin d'arrêter l'étranger aux frontières.

GuiCtrlSetPos déplace le contrôle d'image vers les nouvelles coordonnées.

Voici une capture d'écran avec un extraterrestre transparent (vous pouvez même vous déplacer en diagonale):

capture d'écran

mınxomaτ
la source
Votre fond n'est pas blanc!
sergiol
2

Lua + LÖVE, 291 caractères

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

Cela utilise une fenêtre 400 x 400 non redimensionnable. Je n'ai pas réussi à régler love.keyboard.setKeyRepeat()pour accélérer la lecture des clés, j'ai donc fait la méthode recommandée, en interrogeant l'état de chaque touche.

Comme ma relation avec Lua forn'est pas la meilleure, ni cette fois-ci n'a réussi à raccourcir la boucle que le codage en dur de l'état de chaque clé.

homme au travail
la source
2

SpecBAS - 285 255 octets

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

Charge l'image - la couleur 15 est d'un blanc brillant, de sorte qu'elle devient transparente.

L'utilisation de l'image d'origine et de la palette SpecBAS par défaut a rendu la chose un peu étrange, donc la ligne 2 les fait basculer pour correspondre à l'image d'entrée. L'image ci-dessous montre à quoi cela ressemble sans la ligne 2 et après.

entrez la description de l'image ici

La commande CLAMP limite le graphique entre 1 et 400 dans les deux sens, enregistre plusieurs instructions IF ... THEN.

La ligne 9 attend juste que les choses se rattrapent et empêche le scintillement.

Il se déplace d'un pixel à la fois sur la base d'une vérification booléenne de la touche enfoncée, ce qui prend un peu plus de 5 secondes pour aller d'un côté à l'autre.

Brian
la source
2

Rubis avec des chaussures, 252 243 caractères

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

Cela utilise une fenêtre redimensionnable à partir de 600 x 500 par défaut. Si vous redimensionnez la fenêtre de sorte que l'envahisseur soit laissé de côté, il reviendra lorsque la touche de mouvement suivante sera enfoncée.

L'astuce pour satisfaire aux exigences est que la position de l'envahisseur est modifiée par incréments de 4, mais le mouvement réel est effectué avec un incrément de 1 à 99 images par seconde.

homme au travail
la source
2

Tcl / Tk , 242 octets

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
la source
Pour l'exécuter dans n'importe quel Linux: vous devez avoir installé Tcl et Tk; puis copiez le code dans un fichier, disons invaders.tcl; vous devez également enregistrer l'image comme .pngdans le même dossier. Pour exécuter le script, tapez wish invaders.tcl dans un shell. PS: Il peut être plus pratique si le code est plutôt collé dans un shell interactif, car il prend en charge les commandes abrégées par défaut.
sergiol
1

JavaScript (en utilisant paper.js), 215 octets

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 est un framework graphique JS, ce qui signifie qu'il comporte de nombreuses fonctionnalités utiles concernant la manipulation d'images. Pour exécuter, copiez simplement ce qui précède dans la section de gauche ici , puis, pour déplacer l'étranger, cliquez une fois dans la section de droite pour lui donner le focus. Si votre navigateur peut le gérer, il devrait fonctionner à 60 ips.

ivzem
la source