O desafio
Implemente uma função que aceite dois números inteiros cujos valores variam de 0 a 255 e retorne a soma dos números inteiros mod 256. Você pode usar apenas operadores de negação bit a bit (~), bit a bit ou (|), deslocamento de bits (>>, <<) e atribuição (=).
Coisas que você não pode usar incluem (mas não estão limitadas a)
- Adição, subtração, multiplicação e divisão
- rotações
- Instruções condicionais
- Chamadas de função
O menor número de usos de operações binárias ou negativas binárias e de troca de bits vence . Em caso de empate, a solução mais popular vence. Como sempre, lacunas padrão se aplicam.
Aqui está um exemplo de um somador simples de 2 bits. Ele usa 77 negações binárias, 28 ors binários e turnos de 2 bits para uma pontuação total de 107 (isso pode ser visto executando o pré-processador C com gcc -E
). Isso poderia ser muito mais eficiente removendo os se #define
simplificando as expressões resultantes, mas eu as deixei para maior clareza.
#include <stdio.h>
#define and(a, b) (~((~a)|(~b)))
#define xor(a, b) (and(~a,b) | and(a,~b))
int adder(int a, int b)
{
int x, carry;
x = xor(and(a, 1), and(b, 1));
carry = and(and(a, 1), and(b, 1));
carry = xor(xor(and(a, 2), and(b, 2)), (carry << 1));
x = x | carry;
return x;
}
int main(int argc, char **argv)
{
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (adder(i, j) != (i + j) % 4) {
printf("Failed on %d + %d = %d\n", i, j, adder(i, j));
}
}
}
}
Atualização: Exemplo adicionado e critério de pontuação alterado
fonte
Respostas:
Python, 36 operações
Métodos logarítmicos no parâmetro "8"!
A idéia é descobrir quais índices excedem e causam carregamentos. Inicialmente, este é apenas o lugar onde
a
anddb
tem um1
. Mas como os bits transportados podem causar sobreposições adicionais, isso precisa ser determinado iterativamente.Em vez de transbordar cada índice para o próximo, agilizamos o processo movendo 1 índice, depois 2 índices e 4 índices, lembrando-se dos locais onde ocorreu um estouro (H) e onde um excesso não pode mais acontecer (K )
Uma solução iterativa mais simples com 47 operações:
Equipamento de teste, para quem quiser copiá-lo.
fonte
C - 0
Ele usa operadores fora de ~, |, >>, << e =, mas vejo soluções usando operadores de conversão e vírgula, então acho que a regra não é muito rigorosa, desde que não esteja usando os operadores proibidos.
fonte
python, score =
8380Desenrole o loop. São 10 operações por loop vezes 7 loops, 7 para o último xor e 3 para esmagar o 9º bit no final.
Implementa a equação
x+y = x^y + 2*(x&y)
repetindo-a 8 vezes. Cada vez que há mais um bit zero na parte inferior dey
.fonte
C, Pontuação:
7760Jogou golfe apenas para o inferno,
206169131 bytes:Expandido:
Essencialmente, a mesma solução (matematicamente) que o
@KeithRandall@JuanICarrano surgiu, mas aproveita a capacidade do C de tocar rápido e flexível com tipos e ponteiros variáveis para limpar tudo após os primeiros 8 bits sem usar mais operadores.Depende da capacidade de endereçamento da máquina e do tamanho de () um int e um caractere, mas deve poder ser portado para a maioria dos aplicativos específicos da máquina com a matemática apropriada do ponteiro.
EDIT: Este é um desafio que C (ou outras linguagens de baixo nível) terão uma vantagem distinta - a menos que alguém crie um algoritmo que não precise ser carregado.
fonte
unsigned char
. É mais limpo e mais portátil.unsigned
não vem naturalmente para mim no código de golfe. Você está certo, é claro - atualizado.Python - Pontuação
6664É a equação para um somador de ondas. C é o transporte. É calculado um bit de cada vez: em cada iteração, o carry é propagado para a esquerda. Como apontado por @Orby, a versão original não fez uma adição modular. Eu o corrigi e também salvei um ciclo na iteração, pois a primeira bagagem sempre é zero.
fonte
s(255,2)
retorna em257
vez de1
). Você pode corrigir isso alterando sua última linha,return ~(~xxor(axb,C)|256)
que adiciona 3 pontos.C ++ - pontuação: 113
fonte
add(1, 255)
está retornando 128 para mim, @Ryan.%
não está na lista de operadores autorizados, nomeadamente~
,|
,>>
, e<<
. Talvez substitua-o porands(x8|y8, 255)>>1
?~(~x8 | y8 | 0xFFFFFF00)
seria bom fazer o truque com apenas 4+ para a sua pontuação.byte
vez deint
fazê-lo transbordar automaticamente?