Hợp nhất hai giá trị


44

Bạn có hai giá trị, mỗi giá trị 0đại diện cho "không xác định" hoặc một trong số đó 1,2,3. Hợp nhất chúng thành một giá trị như sau:

  • Nếu cả hai giá trị đều khác nhau và bằng nhau, hãy xuất giá trị đó:
    (3,3) -> 3
  • Nếu cả hai giá trị đều khác nhau nhưng không bằng nhau, đầu ra 0 không xác định:
    (1,2) -> 0
  • Nếu một giá trị bằng 0 và giá trị kia thì không, hãy xuất giá trị khác không:
    (2,0) -> 2, (0,1) -> 1
  • Nếu cả hai giá trị bằng 0, đầu ra bằng 0:
    (0,0) -> 0

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

Có 16 cặp đầu vào có thể.

  | 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

Bảng xếp hạng


8
Quy tắc thứ tư phù hợp với quy tắc đầu tiên, vì vậy tôi không biết tại sao bạn tách chúng ra.
Gây tử vong vào

1
Nitpick: Điểm thứ 4 là dư thừa, bạn có thể loại bỏ "nonzero" khỏi điểm đầu tiên. EDIT: Wow, thật là một ninja @Firthize.
Erik the Outgolfer

Ngoài ra, 3 không thực sự cần thiết ở đây, mặc dù nó làm tăng số lượng đầu vào có thể.
Erik the Outgolfer

2
Tôi đã cân nhắc việc cô đọng các quy tắc, nhưng nghĩ rằng sẽ rõ ràng nhất khi chỉ liệt kê tất cả các trường hợp zero / nonzero và để lại sự tối ưu hóa cho các gôn thủ.
xnor

2
Điều này cần một bảng thành tích , trang đầu tiên bắt đầu nhận được câu trả lời đã bị đánh bại ở trang thứ hai.
Ørjan Johansen

Câu trả lời:


22

Python 3 , 27 25 byte

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

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


5
Tôi thích rằng điều này phá vỡ cho đầu vào hơn 3. Làm thế nào bạn nghĩ ra điều này?
Jakob

4
Về cơ bản rất nhiều thử nghiệm và lỗi.
Dennis

1
Hấp dẫn. Trong một khoảnh khắc, tôi đã nghĩ đến việc tự động tìm kiếm thông qua các biểu thức có độ dài giới hạn liên quan đến hai số nguyên và một số toán tử, nhưng không gian quá lớn thậm chí chỉ khoảng 20 byte. Một số thông minh là cần thiết!
Jakob

16

Thạch , 4 byte

gf|S

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

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

gf|S  Main link. Left argument: x. Right argument: y.

g     Compute a, the gcd of x and y.
  |   Compute b, the bitwise OR of x and y.
 f    Filter; yield all common elements of [a] and [b].
   S  Take the sum.

10

APL (Dyalog) , 5 byte

⌈×∧=⌊

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

Tài liệu tham khảo hữu ích

∧=⌊: Trả về 1nếu bội số chung thấp nhất bằng với mức tối thiểu. Điều này chỉ đúng nếu một trong các giá trị bằng 0 hoặc cả hai đều bằng nhau. Hoặc tôi có thể có=*⌊

⌈×: Tối đa nhân với ở trên.


7

Ngôn ngữ lập trình Shakespeare , 296 byte

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]

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

Lần đầu tiên tham gia vào một thử thách chơi gôn, vì vậy hãy bắt đầu với một trong những ngôn ngữ trò đùa yêu thích của tôi!

Giải thích: Khai báo hai biến Ford và Ajax (tên biến ngắn nhất hiện có)

Z.Ford,.Ajax,.

Cảnh đầu tiên: Đặt hai giá trị vào biến, sau đó kiểm tra chúng bằng nhau, sau đó kiểm tra Ajax với 0. Nếu giá trị mà chúng ta phải trả về được lưu trữ trong biến Ford, hãy chuyển đến Cảnh 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.

Nếu Ford bằng 0, in Ajax, khác đặt Ajax thành 0 rồi in Ajax. Sau đó đi đến cuối chương trình.

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

Cảnh C: In Ford

Scene C:.
Ajax:open heart.

Cảnh V: Kết thúc chương trình.

Scene V:.
[Exeunt]


2
@JoKing phiên bản của bạn tốt hơn không thể phủ nhận hơn phiên bản của tôi, tôi nghĩ sẽ tốt hơn nếu bạn đăng nó dưới dạng câu trả lời vì lý do đằng sau chương trình này khá khác biệt và tôi không muốn ghi nhận công việc của bạn
Guillaume Ruchot

6

Ruby , 21 byte

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

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

Vì Ruby

Giải thích ngắn gọn:

  • a|b là bitwse HOẶC, vì vậy nó cung cấp cho chúng ta số đúng nếu a == b hoặc một trong số chúng bằng không.

  • Số ma thuật 531là 2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0 và toán tử [] trích xuất một bit. Điều này có nghĩa là: nhân với 1 nếu a * b là 0, 1, 2, 4 hoặc 9, nhân với 0 nếu không.

  • Điều này sẽ không hoạt động cho các giá trị> 3



5

Bình thường , 8 7 byte

@{+0SQ3

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

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

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

Trường hợp 1 - Cả hai giá trị khác không và bằng nhau

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

Trường hợp 2 - Cả hai giá trị khác không và không bằng nhau

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

Trường hợp 3 - Chính xác là một giá trị 0

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

Trường hợp 4 - Cả hai giá trị bằng không

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

Giải pháp thay thế, cũng 7 byte

*eSQ}s{

Dùng thử trực tuyến

*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) 

Phiên bản trước, 8 byte

@+0{-QZ3

@xnor Cảm ơn bạn đã phát hiện ra điều đó, nó nên được sửa ngay bây giờ
Sok

@{+0Q3hoạt động trong 6 byte.
Ông Xcoder


4

Stax , 8 byte

Ç∞∟∙◄╥*♣

Chạy và gỡ lỗi nó

Giải nén, không được chỉnh sửa và nhận xét, nó trông như thế này.

    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

Chạy cái này




4

C (gcc), 25 byte

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

mã giả:

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

3

C (gcc), 26 byte

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

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

Mở rộng / 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 byte

dGp*~GX>*

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

Giải trình:

           % 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

Không outgolf:t?td~*]X>
Sundar

3

GNU sed, 23 byte

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

(phải được chạy với -rcờ)

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


1
Chào mừng bạn đến với PPCG :) Sự đồng thuận hiện tại là các cờ không được tính (Tôi đang ở trên điện thoại của mình nên không thể liên kết Meta có liên quan).
Xù xì

1
Ồ tuyệt! Tôi sẽ chỉnh sửa sau vì tôi cũng trên điện thoại của mình; một -3 byte miễn phí là một sự chào đón tuyệt vời cho PPCG :)
KernelPanic

3

QBasic, 34 byte

Phương pháp khác nhau!

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

Quan sát rằng các giá trị khác 0 trong lưới đầu ra là tất cả các bit ORcủa hai số đầu vào. Đây chỉ là a OR btrong QBasic. Chúng tôi muốn xuất giá trị này khi a*b=0 OR a=b, và 0nếu không, chúng tôi có thể làm bằng cách nhân với số âm của điều kiện đã nói ở trên (phủ định, vì tính trung thực là -1trong QBasic).


2

Brainfuck, 25 byte

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

Đầu vào là hai giá trị byte (không phải ascii)


2

Swift , 118 byte

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

4
Chào mừng đến với PPCG! Tôi không biết Swift, nhưng có lẽ bạn có thể tiết kiệm rất nhiều byte bằng cách đặt tên biến cho mỗi ký tự 1 ký tự và xóa khoảng trắng xung quanh các toán tử như !=và ternary.
Οurous

1
Xin chào, chào mừng đến với PPCG! Như được đề cập bởi @ Οurous, bạn có thể thay đổi n1n2ký tự đơn để rút ngắn chúng; xóa một số khoảng trắng và dấu ngoặc đơn và xóa một số khoảng trắng. Ngoài ra, ==0có thể <1!=0có thể >0, vì chúng ta chỉ biết các đầu vào 0,1,2,3là có thể. Chưa bao giờ được lập trình trong Swift trước đó, nhưng tôi đã giảm xuống còn 91 byte như thế này: func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")} Hãy thử trực tuyến.
Kevin Cruijssen

Ngoài ra, có vẻ như bạn có thể rút ngắn nó xuống còn 51 byte như thế này: func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} Hãy thử trực tuyến. Một lần nữa chào mừng bạn đến với PPCG, và tận hưởng kỳ nghỉ của bạn!
Kevin Cruijssen

1
Ngoài các sân gôn của @ KevinCruijssen, bạn có thể biến bài nộp của mình thành một bao đóng ẩn danh để tiết kiệm 87 byte: {$0==$1||1>$0*$1 ?max($0,$1):0} Hãy thử trực tuyến!
Ông Xcoder

2

Mẻ, 38 36 35 30 byte

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

Câu trả lời Python của cảng @ Dennis, vì các điều kiện quá đắt trong Batch.



2

J , 8 7 byte

1 byte được lưu bởi H.PWiz.

>.*=^<.

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

Cổng AJ của giải pháp APL của H.PWiz

=các số có bằng nhau không? (kết quả là 1 hoặc 0)

^ với sức mạnh của

<. số nhỏ hơn

* nhân với

>. số lượng lớn hơn


1
>.*=^<.cho 7 byte
H.PWiz

@ H.PWiz Cảm ơn bạn! Sử dụng thông minh =^!
Galen Ivanov

2

05AB1E , 9 8 byte

àIËIP_+*

-1 byte nhờ @MagicOctopusUrn .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

à         # 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

Giải thích khái quát:

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đã từng là của tôi; tốt đẹp Không thực sự chắc chắn bạn có thể đánh bại 9 byte nhiều.
Bạch tuộc ma thuật Urn

1
Tôi lấy lại à®Ë®P_+*nơi _tương đương về mặt logic với
Bạch tuộc ma thuật Urn

_biến 0 thành 1, tất cả các giá trị khác thành 0.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Cảm ơn! Khi tôi đưa ra câu trả lời này, tôi đã xem các tài liệu để xem liệu có == 0lệnh hay không, không biết _chính xác điều đó. Nên hữu ích cho những thách thức khác trong tương lai. GẠCH :)
Kevin Cruijssen

2

Javascript, 35 byte

f=(m,n)=>(m||n)&&(m!=n)?(m>n?m:n):0


2

Javascript ES6, 25 22 21 20 byte

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

14 13 byte , Nếu các đối số được cung cấp theo thứ tự được sắp xếp

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


2

QBasic, 38 36 35 byte

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

Lấy cảm hứng một phần từ câu trả lời của ErikIF ... THEN ... ELSE , đây là một giải pháp chỉ dành cho toán học.

Làm thế nào tôi đến đây

Lưu ý quan trọng cho sự hiểu biết toán học-với-điều kiện: trong QBasic, kết quả của toán tử so sánh là 0-1, không 01.

Chúng tôi bắt đầu với mã của Erik:

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

Nói cách khác, nếu abcả hai đều khác, sau đó in a*-(a=b)( anếu a=b, nếu không 0); khác (ít nhất một trong abbằng 0), đầu ra a+b(số khác không, hoặc0 nếu cả hai đều bằng 0).

Đã có một số phép toán với các điều kiện đang diễn ra ở đây. Chúng ta hãy tiến một bước xa hơn và xem liệu chúng ta có thể loại bỏ IFhoàn toàn tuyên bố đó không. Chúng ta sẽ phải sử dụng a*b>0cho điều kiện bên ngoài: a*bcó thể có nhiều giá trị trung thực khác nhau, điều này tốt cho IFnhưng gây ra vấn đề cho toán học.

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

Đây là thủ thuật chuẩn của tổng IFhợp. Khi nào clà đúng, c*a*(a=b)-a*(a=b)(c+1)*(a+b)0; khi clà sai, c*a*(a=b)0(c+1)*(a+b)a+b. Vì vậy, biểu thức này cho kết quả tương tự như IF ... THEN ... ELSE. Vấn đề duy nhất là, nó làm cho chương trình của chúng ta 40 byte thay vì 38. Có lẽ chúng ta có thể rút ngắn nó bằng cách sắp xếp lại toán học.

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

Vẫn 40 byte ...

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

Bây giờ chương trình của chúng tôi đã trở lại 38 byte. Nhưng vì chúng tôi chỉ sử dụng cmột lần, chúng tôi không phải gán nó cho một biến nữa:

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

Bây giờ chúng tôi xuống còn 36 byte.

Nhưng chờ thêm ...a+b+a*(a=b) Biểu hiện đó có vẻ hơi thừa. a*(a=b)-anếu a=b0nếu không. Khi chúng tôi thêm nó vào a, chúng tôi nhận được 0nếu a=banếu không. Có lẽ chúng ta có thể đạt được điều tương tự trong ít byte hơn bằng cách đảo ngược điều kiện.

b+a*-(a<>b)

Lúc đầu, điều này không có vẻ ngắn hơn. Nhưng chúng ta có thể lưu một byte bằng cách trừ thay vì thêm âm:

b-a*(a<>b)

Và ở đó chúng tôi có giải pháp 35 byte của chúng tôi.


Thủ thuật hay đấy ...
Erik the Outgolfer

1

Sạch , 46 43 42 byte

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

?o sort

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

Thành phần ẩn danh :: [Int] -> Int, sắp xếp các cặp và sau đó khớp với thành viên đầu tiên.

Làm điều đó như một lambda sáng tác có cùng độ dài:

import StdEnv

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

1

Thạch , 7 6 byte

׬o=a»

Hãy thử trực tuyến! hoặc Thử tất cả các kết hợp!

Làm sao?

׬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.

Sử dụng phương thức trong câu trả lời APL , chúng ta có cùng số byte. Một byte dài hơn câu trả lời đó vì bội số chung thấp nhất là hai byte.

6 byte

«=æl×»

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


Tôi cũng lưu ý một phương pháp thay thế bên dưới
H.PWiz

@ H.PWiz Ồ, tôi nghĩ rằng bạn đang sử dụng phương pháp tương tự như phương pháp trong liên kết
dylnan

Tôi đưa ra hai phương pháp ∧=⌊=*⌊. Thứ hai trong số đó được ưa thích bởi Jelly
H.PWiz

@ H.PWiz Tôi không nói APL, tôi chỉ sử dụng phương pháp bạn mô tả. Không gì =*⌊làm gì?
dylnan

Nó khá giống với Jelly, ngoại trừ việc là tối thiểu. Hoặc người ta có thể sử dụng ×cả hai ngôn ngữ
H.PWiz
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.