Объединить два значения


44

У вас есть два значения, каждое из которых 0представляет «неизвестно», или одно из 1,2,3. Объедините их в одно значение следующим образом:

  • Если оба значения отличны от нуля и равны, выведите это значение:
    (3,3) -> 3
  • Если оба значения ненулевые, но неравные, выведите 0 для неизвестного:
    (1,2) -> 0
  • Если одно значение равно нулю, а другое нет, выведите ненулевое значение:
    (2,0) -> 2, (0,1) -> 1
  • Если оба значения равны нулю, выведите ноль:
    (0,0) -> 0

Тестовые случаи:

Есть 16 возможных входных пар.

  | 0 1 2 3
--+--------
0 | 0 1 2 3
1 | 1 1 0 0
2 | 2 0 2 0
3 | 3 0 0 3

(0, 0) -> 0
(0, 1) -> 1
(0, 2) -> 2
(0, 3) -> 3
(1, 0) -> 1
(1, 1) -> 1
(1, 2) -> 0
(1, 3) -> 0
(2, 0) -> 2
(2, 1) -> 0
(2, 2) -> 2
(2, 3) -> 0
(3, 0) -> 3
(3, 1) -> 0
(3, 2) -> 0
(3, 3) -> 3

Leaderboards


8
Четвертое правило соответствует первому правилу, поэтому я не знаю, почему вы их разделили.
Роковой

1
Nitpick: 4-й пункт является избыточным, вы можете просто удалить "ненулевой" из первой точки. РЕДАКТИРОВАТЬ: Wow, что ниндзя @Fatalize.
Эрик Outgolfer

Кроме того, 3 здесь на самом деле не требуется, хотя это увеличивает количество возможных входных данных.
Эрик Outgolfer

2
Я подумал о сокращении правил, но подумал, что будет проще всего перечислить все случаи с нулем / ненулем и оставить оптимизацию на усмотрение игроков в гольф.
xnor

2
Для этого нужна таблица лидеров , первая страница начинает получать ответы, уже избитые на второй.
Орджан Йохансен

Ответы:


22

Python 3 , 27 25 байт

lambda x,y:(x|y)>>(x*y&2)

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


5
Мне нравится, что это перерывы для входов более 3. Как вы пришли к этому?
Якоб

4
В основном много проб и ошибок.
Деннис

1
Интересный. На мгновение я подумал об автоматизации поиска с помощью выражений ограниченной длины, включающих два целых числа и несколько операторов, но пространство слишком велико даже примерно в 20 байтах. Некоторый интеллект требуется!
Якоб


10

APL (Dyalog) , 5 байтов

⌈×∧=⌊

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

Полезная ссылка

∧=⌊: Возвращает, 1если минимальное общее кратное равно минимальному. Это верно только в том случае, если одно из значений равно нулю или оба равны. В качестве альтернативы я мог бы иметь=*⌊

⌈×: Максимум, умноженный на вышеуказанное.


7

Язык программирования Шекспира , 296 байт

Z.Ford,.Ajax,.Act I:.Scene I:.[Enter Ford and Ajax]Ajax:Listen to thy heart.Ford:Listen to thy heart.Am I as fat as you?Ajax:If so,let us Scene C.Am I as fat as zero?If so,let us Scene C.Ford:Am I as fat as zero?If not,you zero.open heart.let us Scene V.Scene C:.Ajax:open heart.Scene V:.[Exeunt]

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

Первое участие в соревнованиях по коду, поэтому давайте начнем с одного из моих любимых языков шутки!

Объяснение: Объявление двух переменных Ford и Ajax (доступны самые короткие имена переменных)

Z.Ford,.Ajax,.

Первая сцена: поместите два значения в переменную, затем проверьте их на равенство, затем проверьте Ajax против 0. Если значение, которое мы должны вернуть, хранится в переменной Ford, перейдите к сцене C.

Act I:.
Scene I:.
[Enter Ford and Ajax]
Ajax:
Listen to thy heart.
Ford:Listen to thy heart.
Am I as fat as you?
Ajax:
If so,let us Scene C.
Am I as fat as zero?
If so,let us Scene C.

Если Ford равен 0, выведите Ajax, иначе установите Ajax на 0, а затем Ajax. Затем перейдите к концу программы.

Ford:Am I as fat as zero?
If not,you zero.
open heart.
let us Scene V.

Сцена C: Печать Форд

Scene C:.
Ajax:open heart.

Сцена V: Конец программы.

Scene V:.
[Exeunt]


2
@ Шутя, что ваша версия, несомненно, лучше моей, я думаю, было бы лучше, если бы вы опубликовали ее в качестве ответа, поскольку обоснование программы совершенно иное, и я не хочу брать на себя ответственность за вашу работу
Гийом Рюшо

6

Рубин , 21 байт

->a,b{(a|b)*531[a*b]}

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

Потому что рубин

Краткое объяснение:

  • a|b является bitwse ИЛИ, поэтому дает правильное число, если a == b или один из них равен нулю.

  • Магическое число 531равно 2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0, и оператор [] извлекает один бит. Это означает: умножить на 1, если a * b равно 0, 1, 2, 4 или 9, умножить на 0 в противном случае.

  • Это не будет работать для значений> 3


5

JavaScript (Node.js) , 17 байт, порт как-то из ответа Python

a=>b=>a*b&2?0:a|b

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

JavaScript (Node.js) , 21 байт

a=>b=>a-b?a*b?0:a+b:a

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


?0:... Не могли бы вы сделать ||, или старшинство испортило это?
Стэн Струм

@StanStrum ?0:среднее значение возвращает ноль, если cond не равно нулю, ||возвращает ненулевое значение, если cond не равно нулю
l4m2

5

Pyth , 8 7 байтов

@{+0SQ3

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

@{+0SQ3   Implicit: Q=input()

    SQ    Sort input
  +0      Prepend 0
 {        Deduplicate
@     3    Get 4th element (index 3), modular indexing

Случай 1 - Оба значения ненулевые и равные

Sorted Input   [3,3]
Prepend 0      [0,3,3]
Deduplicate    [0,3] - index 3 yields 3

Случай 2 - оба значения ненулевые и неравные

Sorted Input   [1,2]
Prepend 0      [0,1,2]
Deduplicate    [0,1,2] - index 3 yields 0

Случай 3 - ровно одно значение ноль

Sorted Input   [0,1]
Prepend 0      [0,0,1]
Deduplicate    [0,1] - index 3 yields 1

Случай 4 - оба значения ноль

Sorted Input   [0,0]
Prepend 0      [0,0,0]
Deduplicate    [0] - index 3 yields 0

Альтернативное решение, также 7 байтов

*eSQ}s{

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

*eSQ}s{QQ   Trailing Q's inferred

      {Q    Deduplicate input
     s      Take the sum
    }   Q   Is this in the input? True treated as 1, false as 0
*           Multiplied by
 eSQ        Max from input (end of sorted input) 

Предыдущая версия, 8 байт

@+0{-QZ3

@xnor Спасибо, что заметили это, это должно быть исправлено сейчас
Сок

@{+0Q3работает на 6 байтов.
Мистер Xcoder


4

Stax , 8 байт

Ç∞∟∙◄╥*♣

Запустите и отладьте его

Распакованный, размазанный и прокомментированный, это выглядит так.

    e.g.        [2, 0]
c:s [2, 0] 2    calculate the "span" of the input array (max(a) - min(a))
+   [2, 0, 2]   append the span to the input array
o   [0, 2, 2]   sort the 3-element array
E   0 2 2       explode the 3 elements into 3 separate stack entries
a   2 2 0       rotate the third stack element to the top of stack
!   2 2 1       logical not, produces 1 iff the top value was 0
*   2 2         multiply
                implicitly print top of stack

Запустите этот



4

(первое представление, поэтому, пожалуйста, не пинайте слишком сильно)

Python 2 , 57 44 43 байта

lambda a,b:(0 if a*b else a+b)if a-b else a

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

(немного сжал после просмотра первого ответа Python )



Вычеркнуто 44 все еще 44; (
Джо Кинг

@ Шучу, а? Ваше решение великолепно, я пытался сделать это с помощью арифметики, но потерпел неудачу и отступил, если / иначе
ааааа говорит восстановить Монику

4

C (gcc), 25 байтов

f(a,b){a=a^b&&a*b?0:a|b;}

псевдокод:

foo(A,B)
    if A XOR B and A*B are > 0
        return 0
    else 
        return A OR B`

3

C (gcc), 26 байтов

f(a,b){a=a*b?a-b?0:a:a+b;}

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

Расширение / Ungolfed:

int f(int a, int b) { // implicit-int (C89)
    // return replaced with assignment: link
    return a*b ? // if a and b are both not zero, then
        a-b ? // if a != b
        0 : // a != b, so return 0
        a // a == b, so return a
    : a+b // one of a,b is zero, so return whichever is nonzero 
    ;
}

3

MATL , 9 байт

dGp*~GX>*

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

Объяснение:

           % Implicit input as a vector with two elements implicitly. Stack: [0,2]
d          % The difference between the two elements. Stack: [2]
 G         % Push input again. Stack: [2], [0,2]
  p        % The product of the last element (the input). Stack: [2], [0]
   *       % Multiply the two elements on the stack. Stack: [0]
    ~      % Negate. Stack: [1]
     G     % Push input again. Stack: [1], [0,2]
      X>   % Maximum value. Stack: [1], [2]
        *  % Multiply the two elements on the stack. Stack: [2]
           % Implicit output


3

GNU sed, 23 байта

s/^0?(.)\1?0?$/\1/
t
c0

(должен быть запущен с -rфлагом)

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


1
Добро пожаловать в PPCG :) Текущий консенсус заключается в том, что флаги не учитываются (я на моем телефоне, поэтому не могу связать соответствующую мету).
Лохматый

1
О, круто! Я отредактирую позже, так как я тоже на своем телефоне; свободный -3 байта - отличный прием в PPCG :)
KernelPanic

3

QBasic, 34 байта

Другой подход!

INPUT a,b
?(a OR b)*-(a*b=0OR a=b)

Обратите внимание, что ненулевые значения в выходной сетке все побитовые ORиз двух входных чисел. Это только a OR bв QBasic. Мы хотим вывести это значение, когда a*b=0 OR a=bи в 0противном случае, что мы можем сделать, умножив на отрицательное значение вышеупомянутого условного (отрицательное, так как истина -1в QBasic).


2

мозговой трах, 25 байтов

,>,[>]<<[[->->+<<]>[>]]>.

Ввод двухбайтовых значений (не ascii)


2

Swift , 118 байт

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}

4
Добро пожаловать в PPCG! Я не знаю Swift, но вы, вероятно, можете сэкономить много байтов, сделав имена переменных по 1 символу в каждом и удалив пробелы вокруг таких операторов, как !=и троичный.
18:30

1
Привет, добро пожаловать в PPCG! Как уже упоминалось @ Οurous, вы можете изменить n1и n2на одиночные символы, чтобы сократить их; удалить некоторые пробелы и скобки, а также удалить некоторые пробелы. Кроме того, ==0может быть <1и !=0может быть >0, поскольку мы знаем, что 0,1,2,3возможны только входные данные. Никогда еще не программировал в Swift, но я сократил его до 91 байта вот так: func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} Попробуйте онлайн.
Кевин Круйссен

Кроме того, кажется, что вы можете сократить его до 51 байта следующим образом: func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} Попробуйте онлайн. Еще раз добро пожаловать в PPCG и приятного пребывания!
Кевин Круйссен

1
В дополнение к полям @ KevinCruijssen вы можете превратить свою заявку в анонимное закрытие, чтобы сэкономить 87 байт: {$0==$1||1>$0*$1 ?max($0,$1):0} попробуйте онлайн!
Мистер Xcoder

2

Пакет, 38 36 35 30 байт

@cmd/cset/a"(%1|%2)>>(%1*%2&2)

Порт @ Python ответ Денниса, так как условия слишком дорого в пакетном режиме.




2

05AB1E , 9 8 байт

àIËIP_+*

-1 байт благодаря @MagicOctopusUrn .

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

à         # Take the maximum of the input-list
          #  [0,2] → 2
IË        # Are all elements in the input-list equal?
          #  [0,2] → 0
  IP_     # Take the product of the input-list, and verify if it equals 0
          # (`_` transforms 0 into 1; everything else into 0)
          #  [0,2] → 0 (product) → 1 (==0)
     +    # Add them together (since only 1 is truthy in 05AB1E, this is basically an OR)
          #  0+1 → 1
*         # Multiply both values on the stack
          #  2*1 → 2

Обобщенное объяснение:

IËIP_+    # If both values are equal, or one of them is a zero:
 à        #  Output the maximum of the two values
          # Else:
          #  Output 0

Ës0å~iZë0был мой; хороший. Не совсем уверен, что вы можете побить 9 байтов на много.
Волшебная Урна Осьминога

1
Я беру это обратно, à®Ë®P_+*где _логически эквивалентно
Волшебная Осьминога Урна

_превращает 0 в 1, все остальные значения в 0.
Волшебная урна осьминога

@MagicOctopusUrn Спасибо! Когда я сделал этот ответ, я смотрел на документы, чтобы увидеть, есть ли == 0команда, не знал, _делает ли это точно. Должно быть полезно и для других задач в будущем. TIL. :)
Кевин Круйссен



2

Javascript ES6, 25 22 21 20 байт

a=>b=>a?b-a?!b*a:a:b

14 13 байт , если аргументы предоставлены в отсортированном порядке

a=>b=>a%b?0:b


2

QBasic, 38 36 35 байт

INPUT a,b
?(a*b>0)*(b-a*(a<>b))+a+b

Частично вдохновленный ЭрикомIF ... THEN ... ELSE ответом , вот математическое решение.

Как я сюда попал

Важное примечание для понимания математики с условными выражениями: в QBasic результаты операторов сравнения есть 0и -1, а не 0и 1.

Начнем с кода Эрика:

IF a*b THEN?a*-(a=b)ELSE?a+b

Другими словами, если aи bоба ненулевые, то напечатайте a*-(a=b)( aесли a=b, иначе 0); иначе (хотя бы один из aи bравен нулю), выводa+b (ненулевое число, или 0если они оба равны нулю).

Здесь уже есть некоторая математика с условными выражениями. Давайте сделаем еще один шаг и посмотрим, сможем ли мы IFполностью исключить это утверждение. Придется использовать a*b>0для внешнего условия: a*bможет иметь несколько разных истинных значений, что хорошо, IFно создает проблемы для математики.

c=a*b>0
?c*a*(a=b)+(c+1)*(a+b)

Это стандартный трюк - IFустранения. Когда cэто правда, c*a*(a=b)есть -a*(a=b)и (c+1)*(a+b)есть 0; когда cложно, c*a*(a=b)есть 0и (c+1)*(a+b)есть a+b. Так что это выражение дает те же результаты, что и IF ... THEN ... ELSE. Единственная проблема в том, что она делает нашу программу 40 байтов вместо 38. Может быть, мы можем сократить ее, переставив математику.

c=a*b>0
?c*a*(a=b)+c*(a+b)+a+b

Еще 40 байт ...

c=a*b>0
?c*(a+b+a*(a=b))+a+b

Теперь наша программа вернулась к 38 байтам. Но поскольку мы используем только cодин раз, нам больше не нужно присваивать его переменной:

?(a*b>0)*(a+b+a*(a=b))+a+b

Теперь мы до 36 байтов.

Но подождите, это еще не все ... Это a+b+a*(a=b)выражение выглядит немного излишним. a*(a=b)это -aесли a=bи 0иначе. Когда мы добавляем это к a, мы получаем, 0если a=bи aиначе. Может быть, мы можем достичь того же самого за меньшее количество байтов, изменив условие.

b+a*-(a<>b)

Сначала это не выглядит короче. Но мы можем сохранить байт, вычтя вместо добавления отрицательный:

b-a*(a<>b)

И там у нас есть 35-байтовое решение.


Хороший трюк там ...
Эрик Outgolfer

1

Чисто , 46 43 42 байта

import StdEnv
?[a,b]|a<1||a==b=b=0

?o sort

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

Анонимная композиция :: [Int] -> Int , сортирует пару, а затем сопоставляет первый член.

Делать это как составную лямбду одинаковой длины:

import StdEnv

(\[a,b]|a<1||a==b=b=0)o sort

1

Желе , 7 6 байт

׬o=a»

Попробуйте онлайн! или попробуйте все комбинации!

Как?

׬o=a»   Dyadic link
×        Multiply the two arguments.
 ¬       Logical not. Gives 1 if one argument is 0, 1 otherwise.
   =     Are the two arguments equal?
  o      Logical or the result of = and ¬. 
     »   Greater of the two arguments.
    a    Logical and. Gives the greater of the two arguments if they are equal
         or if one of them is zero and gives 0 otherwise.

Используя метод в ответе APL , мы получаем одинаковое количество байтов. На один байт длиннее этого ответа, поскольку наименьшее общее кратное составляет два байта.

6 байт

«=æl×»

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


Я также отмечаю альтернативный метод ниже
H.PWiz

@ H.PWiz О, я думал, что вы использовали тот же метод, что и в ссылке
dylnan

Я даю два метода ∧=⌊и=*⌊ . Второй из которых предпочитает Желе
H.PWiz

@ H.PWiz Я не говорю на APL, я просто использовал метод, который вы описали. Что делает =*⌊?
Дилнан

Это почти так же, как желе, за исключением того, что это минимум. Или можно использовать ×на обоих языках
H.PWiz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.