Su tarea es crear un programa que, dada una imagen de entrada, cree una imagen de salida del mismo tamaño, donde todos los píxeles se ordenan por valor hexadecimal.
Su programa puede:
- Ordene los píxeles de izquierda a derecha y luego hacia abajo o primero hacia abajo en columnas y luego hacia la derecha. En cualquier caso, el píxel superior izquierdo es el más pequeño y el inferior derecho es el más grande.
- Use transparencia, pero esto no es obligatorio.
- Ordene por RGB, pero puede usar CMY o cualquier otro formato con al menos 3 valores. Puede elegir qué valores ordenar. (HSV puede dar algunas buenas imágenes)
- Use cualquier formato de imagen conocido que la mayoría de las computadoras puedan abrir.
Reglas:
- La salida debe escribirse en el disco o ser canalizable a un archivo.
- La entrada se proporciona como un argumento de línea de comandos, en forma de una ruta relativa a la imagen, o se canaliza desde la línea de comandos.
- Este es el código de golf, por lo que gana el código más corto en bytes.
Respuestas:
Pyth - 10 bytes
Lee la imagen, contrae el mapa de bits, ordena y luego divide el mapa de bits nuevamente, luego escribe.
No funciona en línea por razones obvias. Toma la entrada como ruta relativa al archivo de imagen y las salidas en
o.png
.Salida del gótico americano:
fuente
JavaScript (ES6),
383377354 bytesDemo ejecutable:
Mostrar fragmento de código
Cómo funciona este código es usarlo
getImageData
para obtener una matriz del formularioY
map
a una variedad de la formaPara que los valores R se asignen a las matrices del conjunto RGBA, y los valores B, G y A se convierten en matrices cero de valor mínimo. Cuando clasificamos esta matriz, todas las
[0,0,0,0]
matrices se clasifican en la parte inferior y las matrices de valor real se clasifican normalmente en la parte superior:Desnatamos el cuarto superior de la matriz (para perder los valores vacíos que creamos), lo aplanamos
[].concat.apply
y terminamos con una matriz de la primera forma nuevamente, pero esta vez, está ordenada.Ligeramente fuera de golf con espacios en blanco y comentarios:
Tenga en cuenta que la mayoría de los navegadores pueden fallar al ejecutar este código para imágenes grandes, porque pasa una gran cantidad de argumentos
[].concat
. Cuando el entorno del navegador no permite suficiente memoria para todos los argumentos, un enfoque alternativo es volver a mapear los valores RGBA de las primeras cuatro matrices nuevamente en la matriz, para una puntuación total de 361 bytes :Simplemente reemplazamos el
[].concat(...{stuff}).slice(12*w*h)
con{stuff}.map((v,i,A)=>A[3*w*h+(i>>2)][i%4])
.)fuente
concat.apply
llamada está proporcionando demasiados argumentosconcat
y el motor JS la está rechazando.D:
¡Gracias! Lo arreglaré y notaré los dos puntajes. (¡Y me alegro de poder ayudar!)Mathematica
86 8372 bytesCon 14 bytes guardados gracias a @Martin Buttner.
Ejemplo
La imagen en sí es de entrada. Alternativamente, se podría usar una variable que contenga la imagen.
fuente
ImageData
yArrayReshape
podría usar la notación infija.Flatten
es lo suficientemente largo como para guardar un par de bytes asignándolo af
. ¿Y realmente lo necesitas"Byte"
? ¿El valor predeterminado simplemente no escalaría los valores del canal para[0,1]
que la clasificación y la reconstrucción de la imagen siguieran funcionando bien?Javascript ES6, 334 bytes
Sin golf:
fuente
appendChild
devuelve su argumento. ¡Muy útil! Me inspiraste a reducir mi entrada de 377 a 354, pero no puedo vencer la tuya :). (Cuando uso tu técnicaappendChild
y tu encadenamiento puedo reducirlowith
a 347, ¡pero aún así a 13!) ¡Excelente trabajo!C (usando SDL1.2),
333322315 bytesC probablemente no sea el "cuchillo más afilado del estante" para este tipo de trabajo, de todos modos quería probarlo. Consejos para mejorar mi respuesta son bienvenidos. El programa obtiene el nombre del archivo de imagen de entrada como un argumento cli.
compilar y ejecutar:
gcc -I/usr/include/SDL snippet.c -lSDL -lSDL_image && ./a.out
No suelo jugar golf en C, pero ayer acabo de responder a este desafío y solo quería seguir jugando con ese nuevo juguete :)
gracias a @ pseudonym117 por ayudarme a ahorrar 5 bytes
fuente
while
al final afor(;;SDL_Flip(s));
, y creo que puede omitirint
el métodoC
y guardar 4 más.JavaScript (ES6), 452
480484487511bytesWow, esto se hizo más largo de lo esperado:
La función toma una URL como entrada
f('test.jpg');
y dibuja el resultado en uncanvas
elemento que se adjunta abody
.Tenga en cuenta que la fuente debe estar en el mismo dominio o el script se detendrá con un problema de seguridad.
Limitaciones
Lo probé en Firefox 42 en OS X (10.10) en una máquina con i7 de 2.5 GHz y 16 GB de RAM. El tamaño máximo de imagen que podía procesar sin que Firefox pidiera continuar con la ejecución del script fue 1600 x 1932 px .
Sin golf
Salida
Para una mejor comparación, también tomé el " American Gothic " como fuente de ejemplo:
Ediciones
for (a in b)
lugar defor(;;)
. Gracias a ar34zdocument
en una variable.()
.()
creación del objeto activado y eliminando otro par de redundantes()
. Gracias a los apsillers .for
-loop que obtiene los colores de cada píxel.fuente
for(k in t)
que ahorrará algunos bytes más :)()
ennew Image()
; use cadenas de plantillas etiquetadas para sus argumentos de cadena (createElement`canvas`
,getContext`2d`
), no use paréntesis para los parámetros de funciones de flecha única (solo hagaf=u=>{...}
; los parens son solo para funciones de flecha de parámetros múltiples o parámetros cero). También es posible que tenga uno o dosfor
bucles de una sola declaración que tengan corchetes, que no son necesarios.i.onload=$=>...
lugar dei.onload=()=>...
)for(l in u)f.push(u[l]);
puede convertirsefor(z of u)f.push(z);
:)
. -for(u of t)for(z of u)f.push(z)
es bastante corto, pero se puede acortar aún mást.map(u=>u.map(z=>f.push(z)))
. En muchos casos, usar.map
o.some
con una función de flecha será más corto que usar unfor
bucle. Si quieres ir realmente loco, usted puede ahorrar aún más aquí cont.map(u=>f.push.apply(f,u));
lo que dice "Por cada serieu
ent
, el suministrou
como una lista de argumentos af.push
través deapply
(ya quepush
puede aceptar un número ilimitado de argumentos y empuja todos ellos en orden).Bash + GNU utils, 80
Esto supone que el formato de entrada / salida está en el formato .txt de enumeración de píxeles de ImageMagick. La entrada se pasa como un nombre de archivo y la salida va a STDOUT.
Si lo anterior no se considera un formato de imagen conocido, entonces podemos agregar las conversiones necesarias:
Bash + utilidades GNU + ImageMagick, 108
La entrada y la salida se especifican como nombres de archivo. ImageMagick determina qué formatos de archivo utilizar las extensiones de archivo aprobadas, por lo que podemos usar cualquiera de los formatos comunes:
El o.png resultante se ve así:
fuente
Python 2, 128 bytes
Siempre que la imagen sea un archivo llamado
a
sin extensión, la salida será un archivo llamadob
sin extensión.fuente
a.putdata(sorted(b[f/c,f%d]for f in range(d*c)))
similar (acabo de despertar, por lo que puedo haber mezclado las variables).Java, 316 bytes
Coloca los valores hexadecimales de los colores de píxeles en una matriz. La matriz se ordena y los colores se reasignan a los píxeles de la imagen. El nombre de la imagen resultante es
a.png
.fuente
SmileBASIC,
3935 bytesSuponiendo que la imagen se carga en la página de gráficos 512 * 512:
Explicado:
¡Es así de simple!
Desafortunadamente, tenemos que usar números enteros, que agregan 4 bytes al tamaño del programa debido a los sufijos de tipo.fuente
SYS/DEFSP.GRP
coloca unFF000000
en la parte superior izquierda y una00101010
en la parte inferior derecha, que es el opuesto aparente de la pregunta. El uso de flotadores pone00000000
en la parte superior izquierda yFFF8F8F8
en la parte inferior derecha, lo cual es correcto. (Por supuesto, esto trata los colores hexadecimales como canales sin signo / superiores, lo que probablemente sea correcto).0xFF000000
es más pequeño que0x00101010
), pero de todos modos, no estoy seguro de por qué usé números enteros aquí ... Creo que en la vez que no entendí cómo GLOAD usaba valores sin signo cuando usabas una matriz flotante, y simplemente asumía que no funcionaba.Java,
424417404 bytesBueno, este no es un idioma en el que quieras jugar golf ...
fuente
C #, 497 bytes
Primera publicación, primer golf. Claramente no es el mejor para jugar golf
Realmente no respetando las tuberías. Toma una ruta de la imagen como entrada y la muestra con la letra "o" antes del nombre.
Funciona mejor con mapas de bits, resultados de probabilidades con otros
fuente
Haskell, 195 bytes
Esto usa la
GD
biblioteca. Usof <filename>
. El archivo de entrada debe estar enpng
formato. El archivo de salida se llamao
.Cómo funciona: sencillo, es decir, leer la imagen, recorrer todas las coordenadas y obtener los píxeles, ordenar los píxeles, recorrer las coordenadas nuevamente, pero esta vez configure los píxeles en el orden en que aparecen en la lista ordenada, escriba el archivo en disco.
fuente