Якщо AB знаходиться в AB A else B eh?


44

З урахуванням двох цілих чисел, A і B, виведіть A, якщо AB (A мінус B) знаходиться в AB (A до B), інакше виведіть B.

"Мінус В" - це стандартне віднімання.

"А до В" - це діапазон цілих чисел, що починається з A і закінчується на B, включаючи як A, так і B. Наприклад:

1 to 4: 1, 2, 3, 4
-2 to 5: -2, -1, 0, 1, 2, 3, 4, 5
3 to -1: 3, 2, 1, 0, -1
7 to 7: 7

Виграє найкоротший код у байтах.

Випробування

A B Output
1 4 4
-2 5 5
3 -1 -1
7 7 7
90 30 90
90 -30 -30
-90 30 30
-90 -30 -90
-2 -2 -2
-2 -1 -2
-2 0 -2
-2 1 1
-2 2 2
-1 -2 -2
-1 -1 -1
-1 0 -1
-1 1 1
-1 2 2
0 -2 -2
0 -1 -1
0 0 0
0 1 1
0 2 2
1 -2 -2
1 -1 -1
1 0 1
1 1 1
1 2 2
2 -2 -2
2 -1 -1
2 0 2
2 1 2
2 2 2

Оригінальний чат-міні-виклик

Відповіді:


44

Пітон , 27 байт

lambda a,b:[a,b][2*b*b>a*b]

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

Арифметична формула. Чому заперечення 2*b*b>a*bрівносильне умові проблеми a-b in symrange(a,b)?

Зауважте, що x in symrange(a,b)еквівалентно 0 in symrange(a-x,b-x). Застосовуючи це до x=a-bдає 0 in symrange(b,2*b-a). Значення 0включається в інтервал, якщо воно не розтягується між двома позитивними або двома негативними значеннями. Це можна констатувати арифметично, оскільки "їхній продукт b*(2*b-a)не є позитивним.

Нарешті, візьміть b*(2*b-a)<=0і перепишіть на 2*b*b<=a*b. Байт зберігається перевертаючи , <=щоб >і перемикаючи справи.



8

05AB1E , 7 байт

Код:

DŸ¹Æå_è

Використовує кодування CP-1252 . Спробуйте в Інтернеті!

Пояснення:

D         # Duplicate the input.
 Ÿ        # Inclusive range.
  ¹Æ      # Push the input [a, b] and compute a - b.
    å     # Check if the number exists in the range.
     _    # Boolean negate
      è   # Index at the first input

1
@Okx CMC попросив булевого типу.
Денніс


6

JavaScript (ES6), 24 байти

a=>b=>[a,b][2*b*b>a*b|0]

Тестові справи

let f = a=>b=>[a,b][2*b*b>a*b|0]
let tests = [[1,4,4],[-2,5,5],[3,-1,-1],[7,7,7],[90,30,90],[90,-30,-30],[-90,30,30],[-90,-30,-90],[-2,-2,-2],[-2,-1,-2],[-2,0,-2],[-2,1,1],[-2,2,2],[-1,-2,-2],[-1,-1,-1],[-1,0,-1],[-1,1,1],[-1,2,2],[0,-2,-2],[0,-1,-1],[0,0,0],[0,1,1],[0,2,2],[1,-2,-2],[1,-1,-1],[1,0,1],[1,1,1],[1,2,2],[2,-2,-2],[2,-1,-1],[2,0,2],[2,1,2],[2,2,2]]
tests.map(test => `f(${test[0]})(${test[1]}) == ${test[2]}`).forEach(test => console.log(test, eval(test)))


4

Python 2, 37 байт

lambda*s:s[min(s)<=s[1]-s[0]<=max(s)]

Викликати як f(B, A).


4

Python2, 55 52 51 байт

lambda A,B:[B,A][A-B in range(min(A,B),max(A,B)+1)]

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

Обробляє кожен згаданий тестовий випадок (на момент публікації цього повідомлення), як пропонує TIO.


4

JavaScript ES6, 40 37 байт

a=>b=>a-b<(a<b?a:b)|a-b>(a<b?b:a)?b:a

Пояснили:

a=>b=>                                   take a and b as inputs
      a-b<(a<b?a:b)                      if a-b is less than the lowest of a and b
                   |a-b>(a<b?b:a)        or a-b is greater than the largest of a and b
                                 ?b      return b
                                   :a    else return a

Збережено 3 байти завдяки Арнольду.

f=a=>b=>a-b<(a<b?a:b)|a-b>(a<b?b:a)?b:a

function t(){
    var tests = [[1,4,4],[-2,5,5],[3,-1,-1],[7,7,7],[90,30,90],[90,-30,-30],[-90,30,30],[-90,-30,-90],[-2,-2,-2],[-2,-1,-2],[-2,0,-2],[-2,1,1],[-2,2,2],[-1,-2,-2],[-1,-1,-1],[-1,0,-1],[-1,1,1],[-1,2,2],[0,-2,-2],[0,-1,-1],[0,0,0],[0,1,1],[0,2,2],[1,-2,-2],[1,-1,-1],[1,0,1],[1,1,1],[1,2,2],[2,-2,-2],[2,-1,-1],[2,0,2],[2,1,2],[2,2,2]];
    for (var test of tests) {
        console.log(`f(${test[0]},${test[1]}) == ${test[2]}`, f(test[0])(test[1])==test[2]);
    }
}

t();



2

R, 49 30 28 байт

pryr::f("if"(2*b*b>a*b,b,a))

Використовує логіку @ xnor для визначення того, чи ab знаходиться в a: b.


Безіменні функції, як правило, дозволені
MickyT

Ви можете втратити ще 3 байти за допомогоюpryr::f(match(a-b,a:b,b))
mnel

@mnel дякую, що поділився цим, я не знав, як% у% працювали раніше; але це не вдається, коли ab знаходиться в a: b. f (-90, -30) = 31
BLT

Справді. `pryr :: f (match (ab, a: b, 0) + b) фіксує, що (і все ще зберігає байт.
mnel

2

Clojure, 71 41 байт

-30 байт за допомогою <=та min/ maxзамість ranges.

#(if(<=(min % %2)(- % %2)(max % %2))% %2)

Перевіряє, чи (a - b)знаходиться в діапазоні від aдо b, відповідно відправляє повернення.

(defn eh [a b]
  ; <= accepts any number of argments, and ensures all fall within the range
    (if (<= (min a b) (- a b) (max a b))
      a
      b))

2

PHP (7.1), 55 байт

використовує новий синтаксис деструктуризації масиву:

[,$a,$b]=$argv;echo in_array($a-$b,range($a,$b))?$a:$b;

Запустіть -r, наведіть числа як аргументи командного рядка.


2

PowerShell , 37 35 32 байт

($a,$b=$args)[$a-$b-notin$a..$b]

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

Буквальний переклад проблеми в PowerShell за допомогою -notinоператора. Збережено три байти за допомогою декількох призначень та інкапсуляції. Це працює , тому що -має більш високий пріоритет оператора , ніж -notin, а ( )частина коду виконується перший і повертається в вигляді масиву @($a,$b). Однак, оскільки це $a,$bшвидше $b,$a, нам потрібно використовувати -notinдля гортання / флопування вихідного результату.


1

Пакет, 107 байт

@set/aa=%1,r=b=%2,x=a-b
@if %a% gtr %b% set/aa=b,b=%1
@if %a% leq %x% if %x% leq %b% set/ar=%1
@echo %r%



1

> <> , 21 байт

Використовує хитрість @ xnor . Ми використовуємо -v B Aдля повторного складання стека. ( -v A Bє +1 байт).

:01pr:11p::2**r*)1gn;

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

Пояснення

                        Input: [B, A] on stack.
:01pr:11p::2**r*)1gn;
:                       Duplicate.           [B, A, A]
 01p                    Push A to [0,1].     [B, A]
    r                   Reverse              [A, B]
     :                  Duplicate.           [A, B, B]
      11p               Push B to [1,1].     [A, B]
         ::             Duplicate x 2.       [A, B, B, B]
           2            Push 2.              [A, B, B, B, 2]
           2**          Compute 2*B*B.       [A, B, 2*B*B]
              r         Reverse.             [2*B*B, B, A]
               *        Compute A*B.         [2*B*B, A*B]
                )       >                    [2*B*B > A*B]
                 1      Push 1.              [2*B*B > A*B, 1]
                  g     If 2*B*B > A*B
                         get B, else get A.  [2*B*B > A*B ? B : A]
                   n    Output as number.
                    ;   Terminate.

1

Рубі , 27 22 байт

->a,b{(b*a<2*b*b)?b:a}

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

Тут нічого інноваційного. Проста математика за нею:

(A<=A-B<=B or B<=A-B<=A)

можна записати як

(B>=0 and A>=2B) or (B<=0 and A<=2B)

тобто: якщо A-2B має той самий знак, що і B, ми знаходимося в діапазоні.


1

SpecBAS - 38 біт

1 INPUT a,b: ?IIF(a-b IN [a TO b],a,b)

IIF - це вбудований IF-THEN-ELSE для друку правильного значення.


1

Haskell, 21 байт

a!b|b*a<2*b*b=b|0<1=a

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

Читабельна

func :: Int -> Int -> Int
func a b
    | b*a < 2*b*b = b
    | otherwise = a

Пояснення

Використовує формулу @ xnor, щоб перевірити, чи знаходиться ab в діапазоні. Нічого особливого, крім цього.


1

Хаскелл, 58 байт

Зовсім недавно я знову закохався у стріли. На жаль, вони вимагають від нас роботи з кортежами, а не бінарними функціями. І звичайно Хаскелл не має симетричної rangeфункції.

import Control.Arrow
u=uncurry
app<<<elem.u(-)&&&(u enumFromTo<<<u min&&&u max)




1

Швидкий -38 30 22 байти

Збережено 8 байт завдяки @Matt

print(a...b~=a-b ?a:b)

Спробуйте це в Інтернеті IBM Swift Sandbox!


Або 21 байт:

(завдяки формулі @xnor ) та збережено 8 байт завдяки @Matt

print(2*b*b>a*b ?a:b)

Свіфт - це не найкраща мова для гри в гольф (це дуже жорстко), тому якщо ви побачите будь-яку іншу можливість для гольфу, я повністю відредагую відповідь.


Чому б не помістити потрійну сторону у друк як друк (a ... b ~ = ab? A: b)
Метт

О, так, добра ідея. Дякую @Matt
Містер Xcoder

1

Java 7, 84 60 58 байт

int c(int a,int b){return(a<b?a:b)>a-b|(a<b?b:a)<a-b?b:a;}

Java 8, 37 байт

a->b->(a<b?a:b)>a-b|(a<b?b:a)<a-b?b:a

Пояснення:

int c(int a, int b){          // method with two integer parameters and integer return-type
  return (a<b ? a : b) > a-b  //  if smallest of the input is larger than a-b
       | (a<b ? b : a) < a-b  //    or if the largest of the input is smaller than a-b
    ? b                       //   return b
    :                         //  else
      a                       //   return a
}                             // end of method

Тестовий код: Спробуйте тут.


1

Ti-Basic (TI-84 Plus CE), 26 24 23 байт

Prompt A,B
A-B≥A and A-B≤B
AAns+Bnot(Ans

TI-Basic - це токенізована мова; всі використовувані жетони - однобайтні жетони .

Prompt підкаже вам два числа.

A-B≥A and A-B≤Bперевіряє, чи AB знаходиться між A і B (включно); це повертає 1, якщо істинне, і нуль, якщо неправдиве, яке зберігається в Ans.

Оскільки ми повертаємо A, якщо AB знаходиться між A і B, ми множимо A на Ans, що буде A, якщо ми маємо повернути A, а 0 в іншому випадку.

Далі Bnot(Ansдо нього додаємо . Якщо Ans був 1 (truthy), ми not(це і отримуємо 0, таким чином, наша сума A. Якщо Ans було 0 (фальшивий), ми not(це отримаємо 1, який множимо на B і додаємо на 0, щоб отримати B.

Остання оцінка в TI-Basic повертається неявно.

-2 байти завдяки Скотту Мілнеру


Ви можете зберегти два байти, не зберігаючи третій рядок Yі просто використовуючи Ansв четвертому рядку.
Скотт Мілнер

1

Pyt , 32 байти

←Đ←Đ3Ș⇹Đ3ȘĐ4Ș3Ș-3Ș⇹Ř∈Đ3Ș⇹¢*3Ș⇹*+

Приймає A і B від stdin як два окремі входи

Пояснення:

AABB -> ABBA -> ABAB -> ABABB -> ABBBA -> ABBBAA -> ABAABB -> ABABBA -> ABABC -> ABCBA -> ABCAB -> ABC [A, ..., B] -> ABD -> ABDD - > ADDB -> ADBD -> AD {B * (1-D)} -> {B * (1-D)} AD -> {B * (1-D)} + {A * D}

де: C = BA і D = C∈ [A, ..., B] (1, якщо вірно, 0, якщо помилково)


0

Ом , 10 байт (CP437)

Напевно, існує спосіб гольфіста для цього, але суворо типова природа Рубі ускладнює це.

G┼┘-îε?┼¿┘

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