Você precisa pegar 2 entradas de string e gerar a soma dessas duas strings sem convertê-las em int ou usar qualquer tipo de dado numérico.
ex.
string one = "123";
string two = "456";
string sum = "579";
Suponha que as strings não tenham mais que 10 dígitos.
Este é o código de golfe e a resposta mais curta em caracteres ganha. Uma edição da resposta em C # me fará sorrir :).
Editar: a conversão para int pode ser definida como algo dessa natureza
Int.TryParse
, (int)
, Convert.ToInt
Etc.
code-golf
string
arithmetic
CSharper
fonte
fonte
Respostas:
80836 Montagem (
5753 bytes)Isso adiciona, dígito por dígito, da direita para a esquerda, sem converter dígitos ASCII em números
'0'-'9'
inteiros0-9
e continuar conforme necessário. O bytecode é o código para uma função, que pode ser chamada em C (veja abaixo).O bytecode acima foi escrito à mão, a partir da seguinte montagem (estilo NASM, comentado):
Para tentar isso em C (gcc, linux, processador intel):
fonte
Ruby,
10971Brega. Se você não pode trazer Mohammad para a montanha ...
Algoritmo:
Changelog
71 mais curto como uma matriz.
Declaração de método removida e consolidar chamadas para
n.to_s
92 aplicou algumas dicas
101 salvar um char
102 use x para incrementar
109 confirmação inicial
fonte
succ
ouprev
.... mas isso não é nem divertido de jogar golfe.sed, 359 bytes (sem a formatação sofisticada)
Ainda não tenho certeza se este é um dup de Add sem adição (ou qualquer um dos 4 operadores aritméticos básicos) . Enquanto isso, deixe-me postar minha resposta para essa pergunta. Não vai ganhar golfe, mas é um começo, e acho que atende facilmente às especificações:
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).
Resultado
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 ordenação pode fazer uma grande diferença na velocidade: x <y será mais rápido que x> y.
fonte
y
é convertido paray+1
usar apenas regex? e nenhuma adição real? Agradável!Rubi -
485432265Isso parece mais com o espírito do que você estava procurando na pergunta.
Basicamente, resolve o problema que um ser humano faria no papel - "memorizando" todos os resultados de adição de um dígito, adicionando cada coluna e entendendo como "transportar o um" quando necessário.
Isso também está usando um "tipo de dados numérico" (variável i), que é proibido pela pergunta, mas é apenas para indexação de string. Vou tentar remover isso e editar minha resposta.
Um pouco não-destruído:
EDIT: Utilizou algumas idéias dos comentários para gerar a tabela de mapeamento "memorizada" em vez de apenas codificá-la.
fonte
[?1..?9].zip([?1..?9]).map{|x,y| Regex.new(x+y)}.map{/*something based on the order of results*/}
product
é melhor quezip
/#{x+y}/
é mais curto queRegexp.new(x+y)
. ;)i=-1;(s=(?0..?9).to_a).product(s).map{|x,y|i+=1;/#{x+y}/=>(?0..'18').each_cons(10).to_a[i/10][i%10]}
fornece a sua matriz regex.i
) ... deve haver outra maneira de contornar isso ... talvez apenas useeach_cons(10)
como enumerador enext
através do conjunto?CJam,
95 92 80 72 7044 caracteresque se traduz em
Definitivamente, isso pode ser muito praticado. Realmente não sei se minha abordagem é ótima ou ainda não.
UPDATE - Inline a criação da matriz de soma para salvar bytes. Devido a isso, o programa agora roda 10 vezes mais devagar, mas ainda é um tempo constante para qualquer tipo de entrada.
Experimente online aqui
Lê a linha que contém dois números de STDIN como string e gera como uma matriz de caracteres que é uma string em si.
Por exemplo:
A saída contém precedentes
0
. Deixe-me saber se isso é um problema.fonte
C # -
128108104Agradecemos a Compass, BMac e Shawn por sugerirem melhorias.
Primeira tentativa no Code Golf, e usar C # parece ser uma desvantagem aqui ...
Ao usar,
.Compute()
você pode usar os valores da sequência e soma-los diretamente. Como bônus, isso funciona para outros operadores além de apenas "+".Golfe:
Ungolfed:
Ligar para
t("123","456");
você 579.fonte
System.Console.WriteLine(new System.Data.DataTable()...
Console.Write
para salvar 4 bytesGNU sed, 266 bytes
Usa uma abordagem diferente da solução da DigitalTrauma. Como efeito, este apresenta desempenho ainda pior, usando O (m + n) . Converta os dois operandos em unário, concatenado e convertido em decimal (todos usando regex, é claro - sed não tem o conceito de um número inteiro).
Como um bônus, este programa resume todos os números naturais fornecidos no stdin (na primeira linha), o que significa que você não pode alimentar nada, um número ou dez números e fará a coisa certa independentemente.
A idéia por trás desse código é vagamente inspirada em uma antiga submissão minha do PPCG sed, embora eu não me lembre para que pergunta seja uma resposta.
Aqui está, "bonito", impresso para sua "conveniência", emprestando outra idéia da DigitalTrauma. : D
(Para obter a versão de 266 bytes, remova o ponto e vírgula à direita, o espaço em branco à esquerda e o comentário final, de preferência usando o sed.)
Emprestando alguns testes do DigitalTrauma:
Apertei um pouco os testes realmente grandes por causa da terrível (in) eficiência do espaço. Devido ao uso de
q
apenas a primeira linha é processada, daí owhile
loop no teste.fonte
Java 6 (181 caracteres)
Não deve ser superado pelo handicap conhecido como C # , Java em toda a sua glória. Muito clichê! O uso é fornecer os argumentos separados por um espaço, ou seja,
123 456
Ungolfed:
Ao usar o mecanismo JavaScript disponível no
javax
, podemos fazer com que outro idioma faça o trabalho por nós e tecnicamente siga as regras de não usar nenhum tipo numérico no idioma nativo ou converter.Justificação para usar
eval
Não convertemos os valores em int para que o JavaScript avalie. Criamos uma String que
"123+456"
não é um número. O JS Engine digere a fórmula e avalia a String como literais numéricos, que não são tipos de dados numéricos. Java brega lógica! Como um aparte, isso também funciona paradouble
matemática.fonte
dc -e"$1 $2+p"
tecnicamente eu não usei um tipo de número na festa nativa é só passar uma string para algum detalhe de implementaçãoAPL (61)
Eu acho que isso se enquadra nas regras.
Esta é uma função que recebe dois argumentos de sequência e retorna uma sequência:
Também é razoavelmente rápido, adiciona o número formado por 999999
9
s a si mesmo em um instante.Ele encontra o índice de cada caractere em
⎕D
(que é a string '0123456789'), depois adiciona a escola primária em cada índice separadamente, carregando conforme necessário, depois pesquisa os dígitos resultantes⎕D
. (Acho que a⎕D
pesquisa se enquadra nas regras, é basicamente fazer'x'-48
).Explicação:
⎕D∘⍳¨⍺⍵
: procure os índices⎕D
para cada caractere nas duas strings.¯1+
: subtraia1
de cada um, porque as matrizes são baseadas em 1 por padrão.⌽↑⌽¨
: inverta ambos, vire uma matriz (preenchendo quadrados vazios com zeros) e depois inverta a matriz.+⌿
: soma as colunas da matriz{
...}
: transitar:∨/T←9<Z←0,⍵
: adicione um extra0
na frente da lista. Descubra quais 'dígitos' são maiores que 9 e armazene-os emT
. Se algum dígito for maior que 10:Z-10×T
: subtraia10
de cada posição superior a 10,T←(1⌽T)+
: adicione1
a cada posição ao lado de cada posição superior a 10 e armazene-aT
.T↓⍨~×⊃T
: seT
começar com zero, remova-o,∇
: aplique a função carry ao resultado.⋄⍵
: caso contrário, retorne o valor inalterado1+
: adicione um a cada posição (porque a matriz é indexada 1)⎕D[
...]
: use o resultado como índices em⎕D
.fonte
Perl -
136119115 bytesEstou aprendendo Perl, isso parecia uma boa prática. Dicas são apreciadas!
Resposta brega, para tirar isso do caminho:
Resposta real:
Descomprimido:
fonte
($x,$y)=@ARGV
e usar emsay
vez deprint
reduzirá alguns caracteres.say
é uma coisa do Perl 6 (ou você pode usá-lo no Perl 5 com essas instruções, mas isso seria muito longo). Em vez desay
, usewarn
para barbear um personagem. Isso produzirá para STDERR em vez de STDOUT, mas isso não é contra as regras deste. :-)Java 7, Pontuação = 252
Não usa números inteiros, compridos, bytes, curtos, duplos, flutuadores ou quaisquer funções internas da biblioteca para adicionar. Envolva um corpo de classe e ligue para
t(String1,String2)
. Coloque as cordas com zeros para que elas tenham o mesmo comprimento.t("123","234")
retorna"0357"
.Golfe:
Golfe Expandido com classe:
Parcialmente golfe expandido:
100% expandido:
fonte
char
é um tipo de dados numérico ._.\u0030
a uma corda, eu recebo"0"
não"48"
.Java - 257 caracteres
como todo mundo sabe java, não há linguagem melhor para jogar golfe do que java
esta é uma solução não destruída
fonte
Haskell -
9894 bytesfonte
JavaScript (ES6),
55 6659 ** Isso faz algumas suposições:
A entrada é definida nas variáveis aeb, ex:Alterada para obter entrada do prompt (+11).var a='123',b=321';
fonte
Python 2.7,
196137 caracteresversão 2 (mais curta inicializando o dicionário com código):
Versão anterior 1 (196 caracteres):
por exemplo
As chaves do dicionário são strings, os valores do dicionário incluem apenas constantes numéricas para encurtar o código, e o cálculo é feito concatenando duas strings e obtendo o comprimento resultante, então espero que isso conte como "não as converta em ints".
Versão de regra de fraude de letras pequenas do Python
Nota:
O tipo z é um tipo personalizado que eu defino como: definitivamente não é um tipo numérico, seja qual for a definição que o questionador use, mas se comporte perto o suficiente de um tipo numérico para ser útil em circunstâncias limitadas . Os comportamentos do tipo z são implementados apenas parcialmente neste exemplo de código e se o interpretador CPython usar 'int' para implementar z , isso é apenas um detalhe da implementação e não está relacionado ao problema em questão.
fonte