Há uma pergunta no site que pede para implementar a divisão sem usar a divisão.
No meu caso, estou pedindo para você fazer o mesmo, mas apenas usando adição.
O que isso significa é basicamente: adição é o único operador ou função permitida que opera com números e retorna outros números (ou seja, sem subtração, multiplicação, exponenciação, inversão bit a bit, etc.). Coisas como instruções if, operadores de atribuição e comparação e loops ainda são permitidos, desde que dentro desses, você ainda use apenas a adição.
Sua tarefa é construir uma função divide(a, b)
que leva dois inteiros positivos a
e b
e retorna o resultado de a
ser dividido por b
e arredondado para zero, mas usando adição e há outros operadores aritméticos, e não outras construções de dados, além de números.
O código que vencer será aquele que requer o menor número de operações de adição a serem executadas no conjunto de entradas, onde a
varia de 1
para 200
e b
varia de 1
para a
.
Para acompanhar isso, você pode criar uma versão alternativa do seu código que substitua todas as instâncias de a + b
with add(a, b)
e program add
para incrementar uma add_used
variável global e retornar a soma dos dois números.
fonte
Respostas:
Escrever regras é difícil, essas regras em particular contêm incentivos para evitar acréscimos a todo custo.
Existe um prêmio pela resposta mais ridícula?
JavaScript - 0 adições
Agora, com o método de fallback que faz uma solução pesada para maiores
a
eb
menores, e uma estrutura um pouco mais compacta para não ultrapassar o limite de caracteres. (Pfff, 30000 caracteres. O que é isso? Twitter?) Ainda não há acréscimos no escopo medido.fonte
a
1 a 200, apenas diz que julgará a pontuação com base nas adições totais desse intervalo de entradas. Ele ainda tem que trabalhar com números inteiros acima de 200.Tcl, 0 adições
Por que não usar cordas?
fonte
Append
é semelhante à adição, mas não é exatamente o mesmo. EuJoined
listo, usando uma lógica semelhante baseada em contagens.Haskell 0 adições, 29 bytes
isso redefine o operador de divisão (
/
). ele funciona criando uma lista0
até o infinito, onde cada item é repetido váriasm
vezes e, em seguida, escolhendo o enésimo elemento da lista (usando um índice baseado em 0).fonte
([0..]>>=replicate m)!!n
. é quase a mesma coisaUse esta implementação em Java, 199206 adições
A seguir estão as funções auxiliares
fonte
Python - 0 adições
Isso usa um iterador de comprimento
a
e o consome em grupos deb
até queStopIteration
seja gerado. Neste ponto,j
contém o resultado.fonte
Minha solução é o código C / C ++ e faz muitas adições (200402), mas mesmo assim ...
E a saída é:
fonte
Python, 320703 adições
Como sempre, uma resposta de referência de último lugar. Isso simplesmente adiciona
1
a umab
variável "quociente" e "remultiplicação" até que seja atingidaa
.Aqui está o código de depuração:
fonte
Tcl, 0 adições.
Bem, eu tive que encontrar uma maneira que não use outras estruturas de dados, mas ainda não seja o que você deseja:
Usa o tamanho atual da pilha de diferentes segmentos verdes.
fonte
C ++, 100201
fonte
a < b
o resultado for0
, não é um erro.break
deveria sercontinue
.Adições ao Mathematica 100201
Isso adiciona o divisor,
b
ac
(que é inicializado em 0), desde que o total atual seja menor ou igual ao dividendoa
,. Também anexa o valor atual dec
a uma listat
, sem executar nenhuma operação aritmética.Quando o
While
loop termina, a função gera o comprimento det
, que corresponderá exatamente ao quociente da divisão inteira. Assim, o número de adições para qualquer dadodivide[a,b]
será igual exatamente ao quociente.100201 é a soma dos quocientes na tabela 200 por 200. Isso é quantas vezes
c
foi incrementado porb
. Não foram necessárias outras adições. Somente números inteiros positivos foram usados.É mais eficiente criar uma tabela de pesquisa, após a qual cada pesquisa será quase instantânea.
Uso
fonte
n++
coisa? Parece adição para mim.n++
, o que era totalmente desnecessário. Pelo que sei, (não conheço TCL), minha solução é como a sua, mas armazena os elementos juntos em vários conjuntos e não em cadeias.no other data constructs besides numbers
?Adição R - 0
Usa reciclagem de vetor R.
A segunda linha cria uma matriz de comprimento
a
preenchida por um vetor de comprimentob
que é reciclado até atingir o comprimentoa
.A terceira linha divide a matriz de acordo com seu valor e retorna o comprimento do último elemento (daí o resultado da divisão inteira de
a
porb
).Preencher uma matriz com um vetor cujo comprimento não seja múltiplo do comprimento da matriz lança um aviso, mas se suprimirmos o aviso anteriormente (linha 1), ele funcionará.
Para dar um exemplo concreto, se dividirmos 5 por 3,
A
será um vetor contendo 1 2 3 1 2 (ou seja, 1 2 3 reciclado para um comprimento 5). O resultado da operação de divisão será uma lista com o primeiro elemento contendo 1 1, o segundo 2 2 e o terceiro 3 (já que existe apenas um 3 polA
.). O resultado é, portanto, 1.fonte
Em Ruby,
Não conheço o TCL, mas suspeito que essa seja a mesma abordagem da primeira resposta de @Johannes.
fonte
d = 'x' * 5
=> "xxxxx".a << b
acrescenta stringb
a stringa
. Aqui,d = "xxx"
ed << 'x'
resulta emd = "xxxx"
.Java: 92 987 adições
Eu uso recursão binária, isso
a/b == 2 * a/(2b) + maybe 1
. Para esse divisor e o restante são necessários. Normalmente, haveria uma subtração a% (2b) - b, mas isso é resolvido mantendo o restante como(rem, remNegative)
. E2b = b+b
claro.fonte
fonte
C # - 0 adições
Preenche uma lista de números inteiros com tempos
1..b
repetidosa
. O número de vezes queb
aparece (exceto a ocorrência com um índice>a
) é o resultado.Não tenho certeza se a lista é permitida pelas regras, mas estou enviando isso no espírito dos outros posts que não levam as regras tão a sério (afinal, não usar adição é basicamente ignorar o desafio completamente).
fonte
C - 85591 Complementos
Aqui vamos nós. Eu acho que isso pode ser ótimo. Ele usa uma técnica de "divisão reversa", através da qual, através da multiplicação longa, cria o maior número, de
q
modo queq * b <= a
, usando apenas+
e<=
. É muito, muito rápido.Notas:
s(a,b)
retorna aa+b
variável do contador de soma e incrementosz
cada vez que uma adição é realizada. Se uma
oub
é zero, a adição desnecessária é evitada.d(a,b,p)
é uma função recursiva para construir as partes internas para comparação e adição. Ele usa variáveis globaisq
,u
ev
. A profundidade máxima da recursão é o número de bitsa
e a recursão é linear, e não uma árvore. (Nota: ob
nesta função é o originalb
multiplicado por uma potência de 2.)divide(a,b)
retorna o piso (a / b) conforme necessário.fonte
J, 0 adições, 14 bytes
Inspirado pela resposta de Alexei Kopylov .
Não usa matemática:
fonte