Trừ tỷ lệ cược của tôi từ evens của tôi


19

Cho một số nguyên không âm, trả về chênh lệch tuyệt đối giữa tổng các chữ số chẵn của nó và tổng các chữ số lẻ của nó.

Quy tắc mặc định

  • Áp dụng sơ hở tiêu chuẩn.

  • Bạn có thể lấy đầu vào và cung cấp đầu ra theo bất kỳ phương thức Nhập / Xuất chuẩn nào.

  • Bạn có thể lấy đầu vào dưới dạng Chuỗi, dưới dạng Số nguyên hoặc dưới dạng danh sách các chữ số.

  • Đây là , vì vậy mã ngắn nhất tính theo byte trong mọi ngôn ngữ sẽ thắng!

Các trường hợp thử nghiệm

Đầu vào ~> Đầu ra

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
Chúng tôi có thể lấy đầu vào là danh sách ints?
Adám

4
@ Mr.Xcoder Điều đó sẽ không quá tầm thường. Nó làm cho thách thức trở nên phức tạp không cần thiết và là một yêu cầu tùy ý có thêm byte.
Okx

4
@ Mr.Xcoder Đừng thực hiện thử thách tắc kè hoa . Câu quan trọng nhất bạn có thể muốn xem xét ở đây là Kết hợp hai hoặc nhiều thử thách cốt lõi không liên quan thành một - xem xét chia thử thách thành các thử thách riêng biệt hoặc bỏ các phần không cần thiết
Okx

1
* chamel e về thử thách
CalculatorFeline

1
Tôi đã thay đổi các quy tắc @Okx. Lấy làm danh sách các chữ số hiện được phép . Tôi vẫn không nghĩ rằng nó sẽ làm cho nó mịn.
Ông Xcoder

Câu trả lời:


8

Thạch , 6 byte

-*æ.¹A

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Bạn có thể lưu 1 byte bằng cách lấy đầu vào làm danh sách.
Máy

Tôi đang lấy đầu vào như một danh sách.
Dennis

Tôi đang nói về sửa đổi 2.
Máy

Raise -1 to A's digits, yielding 1 for even digits and 0 for odd ones.umm, tôi nghĩ rằng bạn đã làm hỏng một cái gì đó một chút hoặc một cái gì đó ...
Erik the Outgolfer

2
@EriktheOutgolfer Darn off-by-one lỗi.
Dennis

8

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

Chip 1 (MC6000):

  • x0: Nhập dưới dạng danh sách
  • 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: Đầu ra
  • 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
(Bạn có thể cho chúng ta một <!-- -->bình luận để lấy mã ngay sau khi một danh sách, thay vì văn bản phụ Hoặc thụt mã với hơn 4 chỗ..)
Mat


5

TI-Basic, 18 9 byte

abs(sum((-1)^AnsAns

Giải trình

Nhân từng chữ số trong danh sách bằng -1 với sức mạnh của nó, phủ định từng chữ số lẻ, trước khi tính tổng chúng.


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

Hãy thử trực tuyến!


1
Nếu nó giúp, tôi đã thay đổi các quy tắc và bây giờ bạn có thể lấy đầu vào làm danh sách. Hy vọng rằng sẽ tiết kiệm byte. Tôi không biết C, vì vậy đó chỉ là một gợi ý.
Ông Xcoder

4

R, 30 29 byte

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

d = scan() lấy số đầu vào sau một chữ số khác.

-1 byte nhờ @Giuseppe!


Điều này là khá xuất sắc! Có một tiết kiệm 1 byte được thực hiện, mặc dù:abs(sum((d=scan())-2*d*d%%2))
Giuseppe

@Giuseppe Cảm ơn, mẹo hay, đã chỉnh sửa!
Nutle

4

C #, 57 byte

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

Lấy đầu vào là ivà tính tổng các số nguyên bằng cách chuyển tỷ lệ cược thành âm.


Câu trả lời đầu tiên ở đây. Không có manh mối nào nếu tôi cần bọc toàn bộ điều này vào một chương trình C # thực tế và cũng đếm những byte đó.
TyCobb

Bạn phải bao gồm các mẫu soạn sẵn namespace System.Linq{và thực hiện một chức năng thực tế. Xem câu trả lời C # khác để tham khảo
Ông Xcoder

@ Mr.Xcoder Cảm ơn thông tin. Hãy nghĩ rằng tôi đã nhận. Gần gấp đôi số byte của tôi = (lol
TyCobb

Vâng, C # không thực sự là ngôn ngữ chơi golf tốt nhất
Mr. Xcoder

@ Mr.Xcoder Không, nhưng tôi nghĩ rằng các quy tắc đã được nới lỏng vì tôi thấy một phiên bản mỏng trên trang đầu tiên không có nội dung không gian tên và không thấy Main . Chỉ có lý do tôi nghĩ tôi sẽ trả lời với nó. Ôi giếng.
TyCobb

4

Toán học, 20 byte

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

lấy làm đầu vào một danh sách các chữ số

đặc biệt hơn @LLlAMnYP vì đã cho tôi biết về "quy tắc mới"


đánh tôi với nó :) Có lẽ bạn không cần *.
Greg Martin

bây giờ OP đã nới lỏng các yêu cầu mà mã của bạn có thể ngắn hơn rất nhiều. +1
LLlAMnYP

3

Japt , 8 byte

x_*JpZÃa

Kiểm tra nó trực tuyến!

Giải trình

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

Giải trình:

Γ        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

Ai không có nội dung dựng sẵn mod 2 thì logic KHÔNG kết quả?
caird coinheringaahing

@cairdcoinheringaahing Về cơ bản là 'kiểm tra ngay cả'
Okx

3

APL, 8 byte

|⊢+.ׯ1*⊢

Hãy thử trực tuyến!

Làm sao?

¯1*⊢- -1 n cho ntrong

[ 4 5 91 ¯1 ¯1]

⊢+.× - phép nhân verctorized với o , sau đó tổng

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

| - giá trị tuyệt đối


Bạn có thể vui lòng cung cấp một môi trường thử nghiệm?
Ông Xcoder

@ Mr.Xcoder đã thêm
Uriel

|⊢+.ׯ1*⊢với thông số kỹ thuật đầu vào mới.
Adám

@ Adám cảm ơn. không thể tin rằng tôi đã bỏ lỡ sản phẩm.
Uriel

bạn có thể cung cấp chi tiết hơn trong lời giải thích? phương pháp này có thể được chuyển đến J? Tôi hiện đang sử dụng khóa (xem câu trả lời của tôi) nhưng phương pháp này có thể tắt một vài byte ...
Jonah

3

JavaScript (ES6), 43 38 byte

Đưa đầu vào dưới dạng một chuỗi các chữ số.

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

Các trường hợp thử nghiệm


3

EDIT: Một cách tiếp cận tập trung vào golf hơn:

EXCEL, 42 36 29 byte

Đã lưu 6 byte nhờ Magic Octopus Urn Lưu 7 byte bằng cách sử dụng phương pháp Dennis '-1 ^ (mà tôi vừa học được, hoạt động trên các mảng trong excel)

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

Đưa ra một danh sách các số nguyên trong cột A cho đầu vào. Có lẽ có thể được đánh gôn xa hơn hoặc bằng cách sử dụng phiên bản chuỗi, lấy một chuỗi trong A1 để nhập liệu.

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

nhập mô tả hình ảnh ở đây


1
từ chối trách nhiệm, chỉ hoạt động đối với các số có độ dài dưới 100
Bạch tuộc ma thuật Urn

1
Chuyển sang A: A tiết kiệm 6 byte và loại bỏ vấn đề đó.
Đánh dấu

Ồ, hiếm khi lời phê bình mang tính xây dựng của tôi tiết kiệm byte, +1 cho kiến ​​thức Excel của bạn, thưa ông.
Bạch tuộc ma thuật Urn

Ngoài ra, do You may take input as a String, as an Integer or as a list of digits.câu trả lời 42 byte của bạn nên là câu trả lời bạn sử dụng.
Bạch tuộc ma thuật Urn

Đầu tiên là một nỗ lực hài hước, nhưng tôi sẽ chuyển chúng đi.
Đánh dấu


2

Husk , 7 byte

≠0ṁṠ!¡_

Hãy thử trực tuyến!

Đưa ra một danh sách các chữ số làm đầu vào.

Vẫn còn thiếu một "abs" dựng sẵn, nhưng kết quả tốt như nhau :)

Giải trình

Ṡ!¡_là một hàm lấy một số nvà sau đó áp dụng n-1lần hàm _(phủ định) cho n. Điều này dẫn nđến lẻ nhoặc -nchẵnn .

áp dụng một hàm cho từng thành phần của danh sách và tính tổng kết quả.

≠0 trả về sự khác biệt tuyệt đối giữa một số và 0.


2

05AB1E , 6 byte

Cảm ơn Dennis vì thủ thuật sức mạnh -1. Lấy đầu vào dưới dạng danh sách các chữ số

®sm*OÄ

Hãy thử trực tuyến!

Giải trình

®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

Tôi có thể làm theo lời giải thích. Bạn có thể thêm một ví dụ xin vui lòng.
Tít

@Titus có bạn đi. Hy vọng nó sẽ giúp :)
Datboi

Và ở đây tôi với È2*<*Omột người bình thường bẩn thỉu.
Bạch tuộc ma thuật Urn

2

PHP, 51 byte

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

thêm chữ số vào $snếu lẻ, trừ nếu chẵn. Chạy như ống với -nR.

hoặc là

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

sử dụng mánh khóe -1điện Dennis bào .


2

Toán học, 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);

Hãy thử trực tuyến!

PHP , 57 byte

lưu trữ số tiền chẵn và lẻ trong một mảng

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

Hãy thử trực tuyến!

PHP , 57 byte

lưu trữ số tiền chẵn và lẻ trong hai biến

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

Hãy thử trực tuyến!


54 byte: tổng số lẻ ${1}và thậm chí tổng bằng ${0}:while(~$n=$argn[$i++])${$n&1}+=$n;echo abs(${1}-${0});
Tít

@Titus đẹp Tôi nghĩ `for (; ~ $ n = $ argn [$ i ++];) $ {eo [$ n & 1]} + = $ n; echo abs ($ e- $ o);` cũng là một biến thể đẹp . Hoặc chúng ta có thể làm điều đó nhiều hơn về mặt toán học for(;~$n=$argn[$i++];$s+=$n)$u+=($n&1)*$n;echo abs($s-2*$u);for(;~$n=$argn[$i++];)$u+=(($n&1)-.5)*2*$n;echo abs($u);là một cách thú vị
Jörg Hülsermann


1

Perl 6 , 28 byte

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

Hãy thử trực tuyến!

Đưa ra một danh sách các chữ số làm đầu vào.

  • $_ là đối số đầu vào.
  • .map(* % 2 * 2 - 1)ánh xạ từng chữ số thành một 1hoặc -1tùy thuộc vào chữ số đó là số lẻ hay số chẵn tương ứng.
  • Z* nén danh sách các chữ số ban đầu với danh sách chẵn / lẻ bằng cách nhân.

1

Braingolf , 18 byte

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

Hãy thử trực tuyến!

Lấy đầu vào dưới dạng danh sách các chữ số

Giải trình

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

Đầu tiên, d = scan()lấy số làm đầu vào, một chữ số khác (nhờ nhận xét @Giuseppe!)
Sau đó, b = d %% 2 <1liên kết với bmột TRUEhoặc FALSEgiá trị ở mỗi chỉ số tùy thuộc vào tính chẵn lẻ của các chữ số. Do đó, bgiá trị này là TRUEcho số chẵn, và !bđang TRUEcho các giá trị lẻ.

Cuối cùng, abs(sum(d[b]) - sum(d[!b]))làm công việc.


<1ngắn hơn một byte so với ==0, nhưng lưu ý rằng bạn cũng có thể lấy đầu vào làm danh sách các chữ số.
Giuseppe

@Giuseppe Phát hiện tốt! Cảm ơn !
Frédéric





1

Mã máy x86-64, 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

Đoạn mã trên xác định hàm chấp nhận danh sách / mảng các chữ số nguyên và trả về chênh lệch tuyệt đối giữa tổng các chữ số chẵn và tổng các chữ số lẻ của nó.

Như trong C , ngôn ngữ hợp ngữ không triển khai danh sách hoặc mảng dưới dạng loại hạng nhất, mà đại diện cho chúng dưới dạng kết hợp của một con trỏ và độ dài. Do đó, tôi đã sắp xếp cho hàm này chấp nhận hai tham số: đầu tiên là con trỏ đến đầu danh sách các chữ số và thứ hai là một số nguyên chỉ định tổng chiều dài của danh sách (tổng số chữ số, một chỉ mục) .

Hàm này tuân theo quy ước gọi AMD64 của System V , là tiêu chuẩn trên các hệ thống Gnu / UNIX. Cụ thể, tham số đầu tiên (con trỏ đến đầu danh sách) được truyền vào RDI(vì đây là mã 64 bit, nó là con trỏ 64 bit) và tham số thứ hai (độ dài của danh sách) được truyền vào ESI( đây chỉ là một giá trị 32 bit, bởi vì đó là quá nhiều chữ số để chơi và tự nhiên nó được coi là khác không). Kết quả được trả về trongEAX sổ đăng ký.

Nếu nó rõ ràng hơn, đây sẽ là nguyên mẫu C (và bạn có thể sử dụng hàm này để gọi hàm từ C):

int OddsAndEvens(int *ptrDigits, int length);

Ma thuật lắp ráp bất khả xâm phạm:

; 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

Dưới đây là hướng dẫn ngắn gọn về mã:

  • Đầu tiên, chúng tôi loại bỏ các thanh ghi EAXEDXthanh ghi, chúng sẽ được sử dụng để giữ tổng số của các chữ số chẵn và lẻ. Thanh EAXghi bị xóa bằng cách nhập XORchính nó (2 byte), và sau đó thanh EDXghi bị xóa bằng cách đăng nhập mở rộng EAX vào nó ( CDQ, 1 byte).
  • Sau đó, chúng ta đi vào vòng lặp lặp qua tất cả các chữ số được truyền trong mảng. Nó lấy một chữ số, kiểm tra xem nó là số chẵn hay lẻ (bằng cách kiểm tra bit có ý nghĩa nhỏ nhất, sẽ là 0 nếu giá trị là chẵn hoặc 1 nếu là số lẻ), sau đó nhảy hoặc rơi qua đó, thêm vào đó giá trị cho bộ tích lũy thích hợp. Ở dưới cùng của vòng lặp, chúng tôi giảm bộ đếm chữ số ( ESI) và tiếp tục lặp miễn là nó khác không (nghĩa là miễn là còn nhiều chữ số trong danh sách cần lấy).

    Điều duy nhất khó khăn ở đây là hướng dẫn MOV ban đầu, sử dụng chế độ địa chỉ phức tạp nhất có thể có trên x86. * Nó lấy RDIlàm thanh ghi cơ sở (con trỏ đến đầu danh sách), chia tỷ lệ RSI(bộ đếm độ dài, đóng vai trò là chỉ số) bằng 4 (kích thước của một số nguyên, tính bằng byte) và thêm nó vào cơ sở và sau đó trừ 4 khỏi tổng số (vì bộ đếm độ dài là dựa trên một và chúng ta cần phần bù là 0). Điều này cho địa chỉ của chữ số trong mảng, sau đó được tải vào thanh ECXghi.

  • Sau khi vòng lặp kết thúc, chúng tôi thực hiện phép trừ các tỷ lệ cược từ evens ( EAX -= EDX).

  • Cuối cùng, chúng tôi tính toán giá trị tuyệt đối bằng cách sử dụng một thủ thuật phổ biến, cùng một cách sử dụng bởi hầu hết các trình biên dịch C cho abshàm. Tôi sẽ không đi vào chi tiết về cách thức hoạt động của thủ thuật này ở đây; xem bình luận mã cho gợi ý, hoặc thực hiện tìm kiếm trên web.

__
* Mã có thể được viết lại để sử dụng các chế độ địa chỉ đơn giản hơn, nhưng nó không làm cho nó ngắn hơn. Tôi đã có thể đưa ra một triển khai thay thế đã hủy đăng ký RDIvà tăng nó lên 8 lần mỗi lần qua vòng lặp, nhưng vì bạn vẫn phải giảm số lượt truy cập ESI, nên hóa ra là 30 byte giống nhau. Điều ban đầu mang lại cho tôi hy vọng là add eax, DWORD PTR [rdi]chỉ có 2 byte, giống như việc thêm hai giá trị được đăng ký. Đây là cách thực hiện, nếu chỉ để cứu bất kỳ ai đang cố gắng vượt qua tôi một số nỗ lực :-)

                    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

Lấy đầu vào như một danh sách. i²^Anstiết kiệm hai byte (-1)^Ansvì chúng ta không cần dấu ngoặc đơn.

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

Hãy thử trực tuyến!

giải trình

|                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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.