ถ้า AB อยู่ใน AB A อื่น B ​​ใช่มั้ย


44

รับจำนวนเต็มสองจำนวนคือ A และ B เอาต์พุต A ถ้า AB (A ลบ B) อยู่ใน AB (A ถึง B) หรือเอาท์พุท B

"A B ลบ" คือการลบมาตรฐาน

"A ถึง 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

Original Chat-Mini-Challenge

คำตอบ:


44

Pythonขนาด 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 ขอบูลีน
Dennis


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

Python2, 55 52 51 ไบต์

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

ลองออนไลน์!

จัดการกรณีทดสอบ OP ทุกครั้งที่ได้กล่าวถึง (ในขณะที่ทำการโพสต์นี้) ตามที่ 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 ไบต์ขอบคุณ 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();


3

Mathematica ขนาด 16 ไบต์

If[2#^2>1##,##]&

ฟังก์ชันบริสุทธิ์รับสองอาร์กิวเมนต์ตามลำดับตรงกันข้ามในฐานะ OP (ตัวอย่างเช่นIf[2#^2>1##,##]&[B,A]) พอร์ตของXNOR เป็นคำตอบหลาม


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 (การจับคู่ (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

Pyth - 9 ไบต์

หวังว่าจะใช้อินพุตโดยปริยายมากขึ้น ... :(

@Q!}-FQ}F

ลองมันออนไลน์ได้ที่นี่



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

Ruby , 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

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

Haskell, 58 ไบต์

เมื่อเร็ว ๆ นี้ฉันตกหลุมรักลูกศรอีกครั้ง น่าเสียดายที่พวกเขาต้องการให้เราทำงานกับ tuples แทนฟังก์ชันเลขฐานสอง และแน่นอนว่า Haskell ไม่มีrangeฟังก์ชันสมมาตร

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


1

อ็อกเทฟ 55 ไบต์

@(a,b)(c=b*~[find((a:1-2*(b<a):b)==(a-b)) 0](1))+(a*~c)

อาจปรับให้เหมาะสมต่อไปได้ ฉันจะเพิ่มคำอธิบายในภายหลัง


วิธีการที่เรียบง่าย +1 สำหรับทุกสิ่งที่ "บ้า" ในนั้นแม้ว่า: P
Stewie Griffin


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)

Swift ไม่ใช่ภาษาที่ดีที่สุดสำหรับการเล่นกอล์ฟ (มันเข้มงวดมาก) ดังนั้นหากคุณเห็นโอกาสในการเล่นกอล์ฟอื่น ๆ ฉันจะแก้ไขคำตอบโดยสิ้นเชิง


ทำไมไม่ใส่ไตรภาคในการพิมพ์เหมือนพิมพ์ (a ... b ~ = ab? a: b)
Matt

โอ้ใช่อุดมคติที่ดี ขอบคุณ @Matt
Mr. 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 (ความจริง) เราnot(ได้และได้ 0 ดังนั้นผลรวมของเราคือ A ถ้า Ans เป็น 0 (เท็จ) เราnot(ต้องได้ 1 ซึ่งเราคูณด้วย B และเพิ่มเป็น 0 เพื่อรับ B

การประเมินล่าสุดใน TI-Basic จะถูกส่งกลับโดยปริยาย

-2 ไบต์ขอบคุณ Scott Milner


คุณสามารถบันทึกสองไบต์ได้โดยไม่ต้องเก็บบรรทัดที่สามไว้Yและเพียงแค่ใช้Ansในบรรทัดที่สี่
Scott Milner

1

Pyt , 32 ไบต์

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

ใช้ A และ B จาก stdin เป็นอินพุตแยกกันสองตัว

คำอธิบาย:

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

โดยที่: C = BA และ D = C∈ [A, ... , B] (1 ถ้าเป็นจริง, 0 ถ้าเป็นเท็จ)


0

โอห์ม 10 ไบต์ (CP437)

อาจเป็นวิธีที่นักกอล์ฟทำเช่นนี้ได้ แต่ธรรมชาติที่เคร่งครัดของ Ruby ทำให้มันยากขึ้น

G┼┘-îε?┼¿┘

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.