Câu đố kim cương!


21

Giải trình:

Năm ngoái trong lớp toán, về bài tập về nhà, đôi khi chúng ta sẽ có được những câu hỏi cực kỳ đơn giản, mặc dù cũng khó chịu không kém gọi là câu đố kim cương. Về cơ bản, đây là những câu hỏi mà chúng tôi sẽ được cung cấp một khoản tiền và sau đó một sản phẩm được yêu cầu tìm hai số mà khi nhân cho sản phẩm và khi được thêm vào sẽ đưa ra tổng. Những điều này làm tôi phát điên, vì cách duy nhất tôi biết cách giải quyết chúng (trong Đại số I) là chỉ liệt kê các yếu tố của sản phẩm sau đó xem những yếu tố nào được thêm vào để tổng hợp. (Vì tôi không biết cách sử dụng Quadratics vào thời điểm đó) Chưa kể, chúng không chính xác là thử thách toán học. Tuy nhiên, điều đó chỉ xảy ra với tôi rằng tôi nên viết một chương trình. Vì vậy, đó là thách thức của bạn ngày hôm nay! Viết một chương trình có thể giải một câu đố kim cương.

Ví dụ nhập mô tả hình ảnh ở đây Xin lỗi cho hình ảnh mờ, đó là cách tốt nhất tôi có thể tìm thấy. Ngoài ra, bỏ qua các số trong bong bóng. Đỉnh của kim cương là sản phẩm, dưới cùng là tổng, bên phải và bên trái là hai số. Câu trả lời như sau: (Đây cũng là những trường hợp thử nghiệm của bạn)

  1. 9, -7
  2. -2, -1
  3. 5, 8
  4. -9, -9

Quy tắc:

  • Bạn không được sử dụng bất kỳ hàm hoặc lớp được xác định trước nào thực hiện điều này cho bạn.
  • Mã của bạn phải là một chương trình hoàn chỉnh hoặc chức năng trả về hoặc in câu trả lời sau khi tìm thấy chúng
  • Đầu vào là tổng và sản phẩm, được nhập dưới dạng tham số chức năng hoặc đầu vào của người dùng

Thông số kỹ thuật:

  • Giả sử rằng hai số, tổng và sản phẩm sẽ luôn là một số nguyên.
  • Cả hai câu trả lời sẽ nằm trong khoảng từ -27 đến 127.
  • Đầu vào của bạn sẽ là hai số nguyên (Tổng và Sản phẩm).

Hãy nhớ rằng đây là mã golf, vì vậy số byte ngắn nhất sẽ thắng. Vui lòng đặt tiêu đề cho câu trả lời của bạn với ## Tên ngôn ngữ tiêu chuẩn, Số lượng byte

Chỉnh sửa: Ngoài ra, Doorknob chỉ ra rằng đây thực chất là "yếu tố bậc hai có dạng x ^ 2 + bx + c,". Đó là một cách khác để suy nghĩ và tiếp cận thách thức này. : D


9
Đây thực chất là "yếu tố bậc hai của hình thức x^2 + bx + c", đúng không?
Doorknob

1
b = - (x + y), c = (x * y)
TheNumberOne

Đơn giản hóa (x + n)(x + m)mang lại cho bạn x^2 + (n+m)x + (n*m), vì vậy bao thanh toán cho biết bậc hai về cơ bản tương đương với câu hỏi này (nếu tôi hiểu chính xác).
Doorknob

@Doorknob 冰 vâng bạn đúng. Tôi đoán tôi sắp bị đánh dấu là một bản sao. :(
Ashwin Gupta

Chà, dù sao thì tôi cũng không nghĩ chúng ta có câu hỏi "nhân tố x ^ 2 + bx + c". Chỉ cần chỉ ra rằng các vấn đề rất giống nhau.
tay nắm cửa

Câu trả lời:


18

Thạch , 15 11 10 byte

Hð+,_ðH²_½

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

Mã nhị phân sau hoạt động với phiên bản trình thông dịch Jelly này.

0000000: 48 98 2b 2c 5f 98 48 8a 5f 90  H.+,_.H._.

Ý kiến

Điều này dựa trên thực tế là

công thức

Hð+,_ðH²_½    Left input: s -- Right input: p

 ð   ð        This is a link fork. We define three links, call the left and right
              link with the input as arguments, then the middle link with the
              results as arguments.

H             Left link, dyadic. Arguments: s p

H             Halve the left input.

     ðH²_½    Right link, dyadic. Arguments: s p

      H       Halve the left input.
       ²      Square the result.
        _     Hook; subtract the right input from the result.
         ½    Apply square root to the difference.

 ð+,_         Middle link, dyadic. Arguments: (results of the previous links)

  +           Compute the sum of the results.
    _         Compute the difference of the results.
   ,          Pair.

1
Đó là một trình biên dịch trực tuyến rất tốt đẹp. Tôi ước họ có một cái như thế cho java.
Ashwin Gupta

2
@AshwinGupta Dennis đã tự mình thực hiện điều đó;) Đối với Java, luôn có Ideone .
Doorknob

@Doorknob 冰 yeah Tôi biết trình biên dịch trực tuyến của anh ấy rất tuyệt. Tôi đã ở trên Ideone, nó tốt và tất cả nhưng nó không có hỗ trợ đa kính là một vấn đề. Tôi không có cách nào để kiểm tra các chương trình phức tạp hơn của tôi ở trường D :. Thêm vào đó, nó không hoạt động trên trình duyệt iPad dù tin hay không phải là một yêu cầu vì đó là thiết bị điện toán mà chúng tôi đã được cung cấp ...
Ashwin Gupta

Trừ khi ai đó có thể đánh bại 14, tôi nghĩ bạn đã thắng.
Ashwin Gupta

3
OK, Jelly bây giờ chính thức cực kỳ ngắn. Tôi đã phải học ngôn ngữ này ngay sau khi tôi hoàn thành việc quấn đầu mình quanh Pyth ...
ETHproductions

14

Kỳ lân , 4650 2982 1874 1546

[ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 ( 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ( ) ) 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 2 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ( 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ✨✨✨✨✨✨✨ 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 4 🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ( ) ) 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ ]

Bây giờ với dê, cầu vồng và lấp lánh!

Hy vọng ngắn hơn Java.


Sử dụng mã hóa tùy chỉnh có thể được áp dụng vớiApplyEncoding

Giải trình

Cái này hoạt động ra sao??? Với sự kỳ diệu của kỳ lân (và một ít mã).

Unicorn được biên dịch thành JavaScript

Mỗi phần được phân tách bằng một khoảng trắng và mỗi phần thể hiện một ký tự trong mã JavaScript.

Nếu phần chứa kỳ lân, ký tự của phần đó là độ dài của phần, được chuyển đổi thành mã char (ví dụ: 32 kỳ lân sẽ là khoảng trắng)

Nếu phần chứa dê, chiều dài của phần được nhân đôi và sau đó được chuyển đổi thành mã char.


Nếu ký tự đặc biệt của chương trình không hiển thị, đây là một hình ảnh:

nhập mô tả hình ảnh ở đây


Đây không phải là cạnh tranh vì Unicorn đã được thực hiện sau khi thử thách này được đăng.


1
Chuyện quái quỷ gì đang xảy ra ở đây? Tôi chỉ thấy hộp. ; -;
Lynn

@Mauris aww :( Tôi sẽ đăng một hình ảnh của chương trình để mọi người có thể thấy đó là vinh quang
Downgoat

3
LOL ổn, đây là sở thích của tôi mặc dù tôi không thể chấp nhận nó vì nó quá dài.
Ashwin Gupta

4
"Hy vọng ngắn hơn Java." Bạn xứng đáng một 10 chỉ cho điều đó;)
ETHproductions

1
@ Doᴡɴɢᴏᴀᴛ, xin lỗi đã làm bạn thất vọng. Java ngắn hơn khoảng 18 lần.
Tamoghna Chowdhury

8

JavaScript ES6, 45 39 37 * byte

(q,p)=>[x=p/2+Math.sqrt(p*p/4-q),p-x]

* Cảm ơn Dennis!


2
Tôi +1 bạn vì đây là câu trả lời đầu tiên tôi thực sự có thể hiểu (loại). LOL
Ashwin Gupta

4

TeaScript, 22 byte 30 31

[d=y/2+$s(y*y/4-x),y-d

Không phải cái đó xấu. Sẽ ngắn hơn nhiều nếu tôi có thể nhận được một số tính năng chơi gôn đã hoàn thành trước đó, chẳng hạn như các phím tắt unicode unicorn

Dùng thử trực tuyến


"Phím tắt kỳ lân" Tôi thích âm thanh đó! ;)
Sản phẩm điện tử

@ETHproductions haha, đó là tự động sửa lỗi: p mặc dù các phím tắt kỳ lân có thể thú vị ...
Downgoat

3

MATL , 33 byte

-100:100t!2$t+i=bb*i=&2#2$1fv101-

Xuất ra hai số trong hai dòng khác nhau. Nếu không có giải pháp tồn tại, nó không tạo ra đầu ra. Nếu tồn tại một số giải pháp, nó chỉ tạo ra cặp số tương ứng với một giải pháp.

Thí dụ

Sau đây đã được chạy trong Octave với cam kết GitHub hiện tại của trình biên dịch.

>> matl -r '-100:100t!2$t+i=bb*i=&2#2$1fv101-'
> 2
> -63
 9
-7

Giải trình

-100:100           % row vector -100, -99, ..., 100
t!                 % duplicate and transpose into column vector
2$t                % duplicate the two vectors
+                  % sum with singleton expansion (all combinations)
i=                 % does it equal input? Produces logical matrix
bb                 % move the two vectors to top
*                  % multiply with singleton expansion (all combinations)
i=                 % does it equal input? Produces logical matrix
&                  % logical "and"
2#2$1f             % find row and column of the first "true" value in logical matrix
v101-              % concatenate vertically and subtract 101

Vì tò mò, liệu chương trình ở dạng "giải thích" có thực sự chạy trên trình biên dịch MATL không? Cú pháp được phân chia khủng khiếp.
Ashwin Gupta

Có, bạn có thể dán chương trình trong các dòng riêng biệt, ví dụ sao chép danh sách từ phần giải thích. Bạn gõ matlvà nhấn "enter"; sau đó dán chương trình và kết thúc bằng một dòng trống. Bạn có nghĩa là cú pháp được chia tách khủng khiếp? MATL sử dụng ký hiệu đánh bóng ngược (postfix), có lẽ điều đó làm bạn bối rối?
Luis Mendo

3

Julia, 46 44 32 byte

f(b,c)=(x=b+√(b^2-4c))/2,b-x/2

Một hàm f lấy tổng và sau đó là sản phẩm.

Julia đầu tiên của tôi trả lời. @AlexA., Bạn nên tự hào về tôi.

Cảm ơn @Dennis và @Alex A. vì tất cả sự giúp đỡ. Tôi phải vượt qua 44 .: P


40 byte:f(b,c)=b/2+√(b^2/4-c),b/2-√(b^2/4-c)
Alex A.

@AlexA. - Bạn sẽ làm cho một meme xảy ra bằng cách đề xuất cải tiến cho cái này ...
Darrel Hoffman

34 byte:f(b,c)=b/2+√(x=b^2/4-c),b/2-√x
Alex A.

32 byte: f(b,c)=(x=b+√(b^2-4c))/2,b-x/2
Dennis

2
Nó giống như công thức bậc hai thông thường đã bị đánh vào đầu chúng tôi kể từ khi chúng tôi còn là những đứa trẻ sơ sinh.
Alex A.

3

đc, 16

?ddd*?4*-v+2/p-p

Đọc tổng sau đó sản phẩm từ các dòng riêng biệt của STDIN. -ve số phải được nhập bằng dấu gạch dưới thay vì dấu trừ. ví dụ

$ { echo 2; echo _63; } | dc -e'?ddd*?4*-v+2/p-p'
9
-7
$ 

Giải trình:

Giải pháp bậc hai cơ bản giống nhau cho sum = a + bproduct = a * b. Điều này tính toán giải pháp anhư sau:

a = [ sum + √( sum² - 4 * product ) ] / 2

Và tính toán giải pháp bnhư sau:

b = sum - a

Mở rộng:

?                   # push sum to stack
 ddd                # duplicate 3 times (total 4 copies)
    *               # sum squared
     ?              # push product to stack
      4*            # multiply by 4
        -           # subtract (4 * product) from (sum squared)
         v          # take square root of (sum squared) - (4 * product)
          +         # add sum to square root of (sum squared) - (4 * product)
           2/       # divide by 2 to give solution a
             p      # print with newline and without pop
              -     # subtract solution a from sum to give solution b
               p    # print with newline and without pop

Chia cho 2 được thực hiện muộn để tránh mất độ chính xác. Có thể chia cho 2 sớm hơn, nhưng điều này đòi hỏi độ chính xác phân đoạn cần nhiều ký tự hơn.


2
Đợi đã, cái gì? Điều này đã kết thúc ngắn hơn APL, Pyth CJam ??? Woohoo!
Chấn thương kỹ thuật số

3

Bình thường, 21 18 byte

Đã lưu 3 byte nhờ @Dennis

,J/+@-^Q2*4E2Q2-QJ

Bộ kiểm tra

Chương trình Pyth thứ hai của tôi từ trước đến nay, vì vậy nó có thể được chơi với các bản dựng sẵn. Đề nghị được chào đón!

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

,J/+@-^Q2*4E2Q2-QJ   Implicit: Q = first line of input
,                    Create and output a list of these items:
 J                     Set variable J to the result of these operations:
      ^Q2                Square Q.
     -   *4E             Subtract 4*(next line of input).
    @       2            Take the square root.
   +         Q           Add Q.
  /           2          Divide by 2.
                       The list is currently [J].
               -QJ     Push Q-J; the list is now [J, Q-J].
                     EOF; list is sent to output.

(Lời giải thích này có thể không chính xác 100%; Tôi không quen thuộc lắm với Pyth.)

Lưu ý đó /là chia số nguyên. Bằng cách thay thế nó c, chúng ta cũng có thể làm cho công việc này với các đầu vào không nguyên.


Đánh bại bạn bằng một byte: P Bạn nên xem xét chuyển đổi; D
nicael

Lời giải thích này có thể không đúng 100% ... ???
Chấn thương kỹ thuật số

@DigitalTrauma Tôi không chắc chắn 100% đó là cách nó hoạt động (cụ thể là J), nhưng đó là những gì tôi thu thập được từ việc đọc tài liệu.
Sản phẩm ETH

1
Có, Jlà biến tự động gán và được đặt lần đầu tiên được sử dụng. Phần duy nhất có vẻ không đúng lắm là Danh sách hiện tại là [J]. ,mất chính xác hai đối số và kết hợp chúng trong một danh sách.
Dennis

3

Java, 82 (69 λ) byte với công thức bậc hai (127 (114) byte brute-force)

Brute-Force: (Vanilla, Java 7)

int[] n(int s,int p){for(int a=-100;a<=100;a++)for(int b=-100;b<=100;b++) if(a+b==s&&a*b==p)return new int[]{a,b};return null;}

Tăng cường: (Java 8)

(s,p)->{for(int a=-100;a<=100;a++)for(int b=-100;b<=100;b++) if(a+b==s&&a*b==p)return new int[]{a,b};return null;}

Chỉ định lambda cho java.util.function.BiFunction<Integer, Integer, int[]>và gọiapply() .

Phương pháp tiếp cận vũ phu cũ. Chỉ có chức năng làm việc ở đây và vì Java không thể trả về nhiều giá trị, nên chúng tôi trả về một phần tử 2int mảng với các số được yêu cầu.

Chương trình dựa trên phương pháp vũ phu đầy đủ có thể được tìm thấy ở đây trên ideone.com , với λ phiên bản tại đây.

Chơi golf này liên quan đến việc loại bỏ tất cả các niềng răng không cần thiết.

Ung dung:

int[] n(int s,int p){//sum and product as function parameters,in that order
    for(int a=-100;a<=100;a++){//iterate first no. from -100 to 100
        for(int b=-100;b<=100;b++){//iterate second no. from -100 to 100
            //if the 2 nos. satisfy the diamond-puzzle condition, 
            //pack them in an int array and return them
            if(a+b==s&&a*b==p)return new int[]{a,b};}
     }//if no such pair exists, return null
return null;}

Phương pháp tiếp cận bậc hai: (Vanilla, Java 7)

int[] n(int s,int p){int x=s+(int)Math.sqrt(s*s-4*p);return new int[]{x/2,s-x/2};}

Tăng cường: (Java 8) (s, p) -> {int x = s + (int) Math.sqrt (s * s-4 * p); trả về int mới [] {x / 2, sx / 2} ;}

(Cách sử dụng như đối với lực lượng vũ phu λ ở trên).

Các thông số và tiêu chí trả về giống như giải pháp brute-force ở trên.

Sử dụng công thức bậc hai cũ tốt được sử dụng bởi hầu hết các câu trả lời khác ở đây, và không thể đánh gôn thêm nữa trừ khi có ai đó giúp tôi ra khỏi đây. Nó khá rõ ràng vì vậy tôi không bao gồm một phiên bản không có người nhận.

Chương trình dựa trên phương pháp bậc hai đầy đủ có ở đây trên ideone.com , với phiên bản tại đây.


AHHA vâng cảm ơn bạn. Tôi đã chờ câu trả lời của Java. Ngoài ra, tôi đã chờ đợi ai đó sử dụng cho các vòng lặp và sức mạnh vũ phu với các yếu tố. Tôi đoán tôi đã có được hai cho một thỏa thuận. +1
Ashwin Gupta

1
Java đánh bại kỳ lân :( Tôi đã +1 nhưng tôi đã sử dụng giới hạn phiếu bầu hàng ngày của mình
Downgoat

2

Japt , 28 22 21 20 byte

[X=V/2+(V²/4-U ¬V-X]

Đầu vào được thực hiện dưới dạng -63 2 .

Giải trình:

  • UVlà hai đầu vào ( -632 trong trường hợp đầu tiên)
  • ² bình phương số
  • q chiết xuất căn bậc hai

Tôi chỉ đang viết lên một câu trả lời cho điều này; đó là, cho đến khi tôi nhìn thấy bạn Công việc tốt đẹp! Bằng cách sắp xếp lại phần đầu tiên và sử dụng thêm một vài phím tắt Unicode, chúng ta có thể đạt được 21 byte: [X=ºV²-4*U ¬+V)/2V-X]Không cần các phím tắt: [X=((V²-4*U q +V)/2V-X]Tôi thực sự nên làm cho dấu vết ]không cần thiết trong phiên bản tiếp theo ...
ETHproductions

@Eth Ok, là một điều tuyệt vời.
nicael

2

APL, 27 21 byte

h(+,-).5*⍨⊣-⍨h×h←.5×⊢

Đây là một hàm chức năng dyadic chấp nhận các số nguyên ở bên phải và bên trái và trả về một mảng. Để gọi nó, gán nó cho một biến.

Ung dung:

                h←.5×⊢       ⍝ Define a train h for halving the input
              h×             ⍝ b^2/4
          ⊣-⍨                ⍝ b^2/4 - c
      .5*⍨                   ⍝ sqrt(b^2/4 - c)
h(+,-)                       ⍝ Return the halved pair

Dùng thử trực tuyến

Đã lưu 6 byte nhờ Dennis!


2

CJam, 18 byte

q~2d/_2#@-mq_2$+p-

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

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

q~                  e# Read an evaluate all input. STACK: product sum
  2d/               e# Divide the sum by 2.0.
     _              e# Push a copy of the result.
      2#            e# Square the copy.
        @-          e# Rotate the product on top and subtract it from the square.
          mq        e# Apply square root.
            _2$     e# Push copies of the root and the halved sum.
               +p   e# Add and print.
                 -  e# Subtract the originals.

2

Trăn 3, 49 44 byte

Có thể có một số cách để chơi golf này xuống hơn nữa, nhưng điều này có vẻ khá tốt.

def f(s,p):s/=2;d=(s*s-p)**.5;return s+d,s-d

Dấu hiệu của sự khác biệt là không chính xác; nó phải được s/2-d. Ngoài ra, d=(s*s/4-p)**.5tiết kiệm một vài byte.
Dennis

@Dennis Oops, bạn nói đúng. Cố định và đánh golf.
Sherlock9

1

MathCAD 15. 38 byte

enter image description here

Với công thức toán học, lập trình trong MathCAD rất dễ dàng. Ngôn ngữ thậm chí được thiết kế để xử lý các số phức tạp một cách dễ dàng. Tuy nhiên, có những ngôn ngữ ngắn hơn có thể giải quyết vấn đề.


1

, 21 ký tự / 30 byte

[x=í/2+√ í²/4-î⦆,í-x]

Try it here (Firefox only).

Meh. Điều này phải đủ trực quan để bạn có thể có được ý tưởng; tuy nhiên, nếu bạn phải , î = input1, í = input2.


0

PHP, 62 byte

<?=($x=($p=$_GET[p])/2+sqrt($p*$p/4-$q=$_GET[q]))." ".($p-$x);

Điều này có thể khá dài nhưng là chương trình web đầy đủ tính năng của PHP - "chương trình". Chấp nhận các đối số thông qua yêu cầu "nhận".

Bản trình diễn .


0

TI-BASIC, 20 byte

Lấy Qtừ AnsPtừ Prompt. Gọi như thế P:prgmNAME.

Prompt P
P/2+√(P²/4-Ans
{Ans,P-Ans

Rất đẹp. Quá tệ cho Promptcâu nói đó quá dài lol. Tôi không biết TI-BASIC, nhưng nó có thể ngắn hơn nếu bạn đặt mã vào một hàm và truyền P làm tham số.
Ashwin Gupta

Trên thực tế, TI-BASIC được chia thành "mã thông báo"; Mỗi Prompt , P, /, 2, +, √(, ², 4, -, Ans, và {là một trong những dấu hiệu, và mỗi một trong các thẻ là một byte. Ngoài ra, TI-BASIC không có chức năng. Đây có lẽ là phương pháp ngắn nhất.
Conor O'Brien

Ồ, đó là điều đáng sợ, tôi đã không nhận ra điều đó. Nhưng không phải mỗi char vẫn là một byte theo nghĩa kỹ thuật? Giống như nếu tôi sao chép dán nó vào tài liệu văn bản, tôi nhận được 36 byte. Hay điều này sử dụng các ký tự Unicode đặc biệt?
Ashwin Gupta

TI-BASIC là một ngôn ngữ máy tính, vì vậy đây là những gì người ta nhìn thấy. Nó được khóa vào máy tính, không phải là tài liệu văn bản hoặc tương tự. Dưới đây là các mã thông báo một byte.
Conor O'Brien

À, tôi hiểu rồi. Mát mẻ. Tôi chỉ tò mò thôi.
Ashwin Gupta
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.