Problema:
Seu objetivo é somar dois números de entrada sem usar qualquer um dos seguintes operadores matemáticos: +,-,*,/
.
Além disso, você não pode usar nenhuma função interna projetada para substituir esses operadores matemáticos.
Pontuação:
O menor código (em número de bytes) vence.
Atualizar
A maioria dos programas que eu vi concatenou duas matrizes contendo seus números ou a forma
first number
de um caractere, anexousecond number
caracteres e contou todos.Menor contador de matrizes: APL com 8 caracteres, de Tobia
Concatenação de matriz mais curta : Golfscript with 4 chars, by Doorknob
Solução logarítmica mais curta: TI-89 Basic com 19 caracteres, da Quincunx
Solução de integração: Mathematica com 45 caracteres, de Michael Stern
O mais legal, na minha opinião: operadores bit a bit em javascript, por dave
fonte
Respostas:
Smalltalk,
2113Todos os itens a seguir funcionam apenas em números inteiros positivos. Veja a outra resposta do Smalltalk para uma resposta séria.
versão 1
mudando para um número inteiro grande e solicitando seu alto índice de bits (ruim, a indexação ST é baseada em 1, então eu preciso de uma mudança à direita adicional):
versão 2
semelhante e até um pouco mais curto (devido às regras de precedência do Smalltalk, e nenhuma mudança à direita necessária):
version3
outra variação do tema "tamanho da solicitação de concatenação da coleção",
dados dois números a e b,
usando intervalos como coleção, obtemos uma versão mais amigável à memória ;-) em 21 caracteres:
não recomendado para trituração de números pesados, no entanto.
version4
Para sua diversão, se você quiser trocar tempo pela memória, tente:
que geralmente é preciso o suficiente (mas não garante ;-)))
version5
escreva em um arquivo e peça seu tamanho
fonte
Javascript (25)
Isso adiciona duas variáveis x e y, usando apenas operações bit a bit e armazena o resultado em x.
Isso funciona com números negativos também.
fonte
while(y)x^=y,y=(y&x^y)<<1
!for(;y;y=(y&x^y)<<1)x^=y
é 1 byte mais curto :)C - 38 bytes
Eu trapaceio um pouco aqui, o OP disse para não usar nenhum operador matemático .
O
*
noprintf()
formato significa que a largura do campo usada para imprimir o caractere é obtida a partir de um argumentoprintf()
, neste caso, 3 e 4. O valor de retornoprintf()
é o número de caracteres impressos. Portanto, imprimir um' '
com largura de campo 3 e outro com largura de campo 4 gera um total de 3 + 4 caracteres.O valor de retorno são os números adicionados na
printf()
chamada.fonte
main
. Além disso, se você não se importa o que você imprimir, você pode substituir um' '
com0
e omitir o segundo.Python - 49 bytes
Assumindo entrada por posicionamento em variáveis
x
ey
.Esta solução de 61 bytes é um programa completo:
Considerando que você não proibiu a exponenciação, tive que postar isso. Quando você simplifica a expressão usando propriedades dos logaritmos, você simplesmente obtém
print input() + input()
.Isso suporta números de ponto negativo e de ponto flutuante.
Nota: Eu segui o conselho do mordedor e dividi esta resposta em três. Esta é a solução Mathematica , e esta é a solução básica TI-89 .
fonte
E^y
. UsarLog[Log[(E^E^x)^E^y]]
parece funcionar bem.JavaScript [25 bytes]
fonte
Mathematica, 21 bytes
Existem várias maneiras de fazer isso no Mathematica. Primeiro, use a função Acumular e lance tudo, exceto o número final na saída. Como na minha outra solução abaixo, presumo que os números de entrada estejam nas variáveis
a
eb
. 21 bytes.Mais divertido, embora tenha 45 caracteres, use os números para definir uma linha e integrar sob ela.
Como bônus, ambas as soluções funcionam para todos os números complexos, não apenas números inteiros positivos, como parece ser o caso de algumas outras soluções aqui.
fonte
function _(){return array_sum(func_get_args());}
. Eu tive que derrubar porque não consegui encontrar uma maneira curta de "consertar".array_sum()
no php, que faz exatamente a mesma coisa.GolfScript,
64 caracteres / bytesEntrada na forma de
10, 5
(=>15
).A
+
concatenação é de matriz, não adição.Como funciona é que
,
é usado para criar uma matriz do tamanho que o número é (0,1,...,n-2,n-1
). Isso é feito para os dois números e as matrizes são concatenadas.,
é usado novamente para uma finalidade diferente, para encontrar o comprimento da matriz resultante.Agora, aqui está o truque . Eu realmente gosto deste porque abusa do formato de entrada. Ele olha como ele está apenas introduzir um array, mas realmente, uma vez que a entrada está sendo executado como código GolfScript, o primeiro
,
já está feito para mim! (A versão antiga de 6 caracteres estava~,\,+,
no formato de entrada10 5
, que eu retirei 2 caracteres eliminando o\,
(swap-array)).Versão antiga (12) :
Cria uma função
f
.A repetição e a concatenação das cordas
*
e+
são respectivamente funções não aritméticas.Explicação:
n
cria uma cadeia de um caractere (uma nova linha). Isso é repetido váriasa
vezes, e a mesma coisa é feitab
. As cadeias são concatenadas e, em seguida,,
são usadas para o comprimento da cadeia.fonte
C,
2927 bytesUsando a aritmética do ponteiro:
x
é definido como um ponteiro, mas o chamador deve passar um número inteiro.Um usuário anônimo sugeriu o seguinte - também 27 bytes, mas os parâmetros são inteiros:
fonte
int
s nos sistemas agora comuns, ondeint
tem 32 bits, e os ponteiros têm 64 bits. O segundo evita esse problema.Brainf * ck,
936Isso funciona sem o uso de adição simples; ele passa e estabelece uma trilha de 1 e depois os conta
Nota: Os
+
e-
são apenas incrementos simples e nada pode ser feito no cérebro sem eles. Eles não são realmente adição / subtração, então acredito que isso ainda conta.fonte
J (6)
Você não disse que não poderíamos usar a função succ:
Uso:
Faz apenas 9 repetições de
>:
8.A abordagem lista concatenação funciona, também:
#@,&(#&0)
. E - eu sei que é contra as regras - não posso deixar essa resposta passar sem a solução mais j-ish:*&.^
(multiplicação sob exponenciação).fonte
Postscript, 41
Definimos função com expressão 41 bytes, desde que:
Então, nós o chamamos, por exemplo, como:
Que dá
Ele lida facilmente com negativos e carros alegóricos, ao contrário da maioria dos concorrentes :-)
fonte
festança, 20 caracteres
fonte
Smalltalk (agora sério),
123 118105 (*)Desculpe por responder duas vezes, mas considere essa uma resposta séria, enquanto a outra era mais parecida com humor. O seguinte é realmente executado exatamente neste exato momento em todas as nossas máquinas (no hardware). Estranho que não viesse à mente de mais ninguém ...
Combinando dois semi-somadores e executando todos os bits das palavras em paralelo, obtemos a versão legível (entradas a, b; saída em s):
O loop é para transportar propagação. As máscaras garantem que números inteiros assinados sejam manipulados (sem eles, apenas números não assinados são possíveis). Eles também definem o comprimento da palavra, sendo o anterior para operação de 32 bits. Se você preferir a adição de 68 bits, mude para 16rFFFFFFFFFFFFFFFFFFF.
versão golf (123 caracteres) (evita a máscara longa reutilizando em m):
(*) Usando -1 em vez de 16rFFFFFFFF, podemos jogar melhor, mas o código não funciona mais para números de precisão arbitrários, apenas para smallIntegers do tamanho de palavras de máquinas (a representação para largeIntegers não está definida no padrão Ansi):
isso reduz o tamanho do código para 105 caracteres.
fonte
APL, 8 e 12
Nada de novo aqui, a versão que conta o array:
e o log ○ versão do log:
Eu apenas pensei que eles pareciam legais no APL!
fonte
≢∘∊⍳¨
sed, 359 bytes (sem a formatação sofisticada)
Desculpe pela resposta tardia e provavelmente a resposta mais longa aqui de longe. Mas eu queria ver se isso é possível com o sed:
Isso é semelhante a https://codegolf.stackexchange.com/a/38087/11259 , que simplesmente incrementa números em uma sequência. Mas, em vez disso, realiza as operações de incremento em um loop.
A entrada é obtida de STDIN no formato "x y". Isso é transformado primeiro em "x: 0 :: y:". Em seguida, incrementamos todos os números que vêm depois dos caracteres ":", até obtermos "x: x: :( x + y):". Então finalmente retornamos (x + y).
Saída
Observe que isso funciona apenas para os números naturais. No entanto (pelo menos em teoria), ele funciona para números inteiros arbitrariamente grandes. Como estamos realizando operações de incremento de x em y, a ordem pode fazer uma grande diferença na velocidade: x <y será mais rápido que x> y.
fonte
Traço , 18 bytes
Requer tempo GNU 1.7 ou superior. A saída é para STDERR.
Experimente online!
Observe que isso não funcionará no B ash, pois seu comando de tempo interno difere do tempo do GNU.
Ao custo de um byte adicional,
\time
pode ser usado em vez detime
forçar o Bash a usar o comando externo.fonte
sleep -3
eu pudesse acelerar meus programas. Que decepção.\time
deve funcionar no Bash.Javascript (67)
Provavelmente há muito melhor
fonte
joins
é desnecessário. OArray
construtor cria uma matriz deundefineds
, que pode ser contada:a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Number
construtor salva 2 caracteres maisparseInt
alert
, a saída ainda iria para o console, mas isso tornaria a resposta um pouco menos divertida. Você também pode reutilizar aprompt
variável em vez de alerta (o construtor alerta o argumento com o prompt). Enfim, boa resposta!Ruby, 18 caracteres
E mais duas variantes detalhadas, 29 caracteres
Outra versão, 32 caracteres
fonte
Geração de código on-the-fly
Sim, há realmente uma adição lá, mas não o operador + e nem mesmo uma função de estrutura que adiciona, em vez disso, geramos um método instantâneo que faz a adição.
fonte
Ruby 39
fonte
R 36
onde
rep
constrói um vetor dex
uns seguidos pory
dois.fonte
length(rep(1:2,scan()))
TI Básico 89 - 19 bytes
Execute isso na sua TI-89 (tela inicial ou aplicativo de programação):
Isso usa regras de log para calcular
x+y
, assim como nesta solução . Como bônus, funciona para números decimais e números inteiros. Funciona para todos os números reais. Se as regras do logaritmo ainda são válidas com expoentes complexos, isso também funciona para números complexos. No entanto, minha calculadora cospe lixo quando tento inserir expoentes complexos.fonte
ln
1 byte no TI Basic? Além disso, você pode soltar os parênteses de fechamento, reduzindo isso para 15 bytes.Agradeço a Michael Stern por me ensinar a notação Mathematica .
Mathematica -
2120 bytesIsso usa a mesma abordagem que esta solução , mas está no Mathematica para torná-la mais curta. Isso funciona para números negativos e de ponto flutuante, além de números inteiros em
x
ey
.Simplificar a expressão usando regras de log gera
x+y
, mas isso é válido, pois usa exponenciação, não um dos quatro operadores básicos.fonte
Aritmética de cordas
Convertemos os dois números em strings, fazemos a adição com o corte de strings (com carry e tudo, você sabe) e depois analisamos de volta para inteiro. Testado com i1, i2 em 0..200, funciona como um encanto. Encontre uma adição neste!
fonte
C (79)
fonte
Python - 22 caracteres
fonte
APL: 2
Isso converte os números da base 1, então (n * 1 ^ 1) + (m * 1 ^ 2), que é exatamente n + m.
Pode ser experimentado em TryApl.org
fonte
TI-BASIC, 10
Adiciona
X
eY
fonte
K, 2 bytes
Exemplo de uso:
Aplique o operador "where" (monádico
&
) aos números em uma lista de entrada (possivelmente liberando o formato de entrada). Isso produzirá uma lista contendo o primeiro número de zeros, seguido pelo segundo número de zeros:Normalmente, esse operador é usado como uma "coleta" para produzir uma lista dos índices dos elementos diferentes de zero de uma lista booleana, mas a forma generalizada é útil ocasionalmente.
Em seguida, basta fazer a contagem dessa lista (monádica
#
).Se minha interpretação dos requisitos de entrada for inaceitável, a seguinte solução um pouco mais longa fará o mesmo truque:
fonte
Pitão , 29 bytes
Experimente online!
Minha primeira submissão aqui!
Isso compila para:
fonte