Sottrai le mie probabilità dai miei pari


19

Dato un numero intero non negativo, restituisce la differenza assoluta tra la somma delle sue cifre pari e la somma delle sue cifre dispari.

Regole predefinite

  • Si applicano scappatoie standard.

  • È possibile accettare input e fornire output con qualsiasi metodo di input / output standard.

  • È possibile accettare input come stringa, come numero intero o come elenco di cifre.

  • Questo è , quindi vince il codice più breve in byte in ogni lingua !

Casi test

Ingresso ~> Uscita

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
Possiamo prendere input come elenco di ints?
Adám,

4
@ Mr.Xcoder Non sarebbe troppo banale. Rende la sfida inutilmente complicata ed è un requisito arbitrario che aggiunge byte.
Okx,

4
@ Mr.Xcoder Non fare sfide camaleonte . La frase più importante che potresti voler guardare qui è Combinare due o più sfide fondamentali non correlate in una - considera di dividere la sfida in sfide separate o di rilasciare parti non necessarie
Okx,

1
* chamel e on challenge
CalculatorFeline

1
Ho modificato le regole @Okx. Ora è consentito prendere come un elenco di cifre . Comunque non penso che lo renderebbe soffice.
Mr. Xcoder,

Risposte:


8

Gelatina , 6 byte

-*æ.¹A

Provalo online!

Come funziona

-*æ.¹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.

È possibile salvare 1 byte prendendo input come elenco.
Calcolatrice

Mi sto prendendo in ingresso come una lista.
Dennis,

Sto parlando della revisione 2.
CalculatorFeline,

Raise -1 to A's digits, yielding 1 for even digits and 0 for odd ones.umm, penso che tu abbia incasinato qualcosa un po 'o qualcosa del genere ...
Erik the Outgolfer

2
@EriktheOutgolfer Darn errori off-by-one.
Dennis,

8

Script MCXXxx I / O SHENZHEN, 197 (126 + 71) byte

Chip 1 (MC6000):

  • x0: input come elenco
  • x2: Chip 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

Chip 2 (MC4000):

  • p0: uscita
  • x0: MC4010
  • x1: Chip 1 x2
mov x1 acc
add x1
add x1
mov 30 x0
mov 0 x0
mov acc x0
mov x0 p0
slx x1

1
(Puoi inviarci un <!-- -->commento per ottenere il codice subito dopo un elenco, anziché il testo di riempimento. O indentare il codice con altri 4 spazi.)
Mat


5

TI-Basic, 18 9 byte

abs(sum((-1)^AnsAns

Spiegazione

Moltiplica ogni cifra nell'elenco per -1 alla sua potenza, annullando ogni cifra dispari, prima di sommarle.


4

C (gcc) , 59 58 57 byte

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

Provalo online!


1
Se aiuta, ho modificato le regole e ora puoi prendere l'input come elenco. Spero che ciò salverebbe i byte. Non conosco C, quindi è solo un suggerimento.
Mr. Xcoder,

4

R, 30 29 byte

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

d = scan() prende il numero inserito di una cifra dopo l'altra.

-1 byte grazie a @Giuseppe!


Questo è abbastanza eccellente! C'è un risparmio di 1 byte da fare, però:abs(sum((d=scan())-2*d*d%%2))
Giuseppe

@Giuseppe Grazie, buon consiglio, a cura!
Nutle,

4

C #, 57 byte

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

Prende input come ie somma gli interi trasformando le probabilità in negative.


Prima risposta qui Nessun indizio se devo racchiudere tutto in un vero programma C # e contare anche quei byte.
TyCobb,

Devi includere la piastra della caldaia namespace System.Linq{ed eseguire una funzione effettiva. Vedi l'altra risposta C # per riferimento
Mr. Xcoder,

@ Mr.Xcoder Grazie per le informazioni. Penso di aver capito. Quasi raddoppiato il mio conteggio dei byte = (lol
TyCobb

Sì, C # non è proprio il miglior linguaggio del golf
Mr. Xcoder, l'

@ Mr.Xcoder No, ma ho pensato che le regole si fossero allentate perché ho visto una versione slim sulla prima pagina senza roba dello spazio dei nomi e non ho visto un Main. L'unica ragione per cui ho pensato di rispondere. Oh bene.
TyCobb,

4

Mathematica, 20 byte

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

accetta come input un elenco di cifre

ringraziamenti speciali a @LLlAMnYP per avermi fatto conoscere le "nuove regole"


battimi! :) Probabilmente non ti serve *.
Greg Martin,

ora che OP ha ridotto i requisiti il ​​tuo codice può essere banalmente molto più breve. +1
LLlAMnYP

3

Japt , 8 byte

x_*JpZÃa

Provalo online!

Spiegazione

 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 byte

ΓDᛃΞ𝐍}𝐬

Spiegazione:

Γ        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

Chi non ha un built-in che mods per 2 quindi logicamente NON è il risultato?
caird coinheringaahing il

@cairdcoinheringaahing In pratica è 'controlla se anche'
Okx,

3

APL, 8 byte

|⊢+.ׯ1*⊢

Provalo online!

Come?

¯1*⊢- -1 n per nin

[ 4 5 91 ¯1 ¯1]

⊢+.×- moltiplicazione verctorizzata con o, quindi somma

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

| - valore assoluto


Potete per favore fornire un ambiente di test?
Mr. Xcoder,

@ Mr.Xcoder aggiunto
Uriel

|⊢+.ׯ1*⊢con le nuove specifiche di input.
Adám,

@Adám grazie. non riesco a credere che mi sia perso il prodotto.
Uriel,

puoi fornire maggiori dettagli nella spiegazione? questo metodo può essere portato su J? sto usando la chiave (vedi la mia risposta) ma questo metodo potrebbe radere qualche byte ...
Giona

3

JavaScript (ES6), 43 38 byte

Prende l'input come stringa di una matrice di cifre.

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

Casi test


3

EDIT: un approccio più incentrato sul golf:

EXCEL, 42 36 29 byte

Hai salvato 6 byte grazie a Magic Octopus Urn Hai salvato 7 byte usando l'approccio -1 ^ di Dennis (che, ho appena imparato, funziona su array in Excel)

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

Prende un elenco di numeri interi in una colonna per l'input. Probabilmente si può giocare a golf ulteriormente, o usando la versione stringa, prendendo una stringa in A1 per l'input.

EXCEL, 256 byte

=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))

inserisci qui la descrizione dell'immagine


1
disclaimer, funziona solo per numeri di lunghezza inferiore a 100
Magic Octopus Urn,

1
Passando ad A: A salva 6 byte e rimuove quel problema.
Segna l'

Caspita, raramente la mia critica costruttiva salva byte, +1 per la tua conoscenza di Excel signore.
Magic Octopus Urn l'

Inoltre, a causa della You may take input as a String, as an Integer or as a list of digits.tua risposta a 42 byte dovrebbe essere la risposta che usi.
Magic Octopus Urn l'

Il primo è stato un tentativo umoristico, ma li cambierò.
Segna l'


2

Buccia , 7 byte

≠0ṁṠ!¡_

Provalo online!

Prende un elenco di cifre come input.

Manca ancora un "abs" incorporato, ma un buon risultato lo stesso :)

Spiegazione

Ṡ!¡_è una funzione che accetta un numero ne quindi applica n-1volte alla funzione _(negazione) n. Questo si traduce in nper dispari no -nper anche n.

applica una funzione a ciascun elemento di un elenco e somma i risultati.

≠0 restituisce la differenza assoluta tra un numero e 0.


2

05AB1E , 6 byte

Grazie a Dennis per il trucco di potenza -1. Accetta input come un elenco di cifre

®sm*OÄ

Provalo online!

Spiegazione

®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

Non riesco a seguire la spiegazione. Vorresti aggiungere un esempio per favore.
Tito,

@Titus eccoti. Spero che sia d'aiuto :)
Datboi,

Ed eccomi qui con È2*<*Ouna sporca casualità.
Magic Octopus Urn l'

2

PHP, 51 byte

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

aggiunge la cifra a $sif dispari, sottrae se pari. Esegui come pipe con -nR.

o

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

usando il -1trucco di Dennis .


2

Mathematica, 67 byte

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

2

PHP , 54 byte

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

Provalo online!

PHP , 57 byte

memorizzare le somme pari e dispari in un array

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

Provalo online!

PHP , 57 byte

memorizzare le somme pari e dispari in due variabili

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

Provalo online!


54 byte: somma dispari ${1}e somma pari ${0}:while(~$n=$argn[$i++])${$n&1}+=$n;echo abs(${1}-${0});
Tito

@Titus nice Penso che `for (; ~ $ n = $ argn [$ i ++];) $ {eo [$ n & 1]} + = $ n; echo abs ($ e- $ o);` è anche una bella variante . Oppure possiamo farlo più nathematical for(;~$n=$argn[$i++];$s+=$n)$u+=($n&1)*$n;echo abs($s-2*$u);ed for(;~$n=$argn[$i++];)$u+=(($n&1)-.5)*2*$n;echo abs($u);è un modo interessante
Jörg Hülsermann,

2

Haskell , 47 42 39 38 26 25 byte

-1 grazie a nimi

-12 grazie a Bruce

-1 grazie a xnor

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

Provalo online!


1
È possibile inline s: ((*)=<<((-1)^)).
nimi,

1
È solo un byte più breve per scrivere (\x->x*(-1)^x).
xnor

1

Perl 6 , 28 byte

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

Provalo online!

Prende un elenco di cifre come input.

  • $_ è l'argomento di input.
  • .map(* % 2 * 2 - 1)esegue il mapping di ciascuna cifra su 1o a -1seconda che la cifra sia pari o dispari, rispettivamente.
  • Z* comprime l'elenco originale di cifre con l'elenco pari / dispari usando la moltiplicazione.

1

Braingolf , 18 byte

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

Provalo online!

Accetta input come un elenco di cifre

Spiegazione

{.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 byte

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

Innanzitutto, d = scan()prende il numero come input, una cifra dopo l'altra (grazie al commento di @Giuseppe!)
Quindi, b = d %% 2 <1associa a bun valore TRUEo FALSEin ciascun indice a seconda della parità delle cifre. Pertanto, i bvalori sono TRUEper numeri pari e lo !bsonoTRUE per i valori dispari.

Finalmente, abs(sum(d[b]) - sum(d[!b]))fa il lavoro.


<1è un byte più breve di ==0, ma tieni presente che puoi prendere l'input anche come un elenco di cifre.
Giuseppe,

@Giuseppe Ben notato! Grazie !
Frédéric,

1

Bash 141 139 99 byte

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

Provalo online!



1

C #, 67 byte

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

1

05AB1E , 7 byte

È2*<*OÄ

Provalo 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 Codice macchina, 30 byte

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

Il codice precedente definisce una funzione che accetta un elenco / array di cifre intere e restituisce la differenza assoluta tra la somma delle sue cifre pari e la somma delle sue cifre dispari.

Come in C , il linguaggio assembly non implementa elenchi o matrici come tipi di prima classe, ma li rappresenta piuttosto come una combinazione di un puntatore e una lunghezza. Pertanto, ho predisposto che questa funzione accetti due parametri: il primo è un puntatore all'inizio dell'elenco di cifre e il secondo è un numero intero che specifica la lunghezza totale dell'elenco (numero totale di cifre, uno indicizzato) .

La funzione è conforme alla convenzione di chiamata System V AMD64 , che è standard sui sistemi Gnu / UNIX. In particolare, viene passato il primo parametro (puntatore all'inizio dell'elenco) RDI(poiché si tratta di un codice a 64 bit, è un puntatore a 64 bit) e viene passato il secondo parametro (lunghezza dell'elenco) ESI( questo è solo un valore a 32 bit, perché è più che sufficiente per giocare, e naturalmente si presume che sia diverso da zero). Il risultato viene restituito nel EAXregistro.

Se è più chiaro, questo sarebbe il prototipo C (e puoi usarlo per chiamare la funzione da C):

int OddsAndEvens(int *ptrDigits, int length);

Mnemonici di assemblaggio non golfati:

; 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

Ecco una breve descrizione del codice:

  • Innanzitutto, azzeriamo i registri EAXe EDX, che verranno utilizzati per contenere i totali delle cifre pari e dispari. Il EAXregistro viene cancellato XORinserendolo con se stesso (2 byte), quindi il EDXregistro viene cancellato estendendo il segno EAX al suo interno ( CDQ, 1 byte).
  • Quindi, entriamo nel ciclo che scorre tutte le cifre passate nell'array. Recupera una cifra, verifica se è pari o dispari (testando il bit meno significativo, che sarà 0 se il valore è pari o 1 se è dispari), quindi salta o cade di conseguenza, aggiungendo che valore per l'accumulatore appropriato. Nella parte inferiore del loop, decrementiamo il contatore delle cifre ( ESI) e continuiamo il loop fino a quando è diverso da zero (ovvero, purché ci siano più cifre rimaste nell'elenco da recuperare).

    L'unica cosa difficile qui è l'istruzione MOV iniziale, che utilizza la modalità di indirizzamento più complessa possibile su x86. * Prende RDIcome registro di base (il puntatore all'inizio dell'elenco), ridimensiona RSI(il contatore della lunghezza, che funge da indice) di 4 (la dimensione di un numero intero, in byte) e lo aggiunge alla base, e quindi sottrae 4 dal totale (poiché il contatore della lunghezza è a base singola e abbiamo bisogno che l'offset sia a base zero). Ciò fornisce l'indirizzo della cifra nell'array, che viene quindi caricato nel ECXregistro.

  • Dopo che il ciclo è terminato, eseguiamo la sottrazione delle probabilità da evens ( EAX -= EDX).

  • Infine, calcoliamo il valore assoluto usando un trucco comune, lo stesso usato dalla maggior parte dei compilatori C per la absfunzione. Non entrerò nei dettagli su come funziona questo trucco qui; vedere i commenti sul codice per suggerimenti o fare una ricerca sul web.

__
* Il codice può essere riscritto per utilizzare modalità di indirizzamento più semplici, ma non lo rende più breve. Sono stato in grado di escogitare un'implementazione alternativa che lo dereferenziasse RDIe lo incrementasse di 8 ogni volta attraverso il ciclo, ma poiché devi ancora diminuire il contatore ESI, questo si è rivelato essere gli stessi 30 byte. Ciò che inizialmente mi aveva dato la speranza è che fossero add eax, DWORD PTR [rdi]solo 2 byte, lo stesso che aggiungere due valori registrati. Ecco l'implementazione, se non altro per salvare qualcuno che tenta di superarmi un po 'di sforzo :-)

                    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 byte

abs(sum(Anscos(πAns

Accetta input come elenco. i²^Anssalva due byte (-1)^Ansperché non abbiamo bisogno delle parentesi.

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 byte

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

Provalo online!

spiegazione

|                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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.