Esta função deve ter quatro entradas inteiras ( a
, b
, c
, d
) e retornar uma palavra binária com base no qual os valores igualar o máximo de quatro.
O valor de retorno será entre 1
e 0xF
.
Por exemplo:
a = 6, b = 77, c = 1, d = 4
retorna 2
(binário 0010
; apenas o segundo bit menos significativo é definido, correspondendo ao b
valor máximo único)
a = 4, b = 5, c = 10, d = 10
retornos 0xC
(binários 1100
; 3º e 4º bits menos significativos configurados, correspondentes c
e d
iguais ao valor máximo)
a = 1, b = 1, c = 1, d = 1
retorna 0xF
(binário 1111
; todos os quatro bits definidos porque todos os valores são iguais ao máximo)
Aqui está uma implementação simples:
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;
}
O valor de retorno pode ser uma sequência de 0 e 1, vetor bool / bit ou número inteiro
Respostas:
Geléia , 2 bytes
Toma entrada como
[d,c,b,a]
. Retorna uma lista de booleanos.Experimente online!
Ṁ
M aximum=
igual a (implica que o outro argumento é o argumento original; vetoriza)fonte
R , 17 bytes
Experimente online!
Retorna um vetor de booleanos. Como essa saída foi confirmada, é preferível à saída numérica, pois essa é quase duas vezes maior:
R , 33 bytes
Experimente online!
fonte
APL (Dyalog Unicode) , SBCS de 4 bytes
Função de prefixo tácito anônimo. Toma
[a,b,c,d]
como argumento. Retorna uma matriz bit-booleana. *Experimente online!
⌈/
O máximo do argumento=
igual (vetoriza)⌽
o contrário do argumento?* Observe que o APL armazena matrizes de booleanos usando um bit por valor; portanto, isso realmente retorna uma palavra de 4 bits, apesar da forma de exibição
0 0 1 0
.fonte
Haskell ,
2018 bytes2 bytes economizados graças ao orgulhoso haskeller
Experimente online!
fonte
map
vez de(<$>)
seria dois bytes mais curto!Perl 6 , 12 bytes
Experimente online!
Bloco de código anônimo que pega uma lista de números inteiros e retorna uma lista de booleanos. Se precisarmos retornar como um número, são +4 bytes para envolver o interior do bloco de código
2:[...]
.Explicação:
fonte
Japt, 5
Tente!
-4 bytes graças a @Oliver!
-2 bytes graças a @Shaggy!
A entrada é uma matriz de 4 elementos no seguinte formato:
A saída é uma matriz de bits.
fonte
rw
converte emr("w")
reduz, obtendo repetidamente o máximo. O mesmo comm¶
a conversão paraU.m("===", ...)
. De qualquer forma, obrigado pelas dicas!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 ou uint32_t)
código de máquina x86 (SSE2), 24 bytes (4x float32) ou 27B para cvt int32
(A última versão que converte int32 em float não é perfeitamente precisa para números inteiros grandes que arredondam para o mesmo float. Com a entrada float, o arredondamento é o problema do chamador e essa função funciona corretamente se não houver NaNs, identificando os floats que comparam == ao máximo. As versões inteiras funcionam para todas as entradas, tratando-as como um complemento assinado de 2.)
Tudo isso funciona no modo 16/32/64 bits com o mesmo código de máquina.
Uma convenção de chamada stack-args tornaria possível fazer um loop sobre os argumentos duas vezes (localizando max e depois comparando), possivelmente nos fornecendo uma implementação menor, mas ainda não tentei essa abordagem.
O x86 SIMD possui bitmap vetor-> inteiro como uma única instrução (
pmovmskb
oumovmskps
pd); portanto, era natural para isso, embora as instruções MMX / SSE tenham pelo menos 3 bytes de comprimento. As instruções SSSE3 e posteriores são mais longas que SSE2 e as instruções MMX / SSE1 são as mais curtas. Versões diferentes depmax*
(máximo vertical inteiro compactado) foram introduzidas em momentos diferentes, com SSE1 (para mmx regs) e SSE2 (para xmm regs) tendo apenas palavra assinada (16 bits) e byte não assinado.(
pshufw
epmaxsw
nos registros MMX são novos no Katmai Pentium III, eles realmente requerem SSE1, não apenas o bit de recurso da CPU MMX.)É possível chamar a partir de C, como
unsigned max4_mmx(__m64)
no i386 System V ABI, que passa um__m64
argumentomm0
. (Não x86-64 System V, que passa__m64
emxmm0
!)Se houvesse um
pmovmskw
, o que teria salvo opacksswb
e oand
(3 + 2 bytes). Não precisamos,and eax, 0x0f
porquepmovmskb
em um registrador MMX já zeros os bytes superiores. Os registros MMX têm apenas 8 bytes de largura, portanto, o AL de 8 bits cobre todos os bits diferentes de zero possíveis.Se soubéssemos que nossas entradas não eram negativas, poderíamos
packsswb mm1, mm0
produzir bytes assinados não negativos nos 4 bytes superiores demm1
, evitando a necessidade deand
depoispmovmskb
. Assim, 24 bytes.O pacote x86 com saturação assinada trata a entrada e a saída como assinadas, preservando sempre o bit de sinal. ( https://www.felixcloutier.com/x86/packsswb:packssdw ). Curiosidade: o pacote x86 com saturação não assinada ainda trata a entrada como assinada. Talvez por isso
PACKUSDW
não tenha sido introduzido até o SSE4.1, enquanto as outras três combinações de tamanho e assinatura existiam desde o MMX / SSE2.Ou com números inteiros de 32 bits em um registro XMM (e em
pshufd
vez depshufw
), todas as instruções precisariam de mais um byte de prefixo, exceto paramovmskps
substituir o pacote / e. Maspmaxsd
/pmaxud
preciso de um byte extra extra ...pode ser chamado de C como
unsigned max4_sse4(__m128i);
no x86-64 System V ou MSVC vectorcall (-Gv
), sendo que ambos passam__m128i
/__m128d
/__m128
args nos registros XMM começando comxmm0
.Ou, se aceitarmos a entrada como
float
, podemos usar as instruções SSE1. Ofloat
formato pode representar uma ampla gama de valores inteiros ...Ou se você acha que isso está distorcendo as regras demais, comece com 3 bytes
0F 5B C0 cvtdq2ps xmm0, xmm0
para converter, criando uma função de 27 bytes que funciona para todos os números inteiros que são exatamente representáveis como IEEE binary32float
e muitas combinações de entradas nas quais algumas das entradas são obtidas . arredondado para um múltiplo de 2, 4, 8 ou o que for durante a conversão. (Portanto, é 1 byte menor que a versão SSE4.1 e funciona em qualquer x86-64 com apenas SSE2.)Se alguma das entradas flutuantes for NaN, observe que é
maxps a,b
implementado exatamente(a<b) ? a : b
, mantendo o elemento do 2º operando em desordenado . Portanto, pode ser possível retornar com um bitmap diferente de zero, mesmo que a entrada contenha algum NaN, dependendo de onde estejam.unsigned max4_sse2(__m128);
copiar e shuffle com
pshufd
ainda é nossa melhor aposta:shufps dst,src,imm8
lê a entrada para a metade baixadst
dadst
. E precisamos de uma cópia e reprodução aleatória não destrutiva as duas vezes, para que 3 bytesmovhlps
eunpckhps
/ pd estejam fora. Se reduzíssemos a um máximo escalar, poderíamos usá-lo, mas custa outra instrução para transmitir antes da comparação, se ainda não tivermos o máximo em todos os elementos.Relacionado: O SSE4.1
phminposuw
pode encontrar a posição e o valor do mínimouint16_t
em um registro XMM. Eu não acho que é uma vitória subtrair do 65535 para usá-lo no máximo, mas veja uma resposta SO sobre como usá-lo para o máximo de bytes ou números inteiros assinados.fonte
Python 3.8 (pré-lançamento) , 67 bytes
A função Lambda, que recebe 4 números inteiros, muda o resultado booleano da comparação para o valor máximo com alguma ajuda do novo operador de atribuição do Python 3.8 e retorna o OR bit a bit dos resultados
Experimente online!
fonte
Java (JDK) , 78 bytes
Experimente online!
[a,b,c,d]
.fonte
05AB1E ,
32 bytesEntrada como uma lista de
[d,c,b,a]
, saída como uma lista de booleanos.Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
JavaScript (ES6), 30 bytes
Toma entrada como
([d,c,b,a])
. Retorna 4 valores booleanos.Experimente online!
fonte
Ruby ,
3422 bytesRecebe a entrada como uma matriz
[d, c, b, a]
e retorna uma matriz de 1s e 0s.Experimente online!
fonte
Python 3 ,
59 bytes66 bytesExperimente online!
Aceita entrada como
[a,b,c,d]
e gera uma lista de booleanos.Editado para ser uma função adequada, em seguida, salvou 2 bytes removendo colchetes ao redor do condicional.
fonte
1. Python 3.5, 90 bytes
Toma sequência de números como parâmetros. Retorna a string "binária"
exemplo:
Explicação
fonte
C # (compilador interativo do Visual C #) , 26 bytes
Experimente online!
Recebe entrada no formato
[d,c,b,a]
. Todos os outros abaixo recebem informações como[a,b,c,d]
C # (compilador interativo do Visual C #) , 35 bytes
Retorna um
IEnumerable<bool>
.Experimente online!
C # (compilador interativo do Visual C #) , 39 bytes
Retorna um
IEnumerable<int>
, que representa bits.Experimente online!
C # (compilador interativo do Visual C #) , 49 bytes
Imprime uma string binária em STDOUT.
Experimente online!
fonte
IEnumerable<bool>
é aceitável.PHP, 54 bytes
ou
receba entrada dos argumentos da linha de comando. Corra com
-nr
ou experimente-os online .fonte
Aqui está uma versão JS que sai como binária
update: Mais curto com junção e sem a pesquisa:
JavaScript (Node.js) , 42 bytes
Experimente online!
Anterior, com pesquisa, 49 bytes
Experimente online!
Anterior, com redução, 52 bytes:
Experimente online!
fonte
[0,1][...]
C # (compilador interativo do Visual C #) , 51 bytes
Experimente online!
Acima está uma função anônima que sai modificando um argumento . A saída é uma matriz de 1 e 0.
Abaixo está uma função recursiva que gera um número inteiro.
C # (compilador interativo do Visual C #) , 60 bytes
Experimente online!
Ambas as funções recebem entrada como uma matriz de 4 elementos.
fonte
Python 2 , 35 bytes
Experimente online!
Recebe entrada no formato [d, c, b, a] como na resposta aceita de Adám, então acho que está tudo bem.
Alternativa para 41, se não for ...
Python 2 , 41 bytes
Experimente online!
fonte
Python 3 , 42 bytes
Simplesmente retorna uma lista de se o elemento é o máximo para cada elemento na entrada. -2 bytes se você não contar a
f=
atribuição.Experimente online!
fonte
f=
não conta, exceto em funções recursivasLote, 92 bytes
Recebe argumentos como parâmetros de linha de comando na ordem inversa. Funciona calculando aritmeticamente o máximo dos parâmetros, reduzindo-os e adicionando apenas diferenças positivas do máximo em execução e, em seguida, mapeando cada parâmetro novamente desta vez, comparando-o ao máximo. Convenientemente
cmd/cset/a
não gera uma nova linha, portanto os resultados são automaticamente concatenados juntos. O%f%
simplesmente salva 5 bytes no que seria uma construção repetida.fonte