Вычти мои шансы из моих событий


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
Можем ли мы принять входные данные в виде списка целых?
Адам

4
@ Mr.Xcoder Это было бы не слишком тривиально. Это делает задачу излишне сложной и является произвольным требованием, которое добавляет байты.
Okx

4
@ Mr.Xcoder Не бросай вызов хамелеону . Самое важное предложение, которое вы, возможно, захотите посмотреть, это объединение двух или более не связанных между собой основных задач в одну - рассмотрите возможность разделения задачи на отдельные задачи или отбрасывания ненужных частей
Okx

1
* Chamel е на вызов
CalculatorFeline

1
Я изменил правила @Okx. Взятие в качестве списка цифр теперь разрешено . Я все еще не думаю, что это сделало бы это пушистым все же.
г-н 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

Я имею принимать входной сигнал в виде списка.
Деннис

Я говорю о ревизии 2.
CalculatorFeline

Raise -1 to A's digits, yielding 1 for even digits and 0 for odd ones.ммм, я думаю, что вы что-то
напутали

2
@EriktheOutgolfer Штопать ошибки по одному.
Деннис

8

Сценарии ввода-вывода SHENZHEN MCxxxx, 197 (126 + 71) байт

Микросхема 1 (MC6000):

  • x0: ввод в виде списка
  • х2: чип 2 х1
  • х3: 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: выход
  • х0: MC4010
  • х1: чип 1 х2
mov x1 acc
add x1
add x1
mov 30 x0
mov 0 x0
mov acc x0
mov x0 p0
slx x1

1
(Вы можете оставить <!-- -->комментарий, чтобы получить код сразу после списка, а не текст-заполнитель. Или сделать отступ в коде с 4 пробелами.)
Мат


5

TI-Basic, 18 9 байтов

abs(sum((-1)^AnsAns

объяснение

Умножает каждую цифру в списке на -1 до ее степени, сводя к нулю каждую нечетную цифру, прежде чем их суммировать.


4

C (gcc) , 59 58 57 байт

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

Попробуйте онлайн!


1
Если это поможет, я изменил правила, и теперь вы можете принимать входные данные в виде списка. Надеюсь, это сэкономит байты. Я не знаю C, так что это всего лишь предложение.
мистер Xcoder

4

R, 30 29 байт

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

d = scan() принимает входной номер на одну цифру за другой.

-1 байт благодаря @Giuseppe!


Это довольно отлично! Тем не менее, необходимо сделать 1-байтовое сохранение:abs(sum((d=scan())-2*d*d%%2))
Джузеппе

@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 # для справки
г-н Xcoder

@ Mr.Xcoder Спасибо за информацию. Думаю, я получил. Почти удвоил счетчик байтов = (
смеется

Да, C # не самый лучший язык для игры в гольф
Mr. Xcoder

@ Mr.Xcoder Нет, но я думал, что правила стали более мягкими, потому что я увидел тонкую версию на первой странице без содержимого пространства имен и не увидел a Main. Единственная причина, по которой я решил ответить. Ох, колодцы.
TyCobb

4

Mathematica, 20 байтов

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

принимает в качестве входных данных список цифр

Отдельное спасибо @LLlAMnYP за сообщение о «новых правилах»


бей меня к этому! :) Вы, вероятно, не нуждаетесь в *.
Грег Мартин

теперь, когда 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

Нейм , 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 Coneheringaahing

@cairdcoinheringaahing Это в основном «проверить, если даже»
Okx

3

APL, 8 байт

|⊢+.ׯ1*⊢

Попробуйте онлайн!

Как?

¯1*⊢- -1 п для nв

[ 4 5 91 ¯1 ¯1]

⊢+.×- вертикованное умножение с o, затем сумма

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

| - абсолютная величина


Можете ли вы предоставить среду тестирования?
г-н Xcoder

@ Mr.Xcoder добавил
Уриэль

|⊢+.ׯ1*⊢с новой входной спецификацией.
Адам

@ Adám спасибо. не могу поверить, что я пропустил продукт.
Уриэль

Можете ли вы предоставить более подробную информацию в объяснении? Можно ли перенести этот метод на J? в настоящее время я использую ключ (см. мой ответ), но этот метод может сбрить несколько байтов ...
Иона

3

JavaScript (ES6), 43 38 байт

Вводит в виде строки массив цифр.

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

Контрольные примеры


3

РЕДАКТИРОВАТЬ: более ориентированный на гольф подход:

EXCEL, 42 36 29 байт

Сохранено 6 байтов благодаря Magic Octopus Urn. Сохранено 7 байтов с использованием подхода Денниса -1 ^ (который, как я только что узнал, работает с массивами в Excel)

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

Принимает список целых чисел в столбце A для ввода. Вероятно, можно продолжить игру или использовать строковую версию, взяв строку в A1 для ввода.

EXCEL, 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
Волшебный Осьминог Urn

1
Переключение на A: A сохраняет 6 байтов и устраняет эту проблему.
Марк

Ничего себе, моя конструктивная критика редко сохраняет байты, +1 за ваши знания Excel, сэр.
Волшебная Осьминог Урна

Кроме того, из-за You may take input as a String, as an Integer or as a list of digits.вашего 42-байтового ответа должен быть ответ, который вы используете.
Волшебная Осьминог Урна

Первая была юмористическая попытка, но я переключу их.
Марк


2

Шелуха , 7 байт

≠0ṁṠ!¡_

Попробуйте онлайн!

Принимает список цифр в качестве ввода.

Все еще отсутствует встроенный "abs", но все равно хороший результат :)

объяснение

Ṡ!¡_является функцией, которая принимает число, nа затем применяет n-1время, к которому функция _(отрицание) n. Это приводит nк нечетным nили -nчетным n.

применяет функцию к каждому элементу списка и суммирует результаты.

≠0 возвращает абсолютную разницу между числом и 0.


2

05AB1E , 6 байтов

Спасибо Деннису за трюк -1. Принимает ввод в виде списка цифр

®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

Я не могу следовать объяснениям. Не могли бы вы добавить пример, пожалуйста.
Тит

@ Там, пожалуйста. Надеюсь, что это поможет :)
Датбой

И тут я был È2*<*Oкак с грязным случайным.
Волшебная Осьминог Урна

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

используя трюк -1силы Денниса .



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});
Тит

@ Титус хороший, я думаю `for (; ~ $ n = $ argn [$ i ++];) $ {eo [$ n & 1]} + = $ n; echo abs ($ e- $ o);` также хороший вариант , Или мы можем сделать это более естественным 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);интересным способом
Йорг Хюльсерманн


1

Perl 6 , 28 байт

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

Попробуйте онлайн!

Принимает список цифр в качестве ввода.

  • $_ является входным аргументом.
  • .map(* % 2 * 2 - 1)отображает каждую цифру в одну 1или в -1зависимости от того, является ли цифра нечетной или четной, соответственно.
  • Z* Сжатие исходного списка цифр с четным / нечетным списком с использованием умножения.

1

Брайнгольф , 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!).
Затем b = d %% 2 <1ассоциируется bсо значением TRUEили FALSEв каждом индексе в зависимости от четности цифр. Таким образом, bзначения TRUEдля четных чисел, и !bявляютсяTRUE для нечетных значений.

Наконец, abs(sum(d[b]) - sum(d[!b]))делает работу.


<1на один байт короче ==0, но учтите, что вы также можете использовать ввод в качестве списка цифр.
Джузеппе

@Giuseppe Хорошо заметили! Благодарность !
Фредерик





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

Приведенный выше код определяет функцию, которая принимает список / массив целочисленных цифр и возвращает абсолютную разницу между суммой четных цифр и суммой нечетных цифр.

Как в С , язык ассемблера не реализует списки или массивы как первоклассные типы, а скорее представляет их как комбинацию указателя и длины. Поэтому я организовал для этой функции прием двух параметров: первый - указатель на начало списка цифр, а второй - целое число, определяющее общую длину списка (общее количество цифр, одноиндексированное) ,

Функция соответствует соглашению о вызовах System64 AMD64 , стандартному для систем Gnu / UNIX. В частности, первый параметр (указатель на начало списка) передается RDI(так как это 64-разрядный код, это 64-разрядный указатель), а второй параметр (длина списка) передается в ESI( это всего лишь 32-битное значение, потому что для этого более чем достаточно цифр, и, естественно, предполагается, что оно ненулевое). Результат возвращается в EAXрегистр.

Если это будет более понятным, это будет прототип C (и вы можете использовать это для вызова функции из C):

int OddsAndEvens(int *ptrDigits, int length);

Неуправляемая сборка мнемоники:

; 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

Вот краткий обзор кода:

  • Во- первых, мы обнулить EAXи EDXрегистры, которые будут использоваться для хранения сумм суммы четных и нечетных цифр. EAXРегистр очищается от XORING его с собой (2 байта), а затем EDXрегистр очищается от входа продлевая EAX в него ( CDQ1 байт).
  • Затем мы идем в цикл, который перебирает все цифры, передаваемые в массиве. Он извлекает цифру, проверяет, является ли она четным или нечетным (проверяя младший значащий бит, который будет равен 0, если значение является четным, или 1, если он нечетный), а затем, соответственно, перепрыгивает или падает, добавляя, что значение для соответствующего аккумулятора. В нижней части цикла мы уменьшаем счетчик цифр ( ESI) и продолжаем цикл до тех пор, пока он не равен нулю (т. Е. До тех пор, пока в списке осталось больше цифр, которые нужно извлечь).

    Единственная сложность здесь - это начальная инструкция MOV, которая использует наиболее сложный режим адресации, возможный на x86. * Он принимает RDIв качестве базового регистра (указатель на начало списка), масштабирует RSI(счетчик длины, который служит индексом) на 4 (размер целого числа в байтах) и добавляет его к базе, и затем вычитает 4 из общей суммы (потому что счетчик длины основан на единице, и нам нужно, чтобы смещение было на основе нуля). Это дает адрес цифры в массиве, который затем загружается в ECXрегистр.

  • После завершения цикла мы делаем вычитание шансов из четных ( EAX -= EDX).

  • Наконец, мы вычисляем абсолютное значение, используя общий прием - тот же, который используется большинством компиляторов Си для absфункции. Я не буду вдаваться в подробности о том, как этот трюк работает здесь; см. комментарии к коду для подсказок или выполните поиск в Интернете.

__
* Код можно переписать, чтобы использовать более простые режимы адресации, но это не делает его короче. Я смог придумать альтернативную реализацию, которая разыменовывала RDIи увеличивала его на 8 каждый раз в цикле, но, поскольку вам все еще нужно уменьшить счетчик ESI, это оказалось теми же 30 байтами. То, что изначально дало мне надежду, это то, что add eax, DWORD PTR [rdi]это всего 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²^Ansсохраняет два байта, (-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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.