f (g (x)) ลดลงในขณะที่ g (f (x)) เพิ่มขึ้น


42

สำหรับความท้าทายนี้คุณต้องใช้ฟังก์ชั่นสองอย่างคือfและgบนจำนวนเต็มเช่นf ∘ gเป็นฟังก์ชันที่ลดลงอย่างเคร่งครัดในขณะที่g ∘ fเป็นฟังก์ชันที่เพิ่มขึ้นอย่างเข้มงวด ในคำอื่น ๆ ถ้าคุณใช้เวลาสองจำนวนเต็ม<bแล้วf (กรัม (ก))> f (กรัม (ข))และG (f (ก)) <กรัม (f (ข)) ไม่มีข้อ จำกัด เกี่ยวกับfและgแยกกันยกเว้นว่าแต่ละแผนที่ต้องมีจำนวนเต็มหนึ่งเป็นจำนวนเต็มอื่น

โปรดระบุคำอธิบายสั้น ๆ ของfและgและเหตุผลว่าทำไมพวกเขาถึงมีคุณสมบัติที่ต้องการ

เครดิต:ความท้าทายนี้ได้รับแรงบันดาลใจจากปัญหาในการแข่งขันคณิตศาสตร์ระดับปริญญาโทสาขาคณิตศาสตร์โรมาเนียปี 2011 (ซึ่งถามในสิ่งเดียวกัน แต่ตามจำนวนจริงแทนที่จะเป็นจำนวนเต็ม) หากคุณต้องการสปอยเลอร์จริงๆตอนนี้คุณรู้ว่าจะค้นหาอะไร

กฎระเบียบ

  • คำว่า "ฟังก์ชั่น" ในการท้าทายนี้ควรนำมาใช้ในเชิงคณิตศาสตร์ในการทำแผนที่จำนวนเต็มหนึ่งไปยังอีกจำนวนหนึ่ง: คุณอาจเขียนโปรแกรมสองโปรแกรมหรือสองฟังก์ชั่นและใช้วิธีการมาตรฐานใด ๆ ในการรับอินพุต คุณอาจใช้การแทนค่าสตริงของจำนวนเต็มแทนที่จะเป็นตัวแปรจำนวนเต็มจริง แต่ประเภทของอินพุตและเอาต์พุตควรเหมือนกันดังนั้นฟังก์ชันสามารถประกอบได้โดยไม่ต้องแปลงประเภทด้วยตนเองในระหว่างนั้น โปรดจำไว้ว่าในทางแนวคิดแล้วfและgยังคงต้องมีฟังก์ชั่นใน can't ดังนั้นคุณจึงไม่สามารถโกงได้โดยใช้การแทนค่าสตริงสองแบบที่มีหมายเลขเดียวกันหรืออะไรทำนองนั้น

  • โปรดจำไว้ว่าฟังก์ชั่นอาจไม่ได้ตั้งชื่อตราบเท่าที่ไม่จำเป็นต้องใช้ชื่อของตัวเองหรือฟังก์ชั่นอื่นที่คุณกำหนด หากคุณตั้งชื่อฟังก์ชั่นหนึ่งหรือทั้งสองอย่างคุณอาจสันนิษฐานว่ามันมีอยู่ในโปรแกรมเดียวกันเพื่อให้สามารถอ้างถึงฟังก์ชั่นอื่น ๆ (เช่นdef f(x): return -g(x)ใน Python)

  • ใช้กฎโอเวอร์โฟลว์จำนวนเต็มตามปกติ: วิธีแก้ปัญหาของคุณจะต้องสามารถทำงานกับจำนวนเต็มขนาดใหญ่ตามอำเภอใจในภาษาของคุณ (หรืออาจจะเป็นจริง) ในรูปแบบสมมุติซึ่งจำนวนเต็มทั้งหมดถูก จำกัด โดยค่าเริ่มต้น แต่หากโปรแกรมของคุณล้มเหลวในทางปฏิบัติ ไม่รองรับจำนวนเต็มที่มีขนาดใหญ่ซึ่งไม่ได้ทำให้โซลูชันไม่ถูกต้อง

  • คุณอาจใช้ภาษาการเขียนโปรแกรมใด ๆแต่โปรดทราบว่าช่องโหว่เหล่านี้เป็นสิ่งต้องห้ามตามค่าเริ่มต้น

  • นี่คือดังนั้นคะแนนของคุณคือผลรวมของจำนวนไบต์ของทั้งฟังก์ชันและคำตอบที่สั้นที่สุดที่ชนะ


ฟังก์ชันอาจส่งคืนสตริงหรือไม่
Matthew Roh

@SIGSEGV ฉันจะบอกว่าใช่ แต่ถ้าพวกเขายังใช้สตริงเป็นอินพุตดังนั้นพวกเขาสามารถประกอบได้โดยไม่ต้องแทรกการแปลงประเภทใด ๆ
Martin Ender

อืมฉันพยายามแปลงเป็นสตริงเพื่อทำให้ฟังก์ชันอื่นไม่สามารถแก้ไขผลลัพธ์เพิ่มเติมได้
Matthew Roh

1
@ แก้ไขถูกต้อง แต่ละคนจะต้องมีฟังก์ชั่นของประเภทℤ→ℤ
Martin Ender

1
@Bijan ทั้งบวกและลบ
Martin Ender

คำตอบ:


18

Python 68 ตัวอักษร

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 แมปตัวเลขเชิงลบกับตัวเลขคี่และตัวเลขบวกกับตัวเลขคู่และเลขคู่กับตัวเลขบวกและตัวเลขคี่กับจำนวนลบด้วยขนาดเอาต์พุตที่เพิ่มขึ้นอย่างเคร่งครัดกับขนาดอินพุต

g ทำเช่นเดียวกันยกเว้นจะแม็พตัวเลขเชิงลบกับตัวเลขคู่และตัวเลขบวกกับตัวเลขคี่

f ∘ g แผนที่ลบ→แม้→บวกและบวก→คี่→ลบ
แผนที่ g ∘ f เป็นลบ→แปลก→ลบและบวก→แม้→เป็นบวก

ดังนั้น f และ g มีคุณสมบัติที่ต้องการ


2
fและgสามารถเป็นฟังก์ชั่นที่ไม่มีชื่อดังนั้นคุณสามารถดรอปได้สี่ไบต์
Martin Ender

คุณสามารถกำหนด(1-x%2*2)เป็นตัวแปรเพื่อบันทึกไม่กี่ไบต์
OldBunny2800

นี่คือรหัสที่สมบูรณ์สำหรับเล่นกับ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(); คุณสามารถแทนที่;ด้วย linefeeds เพื่อให้สามารถอ่านได้
Stéphane Gourichon

16

Pythonขนาด 40 ไบต์

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

ลองออนไลน์! เอาท์พุทบางอย่างเป็นจำนวนเต็มเท่ากันเพราะ(-1)**(-3)ให้ผลลอยตัวเช่น

ตามออกความคิดจากปีเตอร์เทย์เลอร์ ฟังก์ชั่นfคัดค้านตัวเลขคี่และออกแม้กระทั่งคนที่ไม่เปลี่ยนแปลง ฟังก์ชั่นgทำเช่นเดียวกันจากนั้นใช้แผนที่สลับความเท่าเทียมกันแบบโมโนโทx -> 3*x + 1นิก

เนื่องจากf(f(x)) = xเราg(f(x)) = 3*f(f(x))+1 = 3*x+1เพิ่มมากขึ้น

สำหรับf(g(x)) = f(3*f(x)+1)ความคิดคือว่าหนึ่งในfสัญญาณพลิกด้านในและด้านนอกทำให้มันลดลง

  • แม้x, f(x) = xแต่f(3*x+1) = -3*x-1เพราะ3*x+1เป็นเลขคี่
  • สำหรับคี่x, f(x) = -xและf(-3*x+1) = -3*x+1เพราะ-3*x+1แม้แต่

ตอนนี้เราต้องการแค่อินเทอร์รัปต์คู่และคี่ในวิธีที่ลดลงซึ่งเก็บไว้เพราะ-3*x±1ลดลงโดยไม่คำนึงถึงวิธีการเลือกสัญญาณ นี่คือเหตุผลที่3*จำเป็น

พอร์ต Haskell คือ 25 ไบต์:

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

ลองออนไลน์!


ใน Haskell (^)คือการยกกำลังจำนวนเต็ม
user1502040

1
@ user1502040 ไม่สามารถจัดการเลขชี้กำลังเป็นลบได้
xnor

1
เนื่องจากคุณไม่ได้เรียกgตัวเองว่าคุณสามารถบันทึกสองไบต์โดยทำให้ไม่มีชื่อ
Martin Ender

14

CJam (17 ไบต์)

ฟังก์ชั่น f (ตั้งชื่อFเพราะ CJam อนุญาตเฉพาะชื่อตัวพิมพ์ใหญ่เท่านั้น):

{W1$2b,#*}:F

ฟังก์ชั่น g (ไม่ระบุชื่อ):

{F2*}

การสาธิตออนไลน์

สิ่งนี้จะช่วยประหยัดไบต์โดยอาศัยรายละเอียดการใช้งานของ CJam ซึ่งเป็นจุดบกพร่องของเนื้อหา: เมื่อทำการแปลงฐานจะใช้ค่าสัมบูรณ์ 2b,ดังนั้นให้จำนวนบิตในค่าสัมบูรณ์ของการโต้แย้งดังนั้น f จึงคัดค้านตัวเลขเหล่านั้นอย่างแม่นยำซึ่งค่าสัมบูรณ์มีจำนวนบิตแปลก ๆ g ใช้ f แล้วจึงเพิ่มเป็นสองเท่า (เปลี่ยนพาริตีของจำนวนบิต)

ดังนั้นการใช้ฉแล้วใบกรัมลงชื่อไม่เปลี่ยนแปลงและคู่ผสมทำแผนที่ไปx 2xการใช้กรัมแล้วฉเปลี่ยนแปลงสัญญาณว่าครั้งเดียวและคู่ทำแผนที่ไปx-2x


ดีนี่คือโซลูชันอ้างอิงที่มีให้ในการแข่งขันที่มาจากนี้ (ฉันคิดว่าคุณมากับมันด้วยตัวเองเหรอ?)
Martin Ender

@ มาร์ตินฉันเคยเห็นปัญหานี้มาก่อน อาจเป็นไปได้ในคณิตศาสตร์
ปีเตอร์เทย์เลอร์

2

Pyth, 34 ไบต์

นี่เป็นเพียงคำแปลโดยตรงของคำตอบของฉันหลาม

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