Esta función debe tomar cuatro entradas enteros ( a
, b
, c
, d
) y devolver una palabra binaria basan en la que los valores son iguales a la máxima de la cuatro.
El valor de retorno estará entre 1
y 0xF
.
Por ejemplo:
a = 6, b = 77, c = 1, d = 4
retornos 2
(binario 0010
; solo se establece el segundo bit menos significativo correspondiente a b
ser el único valor máximo)
a = 4, b = 5, c = 10, d = 10
retornos 0xC
(binario 1100
; 3º y 4º conjunto de bits menos significativos correspondientes c
e d
iguales al valor máximo)
a = 1, b = 1, c = 1, d = 1
retornos 0xF
(binario 1111
; los cuatro bits establecidos porque todos los valores son iguales al máximo)
Aquí hay una implementación simple:
int getWord(int a, int b, int c, int d)
{
int max = a;
int word = 1;
if (b > max)
{
max = b;
word = 2;
}
else if (b == max)
{
word |= 2;
}
if (c > max)
{
max = c;
word = 4;
}
else if (c == max)
{
word |= 4;
}
if (d > max)
{
word = 8;
}
else if (d == max)
{
word |= 8;
}
return word;
}
el valor de retorno puede ser una cadena de 0 y 1, un vector bool / bit o un entero
Respuestas:
Jalea , 2 bytes
Toma entrada como
[d,c,b,a]
. Devuelve una lista de booleanos.Pruébalo en línea!
Ṁ
M Aximum=
igual a (implica que el otro argumento es el argumento original; vectorises)fuente
R , 17 bytes
Pruébalo en línea!
Devuelve un vector de booleanos. Como esta salida ha sido confirmada, es preferible a la salida numérica, ya que esa es casi dos veces más larga:
R , 33 bytes
Pruébalo en línea!
fuente
APL (Dyalog Unicode) , SBCS de 4 bytes
Función de prefijo tácito anónimo. Toma
[a,b,c,d]
como argumento. Devuelve una matriz booleana de bits. *Pruébalo en línea!
⌈/
¿El máximo del argumento=
igual (vectorises)⌽
¿El reverso del argumento?* Tenga en cuenta que APL almacena matrices de booleanos usando un bit por valor, por lo que esto realmente devuelve una palabra de 4 bits, a pesar de la forma de visualización
0 0 1 0
.fuente
Haskell ,
2018 bytes2 bytes guardados gracias al orgulloso haskeller
Pruébalo en línea!
fuente
map
lugar de(<$>)
sería dos bytes más corto!Perl 6 , 12 bytes
Pruébalo en línea!
Bloque de código anónimo que toma una lista de enteros y devuelve una lista de booleanos. Si necesitamos regresar como un número, son +4 bytes para envolver el interior del bloque de código
2:[...]
.Explicación:
fuente
Japt, 5
¡Intentalo!
-4 bytes gracias a @Oliver!
-2 bytes gracias a @Shaggy!
La entrada es una matriz de 4 elementos en el siguiente formato:
La salida es una matriz de bits.
fuente
rw
conversosr("w")
hacen una reducción al obtener repetidamente el máximo. Lo mismo conm¶
convertirse aU.m("===", ...)
. En cualquier caso, gracias por los consejos!Código de máquina x86 (MMX / SSE1), 26 bytes (4x int16_t)
Código de máquina x86 (SSE4.1), 28 bytes (4x int32_t o uint32_t)
Código de máquina x86 (SSE2), 24 bytes (4x float32) o 27B para cvt int32
(La última versión que convierte int32 en flotante no es perfectamente precisa para enteros grandes que se redondean al mismo flotante. Con la entrada flotante, el problema es el redondeador y esta función funciona correctamente si no hay NaN, identificando flotantes que se comparan == al máximo Las versiones enteras funcionan para todas las entradas, tratándolas como complemento de 2 firmado).
Todo esto funciona en modo 16/32/64 bits con el mismo código de máquina.
Una convención de llamadas de stack-args haría posible recorrer los args dos veces (encontrar max y luego comparar), posiblemente dándonos una implementación más pequeña, pero no he probado ese enfoque.
x86 SIMD tiene un mapa de bits vector-> entero como una sola instrucción (
pmovmskb
omovmskps
pd), por lo que era natural para esto a pesar de que las instrucciones MMX / SSE tienen al menos 3 bytes de longitud. Las instrucciones SSSE3 y posteriores son más largas que SSE2, y las instrucciones MMX / SSE1 son las más cortas. Sepmax*
introdujeron diferentes versiones de (max. Entero vertical empaquetado) en diferentes momentos, con SSE1 (para mmx regs) y SSE2 (para xmm regs) solo con palabra firmada (16 bits) y byte sin firmar.(
pshufw
ypmaxsw
en los registros MMX son nuevos con Katmai Pentium III, por lo que realmente requieren SSE1, no solo el bit de la función MMX CPU).Esto se puede llamar desde C como
unsigned max4_mmx(__m64)
con el i386 System V ABI, que pasa un__m64
argumento enmm0
. (No x86-64 System V, que pasa__m64
enxmm0
!)Si hubiera un
pmovmskw
, lo que habría guardado elpacksswb
y eland
(3 + 2 bytes). No necesitamosand eax, 0x0f
porquepmovmskb
en un registro MMX ya ceramos los bytes superiores. Los registros MMX tienen solo 8 bytes de ancho, por lo que AL de 8 bits cubre todos los posibles bits distintos de cero.Si supiéramos que nuestras entradas no son negativas, podríamos
packsswb mm1, mm0
producir bytes con signo no negativo en los 4 bytes superiores demm1
, evitando la necesidad deand
despuéspmovmskb
. Así 24 bytes.El paquete x86 con saturación con signo trata la entrada y la salida como con signo, por lo que siempre conserva el bit de signo. ( https://www.felixcloutier.com/x86/packsswb:packssdw ). Dato curioso: el paquete x86 con saturación sin signo todavía trata la entrada como firmada. Esta podría ser la razón
PACKUSDW
por la que no se introdujo hasta SSE4.1, mientras que las otras 3 combinaciones de tamaño y firma existieron desde MMX / SSE2.O con enteros de 32 bits en un registro XMM (y en
pshufd
lugar depshufw
), cada instrucción necesitaría un byte de prefijo más, excepto paramovmskps
reemplazar el paquete / y. Peropmaxsd
/pmaxud
necesita un byte extra extra ...invocable desde C como
unsigned max4_sse4(__m128i);
con x86-64 System V, o MSVC vectorcall (-Gv
), ambos pasan__m128i
/__m128d
/__m128
args en los registros XMM que comienzan conxmm0
.O si aceptamos la entrada como
float
, podemos usar las instrucciones SSE1. Elfloat
formato puede representar una amplia gama de valores enteros ...O si cree que eso está doblando las reglas demasiado, comience con un byte
0F 5B C0 cvtdq2ps xmm0, xmm0
para convertir, haciendo una función de 27 bytes que funcione para todos los enteros que son exactamente representables como IEEE binary32float
, y muchas combinaciones de entradas donde algunas de las entradas obtienen redondeado a un múltiplo de 2, 4, 8 o lo que sea durante la conversión. (Por lo tanto, es 1 byte más pequeño que la versión SSE4.1 y funciona en cualquier x86-64 con solo SSE2).Si alguna de las entradas flotantes es NaN, tenga en cuenta que
maxps a,b
se implementa exactamente(a<b) ? a : b
, manteniendo el elemento del segundo operando en desordenado . Por lo tanto, es posible que esto regrese con un mapa de bits distinto de cero, incluso si la entrada contiene algo de NaN, dependiendo de dónde se encuentren.unsigned max4_sse2(__m128);
copiar y mezclar con
pshufd
sigue siendo nuestra mejor apuesta:shufps dst,src,imm8
lee la entrada para la mitad bajadst
dedst
. Y necesitamos un copy-and-shuffle no destructivo las dos veces, por lo que 3-bytemovhlps
yunpckhps
/ pd están fuera. Si estuviéramos reduciendo a un máximo escalar, podríamos usarlos, pero cuesta emitir otra instrucción antes de comparar si no tenemos el máximo en todos los elementos.Relacionado: SSE4.1
phminposuw
puede encontrar la posición y el valor del mínimouint16_t
en un registro XMM. No creo que sea una ganancia restar 65535 para usarlo como máximo, pero veo una respuesta SO sobre cómo usarlo para un máximo de bytes o enteros con signo.fuente
Python 3.8 (prelanzamiento) , 67 bytes
Función Lambda que toma 4 enteros, el bit cambia el resultado booleano de su comparación al valor máximo con la ayuda del nuevo operador de asignación de Python 3.8 , y devuelve el OR bit a bit de los resultados
Pruébalo en línea!
fuente
Java (JDK) , 78 bytes
Pruébalo en línea!
[a,b,c,d]
.fuente
05AB1E ,
32 bytesEntrada como una lista de
[d,c,b,a]
, salida como una lista de booleanos.Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
JavaScript (ES6), 30 bytes
Toma entrada como
([d,c,b,a])
. Devuelve 4 valores booleanos.Pruébalo en línea!
fuente
Ruby ,
3422 bytesToma la entrada como una matriz
[d, c, b, a]
y devuelve una matriz de 1s y 0s.Pruébalo en línea!
fuente
Python 3 ,
59 bytes66 bytesPruébalo en línea!
Toma entrada como
[a,b,c,d]
y genera una lista de booleanos.Editado para que sea una función adecuada, luego guardó 2 bytes eliminando los corchetes alrededor del condicional.
fuente
1. Python 3.5, 90 bytes
Toma secuencia de números como parámetros. Devuelve una cadena "binaria"
ejemplo:
Explicación
fuente
C # (compilador interactivo de Visual C #) , 26 bytes
Pruébalo en línea!
Toma entrada en formato
[d,c,b,a]
. Todos los demás a continuación toman entrada como[a,b,c,d]
C # (compilador interactivo de Visual C #) , 35 bytes
Devuelve un
IEnumerable<bool>
.Pruébalo en línea!
C # (compilador interactivo de Visual C #) , 39 bytes
Devuelve un
IEnumerable<int>
, que representa bits.Pruébalo en línea!
C # (compilador interactivo de Visual C #) , 49 bytes
Imprime una cadena binaria en STDOUT.
Pruébalo en línea!
fuente
IEnumerable<bool>
es aceptablePHP, 54 bytes
o
tomar datos de los argumentos de la línea de comandos. Corre con ellos
-nr
o pruébalos en línea .fuente
Aquí hay una versión JS que sale como binaria
actualización: más corta con join, y sin la búsqueda:
JavaScript (Node.js) , 42 bytes
Pruébalo en línea!
Anterior, con búsqueda, 49 bytes
Pruébalo en línea!
Anterior, con reducción, 52 bytes:
Pruébalo en línea!
fuente
[0,1][...]
C # (compilador interactivo de Visual C #) , 51 bytes
Pruébalo en línea!
Arriba hay una función anónima que se genera modificando un argumento . La salida es una matriz de 1 y 0.
A continuación se muestra una función recursiva que genera un número entero.
C # (compilador interactivo de Visual C #) , 60 bytes
Pruébalo en línea!
Ambas funciones toman la entrada como una matriz de 4 elementos.
fuente
Python 2 , 35 bytes
Pruébalo en línea!
Toma información en el formato [d, c, b, a] como con la respuesta aceptada de Adám, así que supongo que está bien.
Alternativa para 41 si no es ...
Python 2 , 41 bytes
Pruébalo en línea!
fuente
Python 3 , 42 bytes
Simplemente devuelve una lista de si el elemento es el máximo para cada elemento en la entrada. -2 bytes si no cuenta la
f=
asignación.Pruébalo en línea!
fuente
f=
no cuenta excepto en funciones recursivasLote, 92 bytes
Toma argumentos como parámetros de línea de comandos en orden inverso. Funciona calculando aritméticamente el máximo de los parámetros reduciéndolos y agregando solo diferencias positivas del máximo en ejecución, luego mapeando cada parámetro nuevamente esta vez comparándolo con el máximo. Convenientemente
cmd/cset/a
no genera una nueva línea, por lo que los resultados se concatenan automáticamente. El%f%
simplemente ahorra 5 bytes en lo que sería una construcción repetida.fuente