내 짝수에서 내 확률을 빼기


19

음수가 아닌 정수가 주어지면 짝수의 합과 홀수의 합 사이의 절대 차이를 반환합니다.

기본 규칙

  • 표준 허점이 적용됩니다.

  • 모든 표준 입력 / 출력 방법으로 입력을 받아 출력 할 수 있습니다.

  • 문자열, 정수 또는 숫자 목록으로 입력 할 수 있습니다.

  • 이것은 이므로 모든 언어에서 가장 짧은 바이트 코드가 이깁니다!

테스트 사례

입력 ~> 출력

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
정수 목록으로 입력 할 수 있습니까?
Adám

4
@ Mr.Xcoder 너무 사소하지 않을 것입니다. 그것은 도전을 불필요하게 복잡하게 만들고 바이트를 추가하는 임의의 요구 사항입니다.
Okx

4
@ Mr.Xcoder 카멜레온에 도전하지 마십시오 . 여기에서 가장 중요한 문장은 두 가지 이상의 관련이없는 핵심 과제를 하나로 결합하는 것입니다. 과제를 별도의 과제로 나누거나 불필요한 부분을
버리는

1
도전에 대한 * chamel e
CalculatorFeline

1
@Okx 규칙을 변경했습니다. 촬영 숫자의 목록으로하는 것은 이제 허용됩니다 . 나는 아직도 그것이 솜털로 만들 것이라고 생각하지 않습니다.
Mr. Xcoder

답변:


8

젤리 , 6 바이트

-*æ.¹A

온라인으로 사용해보십시오!

작동 원리

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

입력을 목록으로 사용하여 1 바이트를 저장할 수 있습니다.
CalculatorFeline

내가 하고 목록으로 입력을 복용.
Dennis

나는 개정 2에 대해 이야기하고 있습니다.
CalculatorFeline

Raise -1 to A's digits, yielding 1 for even digits and 0 for odd ones.음, 난 당신이 뭔가를 조금 엉망으로 생각합니다 ...
Outgolfer Erik

2
@EriktheOutgolfer Darn off-by-one 오류.
Dennis

8

SHENZHEN I / O MCxxxx 스크립트, 197 (126 + 71) 바이트

칩 1 (MC6000) :

  • x0 : 목록으로 입력
  • x2 : 칩 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

칩 2 (MC4000) :

  • p0 : 출력
  • x0 : MC4010
  • x1 : 칩 1 x2
mov x1 acc
add x1
add x1
mov 30 x0
mov 0 x0
mov acc x0
mov x0 p0
slx x1

1
( <!-- -->필러 텍스트 대신 목록 바로 뒤에 코드를 가져 오려면 주석을 추가 할 수 있습니다 . 또는 공백이 4 개인 코드를 들여 쓰십시오.)
Mat


5

TI 기본, 18 9 바이트

abs(sum((-1)^AnsAns

설명

리스트의 각 숫자에 -1을 곱하여 그 자리수를 합산하기 전에 홀수를 무시합니다.



4

R, 30 29 바이트

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

d = scan() 입력 번호를 한 자리 씩 입력합니다.

@Giuseppe 덕분에 -1 바이트!


이것은 매우 우수합니다! 그래도 1 바이트를 절약 할 수 있습니다.abs(sum((d=scan())-2*d*d%%2))
Giuseppe

@Giuseppe 감사합니다, 좋은 팁, 편집되었습니다!
Nutle

4

C #, 57 바이트

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

i승산을 음수로 바꾸어 입력을 받아 정수를 합합니다.


첫 번째 대답은 여기입니다. 이 모든 것을 실제 C # 프로그램으로 랩핑하고 그 바이트도 계산해야 할 경우 실마리가 없습니다.
TyCobb

상용구를 포함시키고 namespace System.Linq{실제 기능을 수행해야합니다. 다른 C # 답변 참조
Mr. Xcoder

@ Mr.Xcoder 정보 주셔서 감사합니다. 알 겠어요 거의 내 바이트 수를 두 배로 늘 렸습니다 = (lol
TyCobb

네, C #은 실제로 최고의 골프 ​​언어는 아닙니다
Mr. Xcoder

@ Mr.Xcoder Nope,하지만 네임 스페이스가없는 첫 페이지에서 슬림 버전을 보았고을 보지 못했기 때문에 규칙이 완화되었다고 생각했습니다 Main. 내가 대답 할 것이라고 생각한 이유 만. 오 우물
TyCobb

4

Mathematica, 20 바이트

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

숫자 목록을 입력으로받습니다.

"새로운 규칙"에 대해 알려 주신 @LLlAMnYP의 특별 감사


나를 이길! :) 당신은 아마 필요하지 않습니다 *.
Greg Martin

이제 OP는 코드가 훨씬 짧아 질 수있는 요구 사항을 완화했습니다. +1
LLlAMnYP

3

Japt , 8 바이트

x_*JpZÃa

온라인으로 테스트하십시오!

설명

 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 바이트

ΓDᛃΞ𝐍}𝐬

설명:

Γ        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

누가 2로 개조 한 내장을 가지고 있지 않으면 논리적으로 결과를 얻지 못합니까?
caird coinheringaahing

@cairdcoinheringaahing 기본적으로 '짝수인지 확인'
Okx

3

APL, 8 바이트

|⊢+.ׯ1*⊢

온라인으로 사용해보십시오!

어떻게?

¯1*⊢- -1 Nn

[ 4 5 91 ¯1 ¯1]

⊢+.×-로 곱한 곱셈 o, 합

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

| -절대 값


테스트 환경을 제공 할 수 있습니까?
Mr. Xcoder

@ Mr.Xcoder 추가
Uriel

|⊢+.ׯ1*⊢새로운 입력 사양.
Adám

@ Adám 감사합니다. 내가 제품을 놓쳤다는 것을 믿을 수 없다.
Uriel

설명에 더 자세한 정보를 제공 할 수 있습니까? 이 방법을 J로 이식 할 수 있습니까? 나는 현재 키를 사용하고 있지만 (내 대답 참조)이 방법은 몇 바이트
Jonah

3

자바 스크립트 (ES6), 43 38 바이트

숫자 배열을 문자열 로 입력 합니다.

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

테스트 사례


3

편집 : 더 골프 중심 접근법 :

엑셀, 42 36 29 바이트

Magic Octopus Urn 덕분에 6 바이트 절약 Dennis '-1 ^ 접근 방식을 사용하여 7 바이트 절약

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

입력을 위해 A 열의 정수 목록을 가져옵니다. 추가로 골프를 타거나 문자열 버전을 사용하여 A1에서 문자열을 입력하여 입력 할 수 있습니다.

엑셀, 256 바이트

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

여기에 이미지 설명을 입력하십시오


1
면책 조항, 길이가 100 미만인 숫자에 대해서만 작동
Magic Octopus Urn

1
A : A로 전환하면 6 바이트가 절약되고 해당 문제가 해결됩니다.
Mark

와우, 내 건설적인 비판으로 인해 Excel 지식 선생님이 바이트를 절약하는 경우는 거의 없습니다.
매직 문어 Urn

또한 You may take input as a String, as an Integer or as a list of digits.42 바이트 답변 으로 인해 사용하는 답변이되어야합니다.
매직 문어 Urn

첫 번째는 유머러스 한 시도 였지만, 나는 그것들을 바꿀 것입니다.
Mark


2

껍질 , 7 바이트

≠0ṁṠ!¡_

온라인으로 사용해보십시오!

숫자 목록을 입력으로 사용합니다.

여전히 "abs"내장이 누락되었지만 좋은 결과는 동일합니다. :)

설명

Ṡ!¡_는 숫자를 취한 n다음 n-1함수 _(음수)에 시간 을 적용 하는 함수 n입니다. 이로 인해 n홀수 n또는 짝수 -n가 발생 n합니다.

목록의 각 요소에 함수를 적용하고 결과를 합산합니다.

≠0 숫자와 0 사이의 절대 차이를 반환합니다.


2

05AB1E , 6 바이트

-1 파워 트릭을위한 Dennis 에게 감사합니다 . 숫자 목록으로 입력을받습니다.

®sm*OÄ

온라인으로 사용해보십시오!

설명

®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

설명을 따를 수 없습니다. 예를 추가 하시겠습니까?
Titus

@Titus가 있습니다. 도움이
되길 바랍니다

그리고 여기 나는 È2*<*O더러운 캐주얼 과 함께했습니다 .
매직 문어 Urn

2

PHP, 51 바이트

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

$s홀수이면 숫자를 더하고 짝수이면 뺍니다. 로 파이프로 실행하십시오 -nR.

또는

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

Dennis의 -1파워 트릭을 사용합니다.


2

수학, 67 바이트

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

2

PHP , 54 바이트

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

온라인으로 사용해보십시오!

PHP , 57 바이트

짝수 및 홀수 합계를 배열에 저장

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

온라인으로 사용해보십시오!

PHP , 57 바이트

짝수 및 홀수 합을 두 변수에 저장

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

온라인으로 사용해보십시오!


바이트 54 : 홀수 합 ${1}심지어 요컨대 ${0}:while(~$n=$argn[$i++])${$n&1}+=$n;echo abs(${1}-${0});
디도

@Titus nice`for (; ~ $ n = $ argn [$ i ++];) $ {eo [$ n & 1]} + = $ n; echo abs ($ e- $ o);`도 좋은 변형이라고 생각합니다 . 아니면 더 nathematical 할 수 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);재미있는 방법입니다
요 르그 Hülsermann


1

펄 6 , 28 바이트

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

온라인으로 사용해보십시오!

숫자 목록을 입력으로 사용합니다.

  • $_ 입력 인수입니다.
  • .map(* % 2 * 2 - 1)하나 각 자리를 매핑 1또는 -1숫자가 홀수 또는 짝수 각각 여부에 따라.
  • Z* 곱셈을 사용하여 짝수 / 홀수 목록으로 원래 자릿수 목록을 압축합니다.

1

Braingolf , 18 바이트

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

온라인으로 사용해보십시오!

숫자 목록으로 입력을받습니다.

설명

{.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 바이트

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

먼저 d = scan()숫자를 한 자리 씩 입력하고 다른 자리 뒤의 숫자로 입력합니다 (@Giuseppe 주석 덕분에!)
그런 다음 숫자의 패리티에 따라 각 인덱스의 a 또는 값에 b = d %% 2 <1연결합니다 . 그러므로, 값은 짝수 위해하고 있는 홀수 값.bTRUEFALSEbTRUE!bTRUE

결말 abs(sum(d[b]) - sum(d[!b]))은 일을한다.


<1은 1 바이트보다 짧지 ==0만 숫자 목록으로 입력 할 수도 있습니다.
Giuseppe

@ 주세페 잘 발견! 감사 !
Frédéric



1

C #, 67 바이트

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


1

x86-64 기계 코드, 30 바이트

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

위의 코드는 정수 자릿수의 목록 / 배열을 허용하고 짝수 자릿수의 합과 홀수 자릿수의 합 사이의 절대 차이를 반환하는 함수를 정의합니다.

C 에서처럼 어셈블리 언어는 목록이나 배열을 일급 유형으로 구현하지 않고 포인터와 길이의 조합으로 나타냅니다. 따라서이 함수가 두 개의 매개 변수를 받도록 구성했습니다. 첫 번째는 숫자 목록의 시작 부분에 대한 포인터이고 두 번째는 목록의 총 길이 (총 자릿수, 하나의 색인)를 지정하는 정수입니다. .

이 기능 은 Gnu / UNIX 시스템의 표준 인 System V AMD64 호출 규칙을 준수 합니다. 특히 첫 번째 매개 변수 (목록의 시작을 가리키는 포인터)가 전달됩니다 RDI(64 비트 코드이므로 64 비트 포인터 임). 두 번째 매개 변수 (목록의 길이)는 ESI( 이것은 32 비트 값일 뿐이며, 이는 연주하기에 충분한 자릿수 이상이므로 당연히 0이 아닌 것으로 가정합니다). 결과는 EAX레지스터에 반환됩니다 .

더 명확하다면, 이것은 C 프로토 타입이 될 것입니다 (그리고 이것을 C에서 함수를 호출하는데 사용할 수 있습니다) :

int OddsAndEvens(int *ptrDigits, int length);

ungolfed 어셈블리 니모닉 :

; 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

다음은 코드에 대한 간단한 설명입니다.

  • 먼저, 우리 는 짝수와 홀수 자릿수의 합계를 보유하는 데 사용되는 EAXEDX레지스터를 0으로 만듭니다. EAX레지스터는 클리어되고 XOR자체 (2 바이트)와 함께 보내고, 다음 EDX레지스터 사인 연장 그것으로 EAX (클리어되어 CDQ, 1 바이트).
  • 그런 다음 배열에 전달 된 모든 숫자를 반복하는 루프로 이동합니다. 숫자를 검색하고 짝수 또는 홀수인지 테스트합니다 (최소 유효 비트를 테스트하여 값이 짝수이면 0이거나 홀수이면 1 임). 적절한 누산기에 가치. 루프의 맨 아래에서 숫자 카운터 ( ESI)를 줄이고 0이 아닌 한 (즉, 목록에 더 많은 자릿수가 남아있는 한) 계속 반복합니다.

    여기서 까다로운 것은 x86에서 가능한 가장 복잡한 주소 지정 모드를 사용하는 초기 MOV 명령입니다. * 걸리는 RDI기준 레지스터 (리스트의 시작에 대한 포인터), 저울로 RSI(바이트 정수의 크기) 4 (인덱스로서 작용 길이 카운터)과 추가하는베이스 및 길이 카운터는 1을 기준으로하고 오프셋은 0을 기준으로해야하기 때문에 총계에서 4를 뺍니다. 이것은 배열의 숫자 주소를 제공 한 다음 ECX레지스터에 로드됩니다 .

  • 루프가 끝나면 짝수에서 확률을 뺍니다 ( EAX -= EDX).

  • 마지막으로, 대부분의 C 컴파일러가 abs함수에 사용하는 것과 동일한 공통 트릭을 사용하여 절대 값을 계산합니다 . 이 트릭이 어떻게 작동하는지에 대해서는 자세히 다루지 않겠습니다. 힌트는 코드 주석을 참조하거나 웹 검색을 수행하십시오.

__
* 간단한 주소 지정 모드를 사용하도록 코드를 다시 작성할 수 있지만 더 짧게 만들지는 않습니다. RDI루프를 통해 매번 8 씩 역 참조 하고 증가 시키는 대체 구현을 생각해 낼 수 있었지만 카운터를 계속 줄여야하기 때문에 ESI동일한 30 바이트로 나타났습니다. 처음에 희망을 얻은 add eax, DWORD PTR [rdi]것은 2 개의 등록 된 값을 추가하는 것과 동일한 2 바이트입니다. 나에게 약간의 노력을 보내려고 노력하는 사람을 구하기 위해 그 구현이 있습니다 :-)

                    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 바이트

abs(sum(Anscos(πAns

입력을 목록으로 취합니다. 괄호가 필요하지 않기 때문에 i²^Ans2 바이트를 절약 (-1)^Ans합니다.

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 바이트

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

온라인으로 사용해보십시오!

설명

|                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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.