Soustraire mes chances de mes chances


19

Étant donné un entier non négatif, renvoyez la différence absolue entre la somme de ses chiffres pairs et la somme de ses chiffres impairs.

Règles par défaut

  • Les échappatoires standard s'appliquent.

  • Vous pouvez prendre des entrées et fournir des sorties par n'importe quelle méthode d'entrée / sortie standard.

  • Vous pouvez prendre l'entrée comme une chaîne, comme un entier ou comme une liste de chiffres.

  • C'est le , donc le code le plus court en octets dans toutes les langues gagne!

Cas de test

Entrée ~> Sortie

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)

1
Pouvons-nous prendre la saisie comme une liste d'entiers?
Adám

4
@ Mr.Xcoder Ce ne serait pas trop trivial. Cela complique inutilement le défi et constitue une exigence arbitraire qui ajoute des octets.
Okx

4
@ Mr.Xcoder Ne faites pas de défis de caméléon . La phrase la plus importante que vous voudrez peut-être regarder ici est de combiner deux ou plusieurs défis de base non liés en un seul - envisagez de diviser le défi en défis séparés ou de supprimer des parties inutiles
Okx

1
* chamel e on challenge
CalculatorFeline

1
J'ai changé les règles @Okx. La prise en tant que liste de chiffres est désormais autorisée . Je ne pense toujours pas que cela le rendrait moelleux.
M. Xcoder

Réponses:


8

Gelée , 6 octets

-*æ.¹A

Essayez-le en ligne!

Comment ça fonctionne

-*æ.¹A  Main link. Argument: A (digit array)

-*      Raise -1 to A's digits, yielding 1 for even digits and -1 for odd ones.
    ¹   Identity; yield A.
  æ.    Take the dot product of the units and the digits.
     A  Apply absolute value.

Vous pouvez enregistrer 1 octet en prenant l'entrée comme une liste.
CalculatorFeline

Je suis prends entrée comme une liste.
Dennis

Je parle de la révision 2.
CalculatorFeline

Raise -1 to A's digits, yielding 1 for even digits and 0 for odd ones.euh, je pense que vous avez gâché quelque chose ou quelque chose ...
Erik the Outgolfer

2
@EriktheOutgolfer Darn erreurs ponctuelles.
Dennis

8

Scripts SHENZHEN I / O MCxxxx, 197 (126 + 71) octets

Puce 1 (MC6000):

  • x0: entrée sous forme de liste
  • x2: puce 2 x1
  • x3: MC4010
mov 0 dat
j:
mov x0 acc
mov 70 x3
mov -1 x3
mov acc x3
mul x3
mov acc x2
mov dat acc
add 1
tlt acc 3
mov acc dat
+jmp j
slx x0

Puce 2 (MC4000):

  • p0: Sortie
  • x0: MC4010
  • x1: Puce 1 x2
mov x1 acc
add x1
add x1
mov 30 x0
mov 0 x0
mov acc x0
mov x0 p0
slx x1

1
(Vous pouvez nous faire un <!-- -->commentaire pour obtenir le code juste après une liste, au lieu du texte de remplissage. Ou indenter le code avec 4 autres espaces.)
Mat


5

TI-Basic, 18 9 octets

abs(sum((-1)^AnsAns

Explication

Multiplie chaque chiffre de la liste par -1 à sa puissance, annulant chaque chiffre impair, avant de les additionner.


4

C (gcc) , 59 58 57 octets

i;f(char*v){for(i=0;*v;v++)i+=*v%2?*v-48:48-*v;v=abs(i);}

Essayez-le en ligne!


1
Si cela peut aider, j'ai changé les règles et vous pouvez maintenant prendre la saisie sous forme de liste. Espérons que cela permettrait d'économiser des octets. Je ne connais pas C, donc c'est juste une suggestion.
M. Xcoder

4

R, 30 29 octets

abs(sum((d=scan())-2*d*d%%2))

d = scan() prend le numéro saisi d'un chiffre après l'autre.

-1 octet grâce à @Giuseppe!


C'est assez excellent! Il y a cependant une économie de 1 octet à faire:abs(sum((d=scan())-2*d*d%%2))
Giuseppe

@Giuseppe Merci, bon conseil, édité!
Nutle

4

C #, 57 octets

namespace System.Linq{i=>Math.Abs(i.Sum(n=>n%2<1?n:-n))}

Prend l'entrée au fur iet à mesure et résume les nombres entiers en tournant les cotes à négatif.


Première réponse ici. Aucune idée si j'ai besoin d'envelopper tout cela dans un programme C # réel et de compter ces octets aussi.
TyCobb

Vous devez inclure le passe-partout namespace System.Linq{et faire une fonction réelle. Voir l'autre réponse C # pour référence
M. Xcoder

@ Mr.Xcoder Merci pour l'info. Je pense que j'ai. Le nombre d'octets a presque doublé = (lol
TyCobb

Ouais, C # n'est pas vraiment le meilleur langage de golf
M. Xcoder

@ Mr.Xcoder Non, mais je pensais que les règles se sont assouplies parce que j'ai vu une version mince sur la première page sans les trucs d'espace de noms et je n'en ai pas vu Main. La seule raison pour laquelle je pensais répondre avec ça. Oh bien.
TyCobb

4

Mathematica, 20 octets

Abs@Tr[(-1)^(g=#)g]&

prend en entrée une liste de chiffres

merci spécial à @LLlAMnYP pour m'avoir informé des "nouvelles règles"


battez-moi! :) Vous n'avez probablement pas besoin de *.
Greg Martin

maintenant que OP a assoupli les exigences, votre code peut être beaucoup plus court. +1
LLlAMnYP

3

Japt , 8 octets

x_*JpZÃa

Testez-le en ligne!

Explication

 x_  *JpZÃ a
UxZ{Z*JpZ} a
                Implicit: U = list of digits
UxZ{     }      Take the sum of each item Z in U mapped through the following function:
      JpZ         Return (-1) ** Z
    Z*            times Z. This gives Z if even, -Z if odd.
           a    Take the absolute value of the result.
                Implicit: output result of last expression

3

Neim , 7 octets

ΓDᛃΞ𝐍}𝐬

Explication:

Γ        Apply the following to each element in the input array
 D         Duplicate
  ᛃ        Modulo 2, then perform logical NOT
   Ξ       If truthy, then:
    𝐍        Multiply by -1
      }  Close all currently running loops/conditionals etc
       𝐬 Sum the resulting array

Qui n'a pas de module intégré qui modifie par 2, puis logiquement PAS le résultat?
caird coinheringaahing

@cairdcoinheringaahing C'est fondamentalement 'vérifier si même'
Okx

3

APL, 8 octets

|⊢+.ׯ1*⊢

Essayez-le en ligne!

Comment?

¯1*⊢- -1 n pourn dans

[ 4 5 91 ¯1 ¯1 ]

⊢+.× - multiplication vérifiée avec o , puis somme

[ +/ 4 5 9 × 1 ¯1 ¯1+/ 4 ¯5 ¯9¯10 ]

| - valeur absolue


Pouvez-vous s'il vous plaît fournir un environnement de test?
M. Xcoder

@ Mr.Xcoder ajouté
Uriel

|⊢+.ׯ1*⊢avec la nouvelle spécification d'entrée.
Adám

@ Adám merci. ne peux pas croire que j'ai raté le produit.
Uriel

pouvez-vous fournir plus de détails dans l'explication? cette méthode peut-elle être portée sur J? j'utilise actuellement la clé (voir ma réponse) mais cette méthode pourrait raser quelques octets ...
Jonah

3

JavaScript (ES6), 43 38 octets

Prend l'entrée sous forme de chaîne d' un tableau de chiffres.

a=>a.map(d=>s+=d&1?d:-d,s=0)&&s>0?s:-s

Cas de test


3

EDIT: Une approche plus centrée sur le golf:

EXCEL, 42 36 29 octets

Enregistré 6 octets grâce à Magic Octopus Urn Enregistré 7 octets en utilisant l'approche Dennis '-1 ^ (qui, je viens de l'apprendre, fonctionne sur des tableaux dans Excel)

=ABS(SUMPRODUCT(A:A,-1^A:A))

Prend une liste d'entiers dans une colonne pour l'entrée. Peut probablement être joué plus loin, ou en utilisant la version chaîne, en prenant une chaîne en A1 pour entrée.

EXCEL, 256 octets

=ABS(LEN(SUBSTITUTE(A1,1,""))-2*LEN(SUBSTITUTE(A1,2,""))+3*LEN(SUBSTITUTE(A1,3,""))-4*LEN(SUBSTITUTE(A1,4,""))+5*LEN(SUBSTITUTE(A1,5,""))-6*LEN(SUBSTITUTE(A1,6,""))+7*LEN(SUBSTITUTE(A1,7,""))-8*LEN(SUBSTITUTE(A1,8,""))+9*LEN(SUBSTITUTE(A1,9,""))-5*LEN(A1))

enter image description here


1
avertissement, ne fonctionne que pour les numéros de moins de 100 de longueur
Magic Octopus Urn

1
Passer à A: A enregistre 6 octets et supprime ce problème.
Mark

Wow, rarement ma critique constructive enregistre des octets, +1 pour votre connaissance d'Excel monsieur.
Magic Octopus Urn

En outre, en raison de You may take input as a String, as an Integer or as a list of digits.votre réponse de 42 octets, vous devez utiliser la réponse.
Magic Octopus Urn

Le premier était une tentative humoristique, mais je vais les changer.
Mark


2

Husk , 7 octets

≠0ṁṠ!¡_

Essayez-le en ligne!

Prend une liste de chiffres en entrée.

Il manque toujours un "abs" intégré, mais un bon résultat tout de même :)

Explication

Ṡ!¡_est une fonction qui prend un nombre net applique ensuite n-1la fonction _(négation) à n. Cela se traduit npar impair nou -npairn .

applique une fonction à chaque élément d'une liste et additionne les résultats.

≠0 renvoie la différence absolue entre un nombre et 0.


2

05AB1E , 6 octets

Merci à Dennis pour le power-trick -1. Prend la saisie sous forme de liste de chiffres

®sm*OÄ

Essayez-le en ligne!

Explication

®sm*OÄ                                               Example [4, 5, 9]
®      # Push -1                                   % STACK: -1
 sm    # Take -1 to the power of every number      % STACK: [1, -1, -1]
         in the input list 
   *   # Multiply with original input              % Multiply [1, -1, -1] with [4, 5, 9] results in STACK: [4, -5, -9]
    O  # Sum them all together                     % STACK: -10
     Ä # Absolute value                            % STACK: 10
       # Implicit print

Je ne peux pas suivre l'explication. Souhaitez-vous ajouter un exemple s'il vous plaît.
Titus

@Titus vous voilà. J'espère que ça aide :)
Datboi

Et j'étais là avec È2*<*Ocomme un sale sale.
Magic Octopus Urn

2

PHP, 51 octets

while(~$n=$argn[$i++])$s+=$n&1?$n:-$n;echo abs($s);

ajoute un chiffre $ssi impair, soustrait s'il est pair. Exécuter en tant que tuyau avec -nR.

ou

while(~$n=$argn[$i++])$s+=(-1)**$n*$n;echo abs($s);

en utilisant le tour de -1force de Dennis .


2

Mathematica, 67 octets

(s=#;Abs[Subtract@@(Tr@Select[IntegerDigits@s,#]&/@{EvenQ,OddQ})])&

2

PHP , 54 octets

for(;~$n=$argn[$i++];)${eo[$n&1]}+=$n;echo abs($e-$o);

Essayez-le en ligne!

PHP , 57 octets

stocker les sommes paires et impaires dans un tableau

for(;~$n=$argn[$i++];)$r[$n&1]+=$n;echo abs($r[0]-$r[1]);

Essayez-le en ligne!

PHP , 57 octets

stocker les sommes paires et impaires dans deux variables

for(;~$n=$argn[$i++];)$n&1?$o+=$n:$e+=$n;echo abs($e-$o);

Essayez-le en ligne!


54 octets: somme impaire ${1}et somme paire ${0}:while(~$n=$argn[$i++])${$n&1}+=$n;echo abs(${1}-${0});
Titus

@Titus nice je pense que `pour (; ~ $ n = $ argn [$ i ++];) $ {eo [$ n & 1]} + = $ n; echo abs ($ e- $ o);` est aussi une belle variante . Ou nous pouvons le faire plus nathematical for(;~$n=$argn[$i++];$s+=$n)$u+=($n&1)*$n;echo abs($s-2*$u);et for(;~$n=$argn[$i++];)$u+=(($n&1)-.5)*2*$n;echo abs($u);est une manière intéressante
Jörg Hülsermann

2

Haskell, 47 42 39 38 26 25 bytes

-1 thanks to nimi

-12 thanks to Bruce

-1 thanks to xnor

abs.sum.map(\x->x*(-1)^x)

Try it online!


1
You can inline s: ((*)=<<((-1)^)).
nimi

1
It's one byte shorter to just write (\x->x*(-1)^x).
xnor

1

Perl 6, 28 bytes

{abs sum $_ Z*.map(*%2*2-1)}

Try it online!

Takes a list of digits as input.

  • $_ is the input argument.
  • .map(* % 2 * 2 - 1) maps each digit to either 1 or -1 depending on whether the digit is odd or even, respectively.
  • Z* zips the original list of digits with the even/odd list using multiplication.

1

Braingolf, 18 bytes

{.2%?M|}&+v&+c-!s*

Try it online!

Takes input as a list of digits

Explanation

{.2%?M|}&+v&+c-!s*  Implicit input from commandline args
{......}            Foreach loop, runs on each item in the stack..
 .2%                ..Parity check, push 1 if odd, 0 if even
    ?               ..If last item != 0 (pops last item)..
     M              ....Move last item to next stack
      |             ..Endif
        &+          Sum entire stack
          v&+       Switch to next stack and sum entire stack
             c-     Collapse into stack1 and subtract
               !s   Sign check, push 1 if last item is positive, -1 if last item is
                    negative, 0 if last item is 0
                 *  Multiply last item by sign, gets absolute value
                    Implicit output

1

R, 72 43 bytes

b=(d=scan())%%2<1;abs(sum(d[b])-sum(d[!b]))

First, d = scan() takes the number as input, one digit after the other (thanks to @Giuseppe comment !)
Then, b = d %% 2 <1 associates to b a TRUE or FALSE value at each index depending on the digits' parity. Therefore, b values are TRUE for even numbers, and !b are TRUE for odd values.

Finaly, abs(sum(d[b]) - sum(d[!b])) does the job.


<1 is one byte shorter than ==0, but note that you may take input as a list of digits as well.
Giuseppe

@Giuseppe Well spotted ! Thanks !
Frédéric

1

Bash 141 139 99 Bytes

while read -n1 a; do
[ $[a%2] = 0 ]&&e=$[e+a]||o=$[o+a]
done
(($[e-o]>0))&&echo $[e-o]||echo $[o-e]

Try it online!



1

C#, 67 bytes

namespace System.Linq{a=>Math.Abs(a.Sum(n=>n%2<1)-a.Sum(n=>n%2>1))}

1

05AB1E, 7 bytes

È2*<*OÄ

Try it online!

        # Input              | 1234567
È       # Is Even?           | [0,1,0,1,0,1,0]
 2*<    # (a * 2) - 1        | [-1,1,-1,1,-1,1,-1]
    *   # Multiply w/ input. | [-1,2,-3,4,-5,6,-7]
     O  # Sum.               | -10
      Ä # Absolute value of. | 10

1

x86-64 Machine Code, 30 bytes

31 C0 99 8B 4C B7 FC F6 C1 01 74 04 01 CA EB 02 01 C8 FF CE 75 ED 29 D0 99 31 D0 29 D0 C3

The above code defines a function that accepts a list/array of integer digits and returns the absolute difference between the sum of its even digits and the sum of its odd digits.

As in C, assembly language doesn't implement lists or arrays as first-class types, but rather represents them as a combination of a pointer and a length. Therefore, I have arranged for this function to accept two parameters: the first is a pointer to the beginning of the list of digits, and the second is an integer specifying the total length of the list (total number of digits, one-indexed).

The function conforms to the System V AMD64 calling convention, which is standard on Gnu/UNIX systems. In particular, the first parameter (pointer to the beginning of the list) is passed in RDI (as this is 64-bit code, it is a 64-bit pointer), and the second parameter (length of the list) is passed in ESI (this is only a 32-bit value, because that's more than enough digits to play with, and naturally it is assumed to be non-zero). The result is returned in the EAX register.

If it's any clearer, this would be the C prototype (and you can use this to call the function from C):

int OddsAndEvens(int *ptrDigits, int length);

Ungolfed assembly mnemonics:

; parameter 1 (RDI) == pointer to list of integer digits
; parameter 2 (ESI) == number of integer digits in list (assumes non-zero, of course)
OddsAndEvens:
   xor  eax, eax              ; EAX = 0 (accumulator for evens)
   cdq                        ; EDX = 0 (accumulator for odds)
.IterateDigits:
   mov  ecx, [rdi+rsi*4-4]    ; load next digit from list
   test cl, 1                 ; test last bit to see if even or odd
   jz   .IsEven               ; jump if last bit == 0 (even)
.IsOdd:                       ; fall through if last bit != 0 (odd)
   add  edx, ecx              ; add value to odds accumulator
   jmp  .Continue             ; keep looping
.IsEven:
   add  eax, ecx              ; add value to evens accumulator
.Continue:                    ; fall through
   dec  esi                   ; decrement count of digits in list
   jnz  .IterateDigits        ; keep looping as long as there are digits left

   sub  eax, edx              ; subtract odds accumulator from evens accumulator

   ; abs
   cdq                        ; sign-extend EAX into EDX
   xor  eax, edx              ; XOR sign bit in with the number
   sub  eax, edx              ; subtract sign bit

   ret                        ; return with final result in EAX

Here's a brief walk-through of the code:

  • First, we zero out the EAX and EDX registers, which will be used to hold the sum totals of even and odd digits. The EAX register is cleared by XORing it with itself (2 bytes), and then the EDX register is cleared by sign-extending the EAX into it (CDQ, 1 byte).
  • Then, we go into the loop that iterates through all of the digits passed in the array. It retrieves a digit, tests to see if it is even or odd (by testing the least-significant bit, which will be 0 if the value is even or 1 if it is odd), and then jumps or falls through accordingly, adding that value to the appropriate accumulator. At the bottom of the loop, we decrement the digit counter (ESI) and continue looping as long as it is non-zero (i.e., as long as there are more digits left in the list to be retrieved).

    The only thing tricky here is the initial MOV instruction, which uses the most complex addressing mode possible on x86.* It takes RDI as the base register (the pointer to the beginning of the list), scales RSI (the length counter, which serves as the index) by 4 (the size of an integer, in bytes) and adds that to the base, and then subtracts 4 from the total (because the length counter is one-based and we need the offset to be zero-based). This gives the address of the digit in the array, which is then loaded into the ECX register.

  • After the loop has finished, we do the subtraction of the odds from the evens (EAX -= EDX).

  • Finally, we compute the absolute value using a common trick—the same one used by most C compilers for the abs function. I won't go into details about how this trick works here; see code comments for hints, or do a web search.

__
* The code can be re-written to use simpler addressing modes, but it doesn't make it any shorter. I was able to come up with an alternative implementation that dereferenced RDI and incremented it by 8 each time through the loop, but because you still have to decrement the counter in ESI, this turned out to be the same 30 bytes. What had initially given me hope is that add eax, DWORD PTR [rdi] is only 2 bytes, the same as adding two enregistered values. Here is that implementation, if only to save anyone attempting to outgolf me some effort :-)

                    OddsAndEvens_Alt:
31 C0                   xor    eax, eax
99                      cdq
                    .IterateDigits:
F6 07 01                test   BYTE PTR [rdi], 1
74 04                   je     .IsEven
                    .IsOdd:
03 17                   add    edx, DWORD PTR [rdi]
EB 02                   jmp    .Continue
                    .IsEven:
03 07                   add    eax, DWORD PTR [rdi]
                    .Continue:
48 83 C7 08             add    rdi, 8
FF CE                   dec    esi
75 ED                   jne    .IterateDigits
29 D0                   sub    eax, edx
99                      cdq
31 D0                   xor    eax, edx
29 D0                   sub    eax, edx
C3                      ret


1

TI-BASIC, 11 6 bytes

abs(sum(Anscos(πAns

Takes input as a list. i²^Ans saves two bytes over (-1)^Ans because we don't need the parentheses.

abs(sum(Anscos(πAns
           cos(πAns                  1 for evens, -1 for odds
        Ans                          Multiply by original list
abs(sum(                             Sum the list and take absolute value, which also
                                     fixes rounding errors from cos(.

1

J, 14 bytes

|-/(2&|+//.[),

Try it online!

explanation

|                absolute value of
 -/              the difference between
                 the items on the list returned by this fork
   (2&|          is an item odd? (1 for yes, 0 for no)
       +//.      the "key" verb /. which partitions on above (even / odd) then sums
           [)    identity, ie, the list of digits passed
             ,   turn it into a list (to handle 1 element case)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.