अंतरिक्ष आक्रमणकारियों पर (क्या आप इसे ब्लिट कर सकते हैं?)


18

अंतरिक्ष आक्रमणकारियों में

यह एक चित्रमय आउटपुट चुनौती है जहाँ कार्य प्रति भाषा में सबसे छोटा कोड देना है।

कार्य

आपके कोड को उपयोगकर्ता को स्क्रीन / विंडो के आसपास निम्नलिखित एलियन को स्थानांतरित करने की अनुमति देनी चाहिए।

यहाँ छवि विवरण दर्ज करें

आपका कोड इसे स्थानीय फ़ाइल से लोड कर सकता है। बेझिझक इसे दूसरे मानक छवि प्रारूप में बदलने के लिए या यहां तक ​​कि टिप्पणियों में इंगित की गई छवि में छोटी पिक्सेल त्रुटियों को ठीक करने के लिए।

पृष्ठभूमि सफेद होनी चाहिए और खिड़की / स्क्रीन 400 पिक्सेल से कम से कम 400 पिक्सेल होनी चाहिए। अगर आपकी भाषा विंडोज़ / स्क्रीन का समर्थन नहीं करती है तो बड़े आकार का सबसे बड़ा आकार का उपयोग करें जब तक कि यह 200 से 200 से कम न हो।

स्क्रीन के चारों ओर विदेशी को स्थानांतरित करने के लिए कोड को मानक कीबोर्ड पर तीर कुंजियों का उपयोग करके ऊपर / नीचे / बाएं / दाएं का समर्थन करना चाहिए।

आपका कोड एक पूर्ण कार्यक्रम होना चाहिए ।

प्रतिबंध / कमी

विदेशी को सीमाओं पर रुकना चाहिए। यह समान रूप से समान रूप से दिखाई देने वाली झिलमिलाहट या हकलाना के साथ समान रूप से चलना चाहिए और कम से कम 24fps पर दिखाया जाना चाहिए। स्क्रीन / विंडो के एक तरफ से दूसरी तरफ जाने में 2 से 5 सेकंड का समय लगना चाहिए।

भाषा और पुस्तकालय

आप अपनी पसंद की किसी भी भाषा या लाइब्रेरी का उपयोग कर सकते हैं (जो इस चुनौती के लिए डिज़ाइन नहीं की गई थी)। हालाँकि, यदि संभव हो तो मैं आपके कोड का परीक्षण करने में सक्षम होना चाहूंगा ताकि यदि आप इसे उबंटू में चलाने के लिए स्पष्ट निर्देश प्रदान कर सकें तो यह बहुत सराहनीय होगा।

सूची

इस पोस्ट के निचले भाग में स्टैक स्निपेट उत्तर से सूची बनाता है) क) प्रति भाषा में सबसे छोटे समाधान की सूची के रूप में और बी) एक समग्र लीडरबोर्ड के रूप में।

यह सुनिश्चित करने के लिए कि आपका उत्तर दिख रहा है, कृपया अपना उत्तर शीर्षक मार्कडाउन टेम्पलेट का उपयोग करके शीर्षक के साथ शुरू करें:

## Language Name, N bytes

Nआपके प्रस्तुत करने का आकार कहां है। यदि आप अपने स्कोर में सुधार करते हैं, तो आप पुराने अंकों को हेडलाइन में रख सकते हैं , उनके माध्यम से स्ट्राइक करके। उदाहरण के लिए:

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

यदि आप अपने हेडर में कई संख्याओं को शामिल करना चाहते हैं (जैसे कि आपका स्कोर दो फ़ाइलों का योग है या आप दुभाषिया ध्वज दंड को अलग से सूचीबद्ध करना चाहते हैं), तो सुनिश्चित करें कि हेडर में वास्तविक अंक अंतिम संख्या है:

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

आप भाषा के नाम को एक लिंक भी बना सकते हैं जो बाद में स्निपेट में दिखाई देगा:

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


2
क्या हम स्वयं परग्रही का निर्माण कर सकते हैं? यदि हां, तो क्या हमें तस्वीर से पिक्सेल त्रुटियों (मुझे लगता है?) को शामिल करना होगा?
mınxomaτ

@ mınxomaτ यह लिनक्स तक सीमित नहीं है! नोट "यदि संभव हो तो"।

@ नमि धन्यवाद। जोड़ा गया है कि आप इसे स्थानीय फ़ाइल से लोड कर सकते हैं।

@ mınxomaτ आप इसे स्वयं बना सकते हैं या स्थानीय फ़ाइल से लोड कर सकते हैं। मैंने पिक्सेल त्रुटियों पर ध्यान नहीं दिया था, लेकिन मुझे लगता है कि इसे लोड करना किसी भी मामले में कम कोड होगा।

क्या आप "सीमाओं पर रोक" को परिभाषित कर सकते हैं? क्या पूरे विदेशी को हर समय दिखाई देने की आवश्यकता है, या यह सीमा के बाहर आंशिक रूप से रोक सकता है?
timothymh

जवाबों:


12

स्क्रैच , 221 217 बाइट्स

इसे कार्रवाई में देखने के लिए चित्र पर क्लिक करें। आंदोलन कीस्ट्रोक्स द्वारा निर्धारित किया जाता है , इसलिए यह आपके कुंजी रिपीट को सेट करने में तेज होगा।

छवि को परियोजना के भीतर शामिल किया गया है, लेकिन स्क्रैच बाइट्स को आमतौर पर इस मेटा पोस्ट के अनुसार गोल्फ ग्राउंडुअल प्रतिनिधित्व से गिना जाता है । यदि इस बात से असहमति है कि क्या यह स्वीकार्य है (या क्या आंदोलन काफी सुचारू है) तो मुझे बताएं और मैं इसके आसपास काम करने की कोशिश करूंगा।


यह जवाब बहुत मजेदार है!

आपने इस कार्यक्रम का आकार कैसे मापा?

@ लेम्बिक दूसरा पैराग्राफ देखें।
टिमोथीम

1
217 बाइट्स में उत्पन्न होता है: स्क्रैब्लॉकs.github.io/…
ev3commander

1
@ मौरिस हां, यही "अगर किनारे पर, उछाल" आदेश का ख्याल रखता है। आप छवि पर क्लिक करके डेमो खेल सकते हैं!
15

7

प्रसंस्करण 2, 219 199 241 220 219 बाइट्स

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 के रूप में सहेजी गई छवि की आवश्यकता है


6

पायथन 2, 262 253 246 240 बाइट्स

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

वाह। क्या बहुत हैकरी।

Http://pygame.org पर पाए गए मॉड्यूल 'pygame' का उपयोग करता है ।

व्याख्या

key.set_repeat(1) - प्रत्येक मिलीसेकंड इवेंट सिस्टम के माध्यम से दोहराएँ प्रमुख घटनाओं भेजें

c=d.set_mode((400,)*2) - 400x400 डिस्प्ले सतह बनाएं

while c.fill((255,)*3):- प्रभावी रूप से, while 1:लेकिन स्क्रीन को भी साफ करता है

e=event.get(2);c.blit(image.load("I"),p);d.flip()- केवल कीबोर्ड ईवेंट्स को इकट्ठा करें, एक पीएनजी फाइल में संग्रहीत छवि को लोड करें Iऔर इसे ड्रा करें। स्क्रीन अपडेट करें

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)))) - अगर कोई ईवेंट था, तो यह पता लगाएं कि किस एरो की को दबाया गया था (यदि आप अन्य कीज़ को दबाते हैं तो अजीब सामान होता है), और उसके बाद सतह की पोज़िशन को बदल दें, जिसके आधार पर आपने की को दबाया।


मुझे वास्तव में आपका समाधान पसंद है।

@Lembik तो एक एकल बाइट फ़ाइल नाम की अनुमति है? (यानी बिना विस्तार के?)। यदि हां, तो मैं फ़ाइल नाम को पूरी तरह से बाइट काउंट से बाहर करने का सुझाव देता हूं।
mnnxoma m

@ mınxomaτ I सिंगल बाइट फ़ाइल नाम की अनुमति है लेकिन मैं एक नई स्कोरिंग योजना का आविष्कार नहीं करना चाहता।

@ लेम्बिक प्रसंस्करण एकल-बाइट फ़ाइल नाम नहीं संभाल सकता ... इसलिए यह अनुचित है।
TheDoctor

2
@ TheDoctor यह बस में: विभिन्न भाषाओं में अलग हैं! मैं प्रस्ताव करता हूं कि हम उन चुनौतियों को भी
खारिज

5

हास्केल, 410 बाइट्स

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)

विदेशी की तस्वीर नामक फ़ाइल में आशा की जाती है bमें .bmpप्रारूप।

मैं ग्लॉस लाइब्रेरी के लिए नया हूं, इसलिए शायद यह इष्टतम नहीं है। क्या किसी को पता है कि क्या मैं जांच कर सकता हूं कि क्या ट्रैकिंग KeyUp/ KeyDownईवेंट के बजाय एक कुंजी दबाया गया है ?

यह कैसे काम करता है: playविश्व के अंतिम चार पैरामीटर हैं ((0,0),id), एक राज्य ( एक तस्वीर #, एक घटना हैंडलर e) ( ) और एक फ़ंक्शन जो समय के साथ राज्य को बदलता है ( ) से चित्र बनाने के लिए एक फ़ंक्शन (प्रारंभिक , के साथ %)।

राज्य xy-निर्देशांक और एक फ़ंक्शन की एक जोड़ी है, जब भी उन्हें %बुलाया जाता है तो उन्हें कैसे बदलना है।

#बिटमैप ( b) को वर्तमान निर्देशांक में ले जाता है और उसे खींचता है।

eKeyDownकर्सर कुंजियों की घटनाओं के लिए देखता है और राज्य में उपयुक्त फ़ंक्शन सेट करता है या KeyUpपहचान समारोह में राज्य में फ़ंक्शन को रीसेट करने के लिए किसी भी कुंजी के लिए।

% फ़ंक्शन को राज्य से वर्तमान निर्देशांक पर लागू करता है और सीमाओं की जांच करता है।


मुझे हमेशा आश्चर्य होता है कि आप हास्केल में भी इस तरह का काम कर सकते हैं। धन्यवाद!

4

एल्म, 240 बाइट्स

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)

इसे यहाँ आज़माएँ । बाइट की गिनती URL को बदलने के बाद होती है .png


मुझे अब एल्म सीखना पड़ सकता है। धन्यवाद।

3

ऑटो इट , 269 267 बाइट्स

#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

स्क्रिप्ट निर्देशिका में चित्र को b.bmp के रूप में सहेजने की आवश्यकता होती है। यदि आप वास्तविक पारदर्शिता के साथ किसी चित्र का उपयोग करना चाहते हैं, तो आपको इसे PNG से 32 बिट बिटमैप (OT: वास्तव में अप्राप्य प्रारूप) में परिवर्तित करना होगा।

व्याख्या

हमें Misc.au3एक्सेस करने के लिए आयात करने की आवश्यकता है _IsPressed। एक फ़ंक्शन जो एक महत्वपूर्ण कोड को स्वीकार करता है और रिटर्न करता हैTrue या Falseजब कुंजी दबाया जाता है।

चुनौती का अनुमान इस तरह से काफी अच्छा है कि हमें 400px वर्ग विंडो बनाना होगा। डिफ़ॉल्ट (के रूप में -1या Default) आकार पैरामीटर 400x400 हैं। बढ़ाया खिड़कियों शैली के लिए सेट है34078728 । यह खिड़की को दो-बफर होने के लिए मजबूर करता है और नीचे से ऊपर तक खींचा जाता है। चुनौती की आवश्यकता के अनुसार टिमटिमा को खत्म करना आवश्यक है। विंडोज 10 में, शैलियों का यह असामान्य (और कुछ हद तक अनिर्दिष्ट) संयोजन खिड़की शीर्षक बार को तोड़ता है (सभी मँडरा प्रभाव अक्षम हैं)।

$1और $2घोषित किए गए हैं और नियंत्रण द्वारा लोड की गई तस्वीर के x और y ऑफसेट को पकड़ेंगे $0$3फ़ंक्शन के लिए एक पॉइंटर बन जाता है_IsPressedकोड को काफी छोटा का ।

चूंकि कार्यक्रम से बाहर निकलने में सक्षम होने की आवश्यकता नहीं है, इसलिए यह स्क्रिप्ट अनंत लूप ( Until 0) में चलती है ।

$1+=$3("27")-$3("25")AutoIt में वैरिएंट डेटाटाइप को गाली देते हुए बूलियन मान _IsPressedको एक पूर्णांक से लौटाया जाता है जिसे x ऑफ़सेट से जोड़ा या सबड किया जा सकता है। उसी के लिए। $1=($1>336)?336:($1<0)?0:$1सीमाओं पर विदेशी को रोकने के लिए एक सीमा जाँच करने के लिए C- जैसी भाषाओं से जानी जाने वाली टर्नेरी ऑपरेटर का उपयोग करता है।

GuiCtrlSetPos नए निर्देशांक के लिए तस्वीर नियंत्रण ले जाता है।

यहां एक पारदर्शी एलियन वाला स्क्रीनशॉट है (आप तिरछे तरीके से भी हिल सकते हैं):

स्क्रीनशॉट


आपकी पृष्ठभूमि सफेद नहीं है!
सर्गिओल

2

Lua + LuaVE, 291 वर्ण

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

यह एक अनौपचारिक 400 x 400 विंडो का उपयोग करता है। मुझे love.keyboard.setKeyRepeat()कुंजी पढ़ने की गति को समायोजित करने में कोई सफलता नहीं मिली , इसलिए मैंने प्रत्येक कुंजी की स्थिति को देखते हुए, अनुशंसित तरीका किया।

जैसा कि लुआ के साथ मेरा संबंध forसबसे अच्छा नहीं है, न ही इस बार प्रत्येक कुंजी की स्थिति के डंप हार्डकोडिंग की तुलना में लूपिंग को कम करने में कामयाब रहे।


2

SpecBAS - 285 255 बाइट्स

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

छवि को लोड करता है - रंग 15 उज्ज्वल सफेद है, ताकि पारदर्शी हो जाए।

मूल छवि और डिफ़ॉल्ट स्पेसबेट पैलेट का उपयोग करके इसे थोड़ा अजीब बना दिया गया है, इसलिए लाइन 2 इनपुट छवि से मेल खाने के लिए उन्हें चारों ओर स्विच करता है। नीचे दी गई छवि दिखाती है कि यह बिना लाइन 2 और उसके बाद कैसा दिखता है।

यहाँ छवि विवरण दर्ज करें

क्लैंप कमांड दोनों दिशाओं में 1 और 400 के बीच ग्राफिक को सीमित करता है, कई IF पर बचाता है ... कुछ कथन।

लाइन 9 बस चीजों को पकड़ने के लिए इंतजार करती है और झिलमिलाहट को रोकती है।

यह बूलियन चेक के आधार पर एक समय में एक पिक्सेल ले जाता है जिसमें कुंजी दबाया जाता है, इसलिए साइड से दूसरी तरफ जाने में 5 सेकंड से अधिक समय लगता है।


2

रूबी विद शूज़, 252 243 अक्षर

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

यह डिफ़ॉल्ट 600 x 500 पर शुरू होने वाली एक resizable विंडो का उपयोग करता है। यदि आप विंडो का आकार बदलते हैं, तो हमलावर को छोड़ दिया जाता है, अगली आंदोलन कुंजी दबाने पर वापस आ जाएगी।

आवश्यकताओं को पूरा करने की चाल यह है कि हमलावर की स्थिति 4 के वेतन वृद्धि में बदल जाती है, लेकिन वास्तविक आंदोलन 99 फ्रेम प्रति सेकंड में 1 की वृद्धि के साथ किया जाता है।


2

Tcl / Tk , 242 बाइट्स

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

इसे किसी भी लिनक्स में चलाने के लिए: आपके पास Tcl और Tk स्थापित होना चाहिए; फिर कोड को फ़ाइल में कॉपी करें, मान लें invaders.tcl; आपको .pngउसी फ़ोल्डर में छवि को सहेजने की भी आवश्यकता है । स्क्रिप्ट प्रकार wish invaders.tcl को शेल में चलाने के लिए । PS: यदि कोड को इंटरेक्टिव शेल में पेस्ट किया जाता है, तो यह अधिक गोल्फ हो सकता है, क्योंकि यह डिफ़ॉल्ट संक्षिप्त कमांड द्वारा समर्थन करता है।
सर्गिओल

1

जावास्क्रिप्ट (पेपर का उपयोग करके), 215 बाइट्स

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 एक जेएस ग्राफिक्स फ्रेमवर्क है, जिसका अर्थ है कि यह छवि हेरफेर के बारे में कई उपयोगी विशेषताएं पेश करता है। चलाने के लिए, बस बाईं ओर दिए गए अनुभाग में उपरोक्त कॉपी करें , फिर, चारों ओर विदेशी को स्थानांतरित करने के लिए, उसे ध्यान देने के लिए दाएं अनुभाग में एक बार क्लिक करें। यदि आपका ब्राउज़र इसे संभाल सकता है, तो इसे 60fps पर चलना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.