Об’єднайте два значення


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

Табло лідерів


8
Четверте правило відповідає першому правилу, тому я не знаю, чому ви їх розділили.
Фаталізувати

1
Нітпік: 4-та точка зайва, ви можете просто зняти "ненульовий" з першої точки. EDIT: Нічого собі, що таке ніндзя @Fatalize.
Ерік Аутгольфер

Також 3 насправді тут не потрібно, хоча це збільшує кількість можливих входів.
Ерік Аутгольфер

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

2
Для цього потрібна таблиця лідерів , перша сторінка починає отримувати відповіді, вже побиті на другій.
Ørjan Johansen

Відповіді:


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.

Сцена С: Друк Ford

Scene C:.
Ajax:open heart.

Сцена V: Кінець програми.

Scene V:.
[Exeunt]


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

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 не дорівнює нулю, ||повернути non-zero, якщо 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 Дякую за плямистість , що вона повинна бути виправлена
Sok

@{+0Q3працює на 6 байт.
Містер Xcoder


4

Стакс , 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

Спробуйте в Інтернеті!

(трохи стиснувшись після перегляду першої відповіді пітона )



Закреслений 44 все ще 44; (
Джо Кінг,

@JoKing так? Ваше рішення чудове, я спробував це зробити з арифметикою, але не вдався і повернувся до if / else
Жовтень 18, день тиші

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

Спробуйте в Інтернеті!

Розширення / Недоліковані:

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

Не вдалося подолати:t?td~*]X>
sundar

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іншому випадку, що ми можемо зробити, помноживши на мінус вищезгаданого умовного (від'ємного, оскільки truthy є -1в QBasic).


2

мозковий ебать, 25 байт

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

Вхід - це два байтових значення (не ascii)


2

Свіфт , 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 символу кожен і видаливши пробіли навколо таких операторів, як !=і потрійний.
Οurous

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)

Порт @ Dennis's Python відповідь, оскільки умовні умови занадто дорогі в Batch.



2

J , 8 7 байт

1 байт, збережений H.PWiz.

>.*=^<.

Спробуйте в Інтернеті!

Порт AJ рішення APL H.PWiz

=чи рівні числа? (результати в 1 або 0)

^ під силу

<. менша кількість

* помножений на

>. більша кількість


1
>.*=^<.за 7 байт
H.PWiz

@ H.PWiz Дякую! Розумне використання =та ^!
Гален Іванов

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-байтне рішення.


Хороший трюк там ...
Ерік Переможник

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 Я не розмовляю APL, я просто використовував описаний вами метод. Що робить =*⌊?
ділнан

Це майже те саме, що і Jelly, за винятком того, що це мінімум. Або можна використовувати ×обидві мови
H.PWiz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.