Nếu AB ở AB A khác B eh?


44

Cho hai số nguyên A và B, đầu ra A nếu AB (A trừ B) nằm trong AB (A đến B), nếu không thì đầu ra B.

"A trừ B" là phép trừ tiêu chuẩn.

"A đến B" là phạm vi các số nguyên bắt đầu từ A và kết thúc tại B, bao gồm cả A và B. Ví dụ:

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

Mã ngắn nhất tính bằng byte thắng.

Các trường hợp thử nghiệm

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

Trò chuyện gốc-Thử thách nhỏ

Câu trả lời:


44

Python , 27 byte

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

Hãy thử trực tuyến!

Một công thức số học. Tại sao phủ định 2*b*b>a*btương đương với điều kiện vấn đề a-b in symrange(a,b)?

Lưu ý rằng x in symrange(a,b)tương đương với 0 in symrange(a-x,b-x). Áp dụng điều này để x=a-bcho 0 in symrange(b,2*b-a). Giá trị 0được bao gồm trong khoảng trừ khi nó trải dài giữa hai giá trị dương hoặc hai giá trị âm. Điều này có thể được nói một cách hợp lý là "sản phẩm của họ b*(2*b-a)không tích cực.

Cuối cùng, lấy b*(2*b-a)<=0và viết lại 2*b*b<=a*b. Một byte được lưu bằng cách lật <=tới >và chuyển đổi các trường hợp.


10

Thạch , 5 byte

_erị,

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

_erị,  Main link. Arguments: a, b

_      Subtraction; Yield a-b.
  r    Range; yield [a, ..., b].
 e     Exists; yield 1 if a-b belongs to [a, ..., b], 0 if not.
    ,  Pair; yield [a, b].
   ị   At-index; yield the element of [a, b] at index 1 (a) or index 0 (b).

8

05AB1E , 7 byte

Mã số:

DŸ¹Æå_è

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!

Giải trình:

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 đã yêu cầu Boolean.
Dennis

6

PHP, 58 byte

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

1
Bài $btập không cần dấu ngoặc đơn.
Tít

6

JavaScript (ES6), 24 byte

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

Các trường hợp thử nghiệm

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 byte

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

Gọi như f(B, A).


4

Python2, 55 52 51 byte

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

Hãy thử trực tuyến!

Xử lý mọi trường hợp thử nghiệm mà OP đã đề cập (tại thời điểm đăng bài này), như TIO gợi ý.


4

JavaScript ES6, 40 37 byte

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

Giải thích:

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

Đã lưu 3 byte nhờ Arnauld.

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 byte

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

Sử dụng logic của @ xnor để xác định xem ab có trong a: b.


chức năng không tên thường được cho phép
MickyT

Bạn có thể mất thêm 3 byte bằng cách sử dụngpryr::f(match(a-b,a:b,b))
mnel

@mnel cảm ơn vì đã chia sẻ điều đó, tôi không biết làm thế nào% trong% hoạt động trước đó; nhưng thất bại bất cứ khi nào ab ở trong a: b. f (-90, -30) = 31
BLT

Thật. `pryr :: f (match (ab, a: b, 0) + b) sửa lỗi đó (và vẫn lưu một byte.
mnel

2

Clojure, 71 41 byte

-30 byte bằng cách sử dụng <=min/ maxthay vì ranges.

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

Kiểm tra nếu (a - b)trong phạm vi từ ađến b, gửi trả lại cho phù hợp.

(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 byte

sử dụng cú pháp phá hủy mảng mới :

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

Chạy với -r, cung cấp số làm đối số dòng lệnh.


2

PowerShell , 37 35 32 byte

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

Hãy thử trực tuyến!

Dịch nghĩa đen của vấn đề sang PowerShell bằng cách sử dụng -notintoán tử. Đã lưu ba byte bằng cách sử dụng nhiều phép gán và đóng gói. Điều này hoạt động vì -quyền ưu tiên toán tử cao hơn -notin( )phần mã được thực thi trước và được trả về dưới dạng một mảng @($a,$b). Tuy nhiên, vì nó $a,$bđúng hơn là $b,$a, chúng ta cần sử dụng -notinđể lật / lật kết quả đầu ra.


1

Mẻ, 107 byte

@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 byte

Làm cho việc sử dụng thủ thuật của @ xnor . Chúng tôi sử dụng -v B Ađể chuẩn bị trước ngăn xếp. ( -v A Blà 1 byte).

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

Hãy thử trực tuyến!

Giải trình

                        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

Ruby , 27 22 byte

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

Hãy thử trực tuyến!

Không có gì đổi mới ở đây. Toán học đơn giản đằng sau nó:

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

có thể được viết như

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

đó là: nếu A-2B có cùng dấu với B, chúng ta nằm trong phạm vi.


1

SpecBAS - 38 byte

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

IIF là một nội tuyến-IF-THEN-ELSE, để in giá trị chính xác.


1

Haskell, 21 byte

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

Hãy thử trực tuyến!

Có thể đọc được

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

Giải trình

Sử dụng công thức của @ xnor để kiểm tra xem ab có trong phạm vi không. Không có gì đặc biệt ngoài điều đó.


1

Haskell, 58 byte

Mới gần đây tôi lại yêu mũi tên. Thật không may, họ yêu cầu chúng ta làm việc với các bộ dữ liệu thay vì các hàm nhị phân. Và tất nhiên Haskell không có rangechức năng đối xứng .

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



1

Nim, 60 byte

proc f(a,b:int):int=
  if a-b in min(a,b)..max(a,b):a else:b

Hãy thử trực tuyến!

Khá chuẩn theo như câu trả lời, không có thủ thuật lớn nào trong bài này.


1

Nhanh -38 30 22 byte

Đã lưu 8 byte nhờ @Matt

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

Dùng thử tại IBM Swift Sandbox trực tuyến!


Hoặc 21 byte:

(nhờ công thức của @xnor ) và lưu 8 byte nhờ @Matt

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

Swift không phải là ngôn ngữ tốt nhất để chơi gôn (nó rất cứng nhắc), vì vậy nếu bạn thấy bất kỳ cơ hội chơi gôn nào khác, tôi sẽ hoàn toàn chỉnh sửa câu trả lời.


Tại sao không đặt ternary bên trong bản in như in (a ... b ~ = ab? A: b)
Matt

Ồ, vâng, ideA tốt. Cảm ơn @Matt
Ông Xcoder

1

Java 7, 84 60 58 byte

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

Java 8, 37 byte

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

Giải trình:

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

Mã kiểm tra: Hãy thử nó ở đây.


1

Ti-Basic (TI-84 Plus CE), 26 24 23 byte

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

TI-Basic là ngôn ngữ được mã hóa; tất cả các mã thông báo được sử dụng là mã thông báo một byte .

Prompt nhắc bạn cho hai số.

A-B≥A and A-B≤Bkiểm tra xem AB có nằm giữa A và B không (bao gồm); cái này trả về 1 nếu đúng và 0 nếu sai, được lưu trữ vàoAns .

Vì chúng ta sẽ trả về A nếu AB nằm giữa A và B, chúng ta nhân A với Ans, sẽ là A nếu chúng ta phải trả lại A và 0 nếu không.

Tiếp theo, chúng tôi thêm Bnot(Ansvào nó. Nếu Ans là 1 (trung thực), chúng tôi not(và nhận 0, do đó tổng của chúng tôi là A. Nếu Ans là 0 (giả), chúng tôinot( sẽ nhận được 1, chúng tôi nhân với B và thêm vào 0 để có được B.

Đánh giá cuối cùng trong TI-Basic được trả lại ngầm.

-2 byte nhờ Scott Milner


Bạn có thể lưu hai byte bằng cách không lưu trữ dòng thứ ba Yvà chỉ sử dụng Anstrong dòng thứ tư.
Scott Milner

1

Pyt , 32 byte

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

Lấy A và B từ stdin làm hai đầu vào riêng biệt

Giải trình:

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}

trong đó: C = BA và D = C∈ [A, ..., B] (1 nếu đúng, 0 nếu sai)


0

Ohm , 10 byte (CP437)

Có lẽ có một cách chơi golf để làm điều này, nhưng bản chất được đánh máy nghiêm ngặt của Ruby làm cho điều này trở nên khó khăn.

G┼┘-îε?┼¿┘

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.