Le falta el signo de número (#) requerido por los resultados de muestra en la pregunta.
Iszi
5
Potencia Shell: 71 52 51 41
Gracias a @manatwork por señalar, ForEach-Objectse puede usar en lugar de un forbucle.
Gracias a @Joey por señalar que podría usar -joinen la salida del bucle, en lugar de tener que ponerlo en variables.
Código de golf:
'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
Nota:
No hay ningún error al verificar aquí las entradas no válidas. El script felizmente tomará 256, 4096 y 65536 como entradas, luego la salida # 100100010000 (que obviamente no funcionará como RGB).
Sin golf, con comentarios:
# Put a hashtag in front of the output.
'#'+
# Join the nested code into one string.
-join(
# Pipe 1..3 to ForEach-Object to run a loop three times.
1..3|%{
# Take user input and format it as hex, with minimum two digits in output.
"{0:X2}"-f+(read-host)
}
)
Haz el bucle foreach($i in 1,2,3)para reducirlo a 68 caracteres.
manatwork
@manatwork No creo que esa sea la sintaxis adecuada para un foreachen PowerShell. (Al menos, no he podido hacer que funcionen algunas pruebas). Sin embargo, usando la sintaxis correcta, un alias incorporado y otro acceso directo de PowerShell que descubrí recientemente, creo que tengo algo mejor, afeitarme otros 12 caracteres de su sugerencia. (1..3)|%{...}(Inserte una declaración entre corchetes del guión existente en lugar de los puntos suspensivos). Todavía necesito probar esto completamente en el guión, ¡pero gracias por señalarme en esa dirección!
Iszi
No tengo idea de si es la sintaxis adecuada o no, pero la referencia SS64 lo foreachmenciona y funciona para mí. (No tengo idea de la versión. La que vino con Windows 7.)
manatwork
@manatwork Eso es interesante. Me gustaría investigar un poco más y descubrir qué hay de malo en eso (estaba recibiendo errores de "token inesperado '...') en otro momento. Es posible que el artículo SS64 haya sido escrito para una versión diferente de PowerShell. No estoy seguro. Por ahora, he confirmado que (1..3)|%funciona y reduce el guión a 56 caracteres. Lo editaré en la respuesta y definitivamente te daré crédito por la idea. ¡Gracias de nuevo!
Iszi
2
Oh dang Se puede conseguir que esto mediante el uso de 41 -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey
4
bash 22 21 caracteres
(Gracias @manatwork por 1 carácter usando en \lugar de comillas dobles)
Añadido 2015-10-06: bash ( método más poco ortodoxo ) 84 83 caracteres
c=({0..9} {a..f}) d=\#;for b;do for a in / %;do d+=${c[$b$a 020]};done;done;echo $d
Lo sé, podrían ser 82 caracteres si están 020escritos 16, pero prefiero esto ... O tal vez d+=${c[$b$a 0x10]}cuál fue la primera publicación.
hexcolor() {
local a b c=({0..9} {a..f}) d=\#
for b ;do
for a in / % ;do
d+=${c[$b$a 0x10]}
done
done
echo $d
}
hexcolor 72 61 139
#483d8b
hexcolor 75 0 130
#4b0082
hexcolor 0 255 127
#00ff7f
Me gusta esta respuesta :) un poco más y creo que podría decidirme si no hay nada mejor.
Quillion el
¡Frio! Solo una unpackpregunta: ¿puedes hacer que el hexadecimal sea ... mayúscula, como en la pregunta?
manatwork
@manatwork Intenté encontrar una manera de hacerlo dentro unpack, pero no tuve suerte. Una forma es usar en sprintflugar de unpack, pero eso es más largo y completamente ortodoxo. La otra forma es simplemente modificar la cadena a mayúsculas: map{uc unpack H2,chr}a un costo de tres caracteres.
breadbox
Gracias, @breadbox. Esos pequeños tramposos packy unpacknunca entran en mi estilo de codificación. Entonces es poco ortodoxo para mí.
Hola @ratchetfreak. Esto funciona para mi. Acabo de probar con gforth. Dándole 1 1 1salidas #010101. Cualquier otro valor 0-255 también funciona. ¿Qué ambiente o más estás usando?
Darren Stone
2
C (67 caracteres sin placa principal)
int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);
¡Buen trabajo! ¡Muestra que todavía tengo mucho que aprender sobre el golf!
Iszi
Oh, tu idea con las variables también fue inteligente; nunca me hubiera pasado por la cabeza. Sucede que es más largo que mi favorito habitual: -splity -join.
Puede guardar un par de bytes deshaciéndose del [byte]dado que se nos da la entrada como números enteros, y edite su salida para que sea "#$o"- eso da 31 bytes para$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork
@TimmyD no sabe si eliminar [byte] funciona correctamente en todas las versiones en una versión en la que probé (iirc 2.0 en xp) sin [byte] no estaba concatenando como hexadecimal, sino como ints, es decir, 72 61 139 fue # 7261139 no # 483d8b "# $ O" cotizaciones dentro tampoco un literal de cadena, pero evaluado cordaje que saber gracias comentarios acerca de la conversión hexadecimal se apreciará
blabb
Aparentemente, es una diferencia entre PowerShell v2 y v3: debe ser algo en cómo la versión correspondiente de .NET maneja la conversión hexadecimal, pero no puedo encontrar documentación al respecto.
(Nota: imprime '#' antes de leer la entrada --- la tarea no lo prohíbe; dado tres números en stdin produce el resultado correcto en stdout. Tampoco se molesta con las nuevas líneas, y como puede ver no 'agregue' # 'correctamente cuando se ejecute "interactivamente".)
Game Maker Language, 175 (Error en la posición 81)
Solicita RGB de 3 a 9 dígitos. Devuelve hexadecimal con signo hexadecimal GML,$
d=get_string('','')if(d=='')e=""else e="00"h="0123456789ABCDEF"while(d!=''){b=d&255i=string_char_at(h,byte div 16+1)l=string_char_at(h,byte mod 16+1)e+=i+l;d=d>>8}return '$'+e
Haz de esto un guión. Además, compile con variables no inicializadas tratadas como 0.
Casualmente, terminé escribiendo casi exactamente lo mismo que tú antes de ver el tuyo. Muy agradable =) Están lo suficientemente cerca como para que no publique el mío, pero puede guardar algunos bytes en su mapeo con esto:x=>(x<16?0:'')+x.toString(16)
Mwr247
1
Además, no es necesario incluir el r=al principio. Todavía cuenta como una función, incluso como una función anónima, ya que puede invocarla sin tener que asignar nada.
Mwr247
Whoops Significaba que el mapa era: el x=>(x<16?0:'')+(x*1).toString(16)tuyo y el primero allí dan valores incorrectos x>9.
Mwr247
Actualmente, esto regresa en #7261139lugar del #483D8Bprimer caso de prueba.
Dennis
0
Python 2, 40 bytes
s='#';exec's+="%02X"%input();'*3;print s
Lee la entrada de tres líneas separadas. Abusos execy multiplicación de cuerdas.
Respuestas:
Rubí: 19 caracteres.
Ejecución de muestra:
fuente
Rubí
Iba más por la parte "poco ortodoxa". ;)
La fuente (en mi navegador web) es un poco alta, por lo que se ve distorsionada, pero se ve mejor en Courier New:
Ejecución de muestra:
fuente
q / k (3 caracteres)
No exactamente poco ortodoxo, pero bastante corto.
Ejemplo
Para que coincida exactamente con el formato de salida en la pregunta, podemos hacer (para 9 caracteres):
fuente
Potencia Shell:
71525141Código de golf:
Nota:
No hay ningún error al verificar aquí las entradas no válidas. El script felizmente tomará 256, 4096 y 65536 como entradas, luego la salida # 100100010000 (que obviamente no funcionará como RGB).
Sin golf, con comentarios:
fuente
foreach($i in 1,2,3)
para reducirlo a 68 caracteres.foreach
en PowerShell. (Al menos, no he podido hacer que funcionen algunas pruebas). Sin embargo, usando la sintaxis correcta, un alias incorporado y otro acceso directo de PowerShell que descubrí recientemente, creo que tengo algo mejor, afeitarme otros 12 caracteres de su sugerencia.(1..3)|%{...}
(Inserte una declaración entre corchetes del guión existente en lugar de los puntos suspensivos). Todavía necesito probar esto completamente en el guión, ¡pero gracias por señalarme en esa dirección!foreach
menciona y funciona para mí. (No tengo idea de la versión. La que vino con Windows 7.)(1..3)|%
funciona y reduce el guión a 56 caracteres. Lo editaré en la respuesta y definitivamente te daré crédito por la idea. ¡Gracias de nuevo!-join
:'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
.bash
2221 caracteres(Gracias @manatwork por 1 carácter usando en
\
lugar de comillas dobles)o leyendo STDIN en un bucle: 48 caracteres:
Añadido 2015-10-06: bash ( método más poco ortodoxo )
8483 caracteresLo sé, podrían ser 82 caracteres si están
020
escritos16
, pero prefiero esto ... O tal vezd+=${c[$b$a 0x10]}
cuál fue la primera publicación.Otro enfoque bash
Esto mostrará una ventana del navegador, con:
Donde podría girar la rueda del mouse para cambiar los valores (con la tecla Mayús presionada para el paso 15) ...
fuente
printf \#%02X%02X%02X
es suficiente.d+=${c[$b$a 0x10]}
algo sexy !d+=${c[$b$a 020]}
hará el trabajo y se verá bienPerl, 31 caracteres
Es difícil hacer que un programa tan corto no sea ortodoxo, pero creo que esto funciona.
fuente
unpack
pregunta: ¿puedes hacer que el hexadecimal sea ... mayúscula, como en la pregunta?unpack
, pero no tuve suerte. Una forma es usar ensprintf
lugar deunpack
, pero eso es más largo y completamente ortodoxo. La otra forma es simplemente modificar la cadena a mayúsculas:map{uc unpack H2,chr}
a un costo de tres caracteres.pack
yunpack
nunca entran en mi estilo de codificación. Entonces es poco ortodoxo para mí.Guión de acción 3 | 43 caracteres
Salida:
#483D8B
fuente
Perl 24 caracteres
Lo sentimos, no es tan sexy como usar
unpack
, ¡pero es más corto!Versión más oscura:
Pero si realmente prefiere usar
unpack
, entonces podría:Por ejemplo, no es la versión más corta, ¡pero me gusta! (Tenga en cuenta el uso de
rand
para ordenar esto :-)fuente
> <>
10360Hizo uso del espacio en blanco desperdiciado y moví un poco de código
Ejecutar con entradas de línea de comando:
salida: "# FF2448"
fuente
Adelante, 62 caracteres
fuente
1 1 1
salidas#010101
. Cualquier otro valor 0-255 también funciona. ¿Qué ambiente o más estás usando?C (67 caracteres sin placa principal)
el uso estándar de twiddler de printf & bit
fuente
readf
? ¿No debería ser esoscanf
?Dc:
3532 caracteresEjecución de muestra:
Dc:
2724 caracteres(Pero necesita los números de entrada en líneas separadas).
Ejecución de muestra:
fuente
dc
respuestas en este sitio web.JavaScript, 89 caracteres
Convierte
72 61 139
a256*(256*(72)+61)+139
y evals TI.fuente
eval('(('+DEC.replace(/ /g,'<<8)+'))
lugar deeval('256*(256*('+DEC.replace(/ /g,')+'))
permitirle guardar 5 caracteres!PowerShell, 45
O, si se puede usar canalizando los datos, simplemente puede usar
lo que lo reduce a 42 .
fuente
-split
y-join
.PowerShell 37
guardado un byte gracias a TimmyD
fuente
[byte]
dado que se nos da la entrada como números enteros, y edite su salida para que sea"#$o"
- eso da 31 bytes para$args|%{$o+="{0:X2}"-f$_};"#$o"
R, 16 bytes
Eso es. Utiliza el incorporado.
fuente
C,
6773 caracteres (65 caracteres excluyendo principal)Programa aburrido C - muy ortodoxo.
fuente
Python 2.7 (80 caracteres)
Estoy buscando una mejor manera de manejar los valores hexadecimales de un solo dígito. ¿Algunas ideas?
fuente
Befunge-98, 45 caracteres
Bleh, código duplicado. Oh bien. Solo una implementación sencilla de conversión de radix.
Ejecución de la muestra
(Nota: imprime '#' antes de leer la entrada --- la tarea no lo prohíbe; dado tres números en stdin produce el resultado correcto en stdout. Tampoco se molesta con las nuevas líneas, y como puede ver no 'agregue' # 'correctamente cuando se ejecute "interactivamente".)
fuente
Game Maker Language, 175 (Error en la posición 81)
Solicita RGB de 3 a 9 dígitos. Devuelve hexadecimal con signo hexadecimal GML,
$
Haz de esto un guión. Además, compile con variables no inicializadas tratadas como 0.
Fuente
fuente
Gema, 93 caracteres
Ejecución de muestra:
fuente
Burlsque, 12 bytes (10 bytes para minúsculas)
Si también se permiten minúsculas, entonces 10 bytes:
Uso:
Si necesita desesperadamente mayúsculas, agregue
ZZ
:Si no recibe los enteros como en una cadena, vaya con:
Explicación:
Prueba en línea aquí .
Prima:
Para volver a convertirlo, use esto:
fuente
Powershell, 28 bytes
Script de prueba:
Salida:
fuente
Python3.3 @ 60 caracteres
No pude resistir:
fuente
Clojure 76 Personajes
Esto podría ser tarde, en aras de la integridad:
Llamadas de ejemplo:
fuente
Mathematica, 40 caracteres.
fuente
Lisp común, 39 caracteres
Lee tres enteros, devuelve una cadena.
fuente
Javascript ES6, 63 bytes
fuente
x=>(x<16?0:'')+x.toString(16)
r=
al principio. Todavía cuenta como una función, incluso como una función anónima, ya que puede invocarla sin tener que asignar nada.x=>(x<16?0:'')+(x*1).toString(16)
tuyo y el primero allí dan valores incorrectosx>9
.#7261139
lugar del#483D8B
primer caso de prueba.Python 2, 40 bytes
Lee la entrada de tres líneas separadas. Abusos
exec
y multiplicación de cuerdas.Ejemplo de uso:
fuente
Python (55 caracteres)
fuente