এই সংখ্যাটি -2: (খুব) হার্ড মোডের সঠিক শক্তি


26

এটি সাম্প্রতিক চ্যালেঞ্জের একটি সংস্করণ এই সংখ্যাটি কি -2 এর পূর্ণসংখ্যা শক্তি? সমস্যার আকর্ষণীয় প্রকৃতিটি হাইলাইট করতে এবং চ্যালেঞ্জটিকে আরও কঠিন করে তুলতে ডিজাইন করা বিভিন্ন মানদণ্ডের সাথে। আমি এখানে এটি কিছু বিবেচনা করা ।

সংযুক্ত প্রশ্নে টবি যে বিস্ময়করভাবে বলেছেন সেই চ্যালেঞ্জটি হ'ল:

কোনও পূর্ণসংখ্যা 2-এর সঠিক শক্তি কিনা তা নির্ধারণের চতুর উপায় রয়েছে That's এটি আর কোনও আকর্ষণীয় সমস্যা নয়, সুতরাং নির্ধারিত পূর্ণসংখ্যা -2 এর সঠিক শক্তি কিনা তা নির্ধারণ করি । উদাহরণ স্বরূপ:

-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²

নিয়মাবলী:

  • একটি পূর্ণসংখ্যা হয় 64 বিট, স্বাক্ষরিত, দুটির পরিপূরক। এটি আপনার সাথে কাজ করতে পারে এমন একমাত্র ডেটা টাইপ।
  • আপনি কেবল নিম্নলিখিত অপারেশনগুলি ব্যবহার করতে পারেন। এগুলির প্রত্যেককে একটি অপারেশন হিসাবে গণনা করা হয়।
    • n << k, n >> k: বিট nদ্বারা বাম / ডান স্থানান্তর k। ডান শিফটে সাইন বিট বাড়ানো হয়েছে।
    • n >>> k: ডান শিফট কিন্তু সাইন বিট প্রসারিত করবেন না। 0 এর মধ্যে স্থানান্তরিত হয়।
    • a & b, a | b, a ^ b: Bitwise এবং, অর, X অর।
    • a + b, a - b, a * b: যোগ করুন, বিয়োগ, গুণ।
    • ~b: বিটওয়াইস উল্টানো।
    • -b: দু'জনের পরিপূরক অবহেলা।
    • a / b, a % b: ভাগ করুন (পূর্ণসংখ্যার ভাগফল, 0 টির দিকে রাউন্ড) এবং মডুলো।
      • Negativeণাত্মক সংখ্যার মডুলো C99 এ নির্দিষ্ট বিধিগুলি ব্যবহার করে : (a/b) * b + a%bসমান হবে a। সুতরাং 5 % -3হয় 2, এবং -5 % 3হয় -2:
      • 5 / 3হয় 1, 5 % 3হয় 2যেমন 1 * 3 + 2 = 5।
      • -5 / 3হয় -1, -5 % 3হয় -2, যেমন -1 * 3 + -2 = -5।
      • 5 / -3হয় -1, 5 % -3হয় 2, যেমন -1 * -3 + 2 = 5।
      • -5 / -3হয় 1, -5 % -3হয় -2, 1 * -3 + -2 = -5 হিসাবে।
      • লক্ষ করুন যে পাইথনের //ফ্লোর বিভাগ অপারেটরটি এখানে বিভাগের "রাউন্ডের দিকে 0" সম্পত্তি %পূরণ করে না এবং পাইথনের অপারেটর প্রয়োজনীয়তাও পূরণ করে না either
    • অ্যাসাইনমেন্টগুলি অপারেশন হিসাবে গণনা করা হয় না। সি হিসাবে, অ্যাসাইনমেন্টগুলি অ্যাসাইনমেন্টের পরে বাম দিকের মানটির মূল্যায়ন করে: a = (b = a + 5)সেট bকরে a + 5, তারপরে সেট aকরে bএবং একটি ক্রিয়াকলাপ হিসাবে গণনা করে।
    • যৌগিক কার্যভারগুলি a += bঅর্থ a = a + bহিসাবে ব্যবহৃত হতে পারে এবং একটি অপারেশন হিসাবে গণনা করা যেতে পারে ।
  • আপনি পূর্ণসংখ্যার ধ্রুবক ব্যবহার করতে পারেন, তারা কোনও হিসাবে গণনা করে না।
  • ক্রিয়াকলাপের ক্রম নির্দিষ্ট করার জন্য অভিভাবকরা গ্রহণযোগ্য।
  • আপনি ফাংশন ঘোষণা করতে পারেন। ফাংশন ঘোষণাগুলি আপনার পক্ষে সুবিধাজনক যে কোনও স্টাইলে হতে পারে তবে মনে রাখবেন যে bit৪ বিট পূর্ণসংখ্যা শুধুমাত্র বৈধ ডেটা টাইপ। ফাংশন ঘোষণাগুলি অপারেশন হিসাবে গণনা করা হয় না, তবে একটি ফাংশন কল একটি হিসাবে গণনা করে। এছাড়াও, পরিষ্কার করার জন্য: কার্যক্রমে একাধিক returnবিবৃতি থাকতে পারে এবং যে returnকোনও বিন্দু থেকে অনুমোদিত হতে পারে । returnনিজেই একটি অপারেশন হিসাবে গণনা করা হয় না।
  • আপনি বিনা ব্যয়ে ভেরিয়েবল ঘোষণা করতে পারেন।
  • আপনি whileলুপগুলি ব্যবহার করতে পারেন , তবে আপনি ব্যবহার করতে পারবেন না ifবা ব্যবহারও করতে পারেন forwhileশর্তে ব্যবহৃত অপারেটররা আপনার স্কোরকে গণনা করে। whileলুপগুলি যতক্ষণ না তাদের শর্তটি একটি অ-শূন্য মানের (যে "ভাষায় এই ধারণার বৈধ ফলাফল নয়) তে" সত্যবাদী "0 মূল্যায়ন করে ততক্ষণ কার্যকর করা হয়। প্রারম্ভিক প্রত্যাবর্তন অনুমতি দেওয়া হয় সাল থেকে, আপনি ব্যবহার করার অনুমতি দেওয়া হয় breakহিসাবে ভাল
  • ওভারফ্লো / আন্ডারফ্লো অনুমোদিত এবং কোনও মান দমন করা হবে না। এটি চিকিত্সা করা হয় যেন অপারেশনটি আসলে সঠিকভাবে ঘটেছিল এবং তারপরে 64৪ বিটে ছাঁটাই হয়েছিল।

স্কোরিং / জয়ের মানদণ্ড:

আপনার কোডে অবশ্যই এমন মান তৈরি করতে হবে যা শূন্য নয়, যদি ইনপুটটি -2 এর পাওয়ার হয় এবং অন্যথায় শূন্য হয়।

এটি । আপনার স্কোরটি আপনার কোডে উপস্থিত অপারেশনগুলির মোট সংখ্যা (উপরে সংজ্ঞায়িত হিসাবে), রান-টাইমে কার্যকর হওয়া মোট অপারেশনগুলির সংখ্যা নয় । নিম্নলিখিত কোড:

function example (a, b) {
    return a + ~b;
}

function ispowerofnegtwo (input) {
    y = example(input, 9);
    y = example(y, 42);
    y = example(y, 98);
    return y;
}

5 টি অপারেশন রয়েছে: ফাংশনে দুটি এবং তিনটি ফাংশন কল।

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

বিজয়ী হ'ল পোস্টটি যা প্রদর্শনযোগ্যভাবে সঠিক (প্রয়োজনীয় হিসাবে একটি নৈমিত্তিক বা আনুষ্ঠানিক প্রমাণ সরবরাহ করুন) এবং উপরে বর্ণিত হিসাবে সর্বনিম্ন স্কোর রয়েছে।

বোনাস খুব হার্ড মোড চ্যালেঞ্জ!

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


দ্রষ্টব্য: আপনি যদি এমন ভাষায় কোনও সমাধান সরবরাহ করতে চান যা কেবল 32-বিট পূর্ণসংখ্যার সমর্থন করে তবে আপনি তা করতে পারেন, তবে আপনি যদি যথেষ্ট প্রমাণ করেন যে এটি এখনও ব্যাখ্যায় 64৪-বিট পূর্ণসংখ্যার জন্য সঠিক হবে।

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


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

@ এইচভিডি আপনি যদি এটি পড়েন: আপনার উত্তরটি পুরোপুরি মুছে ফেলা উচিত! ধরে নিলে এটি সঠিক, এমনকি এটিm ^= s এখনও চিত্তাকর্ষক নয় এবং আমি মনে করি এটি আরও উন্নত করার জন্য প্রতিস্থাপন করা সম্পূর্ণ ঠিক হবে।
জেসন সি

কীভাবে এটি অনুমতি দেবে whileএবং breakতা করবে না if? if (x) { ... }সমতূল্য while (x) { ... break; }
আর ..

@ আর .. এটি ১০০% অর্থবোধ করে না ( breakএবং প্রারম্ভিক রিটার্নগুলি দুঃখজনক অংশ) এবং এটি একটি দীর্ঘ গল্প এবং ভবিষ্যতের চ্যালেঞ্জগুলির জন্য নিয়মে শেখা একটি পাঠ। সর্বদা "বোনাস" সংস্করণ আছে! :)
জেসন সি

1
কেন ifএবং forনিষেধ করা হয়? int x=condition; while (x) { ... x=0; }বিনামূল্যে, আরও কোড। সি-স্টাইল সহ একই জিনিস for
কিওয়ারটি

উত্তর:


35

সি ++, 15 অপারেশন

whileলুপগুলিকে পুরো চ্যালেঞ্জটি ধ্বংস করার কারণে কেন অনুমতি দেওয়া হচ্ছে তা আমার কোনও ধারণা নেই । এখানে কোনও উত্তর ছাড়াই:

int64_t is_negpow2(int64_t n) {
    int64_t neg = uint64_t(n) >> 63; // n >>> 63
    n = (n ^ -neg) + neg; // if (n < 0) n = -n;
    int64_t evenbits = n & int64_t(0xaaaaaaaaaaaaaaaaull >> neg);
    int64_t n1 = n - 1;
    int64_t pot = n & n1;
    int64_t r = pot | (n1 >> 63) | evenbits;
    return ~((r | -r) >> 63); // !r
}

whileলুপগুলি কেন পুরো চ্যালেঞ্জটি ধ্বংস করে ?
মিঃ এক্সকোডার

10
@ মিঃ এক্সকোডার কারণ চ্যালেঞ্জটি হ'ল বিটওয়াইজ অপারেশনগুলি সহ এটি করা এবং এটি প্রতিটি উপায়েই এর whileবিরুদ্ধে যায়।
orlp

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

আমি এখানে এই সম্পর্কে একটি মন্তব্য করেছেন ।
জেসন সি

@ জেসনসি এর কারণ, আমার সাইন বিট ছাড়াই ডান শিফট ব্যবহার করা উচিত ছিল। আমি কোডটি সম্পাদনা করেছি (এটি ব্যবহার করে uint64_tকারণ সাইন এক্সটেনশন ছাড়াই ডান শিফট পাওয়ার একমাত্র উপায়))
orlp

25

পাইথন 2 , 3 অপারেশন

def f(n):
 while n>>1:
  while n&1:return 0
  n=n/-2
 return n

এটি অনলাইন চেষ্টা করুন!

অপারেশন হয় >>, &, /

ধারণাটি বারবার -2 দ্বারা ভাগ করা। -2 চেইনের শক্তি 1: নীচে নেমে এসেছে -8 -> 4 -> -2 -> 1। আমরা যদি একটি আঘাত 1, গ্রহণ। আঘাত করার আগে যদি আমরা একটি বিজোড় সংখ্যা হিট করি তবে তা 1প্রত্যাখ্যান করুন। আমাদেরও প্রত্যাখ্যান করা দরকার 0, যা চিরকাল নিজের কাছে চলে যায়।

while n>>1:Loops পর্যন্ত n0 বা 1. যখন লুপ বিরতি হয় nনিজেই ফিরিয়ে দেওয়া হয়, এবং 1একটি Truthy আউটপুট এবং 0একটি Falsey করুন। লুপের অভ্যন্তরে, আমরা বারবার প্রয়োগ প্রত্যাখ্যান করি n -> n/-2এবং কোনও বিজোড় প্রত্যাখ্যান করি n

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


খুশী হলাম। অ্যালগরিদমে চতুর যুক্তি এবং বিট অপারেশনে শর্তাবলীর সমন্বিত ভাল কাজ। এছাড়াও, নিশ্চিত করতে পারেন,
জেসন সি

এর while n&1বদলে কেন if n&1?
মার্ক র্যানসম

2
@MarkRansom চ্যালেঞ্জ অনুমতি দেয় না if
xnor

আহা, যে মিস। খুব চতুর প্রতিস্থাপন।
মার্ক রান্সম

1
@ এভসনওয়ুডার্ড স্কোরিংটি কোডে অপারেটরগুলির সংখ্যা, মৃত্যুদন্ড কার্যকর হওয়ার সময় তাদের কাছে কলগুলির সংখ্যা নয়, যা ইনপুটটির উপর নির্ভর করে: "এটি পারমাণবিক-কোড-গল্ফ Your আপনার স্কোরটি আপনার কোডে উপস্থিত মোট অপারেশন সংখ্যা । "
xnor

11

মরচে, 14 12 টি অপারেশন (কোনও লুপ নেই)

আতঙ্কের পরিবর্তে অপ্টিমাইজেশন ( -O) বা -C overflow-checks=noউপচে পড়া বিয়োগফল সক্ষম করতে হবে।

fn is_power_of_negative_2(input: i64) -> i64 {
    let sign = input >> 63;
    // 1 op
    let abs_input = (input ^ sign) - sign;
    // 2 ops
    let bad_power_of_two = sign ^ -0x5555_5555_5555_5556; // == 0xaaaa_aaaa_aaaa_aaaa
    // 1 op
    let is_not_power_of_n2 = abs_input & ((abs_input - 1) | bad_power_of_two);
    // 3 ops 
    let is_not_power_of_n2 = (is_not_power_of_n2 | -is_not_power_of_n2) >> 63;
    // 3 ops 
    input & !is_not_power_of_n2
    // 2 ops
}

(স্পষ্ট করার জন্য: এখানে !xকিছুটা দিকনির্দেশনা নেই, যৌক্তিক নয় -

পরীক্ষার কেস:

#[test]
fn test_is_power_of_negative_2() {
    let mut value = 1;
    for _ in 0 .. 64 {
        assert_ne!(0, is_power_of_negative_2(value), "wrong: {} should return nonzero", value);
        value *= -2;
    }
}

#[test]
fn test_not_power_of_negative_2() {
    for i in &[0, -1, 2, 3, -3, -4, 5, -5, 6, -6, 7, -7, 8, 1<<61, -1<<62, 2554790084739629493, -4676986601000636537] {
        assert_eq!(0, is_power_of_negative_2(*i), "wrong: {} should return zero", i);
    }
}

এটি অনলাইন চেষ্টা করুন!


| X | কিনা তা যাচাই করে নেওয়া উচিত 2 এর একটি শক্তি ( (y & (y - 1)) == 0যথারীতি ব্যবহার করে )। তাহলে এক্স 2 একটি ক্ষমতা, তাহলে আমরা আরও চেক (1) যখন x >= 02 একটি এমনকি ক্ষমতা, এটি হওয়া উচিত, বা (2) যখন x < 02. একটি বিজোড় ক্ষমতা, এটি হওয়া উচিত আমরা এই পরীক্ষা &-ing " bad_power_of_two"0x মাস্ক ... আআআএ যখন x >= 0(কেবলমাত্র একটি সমান শক্তি তখন 0 উত্পাদন করে), বা 0x… 5555 কখন x < 0


~((r | -r) >> 63)আমার উত্তর ঠিক করা শেষ করার জন্য আমি আপনার কৌশলটি চুরি করেছি।
orlp

6

হাস্কেল, 2 3 অপারেশন

import Data.Bits (.&.)

f 0 = False
f 1 = True
f n | n .&. 1 == 0 = f (n `div` -2)
f n | otherwise    = False

একটি পুনরাবৃত্তি ফাংশন সংজ্ঞায়িত করে f(n)। ব্যবহৃত অপারেশনগুলি হ'ল ফাংশন কল ( f), বিভাগ ( div) এবং বিটওয়াইস এবং ( .&.)।

হাস্কেলের কোনও লুপ স্টেটমেন্ট নেই: এই কারণে লুপ নেই:


4
আমি কেন অবাক হই না যে কোনও লুপ ব্যবহার না করে হাস্কেল সমাধানটি "অফারকুনিস্ট" নামে কেউ সরবরাহ করেছেন? =)
আমটন কর্ট - মনিকা পুনরায়

1
আমি খুব সম্পর্কে দ্বিধাগ্রস্ত f 0, f 1, f n ...এখানে, কারণ তারা মূলত হয় if'ছদ্মবেশে গুলি, যদিও তারপর আবার, আমি অনুমতি হয়নি while+ + breakএবং তাড়াতাড়ি returnগুলি, তাই এটি ন্যায্য বলে মনে হয়। যদিও এটি আমার নিয়মের সেটটি অজান্তেই ব্যাখ্যা ব্যাখ্যার জন্য উন্মুক্ত রেখে দেওয়া হচ্ছে বলে মনে হচ্ছে, এটি একটি দুর্দান্ত সমাধান।
জেসন সি

3
বিশেষত |sগুলি বিশেষত বাতাসে রয়েছে। এটি বলেছিল, এটি কম-বিতর্কিত উপায়ে একটি নির্দিষ্ট নিয়ম লঙ্ঘন করে: তুলনা ==অনুমোদিত নয়। উল্লেখ্য, যদি এই কোড আমার ব্যাখ্যা সঠিক হলে Booleans ব্যবহার এখানে যে নেই তাদের জায়গায় নির্বিচারে পূর্ণসংখ্যা মান বদলে ফলাফল পরিবর্তন বলে মনে হচ্ছে না যেমন গ্রহণযোগ্য প্রদর্শিত, এবং তারা একটি চূড়ান্ত উপস্থাপনা ফর্মের আরো।
জেসন সি

@ জেসনসি আমি কেবলমাত্র ব্যবহার করছি ==কারণ হাস্কেলের Intকাছে Boolবা "সত্যবাদী" থেকে cast ালার কোনও উপায় নেই । প্যাটার্ন মিল এবং রক্ষকরা "না if" র বিধি লঙ্ঘন করছে কিনা তা আপনার কল ;-)
সুযোগ

18
প্যাটার্ন মিলের সাথে, আপনি 0 টি অপারেশন ব্যবহার করে সমস্ত 64-বিট পূর্ণসংখ্যার ফলাফলগুলি হার্ডকোড করতে পারেন।
xnor

5

পাইথন 3, 10 বা 11 9 টি অপারেশন

def g(x):
 while x:
  while 1 - (1 + ~int(x - -2 * int(float(x) / -2))) & 1: x /= -2
  break
 while int(1-x):
     return 0
 return 5  # or any other value

রিটার্নস 5সব শক্তিগুলি -2, 0অন্যথায়


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

5

সি, 5 অপারেশন

long long f(long long x){
    x=x ^ ((x & 0xaaaaaaaaaaaaaaaa) * 6);
    while(x){
        while(x&(x-1))
            return 0;
        return 1;
    }
    return 0;
}

সি, 10 অপারেশন, লুপ ছাড়াই

long long f(long long x){
    x = x ^ ((x & 0xaaaaaaaaaaaaaaaa) * 6);
    long long t = x & (x-1);
    return (((t-1) & ~t) >> 63) * x;
}

সি, 1 অপারেশন

long long f(long long x){
    long long a0=1, a1=-2, a2=4, a3=-8, a4=16, a5=-32, a6=64, a7=-128, a8=256, a9=-512, a10=1024, a11=-2048, a12=4096, a13=-8192, a14=16384, a15=-32768, a16=65536, a17=-131072, a18=262144, a19=-524288, a20=1048576, a21=-2097152, a22=4194304, a23=-8388608, a24=16777216, a25=-33554432, a26=67108864, a27=-134217728, a28=268435456, a29=-536870912, a30=1073741824, a31=-2147483648, a32=4294967296, a33=-8589934592, a34=17179869184, a35=-34359738368, a36=68719476736, a37=-137438953472, a38=274877906944, a39=-549755813888, a40=1099511627776, a41=-2199023255552, a42=4398046511104, a43=-8796093022208, a44=17592186044416, a45=-35184372088832, a46=70368744177664, a47=-140737488355328, a48=281474976710656, a49=-562949953421312, a50=1125899906842624, a51=-2251799813685248, a52=4503599627370496, a53=-9007199254740992, a54=18014398509481984, a55=-36028797018963968, a56=72057594037927936, a57=-144115188075855872, a58=288230376151711744, a59=-576460752303423488, a60=1152921504606846976, a61=-2305843009213693952, a62=4611686018427387904, a63=-9223372036854775807-1, a64=0;
    while(a0){
        long long t = x ^ a0;
        long long f = 1;
        while(t){
            f = 0;
            t = 0;
        }
        while(f)
            return 1;
        a0=a1; a1=a2; a2=a3; a3=a4; a4=a5; a5=a6; a6=a7; a7=a8; a8=a9; a9=a10; a10=a11; a11=a12; a12=a13; a13=a14; a14=a15; a15=a16; a16=a17; a17=a18; a18=a19; a19=a20; a20=a21; a21=a22; a22=a23; a23=a24; a24=a25; a25=a26; a26=a27; a27=a28; a28=a29; a29=a30; a30=a31; a31=a32; a32=a33; a33=a34; a34=a35; a35=a36; a36=a37; a37=a38; a38=a39; a39=a40; a40=a41; a41=a42; a42=a43; a43=a44; a44=a45; a45=a46; a46=a47; a47=a48; a48=a49; a49=a50; a50=a51; a51=a52; a52=a53; a53=a54; a54=a55; a55=a56; a56=a57; a57=a58; a58=a59; a59=a60; a60=a61; a61=a62; a62=a63; a63=a64;
    }
    return 0;
}

2
ওহ মানুষ, শেষটি কেবল খারাপ is খুশী হলাম।
জেসন সি

4

সমাবেশ, 1 অপারেশন

.data

    .space 1         , 1 # (-2)^31
    .space 1610612735, 0
    .space 1         , 1 # (-2)^29
    .space 402653183 , 0
    .space 1         , 1 # (-2)^27
    .space 100663295 , 0
    .space 1         , 1 # (-2)^25
    .space 25165823  , 0
    .space 1         , 1 # (-2)^23
    .space 6291455   , 0
    .space 1         , 1 # (-2)^21
    .space 1572863   , 0
    .space 1         , 1 # (-2)^19
    .space 393215    , 0
    .space 1         , 1 # (-2)^17
    .space 98303     , 0
    .space 1         , 1 # (-2)^15
    .space 24575     , 0
    .space 1         , 1 # (-2)^13
    .space 6143      , 0
    .space 1         , 1 # (-2)^11
    .space 1535      , 0
    .space 1         , 1 # (-2)^9
    .space 383       , 0
    .space 1         , 1 # (-2)^7
    .space 95        , 0
    .space 1         , 1 # (-2)^5 = -32
    .space 23        , 0
    .space 1         , 1 # (-2)^3 = -8
    .space 5         , 0
    .space 1         , 1 # (-2)^1 = -2
    .space 1         , 0
dataZero:
    .space 1         , 0
    .space 1         , 1 # (-2)^0 = 1
    .space 2         , 0
    .space 1         , 1 # (-2)^2 = 4
    .space 11        , 0
    .space 1         , 1 # (-2)^4 = 16
    .space 47        , 0
    .space 1         , 1 # (-2)^6 = 64
    .space 191       , 0
    .space 1         , 1 # (-2)^8
    .space 767       , 0
    .space 1         , 1 # (-2)^10
    .space 3071      , 0
    .space 1         , 1 # (-2)^12
    .space 12287     , 0
    .space 1         , 1 # (-2)^14
    .space 49151     , 0
    .space 1         , 1 # (-2)^16
    .space 196607    , 0
    .space 1         , 1 # (-2)^18
    .space 786431    , 0
    .space 1         , 1 # (-2)^20
    .space 3145727   , 0
    .space 1         , 1 # (-2)^22
    .space 12582911  , 0
    .space 1         , 1 # (-2)^24
    .space 50331647  , 0
    .space 1         , 1 # (-2)^26
    .space 201326591 , 0
    .space 1         , 1 # (-2)^28
    .space 805306367 , 0
    .space 1         , 1 # (-2)^30
    .space 3221225471, 0
    .space 1         , 1 # (-2)^32

.globl isPowNeg2
isPowNeg2:
    movl dataZero(%edi), %eax
    ret

সংখ্যাটি ২ এর পাওয়ার কিনা কিনা তা খুঁজে পেতে একটি বিশাল সন্ধানের টেবিল ব্যবহার করে আপনি এটি 64৪ বিটগুলিতে প্রসারিত করতে পারেন, তবে কম্পিউটারের সন্ধানের জন্য এতগুলি ডেটা পাঠকের অনুশীলন হিসাবে রেখে দেওয়া হয়েছে :- পি


1
সারণি সূচীকরণ অনুমোদিত অনুমতিগুলির মধ্যে একটি নয়।
আর ..

1
এছাড়াও এটি 64 বিটগুলিতে স্পষ্ট নয় tens :-)
আর ..

প্রকৃতপক্ষে, একটি সারণী সূচীকরণ বর্তমান নিয়মের অধীনে অনুমোদিত হওয়ার ইচ্ছা ছিল না । আমি "আপনি ভেরিয়েবলগুলি ঘোষণা করতে পারেন" এবং "আপনি পূর্ণসংখ্যার আক্ষরিক উল্লেখ করতে পারেন" কে স্কেলারের অভিপ্রায় দিয়ে নির্দিষ্ট করেছেন এবং শব্দার্থগতভাবে এটি একটি অ্যারে (এবং প্যাডেন্টালি বলতে বলতে আমি অ্যারের প্রকারগুলিকে অনুমতি দেয়নি এবং আমি কোনওরূপে কোনওরূপে ইনডেক্সিংকে অনুমতিও দিইনি) অপারেশনস যদিও আপনি এ্যাসেম্বেলারের প্রসঙ্গে এটি "সংযোজন" বলতে পারেন) তবে আপনি যে সুযোগসুবিধে হয়ে আছেন ... :)
জেসন সি

3

সি, 31 অপারেশন

সরাসরি নমুনা

আমার ধারণাটি সহজ, এটি যদি দুটি শক্তি হয় তবে তার লগটি যদি এমনকি হয় তবে এটি ইতিবাচক হতে হবে, অন্যথায় এটির লগটি বিজোড় হতে হবে।

int isPositive(int x) // 6
{
    return ((~x & (~x + 1)) >> 31) & 1;
}

int isPowerOfTwo(int x) // 5
{
    return isPositive(x) & ~(x & (x-1));
}

int log2(int x) // 3
{
    int i = (-1);

    while(isPositive(x))
    {
        i  += 1;
        x >>= 1;
    }

    return i;
}

int isPowerOfNegativeTwo(int x) // 17
{
    return (  isPositive(x) &  isPowerOfTwo(x) & ~(log2(x) % 2) )
         | ( ~isPositive(x) & isPowerOfTwo(-x) & (log2(-x) % 2) );
}

1
আপনি যা ভাবেন তার চেয়ে ভাল আপনি করেছেন। একটি ফাংশন কল কেবল 1 হিসাবে গণ্য হয়, ফাংশনে অপারেটরের সংখ্যা হিসাবে নয়। সুতরাং, যদি আমি সঠিকভাবে গণনা করেছি (ডাবল চেক) আপনার কাছে পাওয়ার জন্য + 5 এর জন্য পাওয়ার পাওয়ারফট দুটি জন্য লগ 2 + 17 এর জন্য পাওয়ারপুট অফটুই = 31 এর জন্য
জেসন সি

1

সি, 7 অপারেশন

int64_t is_power_of_neg2(int64_t n)
{
    int64_t x = n&-n;
    while (x^n) {
        while (x^-n)
            return 0;
        return x & 0xaaaaaaaaaaaaaaaa;
    }
    return x & 0x5555555555555555;
}

বা:

সি, 13 লুপ-অ-শর্ত ছাড়াই অপারেশন

int64_t is_power_of_neg2(int64_t n)
{
    int64_t s = ~(n>>63);
    int64_t a = ((n/2)^s)-s;
    int64_t x = n&-(uint64_t)n; // Cast to define - on INT64_MIN.
    return ~(a/x >> 63) & x & (0xaaaaaaaaaaaaaaaa^s);
}

ব্যাখ্যা:

  • n&-nএর সর্বনিম্ন সেট বিট দেয় n
  • aঅবহেলিত পরম মান হ'ল n/2অগত্যা নেতিবাচক কারণ /2অবহেলা ওভারফ্লোকে অন্তর্ভুক্ত করে।
  • a/xaদুজনের সঠিক শক্তি হলেই শূন্য হয়; অন্যথায় কমপক্ষে অন্য একটি বিট সেট করা আছে এবং এটি xসর্বনিম্ন বিটের চেয়ে উচ্চতর , এটি নেতিবাচক ফলাফল দেয়।
  • ~(a/x >> 63)তারপরে বিটমাস্ক দেয় যা সর্বজনীন হয় nবা যদি -nদুটি হয় তবে অন্যথায় সমস্ত শূন্য হয়।
  • ^sএটি মাস্টের উপর প্রয়োগ করে প্রয়োগ করা হয় এটি সশব্দ nকিনা তা দেখতে সাইন সন্ধান করতে -2

1

পিএইচপি, 3 অপারেশন

তিনটি এবং ifনিষিদ্ধ করা হয়; সুতরাং আসুন আপত্তি while:

function f($n)
{
    while ($n>>1)               # 1. ">>1"
    {
        while ($n&1)            # 2. "&1"
            return 0;
        return f($n/-2|0);      # 3. "/-2" ("|0" to turn it into integer division)
    }
    return $n;
}
  1. $n>>1: যদি নম্বর 0 বা 1 হয়, রিটার্ন নম্বর
  2. $n&1: যদি সংখ্যাটি বিজোড় হয় তবে 0 এ ফিরে আসুন
  3. অন্য পরীক্ষা $n/-2(অন্তর্ভুক্ত করা হয়েছে)

0

জাভাস্ক্রিপ্ট ES6, 7 অপারেশন

x=>{
  while(x&1^1&x/x){
    x/=-2;x=x|0
  }
  while(x&0xfffffffe)x-=x
  return x
}

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

while(x&1^1&x/x)

যদিও x! = 0 এবং x% 2 == 0 4 অপ্স
x / x 1 সমান তাই লম্বা x 0 নয় (0/0 নাএন দেয় যা মিথ্যা হিসাবে মূল্যায়ন করা হয়)
এবং বিটওয়াইস এবং
x এবং 1 ^ 1 সমান 1 যদি x সমান (x এবং 1) xor 1 হয়

x/=-2;x=x|0

এই প্রশ্নটি 1 অপ্ট দ্বারা সংজ্ঞায়িত বিভাগের ফর্ম

while(x&0xfffffffe)  

X! = 1 এবং x! = 0 1 অপারেটিংয়ের
শর্তটি যখন x == 0 বা x == 1 হিসাবে প্রস্থান করা দরকার তখন যে দুটি ফেরতের মান এবং একটি অসীম লুপ প্রবেশ করানো ফলপ্রসূ হবে না। এটি তাত্ত্বিকভাবে হেক্সাডেসিমাল সংখ্যা বাড়িয়ে বৃহত্তর মানগুলির জন্য বাড়ানো যেতে পারে। বর্তমানে ± 2 ^ 32-1 অবধি কাজ করে

x-=x

X থেকে 0 1 op সেট করুন
আমি 0 অপ্সের জন্য 0 রিটার্ন ব্যবহার করতে পারতাম, আমি অনুভব করেছি যে অন্য বিবৃতিতে ভেঙে আসা লুপটি প্রতারণার মতো অনুভব করে।

return x

এক্স প্রদান করে (1 -2 এর পাওয়ার হলে 1, অন্যথায় 0)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.