Proto uzay istilacıları (tıkayabilir misiniz?)


18

Proto alanı istilacıları

Bu, görevin dil başına en kısa kodu vermek olduğu bir grafik çıktı zorluğudur.

Görev

Kodunuz, kullanıcının aşağıdaki yabancıyı ekran / pencere etrafında taşımasına izin vermelidir.

resim açıklamasını buraya girin

Kodunuz yerel bir dosyadan yükleyebilir. Başka bir standart görüntü biçimine dönüştürmek veya hatta yorumlarda gösterilen görüntüdeki küçük piksel hatalarını düzeltmek için çekinmeyin.

Arka plan beyaz olmalı ve pencere / ekran en az 400 piksel x 400 piksel olmalıdır. Diliniz bu kadar büyük pencereleri / ekranları desteklemiyorsa, 200'den 200'e kadar olmadığı sürece destekliyor.

Uzaylıyı ekranın etrafında hareket ettirmek için kod, standart bir klavyedeki ok tuşlarını kullanarak yukarı / aşağı / sola / sağa desteklemelidir.

Kodunuz tam bir program olmalıdır .

Kısıtlamalar / sınırlamalar

Uzaylı sınırlarda durmalı. Ayrıca, görünür bir titreme veya kekemelik olmadan düzgün bir oranda düzgün bir şekilde hareket etmeli ve en az 24 fps'de gösterilmelidir. Ekranın / pencerenin bir tarafından diğer tarafına geçilmesi 2 ila 5 saniye sürmelidir.

Diller ve kütüphaneler

İstediğiniz herhangi bir dili veya kütüphaneyi kullanabilirsiniz (bu zorluk için tasarlanmamıştır). Ancak, çok takdir edilecektir Ubuntu çalıştırmak için nasıl net talimatlar sağlayabilir eğer mümkünse kodunuzu test etmek istiyorum.

Katalog

Bu yazının altındaki Yığın Parçacığı, a) her dil için en kısa çözüm listesi ve b) genel bir lider panosu olarak cevaplardan katalog oluşturur.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

## Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını snippet'te görünecek bir bağlantı da yapabilirsiniz:

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


2
Uzaylıyı kendimiz inşa edebilir miyiz? Eğer öyleyse, resimdeki piksel hatalarını (sanırım?) Eklemek zorunda mıyız?
mınxomaτ

@ mınxomaτ Linux ile sınırlı değil! "Mümkünse" not edin.

@nimi Teşekkürler. Yerel bir dosyadan yükleyebileceğiniz eklendi.

@ mınxomaτ Kendiniz oluşturabilir veya yerel bir dosyadan yükleyebilirsiniz. Piksel hatalarını fark etmemiştim, ancak yüklemenin her durumda daha az kod olacağını varsayıyorum.

"Sınırlarda dur" tanımlayabilir misiniz? Tüm uzaylı her zaman görünür olmalı mı yoksa sınır dışında kısmen durabilir mi?
timothymh

Yanıtlar:


12

Çizilmeye , 221 217 bayt

Eylem halinde görmek için resme tıklayın. Hareket tuş vuruşlarıyla belirlenir , bu nedenle tuş tekrarı daha hızlı ayarlanır.

Görüntü projeye dahil edilir, ancak Scratch baytları genellikle bu meta yazı başına golfçü metin temsilinden sayılır . Bunun kabul edilebilir olup olmadığı (veya hareketin yeterince pürüzsüz olup olmadığı) konusunda anlaşmazlıklar varsa bana bildirin ve bunun üzerinde çalışmaya çalışacağım.


Bu cevap çok eğlenceli!

Bu programın boyutunu nasıl ölçtünüz?

@Lembik ikinci paragrafa bakınız.
timothymh

1
217 bayt içinde üretilir: scratchblocks.github.io/…
ev3commander

1
@Mauris Evet, "eğer kenardaysa, hemen çıkma" komutuyla ilgilenir. Görüntüyü tıklayarak demoyu oynayabilirsiniz!
timothhh

7

2 işlenmesi 219 199 241 220 219 bayt

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

.png.Pde ile aynı dizine kaydedilmiş resmi gerektirir


6

Piton 2, 262 253 246 240 bayt

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

Vay. Ne kadar çok hackery.

Http://pygame.org adresinde bulunan 'pygame' modülünü kullanır .

açıklama

key.set_repeat(1) - Her milisaniyede bir olay sistemi üzerinden tekrarlanan önemli olayları gönderin

c=d.set_mode((400,)*2) - 400x400 ekran yüzeyini oluşturun

while c.fill((255,)*3):- Etkili while 1:ama ekranı da temizler

e=event.get(2);c.blit(image.load("I"),p);d.flip()- Sadece klavye olaylarını toplayın, adlandırılan bir png dosyasında depolanan görüntüyü yükleyin Ive çizin. Ekranı güncelleyin

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)))) - Bir olay varsa, hangi ok tuşuna basıldığını bulun (diğer tuşlara basarsanız tuhaf şeyler yapar) ve sonra hangi tuşa bastığınıza bağlı olarak yüzeyin konumunu değiştirin.


Çözümünü gerçekten seviyorum.

@Lembik Tek bir bayt dosya adına izin veriliyor mu? (Yani uzantısız?). Öyleyse, dosya adlarını bayt sayısından tamamen hariç tutmanızı öneririm.
mınxomaτ

@ mınxomaτ Tek bayt dosya adına izin veriliyor, ancak yeni bir puanlama şeması oluşturmak istemiyorum.

@Lembik İşleme tek baytlık dosya adlarını işleyemez ... bu yüzden bu haksızlıktır.
TheDoctor

2
@TheDoctor Bu sadece: Farklı diller farklı! Ayrıca, stdin'den girdi alan zorluklara da izin vermemeyi öneriyorum, biliyorsunuz, çünkü Python'da bunu yapmak için çok fazla karakter gerekiyor ...
Aleksi Torhamo

5

Haskell, 410 bayt

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)

Uzaylının resim adlı bir dosyada bekleniyor biçinde .bmpformatında.

Gloss kütüphanesinde yeniyim, bu yüzden belki de bu uygun değil. Takip KeyUp/ KeyDownetkinlikler yerine bir tuşa basıp basılmadığını kontrol edebileceğimi bilen var mı ?

Nasıl çalışır: Son dört parametresi playdünya durumudur (ile başlatılır ((0,0),id), bir durumdan resim çizme işlevi ( #), olay işleyici ( e) ve zaman içinde durumu değiştiren bir işlevdir %).

Durum, bir çift xy koordinatı ve her %çağrıldığında bunların nasıl değiştirileceği işlevidir .

#bitmap'i ( b) geçerli koordinatlara taşır ve çizer.

eKeyDownimleç tuşlarının olaylarını arar ve durumdaki uygun işlevleri veya KeyUpdurumdaki işlevi kimlik işlevine sıfırlamak için herhangi bir tuş için ayarlar .

% işlevi durumdan geçerli koordinatlara uygular ve sınırları denetler.


Haskell'de bu tür şeyleri bile yapabileceğinize her zaman şaşırdım. Teşekkür ederim!

4

Karaağaç, 240 bayt

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)

Burada deneyin . Bayt sayısı, URL ile değiştirildikten sonradır .png.


Şimdi Elm öğrenmek zorunda kalabilirim. Teşekkür ederim.

3

AutoIt , 269267 bayt

#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

Resmin komut dosyası dizinine b.bmp olarak kaydedilmesini gerektirir. Bir resmi gerçek saydamlıkla kullanmak istiyorsanız, PNG'den 32 bit Bitmap'e (OT: gerçekten eşi görülmemiş bir format) dönüştürmeniz gerekir.

açıklama

Biz ithalat gerek Misc.au3erişmek için _IsPressed. Bir anahtar kodunu kabul eden ve geri dönen Trueveya Falsetuşuna basıldığında işlev .

Meydan okumasının özelliği, 400 piksellik kare bir pencere yaratmamız gerektiğinde oldukça havalı. Varsayılan ( -1veya olarak belirtilir Default) boyut parametreleri 400x400'dür. Genişletilmiş pencere stili olarak ayarlanır 34078728. Bu, pencereyi çift arabelleğe alınmaya ve aşağıdan yukarıya doğru çekmeye zorlar. Zorluk gereksinimine göre titreşimi ortadan kaldırmak için bu gereklidir. Windows 10'da, bu olağandışı (ve biraz belgelenmemiş) stil kombinasyonu, pencere başlık çubuğunu kırar (tüm gezinme efektleri devre dışı bırakılır).

$1ve $2ilan edilir ve x yapacak ve y kontrol tarafından yüklenen resmin ofset $0. kodu önemli ölçüde kısaltmak için $3işleve bir işaretçi olur _IsPressed.

Programdan çıkılması gerekmediğinden, bu komut dosyası sonsuz bir döngüde ( Until 0) çalışır .

$1+=$3("27")-$3("25")_IsPressedx döndürdüğünden eklenebilen veya alt kümeye eklenebilen bir tamsayıya döndürülen boole değerini dinamik olarak dönüştürerek AutoIt içindeki değişken veri türünü kötüye kullanır. Aynı şey y için. $1=($1>336)?336:($1<0)?0:$1C-benzeri dillerden bilinen üçlü operatörü, sınırlarda yabancıyı durdurmak için bir sınır kontrolü gerçekleştirmek için kullanır.

GuiCtrlSetPos resim kontrolünü yeni koordinatlara taşır.

İşte şeffaf bir uzaylı ile bir ekran görüntüsü (çapraz olarak bile hareket edebilirsiniz):

ekran görüntüsü


Arka planınız beyaz değil!
sergiol

2

Lua + LÖVE, 291 karakter

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

Yeniden boyutlandırılamayan 400 x 400 pencere kullanır. love.keyboard.setKeyRepeat()Anahtar okumayı hızlandırmak için ayarlama yapamadım, bu yüzden her bir anahtarın durumunu sorgulayarak önerilen yolu yaptım.

Lua ile ilişkim foren iyi olmadığından, bu sefer her bir anahtarın durumunun döküm kodlamasından daha kısa döngü yapmayı başaramadı.


2

SpecBAS - 285 255 bayt

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

Görüntüyü yükler - renk 15 parlak beyazdır, böylece saydam olur.

Orijinal görüntüyü ve varsayılan SpecBAS paletini kullanmak biraz garipleşti, böylece satır 2 bunları giriş görüntüsüyle eşleşecek şekilde değiştirir. Aşağıdaki resim 2. satır ve sonrası olmadan nasıl göründüğünü göstermektedir.

resim açıklamasını buraya girin

CLAMP komutu grafiği her iki yönde 1 ile 400 arasında sınırlandırır, birkaç IF ... THEN deyimine kaydeder.

9. satır sadece şeylerin yakalanmasını bekler ve titremeyi önler.

Hangi tuşa basıldığı bir boole kontrolüne bağlı olarak her seferinde bir piksel hareket eder, bu nedenle yan yana gitmek 5 saniyeden biraz daha uzun sürer.


2

Ayakkabı, Yakut 252 243 karakterden

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

Bu, varsayılan 600 x 500 boyutunda başlayan yeniden boyutlandırılabilir bir pencere kullanır. Pencereyi, işgalci dışarıda kalacak şekilde yeniden boyutlandırırsanız, bir sonraki hareket tuşuna basıldığında geri gelir.

Gereksinimleri karşılama hilesi, işgalcinin konumunun 4'lü artışlarla değiştirilmesidir, ancak gerçek hareket saniyede 99 karede 1'lik artışla yapılır.


2

Tcl / Tk , 242 bayt

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

Herhangi bir Linux'ta çalıştırmak için: Tcl ve Tk kurulu olmalıdır; sonra kodu bir dosyaya kopyalayın diyelim invaders.tcl; görüntünün .pngaynı klasörde olduğu gibi kaydedilmesi de gerekir . Komut dosyası türünü wish invaders.tcl bir kabukta çalıştırmak için . Not: Kod bunun yerine varsayılan kısaltılmış komutları desteklediği için etkileşimli bir kabuğa yapıştırılırsa daha golf edilebilir.
sergiol

1

JavaScript (paper.js kullanarak), 215 bayt

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 bir JS grafik çerçevesidir, yani görüntü işleme ile ilgili birçok yararlı özelliğe sahiptir. Vadede için, sadece sol bölümünde yukarıdaki kopyalamak burada , o zaman, da odaklanmak üzere sağ bölümünde bir kez tıklayın, etrafında yabancı taşımak için. Tarayıcınız işleyebilirse, 60 fps'de çalışmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.