Najeźdźcy z kosmosu
Jest to graficzne wyzwanie wyjściowe, w którym zadaniem jest podanie najkrótszego kodu dla każdego języka.
Zadanie
Twój kod powinien umożliwiać użytkownikowi poruszanie się po kosmicie po ekranie / oknie.
Twój kod może po prostu załadować go z pliku lokalnego. Możesz go przekonwertować na inny standardowy format obrazu, a nawet naprawić błędy małych pikseli w obrazie, które zostały wskazane w komentarzach.
Tło powinno być białe, a okno / ekran musi mieć co najmniej 400 pikseli na 400 pikseli. Jeśli twój język nie obsługuje tak dużych okien / ekranów, użyj największego rozmiaru, który obsługuje, o ile nie jest to mniej niż 200 na 200.
Aby przesunąć kosmitę po ekranie, kod powinien obsługiwać górę / dół / lewo / prawo za pomocą klawiszy strzałek na standardowej klawiaturze.
Twój kod powinien być pełnym programem .
Ograniczenia / ograniczenia
Cudzoziemiec powinien zatrzymać się na granicach. Powinien także poruszać się z równomierną prędkością płynnie, bez widocznego migotania lub jąkania i pokazywany co najmniej 24 kl./s. Przejście z jednej strony ekranu / okna na drugą powinno zająć od 2 do 5 sekund.
Języki i biblioteki
Możesz użyć dowolnego języka lub biblioteki, która Ci się podoba (która nie została zaprojektowana do tego wyzwania). Chciałbym jednak móc przetestować twój kod, jeśli to możliwe, więc jeśli możesz podać jasne instrukcje dotyczące uruchamiania go w Ubuntu, byłoby to bardzo mile widziane.
Katalog
Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań według języka oraz b) jako ogólnej tabeli wyników.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 62426; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 9206; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Odpowiedzi:
Scratch ,
221217 bajtówKliknij obraz, aby zobaczyć go w akcji. Ruch jest określany przez naciśnięcia klawiszy , więc będzie on płynniejszy, im szybciej zostanie ustawione powtarzanie klawiszy.
Obraz jest zawarty w projekcie, ale bajty Scratch są zwykle liczone od golfowej reprezentacji tekstowej według tego meta postu . Jeśli istnieje spór co do tego, czy jest to dopuszczalne (lub czy ruch jest wystarczająco płynny), daj mi znać, a ja postaram się go obejść.
źródło
Przetwarzanie 2,
219 199 241 220219 bajtówWymaga obrazu zapisanego jak
.png
w tym samym katalogu co .pdeźródło
Python 2,
262253246240 bajtówŁał. Co za hackery.
Używa modułu „pygame” znalezionego na stronie http://pygame.org .
Wyjaśnienie
key.set_repeat(1)
- Wysyłaj powtarzające się kluczowe zdarzenia przez system zdarzeń co milisekundęc=d.set_mode((400,)*2)
- Utwórz powierzchnię wyświetlania 400 x 400while c.fill((255,)*3):
- Efektywniewhile 1:
ale także czyści ekrane=event.get(2);c.blit(image.load("I"),p);d.flip()
- Zbieraj tylko zdarzenia klawiatury, załaduj obraz zapisany w pliku png o nazwieI
i narysuj go. Zaktualizuj ekranif 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))))
- Jeśli wystąpiło zdarzenie, sprawdź, który klawisz strzałki został naciśnięty (robi dziwne rzeczy, jeśli naciśniesz inne klawisze), a następnie zmień położenie powierzchni w zależności od tego, który klawisz został naciśnięty.źródło
Haskell, 410 bajtów
Zdjęcie kosmity jest oczekiwane w pliku o nazwie
b
w.bmp
formacie.Jestem nowy w bibliotece Gloss, więc może to nie jest optymalne. Czy ktoś wie, czy mogę sprawdzić, czy naciśnięto klawisz zamiast śledzenia
KeyUp
/KeyDown
zdarzeń?Jak to działa: ostatnie cztery parametry
play
to stan świata (zainicjowany((0,0),id)
, funkcja rysująca obraz ze stanu (#
), moduł obsługi zdarzeń (e
) i funkcja zmieniająca stan w czasie (%
).Stan to para współrzędnych xy i funkcja zmiany ich przy każdym
%
wywołaniu.#
przesuwa bitmapę (b
) na bieżące współrzędne i rysuje ją.e
wyszukujeKeyDown
zdarzenia klawiszy kursora i ustawia odpowiednie funkcje w stanie lubKeyUp
dowolnego klawisza, aby zresetować funkcję w stanie do funkcji tożsamości.%
stosuje funkcję od stanu do bieżących współrzędnych i sprawdza granice.źródło
Wiąz 240 bajtów
Wypróbuj tutaj . Liczba bajtów następuje po zamianie adresu URL na
.png
.źródło
AutoIt ,
269267 bajtówWymaga zapisania obrazu jako b.bmp w katalogu skryptów. Jeśli chcesz użyć obrazu z faktyczną przezroczystością, musisz przekonwertować go z PNG na 32-bitową mapę bitową (OT: naprawdę niedoceniony format).
Wyjaśnienie
Musimy zaimportować,
Misc.au3
aby uzyskać dostęp do_IsPressed
. Funkcja, która akceptuje kod klucza i zwraca goTrue
lubFalse
po naciśnięciu klawisza.Specyfikacja wyzwania jest całkiem fajna, ponieważ musimy stworzyć kwadratowe okno o wielkości 400 pikseli. Domyślne parametry rozmiaru (oznaczone jako
-1
lubDefault
) to 400 x 400. Styl rozszerzonego systemu Windows jest ustawiony na34078728
. Wymusza to podwójne buforowanie okna i rysowanie od dołu do góry. Jest to konieczne, aby wyeliminować migotanie zgodnie z wymaganiami wyzwania. W systemie Windows 10 ta niezwykła (i nieco nieudokumentowana) kombinacja stylów łamie pasek tytułu okna (wszystkie efekty aktywowania są wyłączone).$1
i$2
są zadeklarowane i będą zawierać przesunięcie xiy obrazu załadowanego przez układ sterowania$0
.$3
staje się wskaźnikiem funkcji,_IsPressed
który znacznie skraca kod.Ponieważ nie jest wymagane, aby móc wyjść z programu, skrypt ten działa w nieskończonej pętli (
Until 0
).$1+=$3("27")-$3("25")
nadużywa wariantu typu danych w AutoIt, dynamicznie rzutując wartość logiczną zwróconą z_IsPressed
na liczbę całkowitą, którą można dodać lub podnosić z przesunięcia x. To samo dla y.$1=($1>336)?336:($1<0)?0:$1
używa operatora trójskładnikowego znanego z języków podobnych do C do wykonania kontroli granic, aby zatrzymać kosmitę na granicach.GuiCtrlSetPos
przesuwa kontrolkę obrazu do nowych współrzędnych.Oto zrzut ekranu z przezroczystym kosmitą (możesz nawet poruszać się po przekątnej):
źródło
Lua + LÖVE, 291 znaków
Wykorzystuje to okno o nieograniczonych rozmiarach 400 x 400. Nie udało mi się dostosować
love.keyboard.setKeyRepeat()
do przyspieszenia odczytu klucza, więc zrobiłem to w zalecany sposób, sprawdzając status każdego klucza.Ponieważ moja relacja z Luą
for
nie jest najlepsza, ani tym razem nie udało się sprawić, by pętla była krótsza niż zrzutowanie na stałe stanu każdego klucza.źródło
SpecBAS -
285255 bajtówŁaduje obraz - kolor 15 jest jasny biały, dzięki czemu staje się przezroczysty.
Użycie oryginalnego obrazu i domyślnej palety SpecBAS sprawiło, że wyszło ono nieco dziwnie, więc linia 2 przełącza je, aby dopasować do obrazu wejściowego. Poniższe zdjęcie pokazuje, jak to wygląda bez linii 2 i po niej.
Komenda CLAMP ogranicza grafikę między 1 a 400 w obu kierunkach, zapisuje kilka instrukcji IF ... THEN.
Linia 9 po prostu czeka, aż rzeczy nadrobią zaległości i zapobiegnie migotaniu.
Porusza się o jeden piksel na raz w oparciu o logiczne sprawdzenie, który klawisz jest wciśnięty, więc przejście z boku na bok zajmuje nieco więcej niż 5 sekund.
źródło
Rubin z butami,
252243 znakówWykorzystuje to okno o zmiennym rozmiarze, zaczynające się domyślnie 600 x 500. Jeśli zmienisz rozmiar okna, aby najeźdźca został pominięty, wróci po naciśnięciu klawisza następnego ruchu.
Sztuczka, by spełnić te wymagania, polega na tym, że pozycja najeźdźcy zmienia się w krokach co 4, ale rzeczywisty ruch wykonuje się w krokach co 1 przy 99 klatkach na sekundę.
źródło
Tcl / Tk , 242 bajty
źródło
invaders.tcl
; musisz także zapisać obraz jak.png
w tym samym folderze. Aby uruchomić skrypt, wpiszwish invaders.tcl
w powłoce. PS: Może być bardziej golfowy, jeśli zamiast tego wkleja się kod w interaktywną powłokę, ponieważ obsługuje domyślnie skrócone polecenia.JavaScript (przy użyciu paper.js), 215 bajtów
paper.js to framework graficzny JS, co oznacza, że zawiera wiele przydatnych funkcji związanych z manipulowaniem obrazami. Aby uruchomić, po prostu skopiuj powyższe do sekcji po lewej stronie , a następnie, aby przesunąć kosmitę, kliknij raz w prawej sekcji, aby go ustawić. Jeśli twoja przeglądarka sobie z tym poradzi, powinna działać przy 60 klatkach na sekundę.
źródło