Proto invasores del espacio
Este es un desafío de salida gráfica donde la tarea es dar el código más corto por idioma.
Tarea
Su código debe permitir al usuario mover al siguiente alienígena por la pantalla / ventana.
Su código simplemente puede cargarlo desde un archivo local. Siéntase libre de convertirlo a otro formato de imagen estándar o incluso corregir los pequeños errores de píxeles en la imagen que se señalaron en los comentarios.
El fondo debe ser blanco y la ventana / pantalla debe tener al menos 400 píxeles por 400 píxeles. Si su idioma no admite ventanas / pantallas tan grandes, utilice el tamaño más grande que sí admite, siempre que no sea inferior a 200 por 200.
Para mover al alienígena por la pantalla, el código debe ser compatible con arriba / abajo / izquierda / derecha usando las teclas de flechas en un teclado estándar.
Su código debe ser un programa completo .
Restricciones / restricciones
El alienígena debería detenerse en las fronteras. También debe moverse a una velocidad uniforme sin problemas, sin parpadeos ni tartamudeos visibles, y debe mostrarse al menos a 24 fps. Debería llevar entre 2 y 5 segundos pasar de un lado de la pantalla / ventana al otro.
Idiomas y bibliotecas
Puede usar cualquier idioma o biblioteca que desee (que no fue diseñada para este desafío). Sin embargo, me gustaría poder probar su código si es posible, así que si puede proporcionar instrucciones claras sobre cómo ejecutarlo en Ubuntu, sería muy apreciado.
Catalogar
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntuación, se puede mantener viejas cuentas en el título, golpeándolos a través. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](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>
Respuestas:
Scratch ,
221217 bytesHaga clic en la imagen para verla en acción. El movimiento está determinado por las pulsaciones de teclas , por lo que será más suave cuanto más rápido se configure la repetición de la tecla.
La imagen se incluye dentro del proyecto, pero los bytes de Scratch generalmente se cuentan a partir de la representación textual de golf , según esta meta publicación . Si hay desacuerdo sobre si esto es aceptable (o si el movimiento es lo suficientemente suave), avíseme y trataré de solucionarlo.
fuente
Procesamiento 2,
219 199 241 220219 bytesRequiere que la imagen se guarde
.png
en el mismo directorio que el .pdefuente
Python 2,
262253246240 bytesGuau. Qué cantidad de piratería.
Utiliza el módulo 'pygame' que se encuentra en http://pygame.org .
Explicación
key.set_repeat(1)
- Enviar eventos clave repetidos a través del sistema de eventos cada milisegundoc=d.set_mode((400,)*2)
- Crear la superficie de visualización 400x400while c.fill((255,)*3):
- Efectivamentewhile 1:
pero también limpia la pantallae=event.get(2);c.blit(image.load("I"),p);d.flip()
- Solo recopila eventos del teclado, carga la imagen almacenada en un archivo png llamadoI
y dibuja. Actualiza la pantallaif 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))))
- Si hubo un evento, calcule qué tecla de flecha se presionó (hace cosas extrañas si presiona otras teclas) y luego cambie la posición de la superficie dependiendo de la tecla que presionó.fuente
Haskell, 410 bytes
La imagen del alienígena se espera en un archivo llamado
b
en.bmp
formato.Soy nuevo en la biblioteca Gloss, así que tal vez esto no sea óptimo. ¿Alguien sabe si puedo verificar si se presiona una tecla en lugar de seguimiento
KeyUp
/KeyDown
eventos?Cómo funciona: los últimos cuatro parámetros
play
son el estado mundial (inicializado con((0,0),id)
, una función para dibujar una imagen de un estado (#
), un controlador de eventos (e
) y una función que cambia el estado con el tiempo (%
).El estado es un par de coordenadas xy y una función de cómo cambiarlas cada vez que
%
se llama.#
mueve el mapa de bits (b
) a las coordenadas actuales y lo dibuja.e
busca losKeyDown
eventos de las teclas del cursor y establece las funciones apropiadas en el estado oKeyUp
cualquier tecla para restablecer la función en el estado a la función de identidad.%
aplica la función del estado a las coordenadas actuales y verifica los límites.fuente
Olmo, 240 bytes
Pruébalo aquí . El recuento de bytes es después de reemplazar la URL con
.png
.fuente
AutoIt ,
269267 bytesRequiere que la imagen se guarde como b.bmp en el directorio del script. Si desea utilizar una imagen con transparencia real, debe convertirla de PNG a un mapa de bits de 32 bits (OT: un formato realmente poco apreciado).
Explicación
Necesitamos importar
Misc.au3
para acceder_IsPressed
. Una función que acepta un código de tecla y regresaTrue
oFalse
cuando se presiona la tecla.La especificación del desafío es bastante buena en la forma en que tenemos que crear una ventana cuadrada de 400 px. Los parámetros de tamaño predeterminados (indicados como
-1
oDefault
) son 400x400. El estilo de Windows extendido se establece en34078728
. Esto obliga a que la ventana tenga doble búfer y se dibuje de abajo hacia arriba. Esto es necesario para eliminar el parpadeo según el requisito de desafío. En Windows 10, esta combinación inusual (y algo indocumentada) de estilos rompe la barra de título de la ventana (todos los efectos de desplazamiento están deshabilitados).$1
y$2
se declaran y mantendrán el desplazamiento xey de la imagen cargada por el control$0
.$3
se convierte en un puntero a la función_IsPressed
para acortar significativamente el código.Como no es necesario poder salir del programa, este script se ejecuta en un bucle infinito (
Until 0
).$1+=$3("27")-$3("25")
abusa del tipo de datos variante en AutoIt al convertir dinámicamente el valor booleano devuelto desde_IsPressed
un entero que se puede agregar o sustituir del desplazamiento x. Lo mismo para y.$1=($1>336)?336:($1<0)?0:$1
usa el operador ternario conocido de lenguajes tipo C para realizar una verificación de límites para detener al alienígena en las fronteras.GuiCtrlSetPos
mueve el control de imagen a las nuevas coordenadas.Aquí hay una captura de pantalla con un extraterrestre transparente (incluso puedes moverte en diagonal):
fuente
Lua + LÖVE, 291 caracteres
Utiliza una ventana de 400 x 400 que no se puede cambiar de tamaño. No tuve éxito con el ajuste
love.keyboard.setKeyRepeat()
para acelerar la lectura de la clave, así que hice la forma recomendada, sondeando el estado de cada clave.Como mi relación con Lua
for
no es la mejor, ni esta vez logró hacer que el bucle sea más corto que el volcado de la condición de cada clave.fuente
SpecBAS -
285255 bytesCarga la imagen: el color 15 es blanco brillante, por lo que se vuelve transparente.
El uso de la imagen original y la paleta predeterminada de SpecBAS hizo que saliera un poco extraño, por lo que la línea 2 los cambia para que coincidan con la imagen de entrada. La imagen de abajo muestra cómo se ve sin la línea 2 y después.
El comando CLAMP limita el gráfico entre 1 y 400 en ambas direcciones, guarda en varias declaraciones IF ... THEN.
La línea 9 solo espera que las cosas se pongan al día y evita el parpadeo.
Se mueve un píxel a la vez en función de una comprobación booleana de qué tecla se presiona, por lo que lleva un poco más de 5 segundos ir de lado a lado.
fuente
Rubí con zapatos,
252243 caracteresEsto utiliza una ventana de tamaño variable que comienza por defecto en 600 x 500. Si cambia el tamaño de la ventana para que el invasor quede fuera, volverá cuando se presione la siguiente tecla de movimiento.
El truco para satisfacer los requisitos es que la posición del invasor se cambia en incrementos de 4, pero el movimiento real se realiza con un incremento de 1 a 99 cuadros por segundo.
fuente
Tcl / Tk , 242 bytes
fuente
invaders.tcl
; También debe tener la imagen guardada como.png
en la misma carpeta. Para ejecutar el script, escribawish invaders.tcl
en un shell. PD: Se puede jugar mejor si el código se pega en un shell interactivo, ya que admite comandos abreviados de forma predeterminada.JavaScript (usando paper.js), 215 bytes
paper.js es un marco de gráficos JS, lo que significa que presenta muchas características útiles con respecto a la manipulación de imágenes. Para correr, simplemente copie lo anterior en la sección de la izquierda aquí , luego, para mover al alienígena, haga clic una vez en la sección derecha para enfocarlo. Si su navegador puede manejarlo, debería ejecutarse a 60 fps.
fuente