Calcular n% 12


27

Calcule o nmódulo 12para um número inteiro de 32 bits não assinado.

As regras:

  • Deve funcionar para todos nentre 0 e 23. Outros números são opcionais.
  • Só devem usar qualquer um dos operadores +-*, ~&^|ou <<, >>como comumente definida em 32 uints bits.
  • Pode usar um número arbitrário de uints constantes.
  • Não pode usar qualquer forma de ponteiro, incluindo matrizes ou ifdeclarações, incluindo itens que são compilados para declarações if, como operadores ternários ou operadores "maiores que".

A pontuação:

  • Operadores + -e operadores bit a bit ~ & ^ | << >>(NOT, AND, XOR, OR, turnos de bits) dão uma pontuação de 1, *dão uma pontuação de 2.
  • A pontuação total mais baixa vence.

6
Você pode definir os operadores para usuários de idiomas diferentes de C / Java. Eu entendo +-*são somar, subtrair, multiplicar; ~&^|são bit a bit NOT, AND, XOR, OR; e << >>são turnos de bits.
Level River St

@steveverrill - obrigado. Essa é realmente a intenção.
Nbubis

Posso usar for i in x:y:z, .dostuff?
Οurous

Posso definir uma variável igual a um valor para usar em uma expressão?
xnor

4
a maioria dos compiladores irá otimizar n % 12a uma multiplicação e uma mudança como no prazer do hacker, então isso é trivial, apenas a saída do conjunto e ver
phuclv

Respostas:


29

4

(O idioma é irrelevante)

n-((48&(11-n))>>2)

Uau! Chegou a 4.

11-n garantirá que todos os bits de ordem superior sejam definidos se e somente se n> = 12.

48&(11-n) == se n> 11 então 48 mais 0

(48&(11-n))>>2 == se n> 11 então mais 12 0

n-((48&(11-n))>>2) é a resposta


1
Aww shucks, você me derrotou com essa abordagem! Eu estava apenas a momentos de postar n - (((11 - n) & 0xC0000000) >> 28). Bem feito, acho que não pode ser feito em menos de quatro.
Runer112

1
@ Runner112 Sim, eu esperava que ninguém me vencesse quando publiquei. Bem feito em encontrá-lo para si mesmo, embora
isaacg

1
Awesome :) 4 é realmente uma conquista.
Nbubis

11

4

Uma solução com uma tabela de pesquisa (procura i ^ (i % 12)):

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

Aqui está outra solução com 4 operações:

i - ((0xffff >> (i - 12)) & 12)

Ele pressupõe que o operando de contagem dos turnos de bits seja implicitamente aceito no mod 32, ou seja, x >> -1é o mesmo quex >> 31 .

5

Outra abordagem, usando uma tabela de pesquisa:

i - (16773120 >> i & 1) * 12

7

bash - 1

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

por exemplo

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

1
Isso não é válido porque usa ponteiros.
precisa saber é o seguinte

@curiousdannii A que ponteiros você está se referindo? Os fluxos stdine stdout? Claro, internamente, são indicadores, mas podemos desqualificar o Java porque ele usa a Integerclasse internamente para muitas coisas.
Cole Johnson

$ () Não é efetivamente equivalente a um ponteiro?
usar o seguinte código

@curiousdannii - a documentação do awk diz que são variáveis ​​embutidas.

5

C, little-endian - 2

Provavelmente isso é trapaça, mas acho que satisfaz as regras ...

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;

Como funciona?
Nbubis

1
É uma trapaça, já que você está usando em = 0 vez de & 0x0, o que deve contar como mais 2 operações. Mas +1 para a criatividade :)
nbubis

4

PHP - pontuação 0

Eu me pergunto como é possível que ninguém veio com isso diante de mim !!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);

2
Agradável. Acho que pode haver um problema, pois as matrizes não são permitidas. Muito bom embora.
AJMansfield

@AJMansfield Alguém poderia argumentar que isso não tem matrizes, mas cadeias de caracteres (sim, em cadeias de baixo nível são matrizes de bytes). :)
Veja

1
@seequ Também se poderia argumentar que isso inválida por causa de sua uso de RAM (sim, a baixo nível, a RAM é tecnicamente uma matriz indexada) _ (ツ) _ / ¯
Stan Strum

2

C, pontuação 5

Funciona até 23, não garantido acima disso.

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4retorna 4 para n> = 12. Adicione-o a n e obterá a resposta correta nos 4 bits menos significativos e, em seguida, truncará os outros bits.


Bem feito!! Agora vamos ver se alguém pode chegar a 4 ..
nbubis

2

qualquer que seja o idioma: 5

não vai ganhar, mas participar porque é divertido e talvez porque é mais fácil entender do que outros:

n - ((n+20)>>5)*12

isso é equivalente a

n - (n>11)*12

isso é equivalente porque, quando você adiciona 20 a 12, obtém 32 e, assim, o 5º bit se torna 1. Isso é apenas quando n> 1 como 32 é o menor número em que o 5º bit se torna 1.

Observe também que é facilmente expansível para uma faixa mais alta, como você pode fazer

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

atingir um alcance até 35


1

Python 2.x - 4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

É = um operador?

Nesse caso, a pontuação é 6.

j-12*(j*357913942>>32)

A solução do BTW @steveverrill também pode ser usada diretamente no Python.

Funciona para o intervalo 0 .. 23

Então o que está acontecendo ? Multiplique por 357913942 e divida por 2 ^ 32 (ou deslocamento para a direita 32)


Eu gosto de como você usou uma função para multiplicar apenas uma vez. mas imho, você acabou de renomear a multiplicação para a função m (,), o que para mim significa que você a usou duas vezes.
Pinna_be

Depende de como as regras são interpretadas, mas você tem um ponto válido
Willem

1

C - 6

(n - (((n * 0xAAAB) >> 19)) * 12 )

Isso deve fazer parte da pergunta ou apenas outra resposta. Eu sugiro o último.
Jwosty

@Jwosty - alterado.
Nbubis

0

Cobra - 2 (ou 3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

Isso pode estar distorcendo um pouco as regras, mas pedi e tive permissão para usar isso.

Também funciona para qualquer número.


0

Kona - 5

Pode ser inválido porque não tenho certeza se o operador de andar é permitido, mas tenho dois *e um menos:

mod:{x-(_0.08333*x)*12}

O que deve funcionar para qualquer número inteiro.


Não tenho certeza sobre a operação do piso, mas definitivamente tenho certeza de que a primeira multiplicação está operando em algo diferente de números inteiros de 32 bits.
Runer112

@ Runer112: O OP diz que a entrada deve ser de 32 bits e os operadores são como definidos normalmente com uints de 32 bits; não diz nada sobre valores não inteiros no código.
precisa

A menos que eu esteja entendendo mal alguma coisa, 0,08333 * x não parece multiplicação, conforme definido em uints de 32 bits, porque 0,08333 não é um uint de 32 bits.
Runer112

1
"Pode usar um número arbitrário de uints constantes." - ou seja, não pode usar carros alegóricos arbitrários.
Nbubis

1
@ nbubis: essa linha não coloca realmente uma restrição em carros alegóricos.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.