Kurangi peluang saya dari evens saya


19

Dengan bilangan bulat non-negatif, kembalikan perbedaan absolut antara jumlah digit genap dan jumlah digit ganjilnya.

Aturan Bawaan

  • Berlaku celah standar.

  • Anda dapat mengambil input dan memberikan output dengan metode Input / Output standar apa pun.

  • Anda dapat mengambil input sebagai String, sebagai Integer atau sebagai daftar digit.

  • Ini adalah , jadi kode terpendek dalam byte di setiap bahasa menang!

Uji Kasus

Input ~> Output

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
Bisakah kita mengambil input sebagai daftar int?
Adám

4
@ Mr.Xcoder Itu tidak akan terlalu sepele. Itu membuat tantangan menjadi tidak perlu rumit dan merupakan persyaratan sewenang-wenang yang menambahkan byte.
Okx

4
@ Mr.Xcoder Jangan membuat tantangan bunglon . Kalimat paling penting yang mungkin ingin Anda lihat di sini adalah Menggabungkan dua atau lebih tantangan inti yang tidak terkait menjadi satu - pertimbangkan untuk memecah tantangan menjadi tantangan terpisah atau menjatuhkan bagian yang tidak perlu
Okx

1
* chamel e tantangan
CalculatorFeline

1
Saya telah mengubah aturan @Okx. Mengambil sebagai daftar angka sekarang diizinkan . Saya masih tidak berpikir itu akan membuatnya mengembang.
Tn. Xcoder

Jawaban:


8

Jelly , 6 byte

-*æ.¹A

Cobalah online!

Bagaimana itu bekerja

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

Anda dapat menyimpan 1 byte dengan mengambil input sebagai daftar.
CalculatorFeline

Saya sedang mengambil input sebagai daftar.
Dennis

Saya sedang berbicara tentang revisi 2.
CalculatorFeline

Raise -1 to A's digits, yielding 1 for even digits and 0 for odd ones.umm, saya pikir Anda mengacaukan sesuatu sedikit atau sesuatu ...
Erik the Outgolfer

2
@EriktheOutgolfer Singkirkan kesalahan satu per satu.
Dennis

8

SHENZHEN I / O skrip MCxxxx, 197 (126 + 71) byte

Chip 1 (MC6000):

  • x0: Input sebagai daftar
  • 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: Output
  • 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
(Anda dapat memberikan <!-- -->komentar kepada kami untuk mendapatkan kode tepat setelah daftar, alih-alih teks pengisi. Atau indentasi kode dengan 4 spasi lebih banyak.)
Mat

5

Python 2, 39 byte

Mengambil bilangan bulat sebagai daftar. Cobalah online

lambda A:abs(sum((-1)**i*i for i in A))

-3 byte terima kasih kepada @ Mr.Xcoder
-1 byte terima kasih kepada @ovs


1
Gunakan [i,-i][i%2]sebagai ganti i%2and i or -iuntuk 40 byte .
Tn. Xcoder

2
(-1)**i*iuntuk 39 byte
ovs

5

TI-Basic, 18 9 byte

abs(sum((-1)^AnsAns

Penjelasan

Mengalikan setiap digit dalam daftar dengan -1 dengan kekuatannya, meniadakan setiap digit ganjil, sebelum menjumlahkannya.


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);}

Cobalah online!


1
Jika ini membantu, saya telah mengubah aturan dan Anda sekarang dapat mengambil input sebagai daftar. Semoga itu bisa menghemat byte. Saya tidak tahu C, jadi itu hanya saran.
Tn. Xcoder

4

R, 30 29 byte

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

d = scan() mengambil nomor input satu demi satu digit.

-1 byte terima kasih kepada @Giuseppe!


Ini sangat bagus! Namun, ada penghematan 1 byte yang harus dilakukan:abs(sum((d=scan())-2*d*d%%2))
Giuseppe

@Giuseppe Terima kasih, tip bagus, diedit!
Nutle

4

C #, 57 byte

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

Mengambil input sebagai idan menjumlahkan bilangan bulat dengan mengubah peluang menjadi negatif.


Jawaban pertama di sini. Tidak tahu apakah saya perlu membungkus semua ini menjadi program C # yang sebenarnya dan menghitung byte juga.
TyCobb

Anda harus memasukkan boilerplate namespace System.Linq{dan membuat fungsi yang sebenarnya. Lihat jawaban C # lainnya untuk referensi
Tn. Xcoder

@ Mr.Xcoder Terima kasih atas informasinya. Pikir saya mengerti. Hampir dua kali lipat jumlah byte saya = (lol
TyCobb

Ya, C # sebenarnya bukan bahasa golf terbaik
Tn. Xcoder

@ Mr.Xcoder Tidak, tapi saya pikir aturannya menjadi santai karena saya melihat versi ramping di halaman pertama tanpa hal namespace dan tidak melihat Main. Satu-satunya alasan saya pikir saya akan menjawabnya. Oh well
TyCobb

4

Mathematica, 20 byte

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

mengambil input dari daftar digit

thanx spesial ke @LLlAMnYP untuk memberi tahu saya tentang "aturan baru"


kalahkan aku untuk itu! :) Anda mungkin tidak perlu *.
Greg Martin

sekarang OP telah melonggarkan persyaratan kode Anda bisa jauh lebih singkat. +1
LLlAMnYP

3

Japt , 8 byte

x_*JpZÃa

Uji secara online!

Penjelasan

 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ᛃΞ𝐍}𝐬

Penjelasan:

Γ        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

Siapa yang tidak memiliki builtin yang mods 2 maka secara logis TIDAK hasilnya?
caird coinheringaahing

@cairdcoinheringaahing Pada dasarnya 'periksa jika genap'
Okx

3

APL, 8 byte

|⊢+.ׯ1*⊢

Cobalah online!

Bagaimana?

¯1*⊢- -1 n untuk ndalam

[ 4 5 91 ¯1 ¯1]

⊢+.×- Penggandaan yang diverifikasi dengan o, lalu jumlah

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

| - nilai mutlak


Bisakah Anda memberikan lingkungan pengujian?
Tn. Xcoder

@ Mr.Xcoder menambahkan
Uriel

|⊢+.ׯ1*⊢dengan spesifikasi input baru.
Adám

@ Adam terima kasih. tidak percaya saya melewatkan produk.
Uriel

dapatkah Anda memberikan lebih detail dalam penjelasannya? dapatkah metode ini dipindahkan ke J? Saya sedang menggunakan kunci (lihat jawaban saya) tetapi metode ini mungkin mengurangi beberapa byte ...
Jonah

3

JavaScript (ES6), 43 38 byte

Mengambil input sebagai string, array digit.

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

Uji kasus


3

EDIT: Pendekatan yang lebih berpusat pada golf:

EXCEL, 42 36 29 byte

Disimpan 6 byte berkat Sihir Gurita Guci Disimpan 7 byte dengan menggunakan pendekatan '-1 ^ Dennis (yang, saya baru saja belajar, bekerja pada array di excel)

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

Mengambil daftar bilangan bulat di kolom A untuk input. Mungkin bisa di-golf lebih lanjut, atau dengan menggunakan versi string, mengambil string di A1 untuk 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))

masukkan deskripsi gambar di sini


1
Penafian, hanya bekerja untuk angka yang panjangnya kurang dari 100
Magic Octopus Mm

1
Beralih ke A: A menyimpan 6 byte dan menghilangkan masalah itu.
Markus

Wow, jarang kritik konstruktif saya menyimpan byte, +1 untuk Pak pengetahuan Excel Anda.
Magic Gurita Guci

Juga, karena You may take input as a String, as an Integer or as a list of digits.jawaban 42 byte Anda harus menjadi jawaban yang Anda gunakan.
Magic Gurita Guci

Yang pertama adalah upaya yang lucu, tetapi saya akan mengubah mereka.
Markus


2

Sekam , 7 byte

≠0ṁṠ!¡_

Cobalah online!

Mengambil daftar digit sebagai input.

Masih melewatkan built-in "abs", tapi hasilnya bagus :)

Penjelasan

Ṡ!¡_adalah fungsi yang mengambil angka ndan kemudian menerapkan n-1kali fungsi _(negasi) ke n. Ini menghasilkan nganjil natau -ngenap n.

menerapkan fungsi ke setiap elemen daftar dan menjumlahkan hasilnya.

≠0 mengembalikan perbedaan absolut antara angka dan 0.


2

05AB1E , 6 byte

Terima kasih kepada Dennis untuk trik daya -1. Mengambil input sebagai daftar digit

®sm*OÄ

Cobalah online!

Penjelasan

®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

Saya tidak bisa mengikuti penjelasannya. Tolong tambahkan contoh.
Titus

@Titus di sana Anda pergi. Semoga ini membantu :)
Datboi

Dan di sini saya dengan È2*<*Oseperti kasual kotor.
Magic Gurita Guci

2

PHP, 51 byte

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

menambahkan digit ke $sjika ganjil, kurangi jika genap. Jalankan sebagai pipa dengan-nR .

atau

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

menggunakan -1trik kekuatan 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);

Cobalah online!

PHP , 57 byte

menyimpan jumlah genap dan ganjil dalam array

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

Cobalah online!

PHP , 57 byte

menyimpan jumlah genap dan ganjil dalam dua variabel

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

Cobalah online!


54 byte: jumlah ganjil ${1}dan bahkan jumlah ${0}:while(~$n=$argn[$i++])${$n&1}+=$n;echo abs(${1}-${0});
Titus

@Titus bagus, saya pikir `untuk (; ~ $ n = $ argn [$ i ++];) $ {eo [$ n & 1]} + = $ n; gema abs ($ e- $ o);` juga merupakan varian yang bagus . Atau kita bisa melakukannya lebih nathematical for(;~$n=$argn[$i++];$s+=$n)$u+=($n&1)*$n;echo abs($s-2*$u);dan for(;~$n=$argn[$i++];)$u+=(($n&1)-.5)*2*$n;echo abs($u);merupakan cara yang menarik
Jörg Hülsermann

2

Haskell , 47 42 39 38 26 25 byte

-1 berkat nimi

Terima kasih untuk Bruce

-1 terima kasih kepada xnor

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

Cobalah online!


1
Anda dapat inline s: ((*)=<<((-1)^)).
nimi

1
Lebih pendek satu byte untuk menulis (\x->x*(-1)^x).
xnor

1

Perl 6 , 28 byte

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

Cobalah online!

Mengambil daftar digit sebagai input.

  • $_ adalah argumen input.
  • .map(* % 2 * 2 - 1)memetakan setiap digit ke salah satu 1atau -1tergantung pada apakah masing-masing digit tersebut ganjil atau genap.
  • Z* zip daftar asli digit dengan daftar genap / ganjil menggunakan perkalian.

1

Braingolf , 18 byte

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

Cobalah online!

Mengambil input sebagai daftar digit

Penjelasan

{.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]))

Pertama, d = scan()mengambil nomor sebagai masukan, satu angka setelah yang lain (terima kasih kepada @Giuseppe komentar!)
Kemudian, b = d %% 2 <1rekan untuk bsebuah TRUEatau FALSEnilai pada masing-masing indeks tergantung pada paritas angka. Oleh karena itu, bnilai-nilai TRUEuntuk nomor bahkan, dan !byang TRUEuntuk nilai-nilai aneh.

Akhirnya, abs(sum(d[b]) - sum(d[!b]))lakukan pekerjaan.


<1satu byte lebih pendek dari ==0, tetapi perhatikan bahwa Anda dapat mengambil input sebagai daftar digit juga.
Giuseppe

@Giuseppe Terlihat dengan baik! Terima kasih!
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]

Cobalah 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Ä

Cobalah 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 Kode Mesin, 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

Kode di atas mendefinisikan fungsi yang menerima daftar / array angka integer dan mengembalikan perbedaan absolut antara jumlah digit genapnya dan jumlah digit ganjilnya.

Seperti dalam C , bahasa assembly tidak mengimplementasikan daftar atau array sebagai tipe kelas satu, melainkan merepresentasikannya sebagai kombinasi dari sebuah pointer dan panjang. Oleh karena itu, saya telah mengatur agar fungsi ini menerima dua parameter: yang pertama adalah penunjuk ke awal daftar digit, dan yang kedua adalah integer yang menentukan panjang total daftar (jumlah total digit, satu-diindeks) .

Fungsi ini sesuai dengan konvensi pemanggilan Sistem V AMD64 , yang merupakan standar pada sistem Gnu / UNIX. Secara khusus, parameter pertama (pointer ke awal daftar) dilewatkan RDI(karena ini adalah kode 64-bit, itu adalah pointer 64-bit), dan parameter kedua (panjang daftar) diteruskan ke ESI( ini hanya nilai 32-bit, karena itu lebih dari cukup angka untuk dimainkan, dan secara alami diasumsikan tidak nol). Hasilnya dikembalikan dalam EAXregister.

Jika lebih jelas, ini akan menjadi prototipe C (dan Anda dapat menggunakan ini untuk memanggil fungsi dari C):

int OddsAndEvens(int *ptrDigits, int length);

Mnemonik perakitan tidak dikumpulkan:

; 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

Berikut ini penjelasan singkat dari kode tersebut:

  • Pertama, kita nolkan EAXdan EDXregister, yang akan digunakan untuk menyimpan jumlah total angka genap dan ganjil. The EAXRegister dibersihkan oleh XORing dengan sendirinya (2 byte), dan kemudian EDXregister dibersihkan oleh tanda-memperpanjang EAX ke dalamnya ( CDQ, 1 byte).
  • Kemudian, kita masuk ke loop yang berulang melalui semua digit yang dilewatkan dalam array. Ini mengambil digit, tes untuk melihat apakah itu genap atau ganjil (dengan menguji bit paling tidak signifikan, yang akan menjadi 0 jika nilainya genap atau 1 jika itu ganjil), dan kemudian melompat atau turun sesuai, menambahkan bahwa nilai ke akumulator yang sesuai. Di bagian bawah loop, kami mengurangi digit digit ( ESI) dan melanjutkan looping selama tidak nol (yaitu, selama ada lebih banyak digit yang tersisa dalam daftar yang akan diambil).

    Satu-satunya hal yang rumit di sini adalah instruksi MOV awal, yang menggunakan mode pengalamatan paling kompleks yang dimungkinkan pada x86. * Dibutuhkan RDIsebagai register dasar (pointer ke awal daftar), skala RSI(penghitung panjang, yang berfungsi sebagai indeks) oleh 4 (ukuran bilangan bulat, dalam byte) dan menambahkan itu ke basis, dan kemudian kurangi 4 dari total (karena penghitung panjang berbasis satu dan kita perlu offset menjadi berbasis nol). Ini memberikan alamat digit dalam array, yang kemudian dimuat ke dalam ECXregister.

  • Setelah loop selesai, kami melakukan pengurangan odds dari evens ( EAX -= EDX).

  • Akhirnya, kita menghitung nilai absolut menggunakan trik umum — yang sama dengan yang digunakan oleh kebanyakan kompiler C untuk absfungsi. Saya tidak akan merinci bagaimana trik ini bekerja di sini; lihat komentar kode untuk petunjuk, atau lakukan pencarian web.

__
* Kode dapat ditulis ulang untuk menggunakan mode pengalamatan yang lebih sederhana, tetapi tidak membuatnya lebih pendek. Saya dapat membuat implementasi alternatif yang mengurangi RDIdan menambahnya setiap 8 kali melalui loop, tetapi karena Anda masih harus mengurangi penghitung ESI, ini ternyata 30 byte yang sama. Apa yang awalnya memberi saya harapan adalah add eax, DWORD PTR [rdi]hanya 2 byte, sama dengan menambahkan dua nilai yang terdaftar. Inilah implementasi itu, jika hanya untuk menyelamatkan siapa pun yang mencoba mengungguli saya beberapa usaha :-)

                    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

Mengambil input sebagai daftar. i²^Ansmenghemat dua byte lebih (-1)^Anskarena kita tidak perlu tanda kurung.

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&|+//.[),

Cobalah online!

penjelasan

|                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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.