f (g (x)) giảm trong khi g (f (x)) tăng


42

Đối với thử thách này, bạn cần thực hiện hai hàm, fg , trên các số nguyên, sao cho f ∘ g là hàm giảm nghiêm ngặt trong khi g f là hàm tăng nghiêm ngặt. Nói cách khác, nếu bạn lấy bất kỳ hai số nguyên a <b , thì f (g (a))> f (g (b))g (f (a)) <g (f (b)) . Không có giới hạn đối với fg riêng lẻ, ngoại trừ việc chúng phải ánh xạ một số nguyên sang một số nguyên khác.

Vui lòng bao gồm một mô tả ngắn về fg và một đối số cho lý do tại sao họ có tài sản cần thiết.

Tín dụng: Thử thách này được lấy cảm hứng từ một vấn đề trong cuộc thi Thạc sĩ Toán học Rumani năm 2011 (yêu cầu điều tương tự nhưng về số thực, thay vì số nguyên). Nếu bạn thực sự muốn spoilers, bây giờ bạn biết những gì để tìm kiếm.

Quy tắc

  • Từ "hàm" trong thử thách này nên được hiểu theo nghĩa toán học là ánh xạ một số nguyên này sang một số nguyên khác: bạn có thể viết hai chương trình hoặc hai hàm và sử dụng bất kỳ phương thức tiêu chuẩn nào để nhận đầu vào và cung cấp đầu ra, như thường lệ. Bạn có thể sử dụng biểu diễn chuỗi số nguyên thay vì biến số nguyên thực tế, nhưng các loại đầu vào và đầu ra phải giống hệt nhau, để các hàm có thể được tạo mà không cần chuyển đổi các loại thủ công ở giữa. Hãy nhớ rằng về mặt khái niệm, fg vẫn cần phải là các hàm trên, vì vậy bạn không thể gian lận bằng cách sử dụng hai biểu diễn chuỗi khác nhau của cùng một số hoặc bất cứ thứ gì tương tự.

  • Hãy nhớ rằng các chức năng có thể không được đặt tên , miễn là tên của chúng không cần thiết bởi chính nó hoặc chức năng khác mà bạn xác định. Nếu bạn đặt tên cho một hoặc cả hai hàm, bạn có thể cho rằng chúng tồn tại trong cùng một chương trình, để chúng có thể tham chiếu lẫn nhau trong quá trình thực hiện (ví dụ như def f(x): return -g(x)trong Python).

  • Áp dụng quy tắc tràn số nguyên thông thường: giải pháp của bạn phải có thể hoạt động cho các số nguyên lớn tùy ý trong phiên bản giả định (hoặc có thể có thật) của ngôn ngữ của bạn trong đó tất cả các số nguyên không bị ràng buộc theo mặc định, nhưng nếu chương trình của bạn không thực hiện do thực hiện do thực hiện không hỗ trợ số nguyên lớn, điều đó không làm mất hiệu lực giải pháp.

  • Bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào , nhưng lưu ý rằng các lỗ hổng này bị cấm theo mặc định.

  • Đây là , vì vậy điểm của bạn là tổng số byte của cả hai hàm và câu trả lời hợp lệ ngắn nhất sẽ thắng.


Các hàm có thể trả về một chuỗi không?
Matthew Roh

@SIGSEGV Tôi muốn nói có, nhưng chỉ khi họ cũng lấy một chuỗi làm đầu vào, để chúng có thể được tạo mà không phải chèn bất kỳ chuyển đổi loại nào.
Martin Ender

À, tôi đã thử chuyển đổi thành chuỗi để làm cho chức năng khác không thể chỉnh sửa kết quả hơn nữa.
Matthew Roh

1
@Firthize Đúng. Mỗi phải là một hàm loại ℤ →.
Martin Ender

1
@Bijan cả tích cực và tiêu cực.
Martin Ender

Câu trả lời:


18

Con trăn, 68 ký tự

f=lambda x:(1-x%2*2)*(2*x*x+(x<0))
g=lambda x:(1-x%2*2)*(2*x*x+(x>0))

f ánh xạ các số âm thành số lẻ và số dương thành số chẵn và số chẵn thành số dương và số lẻ thành số âm, với cường độ đầu ra tăng nghiêm ngặt theo cường độ đầu vào.

g cũng làm như vậy, ngoại trừ nó ánh xạ các số âm thành số chẵn và số dương thành số lẻ.

f ∘ g ánh xạ âm → chẵn → dương và dương → lẻ → âm.
g ∘ f ánh xạ âm → lẻ → âm và dương → chẵn → dương.

Do đó f và g có các tính chất mong muốn.


2
fgcó thể là các hàm không tên, vì vậy bạn có thể bỏ bốn byte.
Martin Ender

Bạn có thể định nghĩa (1-x%2*2)là một biến để lưu một vài byte.
OldBunny2800

Đây là một mã hoàn chỉnh để chơi với import numpy as np; import matplotlib.pyplot as plt; xrange=np.arange(-3,4); f=lambda x:(1-x%2*2)*(2*x*x+(x<0)); g=lambda x:(1-x%2*2)*(2*x*x+(x>0)); plt.plot(xrange, map(f, xrange), 'ro'); plt.plot(xrange, map(g, xrange), 'go'); plt.plot(xrange, map(f, map(g, xrange)), 'b--'); plt.plot(xrange, map(g, map(f, xrange)), 'y--'); plt.show(); Bạn có thể thay thế ;bằng các nguồn cấp dữ liệu để dễ đọc.
Stéphane Gourichon

16

Python , 40 byte

f=lambda x:x*(-1)**x
g=lambda x:3*f(x)+1

Hãy thử trực tuyến! Một số kết quả đầu ra là số float có số nguyên bằng nhau vì (-1)**(-3)ví dụ cho số float.

Dựa trên ý tưởng từ Peter Taylor . Hàm này fphủ định số lẻ và để lại những số không đổi. Hàm gnày thực hiện tương tự, sau đó áp dụng bản đồ chuyển mạch chẵn lẻ đơn điệu x -> 3*x + 1.

Kể từ đó f(f(x)) = x, chúng tôi đã g(f(x)) = 3*f(f(x))+1 = 3*x+1tăng lên.

Đối với f(g(x)) = f(3*f(x)+1), ý tưởng là chính xác một trong những fdấu hiệu lật bên trong và bên ngoài , làm cho nó giảm.

  • Cho chẵn x, f(x) = xnhưng f(3*x+1) = -3*x-13*x+1là lẻ.
  • Đối với lẻ x, f(x) = -xf(-3*x+1) = -3*x+1bởi vì -3*x+1là chẵn.

Bây giờ chúng ta chỉ cần các đầu vào chẵn và lẻ xen kẽ theo cách giảm, giữ vì -3*x±1đang giảm bất kể các dấu hiệu được chọn như thế nào. Đây là lý do tại sao 3*cần thiết.

Một cổng Haskell là 25 byte:

f x=x*(-1)**x
g x=1+3*f x

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


Trong Haskell, (^)là lũy thừa số nguyên.
user1502040

1
@ user1502040 Nó không thể xử lý số mũ âm.
xnor

1
Vì bạn không gtự gọi mình, bạn có thể lưu hai byte bằng cách đặt tên không tên.
Martin Ender

14

CJam (17 byte)

Hàm f (được đặt tên Fvì CJam chỉ cho phép tên viết hoa):

{W1$2b,#*}:F

Hàm g (ẩn danh):

{F2*}

Bản demo trực tuyến

Điều này tiết kiệm một byte bằng cách dựa vào chi tiết triển khai của CJam, đây có thể là một lỗi: khi thực hiện chuyển đổi cơ sở, nó sử dụng giá trị tuyệt đối. 2b,do đó đưa ra số bit trong giá trị tuyệt đối của đối số của nó, vì vậy f phủ định chính xác những số có giá trị tuyệt đối có số bit lẻ. g áp dụng f và sau đó nhân đôi (thay đổi tính chẵn lẻ của số bit).

Vì vậy, áp dụng f và sau đó g lá không thay đổi và nhân đôi, ánh xạ xtới 2x. Áp dụng g và sau đó f thay đổi dấu hiệu chính xác một lần và nhân đôi, ánh xạ xsang -2x.


Thật tuyệt, đây chính xác là giải pháp tham khảo được cung cấp trong cuộc thi này. (Tôi cho rằng bạn đã nghĩ ra nó một cách độc lập?)
Martin Ender

@MartinEnder, tôi đã thấy vấn đề này ở đâu đó trước đây. Có thể về toán học.SE.
Peter Taylor

2

Bình, 34 byte

Đây chỉ là bản dịch trực tiếp câu trả lời Python của tôi.

*-1*2%Q2+*2*QQ<Q0
*-1*2%Q2+*2*QQ>Q0
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.