Dado um número inteiro não negativo, retorne a diferença absoluta entre a soma de seus dígitos pares e a soma de seus dígitos ímpares.
Regras padrão
Aplicam-se brechas padrão.
Você pode receber e fornecer saída por qualquer método padrão de entrada / saída.
Você pode receber a entrada como uma String, como um número inteiro ou como uma lista de dígitos.
Isso é código-golfe , então o código mais curto em bytes em todos os idiomas vence!
Casos de teste
Entrada ~> Saída 0 ~> 0 (| 0-0 | = 0) 1 ~> 1 (| 1-0 | = 1) 12 ~> 1 (| 2-1 | = 1) 333 ~> 9 (| 0- (3 + 3 + 3) | = 9) 459 ~> 10 (| 4- (5 + 9) | = 10) 2469 ~> 3 (| (2 + 4 + 6) -9 | = 3) 1234 ~> 2 (| (2 + 4) - (1 + 3) | = 2)
code-golf
number
number-theory
Mr. Xcoder
fonte
fonte
Respostas:
Gelatina , 6 bytes
Experimente online!
Como funciona
fonte
Raise -1 to A's digits, yielding 1 for even digits and 0 for odd ones.
humm, acho que você mexeu em algo um pouco ou algo assim ...Scripts SHENZHEN I / O MCxxxx, 197 (126 + 71) bytes
Chip 1 (MC6000):
Chip 2 (MC4000):
fonte
<!-- -->
comentário para obter direito de código depois de uma lista, em vez de texto de enchimento ou recuar o código com mais 4 espaços..)Python 2, 39 bytes
Leva inteiro como lista. Experimente online
-3 bytes graças a @ Mr.Xcoder
-1 byte graças a @ovs
fonte
[i,-i][i%2]
vez dei%2and i or -i
para 40 bytes .(-1)**i*i
para 39 bytesTI-Basic,
189 bytesExplicação
Multiplica cada dígito da lista por -1 à sua potência, negando cada dígito ímpar, antes de somar.
fonte
C (gcc) ,
595857 bytesExperimente online!
fonte
R,
3029 bytesd = scan()
pega o número de entrada um dígito após o outro.-1 byte graças a @ Giuseppe!
fonte
abs(sum((d=scan())-2*d*d%%2))
C #, 57 bytes
Toma a entrada como
i
e soma os números inteiros, transformando as probabilidades em negativas.fonte
namespace System.Linq{
e criar uma função real. Veja a outra resposta C # para referênciaMain
. A única razão pela qual pensei em responder com isso. Oh, poços.Mathematica, 20 bytes
toma como entrada uma lista de dígitos
um agradecimento especial a @LLlAMnYP por me informar sobre as "novas regras"
fonte
*
.Japonês , 8 bytes
Teste online!
Explicação
fonte
Neim , 7 bytes
Explicação:
fonte
APL, 8 bytes
Experimente online!
Quão?
¯1*⊢
- -1 n paran
em⍵
[
4 5 9
→1 ¯1 ¯1
]⊢+.×
- multiplicação verctorized como
, então soma[
+/ 4 5 9 × 1 ¯1 ¯1
→+/ 4 ¯5 ¯9
→¯10
]|
- valor absolutofonte
|⊢+.ׯ1*⊢
com a nova especificação de entrada.JavaScript (ES6),
4338 bytesAceita como
stringuma matriz de dígitos.Casos de teste
Mostrar snippet de código
fonte
EDIT: Uma abordagem mais centrada no golfe:
EXCEL,
423629 bytesEconomizei 6 bytes graças ao Magic Octopus Urn Economizei 7 bytes usando a abordagem -1 de Dennis (que, acabei de aprender, funciona em matrizes no Excel)
Leva uma lista de números inteiros na coluna A para entrada. Provavelmente, você pode jogar golfe ainda mais, ou usando a versão em cadeia, usando uma cadeia em A1 para entrada.
EXCEL, 256 bytes
fonte
You may take input as a String, as an Integer or as a list of digits.
sua resposta de 42 bytes, deve ser a resposta que você usa.Julia 0,5 , 19 bytes
Experimente online!
fonte
Casca , 7 bytes
Experimente online!
Leva uma lista de dígitos como entrada.
Ainda falta um "abs" embutido, mas um bom resultado é o mesmo :)
Explicação
Ṡ!¡_
é uma função que pega um númeron
e depois aplican-1
vezes a função_
(negação) an
. Isso resulta emn
ímparn
ou-n
parn
.ṁ
aplica uma função a cada elemento de uma lista e soma os resultados.≠0
retorna a diferença absoluta entre um número e 0.fonte
05AB1E , 6 bytes
Obrigado a Dennis pelo truque de poder -1. Recebe a entrada como uma lista de dígitos
Experimente online!
Explicação
fonte
È2*<*O
um casual imundo.PHP, 51 bytes
adiciona dígito a
$s
se ímpar, subtrai se for par. Corra como cano com-nR
.ou
usando
-1
o truque de poder de Dennis .fonte
Mathematica, 67 bytes
fonte
PHP , 54 bytes
Experimente online!
PHP , 57 bytes
armazena as somas pares e ímpares em uma matriz
Experimente online!
PHP , 57 bytes
armazene as somas pares e ímpares em duas variáveis
Experimente online!
fonte
${1}
e soma par em${0}
:while(~$n=$argn[$i++])${$n&1}+=$n;echo abs(${1}-${0});
for(;~$n=$argn[$i++];$s+=$n)$u+=($n&1)*$n;echo abs($s-2*$u);
efor(;~$n=$argn[$i++];)$u+=(($n&1)-.5)*2*$n;echo abs($u);
é uma maneira interessanteHaskell ,
474239382625 bytes-1 graças a nimi
-12 graças a Bruce
-1 graças a xnor
Experimente online!
fonte
s
:((*)=<<((-1)^))
.(\x->x*(-1)^x)
.Perl 6 , 28 bytes
Experimente online!
Leva uma lista de dígitos como entrada.
$_
é o argumento de entrada..map(* % 2 * 2 - 1)
mapeia cada dígito para um1
ou-1
dependendo se o dígito é ímpar ou par, respectivamente.Z*
fecha a lista original de dígitos com a lista par / ímpar usando multiplicação.fonte
Braingolf , 18 bytes
Experimente online!
Recebe a entrada como uma lista de dígitos
Explicação
fonte
R,
7243 bytesPrimeiro,
d = scan()
leva o número como entrada, um dígito após os outros (graças ao comentário @Giuseppe!)Então,
b = d %% 2 <1
associados ab
umaTRUE
ouFALSE
valor em cada índice dependendo da paridade dos dígitos. Portanto, osb
valores sãoTRUE
para números pares e!b
sãoTRUE
para valores ímpares.Finalmente,
abs(sum(d[b]) - sum(d[!b]))
faz o trabalho.fonte
<1
é um byte menor que==0
, mas observe que você também pode inserir entradas como uma lista de dígitos.Bash
14113999 BytesExperimente online!
fonte
Java (OpenJDK 8) , 55 bytes
Experimente online!
Implementação ingênua.
fonte
C #, 67 bytes
fonte
05AB1E , 7 bytes
Experimente online!
fonte
Código da máquina x86-64, 30 bytes
O código acima define uma função que aceita uma lista / matriz de dígitos inteiros e retorna a diferença absoluta entre a soma de seus dígitos pares e a soma de seus dígitos ímpares.
Como em C , a linguagem assembly não implementa listas ou matrizes como tipos de primeira classe, mas os representa como uma combinação de um ponteiro e um comprimento. Portanto, organizei essa função para aceitar dois parâmetros: o primeiro é um ponteiro para o início da lista de dígitos e o segundo é um número inteiro que especifica o comprimento total da lista (número total de dígitos, um indexado) .
A função está em conformidade com a convenção de chamada do System V AMD64 , que é padrão nos sistemas Gnu / UNIX. Em particular, o primeiro parâmetro (ponteiro para o início da lista) é passado
RDI
(como esse é um código de 64 bits, é um ponteiro de 64 bits) e o segundo parâmetro (comprimento da lista) é passadoESI
( esse é apenas um valor de 32 bits, porque são dígitos mais do que suficientes para brincar e, naturalmente, supõe-se que seja diferente de zero). O resultado é retornado noEAX
registro.Se for mais claro, esse seria o protótipo C (e você pode usar isso para chamar a função de C):
Mnemônicos de montagem não destruídos:
Aqui está uma breve explicação do código:
EAX
eEDX
, que serão usados para armazenar a soma dos dígitos pares e ímpares. OEAX
registro é limpo comXOR
ele próprio (2 bytes) e, em seguida, oEDX
registro é limpo com a extensão do sinal do EAX para ele (CDQ
1 byte).Em seguida, entramos no loop que itera através de todos os dígitos passados na matriz. Ele recupera um dígito, testa para ver se é par ou ímpar (testando o bit menos significativo, que será 0 se o valor for par ou 1 se for ímpar) e, em seguida, salta ou cai de acordo, acrescentando que valor ao acumulador apropriado. Na parte inferior do loop, decrementamos o contador de dígitos (
ESI
) e continuamos o loop desde que não seja zero (ou seja, desde que haja mais dígitos na lista a serem recuperados).A única coisa complicada aqui é a instrução MOV inicial, que usa o modo de endereçamento mais complexo possível no x86. * Ele pega
RDI
como registro base (o ponteiro para o início da lista), escalaRSI
(o contador de comprimento, que serve como índice) por 4 (o tamanho de um número inteiro, em bytes) e o adiciona à base, e subtrai 4 do total (porque o contador de comprimento é baseado em um e precisamos que o deslocamento seja baseado em zero). Isso fornece o endereço do dígito na matriz, que é carregado noECX
registro.Depois que o loop termina, fazemos a subtração das probabilidades dos pares (
EAX -= EDX
).Finalmente, calculamos o valor absoluto usando um truque comum - o mesmo usado pela maioria dos compiladores C para a
abs
função. Não vou entrar em detalhes sobre como esse truque funciona aqui; consulte os comentários do código para obter dicas ou faça uma pesquisa na web.__
* O código pode ser reescrito para usar modos de endereçamento mais simples, mas não o torna mais curto. Consegui criar uma implementação alternativa que a desreferenciou
RDI
e incrementou em 8 a cada vez no loop, mas como você ainda precisa diminuir o contadorESI
, isso acabou sendo os mesmos 30 bytes. O que inicialmente me deu esperança é queadd eax, DWORD PTR [rdi]
sejam apenas 2 bytes, o mesmo que adicionar dois valores registrados. Aqui está essa implementação, apenas para salvar alguém tentando me superar um pouco de esforço :-)fonte
TI-BASIC,
116 bytesLeva a entrada como uma lista.
i²^Ans
economiza dois bytes(-1)^Ans
porque não precisamos dos parênteses.fonte
J, 14 bytes
Experimente online!
explicação
fonte