Invasori spaziali Proto (puoi blittarlo?)


18

Invasori spaziali Proto

Questa è una sfida di output grafico in cui il compito è quello di fornire il codice più breve per lingua.

Compito

Il tuo codice dovrebbe consentire all'utente di spostare il seguente alieno sullo schermo / finestra.

inserisci qui la descrizione dell'immagine

Il tuo codice può semplicemente caricarlo da un file locale. Sentiti libero di convertirlo in un altro formato di immagine standard o anche di correggere gli errori di pixel piccoli nell'immagine che sono stati evidenziati nei commenti.

Lo sfondo deve essere bianco e la finestra / schermo deve essere di almeno 400 pixel per 400 pixel. Se la tua lingua non supporta finestre / schermi così grandi, utilizza le dimensioni più grandi supportate, purché non inferiori a 200 per 200.

Per spostare l'alieno sullo schermo, il codice dovrebbe supportare su / giù / sinistra / destra usando i tasti freccia su una tastiera standard.

Il tuo codice dovrebbe essere un programma completo .

Restrizioni / vincoli

L'alieno dovrebbe fermarsi ai confini. Dovrebbe anche muoversi a una velocità uniforme senza sfarfallio o balbuzie visibili ed essere mostrato ad almeno 24 fps. Dovrebbero essere necessari dai 2 ai 5 secondi per passare da un lato dello schermo / finestra all'altro.

Lingue e biblioteche

Puoi usare qualsiasi lingua o libreria che ti piace (che non è stata progettata per questa sfida). Tuttavia, vorrei essere in grado di testare il tuo codice, se possibile, quindi se puoi fornire istruzioni chiare su come eseguirlo in Ubuntu sarebbe molto apprezzato.

Catalogare

Lo snippet di stack nella parte inferiore di questo post genera il catalogo dalle risposte a) come elenco della soluzione più breve per lingua eb) come classifica generale.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet:

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


2
Possiamo costruire noi stessi l'alieno? In tal caso, dobbiamo includere gli errori di pixel (immagino?) Dall'immagine?
mınxomaτ,

@ mınxomaτ Non è limitato a Linux! Nota "se possibile".

@nimi Grazie. Aggiunto che è possibile caricarlo da un file locale.

@ mınxomaτ Puoi costruirlo tu stesso o semplicemente caricarlo da un file locale. Non avevo notato gli errori dei pixel, ma presumo che caricarlo sarà meno codice in ogni caso.

Puoi definire "fermati ai confini"? L'intero alieno deve essere sempre visibile o può fermarsi parzialmente al di fuori del confine?
timoteo,

Risposte:


12

Scratch , 221 217 byte

Fai clic sull'immagine per visualizzarla in azione. Il movimento è determinato da sequenze di tasti , quindi sarà più fluido quanto più velocemente viene impostata la ripetizione dei tasti.

L'immagine è inclusa nel progetto, ma i byte di Scratch vengono generalmente conteggiati dalla rappresentazione testuale golfizzata , per questo meta post . Se c'è disaccordo sul fatto che questo sia accettabile (o se il movimento sia abbastanza regolare) fammi sapere e cercherò di aggirare il problema.


Questa risposta è molto divertente!

Come hai misurato le dimensioni di questo programma?

@Lembik vedi il secondo paragrafo.
timoteo,


1
@Mauris Sì, questo è ciò di cui si occupa il comando "if on edge, bounce". Puoi giocare alla demo facendo clic sull'immagine!
Timothymh

7

Elaborazione 2, 219 199241 220 219 byte

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

Richiede l'immagine salvata come .pngnella stessa directory del .pde


6

Pitone 2, 262 253 246 240 byte

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

Wow. Che hackery.

Utilizza il modulo "pygame" disponibile su http://pygame.org .

Spiegazione

key.set_repeat(1) - Invia eventi chiave di ripetizione attraverso il sistema di eventi ogni millisecondo

c=d.set_mode((400,)*2) - Crea la superficie del display 400x400

while c.fill((255,)*3):- Effettivamente while 1:ma cancella anche lo schermo

e=event.get(2);c.blit(image.load("I"),p);d.flip()- Raccogliere solo eventi da tastiera, caricare l'immagine memorizzata in un file png chiamato Ie disegnarla. Aggiorna lo schermo

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 si è verificato un evento, capire quale tasto freccia è stato premuto (fa cose strane se si premono altri tasti), quindi cambiare la posizione della superficie in base al tasto premuto.


Mi piace molto la tua soluzione.

@Lembik Quindi è consentito un nome file a byte singolo? (Vale a dire senza estensione?). In tal caso, suggerisco di escludere completamente i nomi dei file dal conteggio dei byte.
mınxomaτ,

@ mınxomaτ I Il nome del file a byte singolo è consentito ma non voglio inventare un nuovo schema di punteggio.

L'elaborazione di @Lembik non è in grado di gestire nomi di file a byte singolo ... quindi non è giusto.
TheDoctor,

2
@TheDoctor Questo in: Lingue diverse sono diverse! Propongo anche di non accettare le sfide che prendono input dallo stdin, sai, perché non è giusto che ci vogliono così tanti personaggi per farlo in Python ...
Aleksi Torhamo,

5

Haskell, 410 byte

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'immagine dell'alieno è prevista in un file denominato bnel .bmpformato.

Sono nuovo nella libreria Gloss, quindi forse questo non è ottimale. Qualcuno sa se posso verificare se viene premuto un tasto invece di tracciamento KeyUp/ KeyDowneventi?

Come funziona: gli ultimi quattro parametri di playsono lo stato del mondo (inizializzato con ((0,0),id), una funzione per disegnare un'immagine da uno stato ( #), un gestore di eventi ( e) e una funzione che cambia lo stato nel tempo ( %).

Lo stato è una coppia di coordinate xy e una funzione su come modificarle ogni volta che %viene chiamato.

#sposta la bitmap ( b) sulle coordinate correnti e la disegna.

ecerca gli KeyDowneventi dei tasti cursore e imposta le funzioni appropriate nello stato o per KeyUpqualsiasi tasto per ripristinare la funzione nello stato sulla funzione identità.

% applica la funzione dallo stato alle coordinate correnti e controlla i confini.


Sono sempre stupito che tu possa persino fare questo genere di cose in Haskell. Grazie!

4

Olmo, 240 byte

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)

Provalo qui . Il conteggio dei byte avviene dopo aver sostituito l'URL con .png.


Potrei dover imparare Elm ora. Grazie.

3

AutoIt , 269 267 byte

#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

Richiede che l'immagine venga salvata come b.bmp nella directory degli script. Se si desidera utilizzare un'immagine con trasparenza effettiva, è necessario convertirla da PNG in una bitmap a 32 bit (OT: un formato davvero non apprezzato).

Spiegazione

Dobbiamo importare Misc.au3per avere accesso a _IsPressed. Una funzione che accetta un codice chiave e ritorna Trueo Falsequando viene premuto il tasto.

La specifica della sfida è piuttosto interessante nel modo in cui dobbiamo creare una finestra quadrata di 400 px. L'impostazione predefinita (indicata come-1Default parametri di dimensione o ) sono 400x400. Lo stile di Windows esteso è impostato su 34078728. Ciò impone che la finestra venga bufferizzata doppia e disegnata dal basso verso l'alto. Ciò è necessario per eliminare lo sfarfallio secondo il requisito della sfida. In Windows 10, questa insolita (e in qualche modo non documentata) combinazione di stili rompe la barra del titolo della finestra (tutti gli effetti al passaggio del mouse sono disabilitati).

$1 e $2 vengono dichiarati e manterranno l'offset xey dell'immagine caricata dal controllo $0. $3diventa un puntatore alla funzione _IsPressedper abbreviare significativamente il codice.

Poiché non è necessario poter uscire dal programma, questo script viene eseguito in un ciclo infinito ( Until 0).

$1+=$3("27")-$3("25")abusa del tipo di dati variante in AutoIt eseguendo il cast dinamico del valore booleano restituito _IsPresseda un numero intero che può essere aggiunto o sottotitolato dall'offset x. Lo stesso per y.$1=($1>336)?336:($1<0)?0:$1usa l'operatore ternario conosciuto da linguaggi simili a C per eseguire un controllo dei limiti per fermare l'alieno ai confini.

GuiCtrlSetPos sposta il controllo immagine sulle nuove coordinate.

Ecco uno screenshot con un alieno trasparente (puoi persino muoverti in diagonale):

immagine dello schermo


Lo sfondo non è bianco!
sergiol

2

Lua + LÖVE, 291 caratteri

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

Questo utilizza una finestra 400 x 400 non ridimensionabile. Non ho avuto successo con la regolazione love.keyboard.setKeyRepeat()per accelerare la lettura della chiave, quindi ho fatto il modo consigliato, sondando lo stato di ogni chiave.

Dato che la mia relazione con Lua fornon è la migliore, nemmeno questa volta è riuscito a rendere il loop più breve del hardcoding di dump delle condizioni di ciascuna chiave.


2

SpecBAS - 285 255 byte

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

Carica l'immagine: il colore 15 è bianco brillante, quindi diventa trasparente.

L'uso dell'immagine originale e la tavolozza SpecBAS predefinita lo hanno reso un po 'strano, quindi la riga 2 li cambia in modo che corrispondano all'immagine di input. L'immagine sotto mostra come appare senza linea 2 e dopo.

inserisci qui la descrizione dell'immagine

Il comando CLAMP limita l'immagine tra 1 e 400 in entrambe le direzioni, salva su diverse istruzioni IF ... THEN.

La linea 9 attende solo che le cose si mettano al passo e previene lo sfarfallio.

Si sposta di un pixel alla volta in base a un controllo booleano del tasto premuto, quindi richiede leggermente più di 5 secondi per passare da un lato all'altro.


2

Rubino con pattini, 252 243 caratteri

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

Questo utilizza una finestra ridimensionabile a partire da 600 x 500 di default. Se ridimensionate la finestra in modo che l'invasore venga lasciato fuori, tornerà quando verrà premuto il tasto di spostamento successivo.

Il trucco per soddisfare i requisiti è che la posizione dell'invasore viene modificata con incrementi di 4, ma il movimento effettivo viene effettuato con incrementi di 1 a 99 fotogrammi al secondo.


2

Tcl / Tk , 242 byte

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

Per eseguirlo su qualsiasi Linux: devi avere Tcl e Tk installati; quindi copia il codice in un file, diciamo invaders.tcl; devi anche salvare l'immagine come .pngnella stessa cartella. Per eseguire il tipo di script wish invaders.tcl in una shell. PS: Può essere più golfato se il codice viene invece incollato in una shell interattiva, poiché supporta comandi abbreviati predefiniti.
sergiol,

1

JavaScript (usando paper.js), 215 byte

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 è un framework grafico JS, il che significa che presenta molte funzioni utili per quanto riguarda la manipolazione delle immagini. Per eseguire, basta copiare quanto sopra nella sezione a sinistra qui , allora, per spostare l'alieno in giro, fare clic una volta nella sezione giusta per dargli fuoco. Se il tuo browser è in grado di gestirlo, dovrebbe funzionare a 60 fps.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.