ডিজাইনের ফাংশন এফ (এফ (এন)) == -এন


841

আমার শেষ সাক্ষাত্কারে একটি প্রশ্ন পেয়েছিলাম:

একটি ফাংশন ডিজাইন করুন f, যেমন:

f(f(n)) == -n

যেখানে nএকটি 32 বিট স্বাক্ষরিত পূর্ণসংখ্যা ; আপনি জটিল সংখ্যা গণিত ব্যবহার করতে পারবেন না।

আপনি যদি সংখ্যার পুরো ব্যাপ্তির জন্য এই জাতীয় ফাংশন ডিজাইন করতে না পারেন তবে এটি সবচেয়ে বড় পরিসরের জন্য ডিজাইন করুন।

কোন ধারনা?


2
এই সাক্ষাত্কারটি কোন কাজের জন্য ছিল?
tymtam

উত্তর:


377

কেমন:

f (n) = sign (n) - (-1) এন * n

পাইথনে:

def f(n): 
    if n == 0: return 0
    if n >= 0:
        if n % 2 == 1: 
            return n + 1
        else: 
            return -1 * (n - 1)
    else:
        if n % 2 == 1:
            return n - 1
        else:
            return -1 * (n + 1)

পাইথন স্বয়ংক্রিয়ভাবে পূর্ণ দৈর্ঘ্যের দীর্ঘকে পূর্ণসংখ্যার প্রচার করে। অন্যান্য ভাষায় বৃহত্তম ধনাত্মক পূর্ণসংখ্যার উপচে পড়বে, সুতরাং এটি ব্যতীত সমস্ত পূর্ণসংখ্যার জন্য কাজ করবে।


এটি বাস্তব সংখ্যার জন্য কাজ করতে আপনাকে n এর (-1) এন এর সাথে প্রতিস্থাপন করতে হবে { ceiling(n) if n>0; floor(n) if n<0 }

সি # তে (অতিরিক্ত প্রবাহ পরিস্থিতি ব্যতীত যে কোনও দ্বিগুণ হয়ে কাজ করে):

static double F(double n)
{
    if (n == 0) return 0;

    if (n < 0)
        return ((long)Math.Ceiling(n) % 2 == 0) ? (n + 1) : (-1 * (n - 1));
    else
        return ((long)Math.Floor(n) % 2 == 0) ? (n - 1) : (-1 * (n + 1));
}

10
-1 এর জন্য ভাঙা, কারণ -1 * 0 এখনও 0
জোয়েল কোহোর্ন

3
না এটা না। f (-1) = 0. f (0) = 1
1800 তথ্য

5
এটি 1 এর জন্য ভেঙে গেছে। f (1) = 0. f (0) = 1
1800 21

18
হুম, সমান এবং বিজোড় সংখ্যার সাথে রাষ্ট্রের সঞ্চয় করা, আমার এটি ভেবে নেওয়া উচিত ছিল।
অজানা

38
আমি মনে করি যে সর্বাধিক গুরুত্বপূর্ণ বিষয়টি আসল ফাংশন নয় (সেখানে রয়েছে অনেকগুলি সমাধান)
পাইওন

440

তারা কী ধরনের ভাষা প্রত্যাশা করেছিল তা আপনি বলেননি ... এখানে একটি স্থির সমাধান (হাস্কেল) রয়েছে। এটি মূলত 2 টি সবচেয়ে উল্লেখযোগ্য বিটের সাথে জগাখিচুড়ি করছে:

f :: Int -> Int
f x | (testBit x 30 /= testBit x 31) = negate $ complementBit x 30
    | otherwise = complementBit x 30

এটি গতিশীল ভাষায় (পাইথন) অনেক সহজ। আর্গুমেন্টটি এক নম্বর হয় কিনা তা পরীক্ষা করে দেখুন এবং একটি ল্যাম্বডা ফিরে আসুন-এক্স:

def f(x):
   if isinstance(x,int):
      return (lambda: -x)
   else:
      return x()

23
শীতল, আমি এটি পছন্দ করি ... জাভাস্ক্রিপ্টে একই পদ্ধতির: var f = ফাংশন (এন) (রিটার্ন (টাইপফন এন == 'ফাংশন')? n (): ফাংশন () {রিটার্ন-এন; }}
মার্ক রেনুফ

এটি সম্ভবত আমার হাস্কেল খুব মরিচা, তবে আপনি এটি পরীক্ষা করেছেন (চ 0)? দেখে মনে হচ্ছে এটির ফলস্বরূপ (এফ 0x80000000) হিসাবে একই ফল পাওয়া উচিত, যদি আমরা কমপক্ষে 32-বিট ইন্টের সাথে র‍্যাপারাউন্ড পাটিগণিত (নেগেটিভ অপারেশন) এর সাথে কাজ করে থাকি। এবং যে খারাপ হবে।
দারিয়াস বেকন

11
গড় সাক্ষাত্কার এমনকি জানতে চান কি একটি ল্যামডা কনস্ট্রাক্ট হয় ?
জেরেমি পাওয়েল

4
অবশ্যই, এই ধরনের একটি টাইপ-প্রতারণার কৌতুক এছাড়াও মধ্যে Haskell কাজ করে, যদিও এটি স্ট্যাটিক আছে: class C a b | a->b where { f :: a->b }; instance C Int (()->Int) where { f=const.negate }; instance C (()->Int) Int where { f=($()) }
বাম দিকের বাইরে

4
কি? আপনি এফ (এন) === 'ফাংশন' টাইপ করেছেন এমন ধারণাটি কোথায় পেয়েছেন, বিশেষত, যেখানে এন একটি সংখ্যা এবং আপনি কোনও নম্বর ফিরে প্রত্যাশা করেছেন? আমি বুঝতে পারি না কীভাবে এখানে উদাহরণস্বরূপ মামলা প্রয়োগ করা যেতে পারে। আমি পাইথনটি ভাল বলতে পারি না, তবে জেএসে কোনও ফাংশনের ধরণের জন্য আর্গুমেন্ট যাচাই করা এই ক্ষেত্রে স্পষ্টত ভুল। কেবলমাত্র সংখ্যার সমাধান এখানে প্রয়োগ করা হয়। f একটি ফাংশন, f (n) হল সংখ্যা।
হ্যারি

284

এই জাতীয় ফাংশন কেন বিদ্যমান না তার একটি প্রমাণ, সমস্ত সংখ্যার জন্য, যদি এটি অতিরিক্ত তথ্য ব্যবহার না করে (ইনটেলের 32 বিট ব্যতীত):

আমাদের অবশ্যই f (0) = 0. (প্রমাণ: ধরুন f (0) = x। তারপরে f (x) = f (f (0)) = -0 = 0. এখন, -x = f (f (x) )) = চ (0) = এক্স, যার অর্থ x = 0.)

ধরুন, যেকোন xএবং এর জন্য y, মনে করুন f(x) = y। আমরা f(y) = -xতখন চাই । এবং f(f(y)) = -y => f(-x) = -y। সংক্ষিপ্তসার হিসাবে: যদি f(x) = y, তবে f(-x) = -y, এবং f(y) = -x, এবংf(-y) = x

সুতরাং, আমাদের 0 টি ব্যতীত সমস্ত পূর্ণসংখ্যা 4 টির মধ্যে ভাগ করতে হবে, তবে আমাদের কাছে এই জাতীয় পূর্ণসংখ্যার একটি বিজোড় সংখ্যা রয়েছে; কেবল এটিই নয়, আমরা যদি ইতিবাচক সমকক্ষ নেই এমন পূর্ণসংখ্যাটি সরিয়ে ফেলি তবে আমাদের কাছে এখনও 2 (মোড 4) সংখ্যা রয়েছে।

যদি আমরা 2 টি সর্বাধিক সংখ্যা বামে ফেলে রাখি (অ্যাবস মান দ্বারা), আমরা ফাংশনটি পেতে পারি:

int sign(int n)
{
    if(n>0)
        return 1;
    else 
        return -1;
}

int f(int n)
{
    if(n==0) return 0;
    switch(abs(n)%2)
    {
        case 1:
             return sign(n)*(abs(n)+1);
        case 0:
             return -sign(n)*(abs(n)-1);
    }
}   

অবশ্যই অন্য একটি বিকল্প, 0 টি মেনে চলার নয়, এবং বোনাস হিসাবে আমরা মুছে ফেলা 2 নম্বরগুলি পেয়েছি। (তবে এটি কেবল নির্বোধ যদি।)


29
আমি বিশ্বাস করতে পারি না যে এমন একটি কার্যকর পদ্ধতিগত সমাধান খুঁজে পেতে আমাকে এ পর্যন্ত পড়তে হয়েছিল যেটি বিশ্বব্যাপী ভেরিয়েবল বা কোডটিকে অবলম্বন করে এমন কৌশলগুলিকে অবলম্বন না করে নেতিবাচক সংখ্যাগুলি পরিচালনা করে। আমি যদি আপনাকে একাধিকবার ভোট দিতে পারি তবে আমি চাই।
কাইল সিমেক

চমৎকার পর্যবেক্ষণ, যে কোনও এন স্বাক্ষরিত বিটগুলিতে একটি অদ্ভুত সংখ্যক ননজারো পূর্ণসংখ্যা রয়েছে ।
অ্যান্ড্রেস জান টেক

এটি আমার উত্তরও হবে তবে প্রান্তের মামলাটি থেকে সাবধান থাকুন n = -2147483648(সর্বনিম্ন মান); আপনি abs(n)এই ক্ষেত্রে পারেন না , এবং ফলাফল অপরিজ্ঞাত করা হবে (বা একটি ব্যতিক্রম)।
কર્ક ব্রডহર્স্ট

1
@ a1kmm: দুঃখিত, -2³² উপরে থাকতে হবে -2³¹। যাইহোক, যে ক্ষেত্রে f (0) ≠ 0 (এবং তাই চ (0) = - 2³¹) প্রকৃতপক্ষে সহজতর কেস, যেমন আমরা দেখিয়েছি যে এই দুটিটি বাকী থেকে সংযোগ বিচ্ছিন্ন হয়েছে। আমাদের অন্য যে বিষয়টি বিবেচনা করতে হবে তা হ'ল f (0) = 0, তবে f (x) = - 2³¹ কিছু x ≠ 0, x ≠ -2³¹ এর জন্য ³¹ সেক্ষেত্রে, f (-2³¹) = f (f (x)) = - x (নোট -x -2 be হতে পারে না, কারণ এরকম কোনও এক্স বিদ্যমান নেই)। আরও যাক f (-x) = y। তারপরে f (y) = f (f (-x)) = x। আবার y -2³¹ (f (y) = x হিসাবে হতে পারে না, তবে f (-2³¹) = - x, এবং x 0 নয়)। সুতরাং, -2³¹ = f (x) = f (f (y)) = - y, যা অসম্ভব। সুতরাং প্রকৃতপক্ষে 0 এবং -2³¹ অবশ্যই বাকী থেকে সংযোগ বিচ্ছিন্ন করা উচিত (অন্য কোনও কিছুর চিত্র নয়)।
শ্রীভাত্সআর

1
@ তবে কোনও স্বাক্ষরিত শূন্য নেই, যদি (আমি ধরে নিই) আমরা দু'জনের পরিপূরক 32-বিট পূর্ণসংখ্যার কথা বলছি।
গফারি

146

সি ++ এ ওভারলোডিংয়ের জন্য ধন্যবাদ:

double f(int var)
{
 return double(var);
} 

int f(double var)
{
 return -int(var);
}

int main(){
int n(42);
std::cout<<f(f(n));
}

4
দুর্ভাগ্যক্রমে, নাম ম্যাংলিংয়ের কারণে, আপনি "চ" নামক ফাংশনগুলিতে প্রকৃত নাম রয়েছে।
পাইওন

1
আমি এরকম কিছু ভেবেছি, তবে সি তে চিন্তা করে, এই ফেলে দেওয়া হয়েছিল ... ভাল কাজ!
লিরান ওরেভী

@ রুই ক্র্যাভারিও: এটি .NET 3.5+ এ কাজ করবে না কারণ লেখক একটি ভেরিয়েবল নাম হিসাবে ভেরওয়ার্ডটি ব্যবহার করতে পছন্দ করেছেন।
ক্রেডনস

72
প্রযুক্তিগতভাবে ... প্রশ্নটি এটাই দাবি করে না। আপনি 2 এফ () ফাংশন, চ (ইনট) এবং চ (ফ্লোট) সংজ্ঞায়িত করেছেন এবং প্রশ্নগুলি "একটি ফাংশন ডিজাইন করুন চ () ..."
এলকুকো

2
@ এলকুকো অবশ্যই প্রযুক্তিগতভাবে, তবে যৌক্তিকভাবে এটি একাধিক ওভারলোডের সাথে একটি ফাংশন (আপনি এটি দিয়ে চ (চ (চ (42)) করতে পারেন)। যেহেতু সংজ্ঞাটি প্যারামিটার এবং রিটার্ন মান সম্পর্কে কিছু না বলে, আমি এটিকে প্রযুক্তিগত সংজ্ঞা হিসাবে খুব কমই গ্রহণ করতে পারি।
মারেক তোমান

135

অথবা, আপনি প্রিপ্রোসেসরটিকে অপব্যবহার করতে পারেন:

#define f(n) (f##n)
#define ff(n) -n

int main()
{
  int n = -42;
  cout << "f(f(" << n << ")) = " << f(f(n)) << endl;
}

তাহলে আপনি কি কনরাড "লে চিফ্রে" রুডলফ হবেন? আমার জামাটা নিয়ে আসব। হ্যাঁ, আমি পুরো "অকার্যকর মূল" জিনিসটি সম্পর্কে জানি তবে একটি "রিটার্ন 0" কেবলমাত্র অনেক অতিরিক্ত প্রচেষ্টা ;-)
স্কিজেড

25
@ স্কিজ্জ, মূল থেকে 0 ফেরত সি ++ তে এমনকি প্রারম্ভিক ফেরতের মানেরও প্রয়োজন নেই ... সুতরাং এটি সঠিকভাবে করে আপনি আসলে একটি কম অক্ষর টাইপ করেন!
ড্যান ওলসন

10
স্কিজ সর্বদা প্রিপ্রোসেসরকে গালাগালি করে: ডি
আরনিস ল্যাপসা

23
এটি কোনও ফাংশন নয় .. সুতরাং এটি কোনও বৈধ সমাধান নয়
স্মার্লিন

3
@ সমারলিন: এটি প্রযুক্তিগতভাবে একটি ইনলাইন ফাংশন যা কোনও ইনলাইন ফাংশন ফিরিয়ে দেয়: উভয়ের মৃতদেহ সংকলনের সময় বা তার ঠিক আগে প্রসারিত হয়। এর চেয়ে বেশি দক্ষ হতে পারে না।
জন পুর্ডি

103

এটি সমস্ত নেতিবাচক সংখ্যার জন্য সত্য।

    f (n) = অ্যাবস (এন)

দ্বিগুণ পরিপূরক পূর্ণসংখ্যার জন্য ধনাত্মক সংখ্যাগুলির চেয়ে আরও একটি নেতিবাচক সংখ্যা রয়েছে f(n) = abs(n)বলে f(n) = n > 0 ? -n : nসমাধানের চেয়ে আরও একটি ক্ষেত্রে বৈধ validf(n) = -abs(n) । তোমাকে এক করে পেয়েছি ...: ডি

হালনাগাদ

না, এটি আর একটি মামলার জন্য বৈধ নয় কারণ আমি কেবল লিটবদের মন্তব্যে স্বীকৃত ... abs(Int.Min) কেবল উপচে পড়বে ...

আমি মোড 2 তথ্য ব্যবহার করার বিষয়েও ভেবেছিলাম, তবে উপসংহারে বলা হয়েছে, এটি ... প্রাথমিক পর্যায়ে কার্যকর হয় না। যদি সঠিকভাবে করা হয় তবে এটি ব্যতীত সমস্ত সংখ্যার জন্য কাজ করবেInt.Min এটি প্রবাহিত হবে।

হালনাগাদ

আমি এটির সাথে কিছুক্ষণ খেললাম, একটি দুর্দান্ত বিট ম্যানিপুলেশন ট্রিকের সন্ধান করছি, তবে আমি একটি দুর্দান্ত ওয়ান-লাইনার খুঁজে পেলাম না, যদিও মোড 2 সলিউশনটি একটিতে ফিট করে।

    f (n) = 2n (অ্যাবস (এন)% 2) - এন + এসএনজি (এন)

সি # তে এটি নিম্নলিখিত হয়ে যায়:

public static Int32 f(Int32 n)
{
    return 2 * n * (Math.Abs(n) % 2) - n + Math.Sign(n);
}

এটি সমস্ত মানের জন্য কাজ করার জন্য, আপনার সাথে একটি প্রতিস্থাপন Math.Abs()করতে হবে (n > 0) ? +n : -nএবং একটি uncheckedব্লকে গণনা অন্তর্ভুক্ত করতে হবে । তারপর আপনি এমনকি পেতেInt.Min যাচাই করা অবহেলা যেমন করেন তেমন নিজেই ম্যাপ হয়ে যান।

হালনাগাদ

অন্য একটি উত্তরের দ্বারা অনুপ্রাণিত হয়ে আমি ব্যাখ্যা করতে যাচ্ছি যে ফাংশনটি কীভাবে কাজ করে এবং কীভাবে এই জাতীয় ফাংশন তৈরি করতে হয়।

একেবারে শুরুতে শুরু করুন। ক্রিয়াকলাপটি fবারবার একটি নির্দিষ্ট মানকে nমানগুলির ক্রম প্রদান করে প্রয়োগ করা হয় ।

    n => f (n) => f (f (n)) => f (f (f (n))) => f (f (f (f (n))) => ...

প্রশ্নটি দাবি করে f(f(n)) = -n, fতর্কটি উপেক্ষা করার জন্য এটি দুটি ক্রমাগত প্রয়োগ । fমোট চারটি - এর আরও দুটি অ্যাপ্লিকেশন আবার যুক্ত হওয়ার কারণে যুক্তিটিকে অস্বীকার করে n

    n => f (n) => -n => f (f (f (n))) => n => f (n) => ...

এখন দৈর্ঘ্যের একটি সুস্পষ্ট চক্র রয়েছে। প্রতিস্থাপন x = f(n)এবং লক্ষ করা যে প্রাপ্ত সমীকরণটি f(f(f(n))) = f(f(x)) = -xধারণ করে, নিম্নলিখিতটি দেয়।

    n => x => -n => -x => n => ...

সুতরাং আমরা দুটি সংখ্যার সাথে দৈর্ঘ্যের চক্র পেয়েছি এবং দুটি সংখ্যা অবহেলিত। আপনি যদি চক্রটিকে একটি আয়তক্ষেত্র হিসাবে কল্পনা করেন তবে প্রত্যাখ্যাত মানগুলি বিপরীত কোণে অবস্থিত।

এই জাতীয় একটি চক্র তৈরির অনেকগুলি সমাধানের মধ্যে একটি এন থেকে নিম্নলিখিতটি শুরু হয়।

 n => একটি ত্যাগ করুন এবং বিয়োগ করুন
-n - 1 = - (n + 1) => একটি যোগ করুন
-n => উপেক্ষা করুন এবং একটি যুক্ত করুন
 n + 1 => একটিকে বিয়োগ করুন
 এন

একটি দৃ concrete় উদাহরণ যেমন একটি চক্র হয় +1 => -2 => -1 => +2 => +1। আমরা প্রায় সম্পন্ন। নির্ধারিত চক্রটিতে একটি বিজোড় ধনাত্মক সংখ্যা রয়েছে, এর উত্তরাধিকারী এবং উভয় সংখ্যা উপেক্ষা করে আমরা সহজেই অনেকগুলি এই জাতীয় চক্রে ( 2^32চারটির একাধিক) ভাগ করতে পারি এবং শর্তগুলি সন্তুষ্ট করে এমন একটি ফাংশন পেয়েছি।

তবে আমাদের শূন্য নিয়ে সমস্যা আছে। চক্রটি অবশ্যই থাকতে হবে 0 => x => 0কারণ শূন্যটি নিজের কাছে অবহেলিত। এবং কারণ চক্রটি ইতিমধ্যে 0 => xএটি অনুসরণ করে বলে 0 => x => 0 => x। এটি কেবল দৈর্ঘ্যের দুটি চক্র এবং xদুটি অ্যাপ্লিকেশন পরে নিজেই রূপান্তরিত হয়, না -x। ভাগ্যক্রমে একটি মামলা রয়েছে যা সমস্যার সমাধান করে। যদি Xশূন্যের সমান হয় তবে আমরা দৈর্ঘ্যের একটি চক্রটি পাই যা কেবলমাত্র শূন্য থাকে এবং আমরা সেই সমস্যাটি সমাধান করেছি যে শূন্যটি একটি নির্দিষ্ট পয়েন্ট f

সম্পন্ন? প্রায়। আমাদের 2^32সংখ্যা আছে , শূন্য একটি নির্দিষ্ট পয়েন্ট বাম 2^32 - 1সংখ্যা, এবং আমাদের অবশ্যই সেই সংখ্যাটি চার সংখ্যার চক্রে বিভক্ত করতে হবে। খারাপ এটি 2^32 - 1চারটির একক নয় - চারটি দৈর্ঘ্যের কোনও চক্রে তিনটি সংখ্যা থাকবে না।

আমি সমাধান 3 বিট সাইন্ড ছোটো থেকে itegers এর ছোট সেট ব্যবহার অবশিষ্ট অংশ ব্যাখ্যা করবে -4করার +3। আমরা শূন্য সঙ্গে সম্পন্ন করা হয়। আমাদের একটি সম্পূর্ণ চক্র রয়েছে +1 => -2 => -1 => +2 => +1। এখন আসুন শুরু করে চক্রটি তৈরি করুন +3

    +3 => -4 => -3 => +4 => +3

যে সমস্যাটি দেখা দেয় তা +4হ'ল 3 বিট পূর্ণসংখ্যা হিসাবে প্রতিনিধিত্বযোগ্য নয়। আমরা প্রাপ্ত হবে +4negating দ্বারা -3করা +3- কি এখনও একটি বৈধ 3 বিট পূর্ণসংখ্যা - কিন্তু তারপর এক যোগ +3(বাইনারি 011) উৎপাদ 100বাইনারি। স্বাক্ষরবিহীন পূর্ণসংখ্যা হিসাবে এটি ব্যাখ্যা করা হয় +4তবে আমাদের এটি স্বাক্ষরিত পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করতে হবে -4। সুতরাং প্রকৃতপক্ষে -4এই উদাহরণের জন্য বা Int.MinValueসাধারণ ক্ষেত্রে পূর্ণসংখ্যার গাণিতিক অবহেলার দ্বিতীয় স্থির বিন্দু - 0 এবং সেগুলিতে Int.MinValueম্যাপ করা হয়। সুতরাং চক্রটি আসলে নিম্নরূপ।

    +3 => -4 => -3 => -4 => -3

এটি দুটি দৈর্ঘ্যের একটি চক্র এবং এটির +3মাধ্যমে চক্রটি প্রবেশ করে -4। ফলস্বরূপ -4দুটি ফাংশন অ্যাপ্লিকেশন পরে +3সঠিকভাবে নিজের কাছে ম্যাপ করা -3হয়, দুটি ফাংশন অ্যাপ্লিকেশন পরে সঠিকভাবে ম্যাপ করা হয় , তবে -3দুটি ফাংশন অ্যাপ্লিকেশন পরে ভুল করে নিজেই ম্যাপ করা হয়।

সুতরাং আমরা একটি ফাংশন নির্মাণ করেছি যা সমস্ত সংখ্যার জন্য কাজ করে তবে একটি one আমরা কি আরও ভাল করতে পারি? না আমরা পারবো না. কেন? আমাদের চারটি দৈর্ঘ্যের চক্র তৈরি করতে হবে এবং চারটি মান পর্যন্ত পুরো পূর্ণসংখ্যা পরিসীমাটি কভার করতে সক্ষম। বাকি মানগুলি দুটি নির্দিষ্ট পয়েন্ট 0এবং Int.MinValueসেগুলি নিজের এবং দুটি স্বেচ্ছাচারিত পূর্ণসংখ্যার সাথে ম্যাপ করতে হবে xএবং -xএটি অবশ্যই দুটি ফাংশন অ্যাপ্লিকেশন দ্বারা একে অপরের সাথে ম্যাপ করা উচিত।

এর বিপরীতে মানচিত্র xকরতে -xতাদের অবশ্যই একটি চারটি চক্র গঠন করতে হবে এবং এগুলি অবশ্যই চক্রের বিপরীত কোণে অবস্থিত। ফলস্বরূপ 0এবং Int.MinValueবিপরীত কোণেও থাকতে হবে। এটি সঠিকভাবে মানচিত্র করবে xএবং -xতবে দুটি স্থির পয়েন্ট 0এবং Int.MinValueদুটি ফাংশন অ্যাপ্লিকেশন পরে অদলবদল করবে এবং আমাদের দুটি ব্যর্থ ইনপুট রেখে দেবে। সুতরাং এটি একটি ফাংশন নির্মাণ করা সম্ভব নয় যা সমস্ত মানের জন্য কাজ করে, তবে আমাদের কাছে এমন একটি রয়েছে যা একটি বাদে সমস্ত মানের জন্য কাজ করে এবং এটিই আমরা অর্জন করতে পারি এটি সেরা।


মানদণ্ডগুলি পূরণ করে না: অ্যাবস (অ্যাবস (এন))! =-এন
ড্যান ওলসন

নিশ্চিতভাবেই, সমস্ত নেতিবাচক সংখ্যার জন্য, যেমনটি তিনি বলেছেন। এটি প্রশ্নের অংশ ছিল: আপনি যদি কোনও সাধারণের সাথে আসতে না পারেন, তবে এমন একটি ব্যক্তির সাথে এগিয়ে আসুন যা সম্ভাব্য বিস্তৃত পরিসরের জন্য কাজ করে।
জলফ

এই উত্তরটি অন্তত মারজ স্নোইয়াইক এবং রোল্যান্ড শ-এর উত্তরের মতো উত্তম, এটি কেবলমাত্র বিভিন্ন ধরণের সংখ্যার জন্য কাজ করে
1800 তথ্য

19
ডুড, আপনি কেবল "আপডেট" এর হাত থেকে মুক্তি পেতে পারেন এবং কেবল একটি সমন্বিত সঠিক উত্তর লিখতে পারেন। নীচে 3/4 ("অন্য উত্তর দ্বারা অনুপ্রাণিত") দুর্দান্ত।
অ্যান্ড্রেস জান টেক

1
আমি সত্যিই নেতিবাচক সংখ্যার জন্য অ্যাবস-সমাধান পছন্দ করি। সহজ এবং সহজে বোঝা যায়।
থরবজর্ন রাভন অ্যান্ডারসন

97

জটিল সংখ্যা ব্যবহার করে আপনি কোনও সংখ্যাকে অবহেলা করার কার্যটিকে দুটি পদক্ষেপে কার্যকরভাবে বিভক্ত করতে পারেন:

  • n কে i দিয়ে গুণিত করুন, এবং আপনি এন * i পেয়ে যা যা 90 ° ঘড়ির কাঁটার দিকে ঘোরানো হয়
  • আমি দ্বারা আবার গুন, এবং আপনি পেতে

দুর্দান্ত জিনিসটি হ'ল আপনার কোনও বিশেষ হ্যান্ডলিং কোডের দরকার নেই। আমি কেবল গুণ করে কাজ করি।

তবে আপনাকে জটিল সংখ্যা ব্যবহার করার অনুমতি নেই। সুতরাং আপনাকে কোনওভাবে নিজের ডেটা রেঞ্জের অংশটি ব্যবহার করে আপনার নিজস্ব কল্পিত অক্ষ তৈরি করতে হবে। যেহেতু আপনার প্রাথমিক মানগুলির তুলনায় হুবহু কাল্পনিক (মধ্যবর্তী) মান প্রয়োজন তাই আপনার কেবলমাত্র অর্ধেক ডেটা রেঞ্জের সাথে বাকি।

আমি স্বাক্ষরিত 8-বিট ডেটা ধরে ধরে নিম্নলিখিত চিত্রটিতে এটি দেখার চেষ্টা করেছি। আপনাকে 32-বিট পূর্ণসংখ্যার জন্য এটি স্কেল করতে হবে। প্রাথমিক n এর জন্য অনুমোদিত রেঞ্জটি -64৪ থেকে +63 to পর্যন্ত। ইতিবাচক এন এর জন্য ফাংশনটি কী করে তা এখানে:

  • যদি এন 0..63 (প্রাথমিক পরিসীমা) এ থাকে তবে ফাংশন কল 64 টি যোগ করে, 64 মেনেজ করে 64..127 (মধ্যবর্তী পরিসর)
  • N যদি 64..127 (অন্তর্বর্তী পরিসীমা) এ থাকে তবে ফাংশনটি 0 থেকে- 0 এর পরিসরে n ম্যাপিং করে 64 থেকে n বিয়োগ করে

নেতিবাচক এন এর জন্য, ফাংশনটি মধ্যবর্তী পরিসর -65 ..- 128 ব্যবহার করে।

বিকল্প পাঠ


4
@geschema, আপনি সেই দুর্দান্ত গ্রাফিক্স তৈরি করতে কোন সরঞ্জামটি ব্যবহার করেছেন?
jwfearn

10
দুঃখিত, প্রশ্নটি স্পষ্টভাবে জটিল সংখ্যা নেই।
রুই ক্রেভেরিও

6
@ লিরান: আমি ওমনিগ্রাফেল (কেবলমাত্র ম্যাক) ব্যবহার করেছি
ইজেচেমা

39
+1 আমি মনে করি এটি সেরা উত্তর। আমার মনে হয় না লোকেরা যথেষ্ট পরিমাণে পড়েন, কারণ তারা সকলেই নোট করেছেন যে প্রশ্নটি বলেছিল জটিল সংখ্যা ব্যবহার করা যাবে না। আমি পুরো জিনিসটি পড়েছি এবং আপনি জিজ্ঞাসা করা অ-জটিল সমাধানের মঞ্চ নির্ধারণ করার জন্য জটিল সংখ্যায় সমাধানটি বর্ণনা করেছেন। খুব সুন্দরভাবে সম্পন্ন হয়েছে।
জ্রিস্টা

1
@ জ্রিস্টা সমস্ত সমাধানগুলিতে একটি দ্বিতীয় মাত্রা ব্যবহার করে, যা আসলেই 'জটিল সংখ্যা' সত্যই (বেশিরভাগ বিজোড় বনাম এমনকি, এবং উপরের ব্যবহারগুলি floatবনাম int) ব্যবহার করে । '4 এলিমেন্টের রিং' যা বহু উত্তর বর্ণনা করে 4 টি রাজ্যের প্রয়োজন, যা 2 টি রাষ্ট্রের সাথে প্রতিটি 2 টি মাত্রা হিসাবে উপস্থাপিত হতে পারে। সমস্যা এই উত্তরটি সঙ্গে এটি অতিরিক্ত প্রক্রিয়াকরণ স্থান প্রয়োজন (-64..63 কেবল 'কাজ', এখনো চাহিদা -128..127 স্থান) এবং স্পষ্টভাবে সূত্র লিখিত রাষ্ট্র নেই
ক্রিক ব্রডহર્স্ট

65

Int.MaxValue এবং int.MinValue ব্যতীত কাজ করে

    public static int f(int x)
    {

        if (x == 0) return 0;

        if ((x % 2) != 0)
            return x * -1 + (-1 *x) / (Math.Abs(x));
        else
            return x - x / (Math.Abs(x));
    }

সচিত্র


কেন এটি নিম্নমানের ছিল তা নিশ্চিত নয়। কি ইনপুট জন্য এটি ব্যর্থ হয়?
রড্রিক চ্যাপম্যান

আপনি কেন সাইনাম ফাংশন ব্যবহার করবেন না?!?
কমোনাড

1
চিত্রটি সত্যিই ভাল। পাঠান 0করার 0এবং -2147483648করতে -2147483648, অস্বীকৃতি অপারেটর জন্য যেহেতু এই দুটি সংখ্যার ঠিক করা হয়েছে পয়েন্ট x => -x। বাকি সংখ্যাগুলির জন্য, উপরের চিত্রের তীরগুলি অনুসরণ করুন। সুরডিনের উত্তর এবং এর মন্তব্যগুলি থেকে স্পষ্ট যে, দুটি সংখ্যা থাকবে, এক্ষেত্রে 2147483647এবং -2147483647অন্য কোনও জুটির সাথে স্বাপের জন্য বাকী থাকবে না।
জেপ্পে স্টিগ নীলসন

দেখতে অনেকটা হাসিখুশি - অনেকগুলি রিঙ্কেল সহ
আনশুল

48

ফাংশনের ইনপুট টাইপ এবং রিটার্নের মান কী তা নিয়ে প্রশ্নটি কিছু বলছে না f না (কমপক্ষে আপনি এটি উপস্থাপন করার উপায় নয়) সে ...

... ঠিক তখন যখন এন 32-বিট পূর্ণসংখ্যা হয় f(f(n)) = -n

সুতরাং, কিভাবে কিছু সম্পর্কে

Int64 f(Int64 n)
{
    return(n > Int32.MaxValue ? 
        -(n - 4L * Int32.MaxValue):
        n + 4L * Int32.MaxValue);
}

N যদি 32-বিট পূর্ণসংখ্যা হয় তবে বিবৃতিটি f(f(n)) == -n সত্য হবে।

স্পষ্টতই, এই পদ্ধতির আরও বিস্তৃত সংখ্যার জন্য কাজ করার জন্য বাড়ানো যেতে পারে ...


2
নিনজা। চরিত্রের সীমা।
জো ফিলিপস

2
হ্যাঁ, আমি একই ধরণের পদ্ধতির উপর কাজ করছিলাম। আপনি যদিও আমাকে এটি মারধর। +1 :)
জলফ

1
খুব চালাক! জটিল সংখ্যা ব্যবহার করে এটি (এবং কার্যকরভাবে একইরকম) খুব কাছাকাছি, যা সুস্পষ্ট ও আদর্শ সমাধান হতে পারে তবে এটি স্পষ্টতই অস্বীকৃত। অনুমোদনযোগ্য সংখ্যার ব্যাপ্তির বাইরে কাজ করা।
কर्क ব্রডহর্স্ট

48

জাভাস্ক্রিপ্টের জন্য (বা অন্যান্য গতিযুক্ত টাইপ করা ভাষাগুলি) আপনি এই ফাংশনটি কোনও int বা অবজেক্ট গ্রহণ করতে পারেন এবং অন্যটি ফিরিয়ে দিতে পারেন। অর্থাত

function f(n) {
    if (n.passed) {
        return -n.val;
    } else {
        return {val:n, passed:1};
    }
}

দান

js> f(f(10))  
-10
js> f(f(-10))
10

বিকল্পভাবে আপনি জোরালোভাবে টাইপ করা ভাষায় ওভারলোডিং ব্যবহার করতে পারেন যদিও এটি বিধিগুলি ভঙ্গ করতে পারে

int f(long n) {
    return n;
}

long f(int n) {
    return -n;
}

পরেরটির অর্থ "এ" (একবচন) ফাংশনের প্রয়োজনীয়তা নেই। :)
ড্র করেছেন

উত্তরের দ্বিতীয়ার্ধটি সরান এবং এটি একটি সঠিক উত্তর।
jmucchiello

@ ড্র যে কারণে আমি উল্লেখ করেছি যে এটি নিয়মগুলি ভঙ্গ করতে পারে
কোব্বল

2
জাভাস্ক্রিপ্টে, একটি ফাংশন একটি অবজেক্ট এবং তাই একটি রাষ্ট্র রাখতে পারে।
নসরেডনা

1
আইএমও: ফাংশন এফ (এন) {রিটার্ন এন.পাস? -n.val: {val: n, উত্তীর্ণ: 1}} আরও পাঠযোগ্য এবং খাটো।
সামগুডি

46

আপনার প্ল্যাটফর্মের উপর নির্ভর করে কিছু ভাষা আপনাকে ফাংশনে রাষ্ট্র রাখতে দেয় state ভিবি.নেট, উদাহরণস্বরূপ:

Function f(ByVal n As Integer) As Integer
    Static flag As Integer = -1
    flag *= -1

    Return n * flag
End Function

আইআইআরসি, সি ++ এটিও অনুমতি দিয়েছে। আমি সন্দেহ করি যে তারা যদিও অন্য কোনও সমাধান খুঁজছেন।

আরেকটি ধারণা হ'ল যেহেতু তারা ফাংশনটিতে প্রথম কলের ফলাফলটি সংজ্ঞায়িত করেনি আপনি সাইন ইনভার্ট করতে হবে কিনা তা নিয়ন্ত্রণ করতে বিজোড় / সান্নিধ্য ব্যবহার করতে পারেন:

int f(int n)
{
   int sign = n>=0?1:-1;
   if (abs(n)%2 == 0)
      return ((abs(n)+1)*sign * -1;
   else
      return (abs(n)-1)*sign;
}

সমস্ত সমান সংখ্যার প্রস্থে একটি যুক্ত করুন, সমস্ত বিজোড় সংখ্যার পরিধি থেকে একটিকে বিয়োগ করুন। দুটি কলের ফলাফলের একই পরিমাণ রয়েছে, তবে একটি কল যেখানে এটি এমনকি আমরা সাইনটি অদলবদল করি। কিছু ক্ষেত্রে রয়েছে যেখানে এটি কাজ করে না (-1, সর্বাধিক বা কমপক্ষে), তবে এটি এখন পর্যন্ত প্রস্তাবিত যে কোনও কিছুর চেয়ে অনেক ভাল কাজ করে।


1
আমি বিশ্বাস করি এটি MAX)T এর জন্য কাজ করে কারণ এটি সর্বদা অদ্ভুত। এটি MIN_INT এবং -1 এর জন্য কাজ করে না।
এয়ারসোর্স লিমিটেড

9
এর পার্শ্ব প্রতিক্রিয়া থাকলে এটি কোনও ফাংশন নয়।
টি

12
এটি গণিতে সত্য হতে পারে তবে প্রোগ্রামিংয়ে এটি অপ্রাসঙ্গিক। সুতরাং প্রশ্নটি হচ্ছে তারা গাণিতিক সমাধান বা কোনও প্রোগ্রামিং সমাধান খুঁজছেন কিনা। তবে প্রদত্ত যে এটি কোনও প্রোগ্রামিং কাজের জন্য ...
রায়ান লুন্ডি

+1 আমি সি এর সাথে একটি "স্ট্যাটিক ইনট এক্স" আউটপুট অবহেলা করে একটি ফিফো বাস্তবায়ন করে পোস্ট করতে যাচ্ছিলাম। তবে এটি যথেষ্ট কাছাকাছি।
phkahler

2
@ নোট: হ্যাঁ, এটি কেবল স্বচ্ছ নয় transparent
ক্লার্ক গাবেল

26

জাভাস্ক্রিপ্ট ব্যতিক্রমগুলি অনুসন্ধান করছে।

function f(n) {
    try {
        return n();
    }
    catch(e) { 
        return function() { return -n; };
    }
}

f(f(0)) => 0

f(f(1)) => -1


আমার সন্দেহ হয় এর আগেও ব্যতিক্রমগুলি এর আগে ব্যবহৃত হয়েছিল ... :)
নোবগস

+1 বাক্সের বাইরে চিন্তাভাবনা। শান্ত! তবে প্রোডাকশন কোডে আমি টাইপফোনটি নিরাপদ রাখতে ব্যবহার করব।

21

সমস্ত 32-বিট মানগুলির জন্য (0 -2147483648 এর ক্যাভিয়েট সহ)

int rotate(int x)
{
    static const int split = INT_MAX / 2 + 1;
    static const int negativeSplit = INT_MIN / 2 + 1;

    if (x == INT_MAX)
        return INT_MIN;
    if (x == INT_MIN)
        return x + 1;

    if (x >= split)
        return x + 1 - INT_MIN;
    if (x >= 0)
        return INT_MAX - x;
    if (x >= negativeSplit)
        return INT_MIN - x + 1;
    return split -(negativeSplit - x);
}

আপনার মূলত প্রতিটি -x => x => -x লুপটি অ্যায় => -ই => ওয় লুপের সাথে জোড়া লাগানো দরকার। তাই আমি এর বিপরীত দিকগুলি জুড়ে দিয়েছিsplit

যেমন 4 বিট পূর্ণসংখ্যার জন্য:

0 => 7 => -8 => -7 => 0
1 => 6 => -1 => -6 => 1
2 => 5 => -2 => -5 => 2
3 => 4 => -3 => -4 => 3

21

একটি সি ++ সংস্করণ, সম্ভবত নিয়মগুলি কিছুটা বাঁকানো তবে সমস্ত সংখ্যার ধরণের (ফ্লোট, ইনটস, ডাবলস) এমনকি ক্লাসের ধরণের জন্যও কাজ করে যা ইউনিারি বিয়োগকে ওভারলোড করে:

template <class T>
struct f_result
{
  T value;
};

template <class T>
f_result <T> f (T n)
{
  f_result <T> result = {n};
  return result;
}

template <class T>
T f (f_result <T> n)
{
  return -n.value;
}

void main (void)
{
  int n = 45;
  cout << "f(f(" << n << ")) = " << f(f(n)) << endl;
  float p = 3.14f;
  cout << "f(f(" << p << ")) = " << f(f(p)) << endl;
}

ভাল ধারণা. বিকল্প হিসাবে, আপনি সম্ভবত কাঠামোটি হারাতে পারেন এবং তার পরিবর্তে একটি ফাংশনটিতে একটি পয়েন্টার ফিরিয়ে দিতে হবে, অন্য ক্রিয়াকলাপটি বিন্যাস এবং অবজ্ঞা করুন।
Imbue

20

x86 asm (এটিএন্ডটি স্টাইল):

; input %edi
; output %eax
; clobbered regs: %ecx, %edx
f:
    testl   %edi, %edi
    je  .zero

    movl    %edi, %eax
    movl    $1, %ecx
    movl    %edi, %edx
    andl    $1, %eax
    addl    %eax, %eax
    subl    %eax, %ecx
    xorl    %eax, %eax
    testl   %edi, %edi
    setg    %al
    shrl    $31, %edx
    subl    %edx, %eax
    imull   %ecx, %eax
    subl    %eax, %edi
    movl    %edi, %eax
    imull   %ecx, %eax
.zero:
    xorl    %eax, %eax
    ret

কোডটি চেক করা হয়েছে, সমস্ত সম্ভাব্য 32 বিট পূর্ণসংখ্যার পাস হয়েছে, -2147483647 (পাতাল) দিয়ে ত্রুটি।


19

গ্লোবাল ব্যবহার করে ... তবে কি তাই?

bool done = false
f(int n)
{
  int out = n;
  if(!done)
  {  
      out = n * -1;
      done = true;
   }
   return out;
}

3
নিশ্চিত না যে এটি প্রশ্নকারীদের উদ্দেশ্য ছিল, তবে "বাক্সের বাইরে চিন্তাভাবনা" করার জন্য +1 1
লিরান ওরেভী

5
শর্তসাপেক্ষে "সম্পন্ন = সত্য" বলার পরিবর্তে আপনার সর্বদা "সম্পন্ন =! সম্পন্ন" বলা উচিত, এইভাবে আপনার ফাংশনটি একাধিকবার ব্যবহার করা যেতে পারে।
ক্রিস লুটজ

@ ক্রিস, যেহেতু সত্য হয়ে গেছে সেটি যদি কোনও (!) করা ব্লকের অভ্যন্তরে থাকে তবে এটি সম্পন্ন =! সমান সমান, তবে! সম্পন্ন করার প্রয়োজন হয় না (বা এটি যথেষ্ট স্মার্ট যদি সংকলক দ্বারা অপ্টিমাইজ করা যায়) ।
nsayer

1
আমার প্রথম চিন্তাটি একটি বিশ্বব্যাপী পরিবর্তনশীল ব্যবহার করে এটি সমাধান করাও ছিল, যদিও এই ধরণের এই বিশেষ প্রশ্নের জন্য প্রতারণার মতো মনে হয়েছিল। তবে আমি যুক্তি দিয়ে বলব যে একটি বৈশ্বিক পরিবর্তনশীল সমাধান হ'ল প্রশ্নের সুনির্দিষ্ট বিবরণ দেওয়া ভাল সমাধান। একটি গ্লোবাল ব্যবহার করে যা ঘটছে তা বোঝা খুব সহজ করে তোলে। আমি সম্মত হব যে একটি সম্পন্ন! = সম্পন্ন করা ভাল তবেই হবে। যদি এটি ক্লজের বাইরে চলে যান।
আলদারথ

3
প্রযুক্তিগতভাবে, যে কোনও কিছু রাষ্ট্রকে বজায় রাখে তা কোনও ফাংশন নয়, তবে রাষ্ট্রীয় মেশিন। দ্বারা সংজ্ঞা , একটি ফাংশন সবসময় একই ইনপুট জন্য একই আউটপুট দেয়।
টেড হপ

19

এই পার্ল সমাধানটি পূর্ণসংখ্যা, ভাসমান এবং স্ট্রিংয়ের জন্য কাজ করে

sub f {
    my $n = shift;
    return ref($n) ? -$$n : \$n;
}

কিছু পরীক্ষার ডেটা চেষ্টা করুন।

print $_, ' ', f(f($_)), "\n" for -2, 0, 1, 1.1, -3.3, 'foo' '-bar';

আউটপুট:

-2 2
0 0
1 -1
1.1 -1.1
-3.3 3.3
foo -foo
-bar +bar

তবে এটি কোনও প্রচ্ছন্নতা রাখে না। আপনি মূলত ইনট "এন" এ গ্লোবাল ভেরিয়েবল ডেটা সংরক্ষণ করছেন ... এটি কোনও ইনট না হয়ে অন্যথায় আপনি এটি করতে পারবেন না। উদাহরণস্বরূপ যদি nএকটি স্ট্রিং আমি 548 করতে পারতাম "ফার্স্টটাইম_548" হয়ে যায় এবং তার পরের বার এটি ফাংশনটির মধ্য দিয়ে চলে ... যদি (উপসর্গ == ফার্স্টটাইম_ ")" ফার্স্টটাইম_ "এর সাথে" - "প্রতিস্থাপন করে
অ্যালবার্ট রেনশো

@ অ্যালবার্ট রেইনশাও নিশ্চিত হন না আপনি কোথায় এই ধারণাটি পেয়েছেন। (1) এখানে অবশ্যই কোনও গ্লোবাল ভেরিয়েবল জড়িত নেই। (২) আপনি যদি ফাংশনটিকে কোনও int প্রদান করেন তবে আপনি ফাংশনটিকে একাধিকবার অজানা সংখ্যায় কল দিলে আপনি কোনও int - বা কোনও int এর একটি রেফারেন্স পাবেন। (3) সম্ভবত সবচেয়ে মৌলিকভাবে, এটি পার্ল । সমস্ত ব্যবহারিক উদ্দেশ্যে, ints এবং স্ট্রিং সম্পূর্ণরূপে বিনিময়যোগ্য। সংখ্যার মতো দেখতে স্ট্রিংগুলি বেশিরভাগ প্রেক্ষাপটে সংখ্যার মতো নিখুঁতভাবে কাজ করবে এবং যখনই জিজ্ঞাসা করা হবে তখন সংখ্যা আনন্দের সাথে শক্তিশালী হবে।
এফএমসি

দুঃখিত, আমি খুব বেশি পার্ল জানি না বলে মনে হয়েছিল আপনি বিশ্বব্যাপী অ্যারে ব্যবহার করছেন
অ্যালবার্ট রেনশো

18

কেউ কখনও বলেনি যে চ (এক্স) একই ধরণের হতে হবে।

def f(x):
    if type(x) == list:
        return -x[0]
    return [x]


f(2) => [2]
f(f(2)) => -2

16

আমি আসলে নিজেই সমস্যার সমাধান দেওয়ার চেষ্টা করছি না, তবে বেশ কয়েকটি মন্তব্য করতে হবে, কারণ প্রশ্নটি বলে যে এই সমস্যাটি একটি (চাকরি?) সাক্ষাত্কারের অংশ ছিল:

  • আমি প্রথমে জিজ্ঞাসা করতাম "কেন এই জাতীয় অনুষ্ঠানের প্রয়োজন হবে? এটির চেয়ে বড় সমস্যাটি কী?" পরিবর্তে ঘটনাস্থলে প্রকৃত ভঙ্গিত সমস্যা সমাধানের চেষ্টা করা। এটি আমি কীভাবে চিন্তা করি এবং কীভাবে এই সমস্যাগুলি মোকাবিলা করি তা বোঝায়। কে জানে? এমনকি প্রথম স্থানে একটি সাক্ষাত্কারে প্রশ্ন জিজ্ঞাসা করা প্রকৃত কারণ হতে পারে। যদি উত্তরটি হয় "কখনই আপনার আপত্তি নেই, ধরে নিন এটির প্রয়োজন আছে, এবং কীভাবে আপনি এই ফাংশনটি ডিজাইন করবেন তা আমাকে দেখান।" আমি তখন তা চালিয়ে যেতে চাই।
  • তারপরে, আমি সি # পরীক্ষার কেস কোডটি লিখব (স্পষ্ট: লুপ থেকে int.MinValueআসা int.MaxValue, এবং nএই পরিসরের কলের প্রতিটিটির জন্য f(f(n))ফলাফলটি পরীক্ষা করা -n), আমি বলছিলাম যে আমি এর পরে কোনও ফাংশনে যেতে টেস্ট চালিত বিকাশ ব্যবহার করব।
  • যদি কেবল ইন্টারভিউয়ার আমার কাছে জিজ্ঞাসা করা হয় যে সমস্যার মুখোমুখি হওয়া সমস্যাটি সমাধান করার জন্য জিজ্ঞাসা করা হয় তবে আমি কি সত্যিই সাক্ষাত্কারের সময় সিউডোকোডটি চেষ্টা করে দেখতে শুরু করতাম এবং কোনও উত্তর পেতে পারি। তবে, আমি সত্যিই মনে করি না যে আমি যদি ইন্টারভিউওয়ালা কোম্পানির মতো অবস্থা সম্পর্কে কোনও ইঙ্গিত দেয় তবে আমি চাকরিটি নিতে ঝাঁপিয়ে পড়ব ...

ওহ, এই উত্তরটি ধরে নিয়েছে যে সাক্ষাত্কারটি একটি সি # প্রোগ্রামিং সম্পর্কিত অবস্থানের জন্য ছিল। সাক্ষাত্কারটি একটি গণিত সম্পর্কিত অবস্থানের জন্য হলে অবশ্যই একটি নির্বোধ উত্তর হবে। ;-)


7
আপনারা ভাগ্যবান তারা 32
ইন্টের

প্রকৃতপক্ষে, আমি এমনকি যদি একটি বিন্দুতে আসলে সত্য পরীক্ষা লিখতে এবং একটি সাক্ষাত্কার সময় এটি চালানো। ;-) আমার বক্তব্য: আমি কোনও সাক্ষাত্কারে মোটেও সেই পর্যায়ে না যাওয়ার চেষ্টা করব। প্রোগ্রামিং আমার মতে "তিনি কোডের লাইনে কীভাবে লেখেন" এর চেয়ে "চিন্তার উপায়" এর চেয়ে বেশি।
পিএসশির

7
প্রকৃত সাক্ষাত্কারে এই পরামর্শটি অনুসরণ করবেন না। সাক্ষাত্কারটি আশা করে আপনি আসলে প্রশ্নের উত্তর দিয়েছেন। প্রশ্নের প্রাসঙ্গিকতা প্রশ্নোত্তর আপনাকে কিছু কিনবে না তবে এটি সাক্ষাত্কারকারীকে বিরক্ত করতে পারে। তুচ্ছ পরীক্ষার নকশা করা আপনাকে উত্তরের কোনও ধাপ কাছে নিয়ে আসে না এবং আপনি এটি সাক্ষাত্কারে চালাতে পারবেন না। যদি আপনি অতিরিক্ত তথ্য (32 বিট) পান তবে কীভাবে এটি কার্যকর হতে পারে তা জানার চেষ্টা করুন।
স্টিফান হস্টেইন

আমি আরও তথ্যের জন্য জিজ্ঞাসা করলে বিরক্ত হয়ে যায় এমন একটি সাক্ষাত্কারকারীর (সম্ভবত প্রক্রিয়াটিতে তাঁর প্রশ্নের প্রাসঙ্গিকতা নিয়ে প্রশ্ন করার সময়) কোনও ইন্টারভিউয়ার নয় আমি প্রয়োজনীয়ভাবে / এর সাথে কাজ করতে চাই। সুতরাং আমি সাক্ষাত্কারে মত প্রশ্ন জিজ্ঞাসা করা হবে। যদি তারা এটি পছন্দ না করে তবে আমি সম্ভবত আমাদের উভয় সময় নষ্ট করা বন্ধ করার জন্য সাক্ষাত্কারটি শেষ করব। "আমি কেবল আদেশগুলি অনুসরণ করছিলাম" পছন্দ করুন না মন কিছুটা সেট করে। তুমি ..?
peSHIr

16

আমি আপনাকে 2 টি সবচেয়ে উল্লেখযোগ্য বিট পরিবর্তন করতে চাই।

00.... => 01.... => 10.....

01.... => 10.... => 11.....

10.... => 11.... => 00.....

11.... => 00.... => 01.....

আপনি দেখতে পাচ্ছেন, বাহিত বিটটি রেখে কেবল এটি একটি সংযোজন।

আমি কীভাবে উত্তর পেয়েছি? আমার প্রথম চিন্তাটি ছিল প্রতিসম মাত্রার প্রয়োজন। আমি যেখানে শুরু করেছি সেখানে ফিরে যাওয়ার জন্য 4 টি টার্নস। প্রথমে আমি ভেবেছিলাম, এটি গ্রে কোড 2 বিট। তখন আমি ভেবেছিলাম আসলে স্ট্যান্ডার্ড বাইনারি যথেষ্ট।


এই পদ্ধতির সমস্যাটি হ'ল এটি দু'জনের প্রশংসা negativeণাত্মক সংখ্যার সাথে কাজ করে না (যা প্রতিটি আধুনিক সিপিইউ ব্যবহার করে)। এজন্য আমি আমার অভিন্ন উত্তর মুছলাম।
তামাস সিজনে

প্রশ্নটি 32-বিট স্বাক্ষরিত পূর্ণসংখ্যাগুলি নির্দিষ্ট করেছে। এই সমাধানটি দুটি-পরিপূরক বা 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার একের পরিপূরক উপস্থাপনার জন্য কাজ করে না। এটি কেবল সাইন-ও-প্রেজেন্টেশন উপস্থাপনার জন্য কাজ করবে যা আধুনিক কম্পিউটারগুলিতে (ভাসমান পয়েন্ট সংখ্যা ব্যতীত) খুব অস্বাভাবিক।
জেফরি এল হুইলেটজ

1
@ ডিআরজোকপু - বাহ, ছয় মাস পরে - জিনক্স!
জেফ্রি এল হুইটলেজ

ফাংশনের অভ্যন্তরে সাইন-ও-গৌন প্রতিনিধিত্বের জন্য আপনাকে কেবল সংখ্যাগুলি রূপান্তর করার দরকার নেই, রূপান্তরটি সম্পাদন করুন, তারপরে ফেরার আগে দেশীয় পূর্ণসংখ্যার উপস্থাপনা যা কিছু হোক না কেন তাকে আবার রূপান্তর করুন?
বিল মিশেল

আমি পছন্দ করি আপনি মূলত একটি কল্পিত বিট প্রবর্তন করে জটিল সংখ্যাগুলি কার্যকর করেছিলেন :)
জবিরালি

16

এখানে একটি সমাধান যা প্রয়োজন দ্বারা অনুপ্রাণিত হয় বা দাবি করে যে জটিল সংখ্যা এই সমস্যাটি সমাধান করতে ব্যবহার করা যাবে না।

-1 এর বর্গমূল দিয়ে গুণ করা একটি ধারণা, এটি কেবল ব্যর্থ বলে মনে হয় কারণ -1 এর পূর্ণসংখ্যার উপর বর্গমূল থাকে না। তবে গণিতের মতো প্রোগ্রামের সাথে খেলাটি সমীকরণের উদাহরণ দেয়

(1849436465 2 +1) মোড (2 32 -3) = 0।

এবং এটি -1 এর বর্গমূল হওয়ার মতোই প্রায় ভাল। ফাংশনের ফলাফলটির জন্য একটি স্বাক্ষরিত পূর্ণসংখ্যার হওয়া দরকার। অতএব আমি একটি সংশোধিত মডুলো অপারেশন মোড (x, n) ব্যবহার করতে যাচ্ছি যেটি পূর্ণসংখ্যা y সংগৃহীতকে x মডুলো এনকে 0 এর নিকটতম স্থানে ফিরিয়ে দেয় কেবল খুব কম প্রোগ্রামিং ভাষারই একটি মডুলো অপারেশন সফল হয়েছে তবে এটি সহজে সংজ্ঞায়িত করা যায় । অজগর উদাহরণস্বরূপ:

def mods(x, n):
    y = x % n
    if y > n/2: y-= n
    return y

উপরের সমীকরণটি ব্যবহার করে, সমস্যাটি এখন যেমন সমাধান করা যায়

def f(x):
    return mods(x*1849436465, 2**32-3)

এটি f(f(x)) = -xপরিসরের সমস্ত পূর্ণসংখ্যার জন্য সন্তুষ্ট । ফলাফলগুলিও এই ব্যাপ্তিতে রয়েছে তবে অবশ্যই গণনার জন্য 64-বিট পূর্ণসংখ্যার প্রয়োজন হবে।[-231-2, 231-2]f(x)


13

সি # 2 of 32 - 1 সংখ্যার ব্যাপ্তির জন্য, সমস্ত int32 নম্বর ব্যতীত (Int32.MinValue)

    Func<int, int> f = n =>
        n < 0
           ? (n & (1 << 30)) == (1 << 30) ? (n ^ (1 << 30)) : - (n | (1 << 30))
           : (n & (1 << 30)) == (1 << 30) ? -(n ^ (1 << 30)) : (n | (1 << 30));

    Console.WriteLine(f(f(Int32.MinValue + 1))); // -2147483648 + 1
    for (int i = -3; i <= 3  ; i++)
        Console.WriteLine(f(f(i)));
    Console.WriteLine(f(f(Int32.MaxValue))); // 2147483647

কপি করে প্রিন্ট:

2147483647
3
2
1
0
-1
-2
-3
-2147483647

এটি f (0) এর জন্যও কাজ করে না যা 1073741824. f (1073741824) = 0. f (f (1073741824)) = 1073741824
দিনাহ

আপনি সাধারণত প্রমাণ করতে পারেন যে কোনও বিট আকারের দুজনের পরিপূরক পূর্ণসংখ্যার জন্য, ফাংশনটিতে কমপক্ষে দুটি ইনপুট মান ব্যবহার করা উচিত নয়।
স্ল্যাকার

12

মূলত ফাংশনটি উপলভ্য পরিসীমাটিকে 4 আকারের চক্রগুলিতে বিভক্ত করতে হয়, এন-চক্রের বিপরীত প্রান্তে -n সহ। তবে, 0 টি অবশ্যই 1 মাপের চক্রের অংশ হতে হবে, কারণ অন্যথায়0->x->0->x != -x । 0 একা থাকার কারণে, আমাদের পরিসীমাতে আরও 3 টি মান থাকতে হবে (যার আকার 4 এর একাধিক) 4 টি উপাদান সহ সঠিক চক্রে নয়।

আমি হতে এই অতিরিক্ত অদ্ভুত মান বেছে নেওয়া হয়েছে MIN_INT, MAX_INTএবং MIN_INT+1। তদ্ব্যতীত, সঠিকভাবে MIN_INT+1মানচিত্র করবে MAX_INT, কিন্তু সেখানে আটকে থাকবে এবং মানচিত্রটি ফিরে আসবে না। আমি মনে করি এটি সর্বোত্তম আপস, কারণ এটির মধ্যে কেবলমাত্র চূড়ান্ত মানগুলিই সঠিকভাবে কাজ করছে না এর দুর্দান্ত সম্পত্তি রয়েছে। এছাড়াও, এর অর্থ এটি সমস্ত বিগিয়ান্টগুলির জন্য কাজ করবে ।

int f(int n):
    if n == 0 or n == MIN_INT or n == MAX_INT: return n
    return ((Math.abs(n) mod 2) * 2 - 1) * n + Math.sign(n)

12

কেউ বলেনি এটি রাষ্ট্রহীন হতে হবে।

int32 f(int32 x) {
    static bool idempotent = false;
    if (!idempotent) {
        idempotent = true;
        return -x;
    } else {
        return x;
    }
}

প্রতারণা, কিন্তু উদাহরণ হিসাবে অনেক হিসাবে না। আপনার কলারের ঠিকানা & এফ আছে কিনা তা দেখার জন্য স্ট্যাকটি তাকাতে আরও আরও খারাপ হতে পারে তবে এটি আরও বহনযোগ্য হতে চলেছে (যদিও থ্রেড নিরাপদ নয় ... থ্রেড-নিরাপদ সংস্করণটি টিএলএস ব্যবহার করবে)। আরও খারাপ:

int32 f (int32 x) {
    static int32 answer = -x;
    return answer;
}

অবশ্যই, এইগুলির উভয়ই এমএইএনআইএনটি 32 এর ক্ষেত্রে খুব ভাল কাজ করে না, তবে আপনাকে যদি আরও বিস্তৃত ধরনের ফেরত না দেওয়া হয় তবে আপনি এগুলি করতে খুব মূল্যবান কিছু করতে পারেন।


আপনি ঠিকানা সম্পর্কে জিজ্ঞাসা করার জন্য এটি 'আপগ্রেড' করতে পারেন (হ্যাঁ, আপনাকে অবশ্যই এটি রেফ a পয়েন্টার হিসাবে পাওয়া উচিত) - সিতে, উদাহরণস্বরূপ: int f (int & n) {স্থিতিশীল ইনট * অ্যাড্রার = & n; যদি (সংযোজক == & n) {রিটার্ন-এন; } রিটার্ন এন; }
আইইউএনডিনিউজ পয়েন্টার

11

আমি কল্পনা করতে পারি ৩১ তম বিটকে কল্পিত হিসাবে ব্যবহার করতে পারি ( i ) বিট এমন একটি পদ্ধতির হতে পারে যা মোট পরিসীমা অর্ধেক সমর্থন করে।


এটি আরও জটিল হতে পারে তবে বর্তমানের সেরা উত্তরের চেয়ে বেশি কার্যকর হবে না
1800 তথ্য

1
@ 1800 তথ্য: অন্যদিকে, ডোমেনটি [-2 ^ 30 + 1, 2 ^ 30-1] স্বচ্ছ এবং এটি গাণিতিক দৃষ্টিকোণ থেকে আরও আকর্ষণীয়।
জোচেন ওয়াল্টার

10

n = [0 .. 2 ^ 31-1] এর জন্য কাজ করে

int f(int n) {
  if (n & (1 << 31)) // highest bit set?
    return -(n & ~(1 << 31)); // return negative of original n
  else
    return n | (1 << 31); // return n with highest bit set
}

10

সমস্যা যুক্তরাষ্ট্রের "32 বিট স্বাক্ষর পূর্ণসংখ্যার" কিন্তু নির্দিষ্ট করে না কিনা তারা দুই দুই-সম্পূরক বা বেশী-সম্পূরক

আপনি যদি পরিপূরক ব্যবহার করেন তবে সমস্ত 2 ^ 32 মান দৈর্ঘ্যের চক্রের মধ্যে ঘটে - আপনার শূন্যের জন্য কোনও বিশেষ কেসের প্রয়োজন হয় না এবং আপনারও শর্তসাপেক্ষ দরকার হয় না।

সি তে:

int32_t f(int32_t x)
{
  return (((x & 0xFFFFU) << 16) | ((x & 0xFFFF0000U) >> 16)) ^ 0xFFFFU;
}

এটি দ্বারা কাজ করে

  1. উচ্চ এবং নিম্ন 16-বিট ব্লক এক্সচেঞ্জ করা
  2. ব্লকগুলির একটি উল্টানো

দুটি পাস করার পরে আমাদের কাছে মূল মানের থেকে বিটওয়াইস বিপরীত হয়। যা পরিপূরক উপস্থাপনা উপেক্ষার সমতুল্য।

উদাহরণ:

Pass |        x
-----+-------------------
   0 | 00000001      (+1)
   1 | 0001FFFF (+131071)
   2 | FFFFFFFE      (-1)
   3 | FFFE0000 (-131071)
   4 | 00000001      (+1)

Pass |        x
-----+-------------------
   0 | 00000000      (+0)
   1 | 0000FFFF  (+65535)
   2 | FFFFFFFF      (-0)
   3 | FFFF0000  (-65535)
   4 | 00000000      (+0)

1
বিভিন্ন আর্কিটেকচার জুড়ে বাই-অর্ডার সম্পর্কে কী?
স্টিভেন 21

1
সমস্ত পাটিগণিত 32-বিট হয়। আমি স্বতন্ত্র বাইটগুলি পরিচালনা করি না, তাই বাইট ক্রম এটি প্রভাবিত করবে না।
ফিনিউ

এটি বেশ কাছাকাছি শোনাচ্ছে। আপনি ধরে নিতে পারেন ইনপুটটি 2-পরিপূরক। সুতরাং আপনি সাইন বিট উপস্থাপনা রূপান্তর। এখন শেষ বিটের উপর নির্ভর করে আপনি প্রথম বিট এবং শেষ বিট বা কেবল সর্বশেষ বিটটি ফ্লিপ করুন। মূলত আপনি কেবলমাত্র সংখ্যা এবং চক্রকে সমান / বিজোড় সব সময় উপেক্ষা করেন। সুতরাং আপনি বিজোড় থেকে বিজোড় এবং এমনকি 2 কল করার পরেও ফিরে আসবেন। শেষে আপনি 2-পরিপূরকতে ফিরে রূপান্তর করুন। নীচে কোথাও এর জন্য কোড পোস্ট করেছেন।
স্টিফান হস্টেইন

9

: ডি

boolean inner = true;

int f(int input) {
   if(inner) {
      inner = false;
      return input;
   } else {
      inner = true;
      return -input;
   }
}

5
বিশ্বব্যাপী ভেরিয়েবলগুলি কেন খারাপ সে বিষয়ে আপনি যদি আলোচনা করতে পারেন তবে তারা আপনাকে এখনই সাক্ষাত্কার থেকে সরিয়ে না দেয়!
পালসুইম


7

আমি এই গণিতবিদ হিসাবে এই আকর্ষণীয় সমস্যা সম্পর্কে আমার দৃষ্টিভঙ্গি ভাগ করতে চাই। আমি মনে করি আমার সবচেয়ে কার্যকর সমাধান রয়েছে।

যদি আমি সঠিকভাবে মনে রাখি তবে আপনি প্রথম বিটটি উল্টিয়ে একটি স্বাক্ষরিত 32-বিট পূর্ণসংখ্যার উপেক্ষা করবেন। উদাহরণস্বরূপ, যদি এন = 1001 1101 1110 1011 1110 0000 1110 1010, তবে -n = 0001 1101 1110 1011 1110 0000 1110 1010।

সুতরাং আমরা কীভাবে এমন একটি ফাংশন সংজ্ঞায়িত করব যা একটি স্বাক্ষরিত 32-বিট পূর্ণসংখ্যার গ্রহণ করে এবং দ্বিতীয় স্বাক্ষরিত 32-বিট পূর্ণসংখ্যার সাথে সেই সম্পত্তি দিয়ে ফিরে আসে যে দুবার এফ গ্রহণ করা প্রথম বিটকে উল্টানোর মতো?

পূর্ণসংখ্যার মতো পাটিগণিত ধারণাগুলির উল্লেখ না করেই আমি প্রশ্নটি পুনরায় উত্তর দিতে পারি।

আমরা কীভাবে এমন একটি ফাংশন সংজ্ঞায়িত করব যা জিরো এবং দৈর্ঘ্যের 32 এর ক্রম নেয় এবং একই দৈর্ঘ্যের শূন্য এবং একের ক্রমটি ফেরত দেয়, এমন সম্পত্তি সহ যে দুবার এফ গ্রহণ করা প্রথম বিটকে উল্টানোর মতো?

পর্যবেক্ষণ: আপনি যদি 32 বিট কেসের জন্য উপরের প্রশ্নটির উত্তর দিতে পারেন তবে আপনি 64 বিট কেস, 100 বিট কেস ইত্যাদির জন্যও উত্তর দিতে পারেন আপনি প্রথম 32 বিটের ক্ষেত্রে কেবল এফ প্রয়োগ করেন।

এখন আপনি যদি 2 বিটের ক্ষেত্রে প্রশ্নের উত্তর দিতে পারেন, ভয়েলা!

এবং হ্যাঁ দেখা যাচ্ছে যে প্রথম 2 বিট পরিবর্তন করা যথেষ্ট।

এখানে সিউডো-কোড

1. take n, which is a signed 32-bit integer.
2. swap the first bit and the second bit.
3. flip the first bit.
4. return the result.

মন্তব্য: দ্বিতীয় ধাপ 2 এবং 3 তম একসাথে (ক, খ) -> (-বি, ক) হিসাবে গ্রীষ্মকালীন করা যেতে পারে। চেনা লাগছে? এটি আপনাকে বিমানের 90 ডিগ্রি ঘূর্ণন এবং -1 এর স্কোয়ার রুটের দ্বারা গুণনের স্মরণ করিয়ে দেয়।

আমি যদি দীর্ঘ উপস্থাপনা ব্যতীত সিউডো কোডটি একাই উপস্থাপন করি তবে এটি টুপি থেকে খরগোশের মতো মনে হবে, আমি কীভাবে সমাধান পেয়েছি তা ব্যাখ্যা করতে চেয়েছিলাম।


6
হ্যাঁ এটি একটি আকর্ষণীয় সমস্যা। আপনি আপনার গণিত জানেন। তবে এটি কম্পিউটার বিজ্ঞানের সমস্যা। সুতরাং আপনার কম্পিউটার অধ্যয়ন করা উচিত। সাইন-মাত্রার প্রতিনিধিত্বযোগ্য তবে এটি প্রায় 60 বছর আগে শৈলীর বাইরে চলে গেছে। 2 এর পরিপূরক সর্বাধিক জনপ্রিয়।
উইন্ডোজ প্রোগ্রামার

5
আপনার ফাংশন দু'বার প্রয়োগ করার সময় দুটি বিটের সাথে কী করবে তা এখানে: (ক, খ) -> (-বি, ক) -> (-এ,-বি)। তবে, আমরা (-a, b) পাওয়ার চেষ্টা করছি, (-a, -b) নয়।
বুটি-অক্সা

@ বুটি-অক্সা, আপনি ঠিক বলেছেন। দুটি বিট ক্রিয়াকলাপটি যেমন হওয়া উচিত: 00 -> 01 -> 10 -> 11 -> 00. তবে তারপরে আমার অ্যালগরিদম সাইন-প্রস্থের উপস্থাপনা ধরে নেয় যা এখন অপ্রিয়, যেমন উইন্ডোজ প্রোগ্রামার বলেছে, তাই আমি মনে করি আমার অ্যালগরিদম খুব কম ব্যবহার করে ।
ইয়ু

তাহলে সে কি একবারের পরিবর্তে দু'বার পদক্ষেপগুলি করতে পারে না?
নোসরেডা

4
বুটি-অক্সা পুরোপুরি সঠিক: ফাংশনটি দুটি অনুরোধের পরে প্রথম বিটটিও ফ্লিপ করে না, এটি প্রথম দুটি বিট উল্টায়। সমস্ত বিট উল্টানো 2 এর পরিপূরক যা করতে পারে তার কাছাকাছি, তবে এটি ঠিক সঠিক নয়।
লাল্টুনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.