f (g (x)) घटता है जबकि g (f (x)) बढ़ता है


42

इस चुनौती के लिए, आपको पूर्णांकों पर दो कार्यों, f और g को लागू करने की आवश्यकता है , जैसे कि f is g एक सख्ती से घटने वाला कार्य है जबकि g is f एक सख्ती से बढ़ता कार्य है। दूसरे शब्दों में, यदि आप कोई दो पूर्णांक लेते हैं <b , तो f (g (a))> f (g (b)) और g (f (a)) <g (f (b)) । व्यक्तिगत रूप से f और g पर कोई प्रतिबंध नहीं है , सिवाय इसके कि वे प्रत्येक नक्शे को एक पूर्णांक से दूसरे पूर्णांक में होना चाहिए।

कृपया एफ और जी का एक संक्षिप्त विवरण और एक तर्क शामिल करें कि उनके पास आवश्यक संपत्ति क्यों है।

क्रेडिट: यह चुनौती 2011 के रोमानियाई मास्टर ऑफ मैथमैटिक्स प्रतियोगिता में एक समस्या से प्रेरित थी (जो एक ही बात पूछता है लेकिन पूर्णांक के बजाय वास्तविक संख्याओं पर)। यदि आप वास्तव में बिगाड़ना चाहते हैं, तो आप अब जानते हैं कि क्या खोजना है।

नियम

  • इस चुनौती में "फ़ंक्शन" शब्द को एक पूर्णांक को दूसरे में मैप करने के गणितीय अर्थ में लिया जाना चाहिए: आप या तो दो प्रोग्राम या दो फ़ंक्शन लिख सकते हैं और इनपुट प्राप्त करने और आउटपुट प्रदान करने के किसी भी मानक तरीके का उपयोग कर सकते हैं । आप वास्तविक पूर्णांक चर के बजाय पूर्णांक के स्ट्रिंग निरूपण का उपयोग कर सकते हैं, लेकिन इनपुट और आउटपुट के प्रकार समान होने चाहिए, ताकि कार्यों को मैन्युअल रूप से बीच में परिवर्तित किए बिना बनाया जा सके। याद रखें कि वैचारिक रूप से, f और g को अभी भी ℤ पर कार्य करने की आवश्यकता है, इसलिए आप एक ही नंबर के दो अलग-अलग स्ट्रिंग अभ्यावेदन या ऐसा कुछ भी करके धोखा नहीं दे सकते।

  • याद रखें कि फ़ंक्शंस अनाम हो सकते हैं , जब तक कि उनके नाम को स्वयं या किसी अन्य फ़ंक्शन द्वारा परिभाषित करने की आवश्यकता नहीं है। यदि आप एक या दोनों कार्यों को नाम देते हैं, तो आप मान सकते हैं कि वे एक ही कार्यक्रम में मौजूद हैं, ताकि वे एक दूसरे को उनके कार्यान्वयन में संदर्भित कर सकें (जैसे def f(x): return -g(x)कि पायथन में)।

  • सामान्य पूर्णांक ओवरफ़्लो नियम लागू होते हैं: आपका समाधान आपकी भाषा के एक काल्पनिक (या शायद वास्तविक) संस्करण में मनमाने ढंग से बड़े पूर्णांकों के लिए काम करने में सक्षम होना चाहिए जिसमें सभी पूर्णांक डिफ़ॉल्ट रूप से अनबाउंड होते हैं, लेकिन यदि आपका प्रोग्राम कार्यान्वयन के कारण अभ्यास में विफल रहता है पूर्णांक का समर्थन नहीं कर रहा है, जो समाधान को अमान्य नहीं करता है।

  • आप किसी भी प्रोग्रामिंग भाषा का उपयोग कर सकते हैं , लेकिन ध्यान दें कि इन खामियों को डिफ़ॉल्ट रूप से मना किया गया है।

  • यह , इसलिए आपका स्कोर दोनों कार्यों के बाइट्स की संख्या और सबसे कम वैध उत्तर जीत का योग है ।


क्या कार्य एक स्ट्रिंग लौटा सकते हैं?
मैथ्यू रो

@SIGSEGV मैं हाँ कहूंगा, लेकिन केवल अगर वे इनपुट के रूप में एक स्ट्रिंग भी लेते हैं, तो उन्हें किसी भी प्रकार के रूपांतरण को सम्मिलित किए बिना बनाया जा सकता है।
मार्टिन एंडर

Aww darnit, मैंने स्ट्रिंग को रूपांतरण की कोशिश की ताकि दूसरे फ़ंक्शन को परिणाम संपादित करने में असमर्थ बनाया जा सके।
मैथ्यू रोह

1
@ सही करे। प्रत्येक को ℤ → must प्रकार का एक कार्य होना चाहिए।
मार्टिन एंडर

1
@ बजन सकारात्मक और नकारात्मक दोनों।
मार्टिन एंडर

जवाबों:


18

अजगर, 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अनाम कार्य हो सकते हैं, इसलिए आप चार बाइट छोड़ सकते हैं।
मार्टिन एंडर

आप (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(); आप के साथ खेलने के लिए एक पूर्ण कोड है ;पठनीयता के लिए लाइनफ़ीड के साथ बदल सकते हैं ।
स्टीफन गौरिचोन

16

पायथन , 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*इसकी आवश्यकता है।

एक हास्केल बंदरगाह 25 बाइट्स है:

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

इसे ऑनलाइन आज़माएं!


हास्केल में, (^)पूर्णांक घातांक है।
user1502040

1
@ user1502040 यह नकारात्मक घातांक को नहीं संभाल सकता है।
xnor

1
चूँकि आप gखुद को नहीं बुला रहे हैं इसलिए आप इसे नामांकित करके दो बाइट्स बचा सकते हैं।
मार्टिन एंडर

14

CJam (17 बाइट्स)

फ़ंक्शन च (नाम Fक्योंकि CJam केवल ऊपरी-केस नामों की अनुमति देता है):

{W1$2b,#*}:F

फ़ंक्शन जी (अनाम):

{F2*}

ऑनलाइन डेमो

यह सीजेएम के कार्यान्वयन विवरण पर भरोसा करके एक बाइट बचाता है जो यकीनन एक बग है: आधार रूपांतरण करते समय यह निरपेक्ष मूल्य का उपयोग करता है। 2b,इसलिए अपने तर्क के निरपेक्ष मूल्य में बिट्स की संख्या देता है, इसलिए एफ उन संख्याओं को ठीक से नकारता है जिनके निरपेक्ष मूल्य में बिट्स की विषम संख्या होती है। जी एफ पर लागू होता है और फिर डबल्स (बिट्स की संख्या की समता को बदलते हुए) पर लागू होता है।

तो च लगाने और फिर जी पत्तियों अपरिवर्तित और डबल्स, मैपिंग xटू साइन 2x। जी को लागू करना और फिर च को एक बार ठीक से बदल देता है और दोगुना हो जाता है, मैपिंग xटू -2x


अच्छा, यह बिल्कुल प्रतियोगिता से प्रदान किया गया संदर्भ समाधान है। (मुझे लगता है कि आप स्वतंत्र रूप से इसके साथ आए थे?)
मार्टिन एंडर

@MartinEnder, मैंने इस समस्या को पहले कहीं देखा है। संभवतः गणित पर।
पीटर टेलर

2

पायथ, 34 बाइट्स

यह मेरे पाइथन के उत्तर का सीधा अनुवाद है।

*-1*2%Q2+*2*QQ<Q0
*-1*2%Q2+*2*QQ>Q0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.