দুইটির দুটি শক্তির যোগফল বা পার্থক্য


27

আপনার চ্যালেঞ্জ, আপনি কি এটি গ্রহণ করা চয়ন করতে পারেন, এটি একটি পূর্ণসংখ্যার দেওয়া হয়, K >= 1অ-নেতিবাচক পূর্ণসংখ্যার সন্ধান করুন Aএবং B যেমন নিম্নলিখিত দুটি শর্তের মধ্যে কমপক্ষে একটি হোল্ড করে:

  1. K = 2^A + 2^B
  2. K = 2^A - 2^B

যদি এর অস্তিত্ব না থাকে Aএবং B, আপনার প্রোগ্রামটি কোনও ফ্যাশনে আচরণ করতে পারে। (স্পষ্ট করা, Aএবং Bসমান হতে পারে।)

পরীক্ষার মামলা

একটি সংখ্যার প্রায়শই একাধিক সমাধান থাকে তবে এখানে কয়েকটি দেওয়া হল:

K => A, B
1 => 1, 0
15 => 4, 0                      ; 16 - 1 = 15
16 => 5, 4                      ; 32 - 16 = 16; also 3, 3: 8 + 8 = 16
40 => 5, 3                      ; 2^5 + 2^3 = 40
264 => 8, 3
17179867136 => 34, 11           ; 17179869184 - 2048 = 17179867136 

শেষ টেস্ট মামলা, 17179867136, 10 সেকেন্ডের অধীন চলবে কোন অপেক্ষাকৃত আধুনিক মেশিনে। এটি একটি কোড গল্ফ, তাই বাইটের মধ্যে সংক্ষিপ্ততম প্রোগ্রামটি জিতে। আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন ব্যবহার করতে পারেন।


5
ক্যান একটি সমান বি ?
ডেনিস

2
@ ডেনিস আমি দেখতে পাচ্ছি না কেন।
কনর ও'ব্রায়েন

... এবং জন্য 16উভয় 5,4এবং 3,3বৈধ।
তিতাস

আসলে এখন যে আমি এটি সম্পর্কে চিন্তা করি A, Bনেতিবাচক হতে পারে? (যেমন -1, -11 এর জন্য)
Sp3000

@ Sp3000 না, ভাল পয়েন্ট।
কনর ও ব্রায়ান

উত্তর:


3

জেলি , 11 10 বাইট

;0+N&$BL€’

@ Xnor দ্বারা পাইথন উত্তর থেকে বিট টুইডলিং ট্রিক প্রয়োগ করা

এটি ট্রাইআইটঅনলাইনে
পরীক্ষা করুন সমস্ত পরীক্ষার কেস ট্রাইআইটঅনলাইনেও রয়েছে

কিভাবে?

;0+N&$BL€’ - main link takes an argument, k, e.g 15
;0         - concatenate k with 0, e.g. [15, 0]
     $     - last two links as a monad
   N       - negate, e.g. -15
    &      - bitwise and, e.g. -15&15=1 since these two are called as a monad (one input)
  +        - add, vectorises, e.g. [16,1]
      B    - convert to binary, vectorises, e.g. [[1,0,0,0,0],[1]]
       L€  - length for each, e.g. [5,1]
         ’ - decrement, vectorises, e.g. [4,0]

15

পাইথন 2, 43 বাইট

lambda n:[len(bin((n&-n)+k))-3for k in n,0]

এটা n==2^a ± 2^bদিয়ে বলুন a>b। তারপরে, সবচেয়ে বড় পাওয়ার-অফ -2 ফ্যাক্টরটি nহ'ল 2^bএবং আমরা এটি বিট-ট্রিক ব্যবহার করে খুঁজে পেতে পারি 2^b = n&-n। এটি আমাদের গণনা করতে দেয় 2^b + n, যা উভয়ই 2^a + 2 * 2^bবা ন্যায়বিচারের সমান 2^a। উভয়রই এর সমান দৈর্ঘ্যের বিট-দৈর্ঘ্য a*। সুতরাং, আমরা তাদের বাইনারি উপস্থাপনার দৈর্ঘ্য থেকে বিট দৈর্ঘ্য n&-nএবং (n&-n)+nগণনা আউটপুট করি । পাইথন 3 প্যারেনগুলির জন্য আরও একটি বাইট দীর্ঘ for k in(n,0)]

* যদি এর 2^a + 2^bসাথে a==b+1আরও দীর্ঘ বিট-দৈর্ঘ্য থাকে তবে এটি ঠিক আছে কারণ আমরা এটির মতো ব্যাখ্যা করতে পারি 2^(a+1)-2^b


আশ্চর্যজনক - আমি কিছুটা বেহালার সন্ধান করলাম, কিন্তু এটি কার্যকর করতে পারলাম না, কেবল জেলির কাছে বন্দরে।
জোনাথন অ্যালান

ব্যবহার করে দেখুন n=4বা 8বা 16দয়া করে।
তিতাস

@ টিটাস f(2**n)ফিরে আসে (n+1,n)এবং 2**(n+1)-2**n=2**nতাই কোনও সমস্যা নেই।
জোনাথন অ্যালান

আহ ... bin()পাইথনের ফর্ম্যাটটি কী?
তিতাস

@ টিটাস এটি একটি নেতৃস্থানীয় সঙ্গে একটি স্ট্রিং 0b, সুতরাং -3
জোনাথন অ্যালান

8

জাভাস্ক্রিপ্ট (ES6), 73 বাইট

(n,[s,f,z]=/^1+(.*1)?(0*)$/.exec(n.toString(2)))=>[s.length-!!f,z.length]

বিয়োগের ক্ষেত্রে, প্রথম সংখ্যাটি বাইনারি উপস্থাপনায় অঙ্কের সংখ্যা এবং দ্বিতীয় সংখ্যাটি হ'ল পিছনের শূন্যের সংখ্যা। সংযোজনের ক্ষেত্রে, আমরা প্রথম সংখ্যা থেকে 1 বিয়োগ করি। বাইনারি উপস্থাপনাটি যদি কিছু 1 টি অনুসরণ করে 0 টি হয় তবে সংযোজনের ক্ষেত্রে ধরে নেওয়া হয় অন্যথায় বিয়োগের কেস ধরে নেওয়া হয়। @ Xnor এর সংস্করণটির 36-বাইট পোর্ট যা জাভাস্ক্রিপ্টে কেবল B≤30 এর জন্য কাজ করে:

n=>[(l=Math.log2)(n+(n&=-n))|0,l(n)]

2
@ এথ প্রডাকশন অবশ্যই, তবে আমি এটিকে 36 এ নামিয়ে দিয়েছি।
নীল

আমার খারাপ, আমি ভেবেছিলাম যে 36-বাইট সংস্করণ 17 বিলিয়ন পরীক্ষার ক্ষেত্রে কাজ করে না।
ETH প্রোডাকশনস

@ ইথ প্রডাকশনগুলি এটি হয় না, তবে তারপরেও আপনার বন্দরটি করেনি, যেমনটি আমি স্মরণ করি (মুছে ফেলার পরে মন্তব্য, দীর্ঘশ্বাস ফেলে), যেহেতু এটি বিটওয়াইজ অপারেশনগুলি ব্যবহার করে।
নীল

দুঃখিত, এটি আবার এখানে: n=>[n,0].map(k=>((n&-n)+k).toString(2).length-1)এবং দুটি সংস্করণই [34,11]শেষ পরীক্ষার ক্ষেত্রে ফিরে আসে (আমি এফএফ 48 ব্যবহার করছি)।
ETH প্রচারগুলি

@ এথ প্রডাকশন আহা, দ্বিতীয় ফলাফলটি 30 বা তার কম হলে তারা আরও সঠিকভাবে কাজ করে।
নীল

6

পার্ল, 52 49 32 বাইট

পুরানো সমাধান (49 বাইট)

এর জন্য +1 অন্তর্ভুক্ত -p

এসটিডিনে ইনপুট দিন:

pow2.pl <<< 17179867136

pow2.pl

#!/usr/bin/perl -p
$_=reverse sprintf"%b",$_;/()1(?:1+|0*)/;$_="@+"

তবে, এক্সনোরের অ্যালগরিদম ব্যবহার করে এবং একটি মোচড় যোগ করা 32 বাইট দেয়:

perl -nE 'say 13/9*log|0for$;=$_&-$_,$_+$'

শুধু কোড:

say 13/9*log|0for$;=$_&-$_,$_+$

এটি মারাত্মক বৃত্তাকার ত্রুটিতে ভুগছে কারণ 13/9 = 1.444...এটি বেশ খানিকটা উপরে 1/log 2 = 1.44269...(এটি logনিজেও একটি গোলাকার ত্রুটি রয়েছে তবে এটি এত ছোট যে আমরা এটিকে 13/9 বিশ্লেষণে গুটিয়ে রাখতে পারি)। তবে যেহেতু লগের আগে 2**big - 2** smallকোনওটি সংশোধন হয়ে 2** bigযায় এটি মেটে না এবং এর জন্য গণনাটি 2**big + 2 * 2**smallকেটে ফেলা হয় তাই নিরাপদ .. এবং সীমাটির অপর প্রান্তেও পরিসরে 2**n+2**(n-1)যথেষ্ট পরিমাণে বৃদ্ধি পায় না [0,64](আমি সঠিকভাবে পারি না &কোনও ভুল ফলাফলের দিকে এগিয়ে যাওয়ার জন্য পূর্ণসংখ্যার রেঞ্জের চেয়ে বেশি সমর্থন করুন ) (গুণক 1.5তবে বড় সংখ্যার জন্য খুব দূরে থাকবে)।


5

ব্র্যাচল্যাগ , 23 বাইট

,A:B#+.:2rz:^a{+|-}?,.=

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

এটি প্রয়োজনের তুলনায় অনেক দ্রুত, উদাহরণস্বরূপ এটি টিআইওতে এখনও 10 সেকেন্ডের নীচে

ব্যাখ্যা

এটি মূলত কোনও অপ্টিমাইজেশন ছাড়াই সূত্রের সরাসরি প্রতিলিপি:

,A:B     The list [A, B]
#+       Both A and B are greater than or equal to 0
.        Output = [A, B]
:2rz     The list [[2, A], [2, B]]
:^a      The list [2^A, 2^B]
{+|-}?   2^A + 2^B = Input OR 2^A - 2^B = Input
,.=      Assign a value to A and B which satisfy those constraints

2
দেখে মনে হচ্ছে এই চ্যালেঞ্জটি ভাষার জন্য করা হয়েছিল: ডি
কনর ও'ব্রায়ান

4

পাইথন, 69 বাইট

def f(k):b=bin(k)[::-1];return len(b)-2-(b.count('1')==2),b.find('1')

টেস্টগুলি আদর্শে রয়েছে

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


4

জাভা 7,142 ,140, 134 বাইটিস

এটি পিপিসিজিতে আমার প্রথম পোস্ট! গল্ফিং টিপসের প্রতিক্রিয়াটির জন্য আমি সত্যিই প্রশংসা করব 2 বাইট সংরক্ষণের জন্য হিমায়িত
ধন্যবাদ

void f(long n){for(int i=-1,j;i++<31;)for(j=0;j++<34;){long a=1,x=a<<i,y=a<<j;if(x+y==n|y-x==n){System.out.println(j+" "+i);return;}}}

UNGOLF

void f(long n){
    for(int i=-1,j;i++<31;)
         for(j=0;j++<34;){
          long a=1,x=a<<i,y=a<<j;
            if(x+y==n|y-x==n){
            System.out.println(j+" "+i);
        return;
        }
            }
    }

ideone


1
হাই নাম্বার নোট! বিস্মিত হওয়া থেকে আমি আর একজন ঘুরে বেড়াচ্ছি। 40=2**3+2**5উদাহরণস্বরূপ এটি কাজ করে বলে মনে হয় না । এটি দেখে, আমি দেখতে পাচ্ছি না কেন, সম্ভবত আমি প্রতিলিপি ত্রুটি করেছি ...
জোনাথন অ্যালান

1
@ জোনাথন অ্যালান এখন এটি ঠিকঠাক কাজ করে A অবশেষে বন্ধনীগুলি এই লাইনে অনুপস্থিত ছিল (যদি (a << i) + (a << জে) == এন | (এ << জে) - (একটি << আমি) == n ) এবং ধন্যবাদ.
নোট

আপনি কি এর 1জন্য ভেরিয়েবল ঘোষণার পরিবর্তে আক্ষরিক ব্যবহার করতে পারবেন না?
তিতাস

1
@ আইটিএস যদি আমি আক্ষরিক 1 ব্যবহার করি তবে এই টেস্টকেসটি (17179867136) সম্ভব হবে না কারণ আপনি যদি আক্ষরিক 1 ব্যবহার করেন তবে জাভা স্বয়ংক্রিয়ভাবে এটি একটি INT মেমরির স্থান নির্ধারণ করে।
নোট

1
আপনি আমার সাথে একসাথে ঘোষনা করতে পারেন:for(int i=-1,j;[...]
হিমায়িত

4

গণিত, 57 54 বাইট

LegionMammal978 ধন্যবাদ 3 বাইট সংরক্ষণ করা!

Do[Abs[2^a-#]==2^b&&Print@{a,b},{a,2Log@#+1},{b,0,a}]&

প্রকৃতপক্ষে সমস্ত 1 উপযুক্ত জোড় {a, b pr প্রিন্ট করে } 2Log@#+1বৃহত্তমের জন্য একটি উপরের সীমা aযা সম্ভবত ইনপুট উপস্থাপন করার সময় উপস্থিত হতে পারে #(টাইট উপরের চৌম্বকটি লগ [2 #] / লগ [2] = 1.44 ... লগ [#] + 1)। পরীক্ষার ইনপুটটিতে প্রায় তাত্ক্ষণিকভাবে চলে এবং এক-চতুর্থাংশেরও কম সময়ে (আমার নতুন তবে অফ-দ্য শেল্ফ কম্পিউটারে) 100-সংখ্যার ইনপুটগুলিতে।

1 লেটিং a1 পরিবর্তে 0 ডিফল্ট মান এ শুরু দুই বাইট সংরক্ষণ; এটি যখন ইনপুট 2 হয় তখন আউটপুট be 0,0। মিস করা যায়, তবে সেই ক্ষেত্রে আউটপুট {2,1 finds সন্ধান করে, যা যথেষ্ট ভাল।


সব * উপযুক্ত জোড়? (এছাড়াও, 3 টি বাইট সংরক্ষণের If[Abs[2^a-#]==2^b,Print@{a,b}]সাথে প্রতিস্থাপন করা Abs[2^a-#]==2^b&&Print@{a,b}যেতে পারে))
লিজিয়নম্যামাল 978

ভাল পর্যবেক্ষণ, আমি এটি পেতে! "সমস্ত *" একটি পাদটীকা ছিল, তবে এটি এখন আরও স্পষ্ট।
গ্রেগ মার্টিন

3

এমএটিএল , 23 22 বাইট

BnQ:qWtG-|ym)1)tG-|hZl

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা

B      % Implicit input. Convert to binary. Gives n digits
nQ:q   % Range [1 ... n+1]
W      % 2 raised to that, element-wise: gives [1 2 4 ... 2^(n+1)] (*)
tG-|   % Duplicate. Absolute difference with input, element-wise (**)
y      % Push a copy of (*)
m      % True for elements of (**) that are members of (*)
)      % Use as logical index to select elements from (*)
1)     % Take the first element. Gives power of the first result
tG-|   % Duplicate. Absolute difference with input. Gives power of the second result
hZl    % Concatenate. Take binary logarithm. Implicit display

3

পার্ল 6 , 41 বাইট

{.base(2).flip~~/1[1+|0*]/;$/.to,$/.from}

( পার্ল 5 উত্তর থেকে অ্যালগরিদম নির্লজ্জভাবে অনুলিপি করেছেন )

ব্যাখ্যা:

# bare block lambda with implicit parameter 「$_」
{
  # turn into binary
  # ( implicit method call on 「$_」 )
  .base(2)

  # flip the binary representation
  .flip

  ~~ # smartmatch that against:

  /
    1      # a 「1」
    [
      | 1+ # at least one 「1」
      | 0* # or any number of 「0」
    ]
  /;

  # returns a list comprised of

  # the position of the end of the match (larger of the two)
  $/.to,
  # the position of the beginning of the match
  $/.from
}

ব্যবহার:

# give it a lexical name for clarity
my &bin-sum-diff = {.base(2).flip~~/1[1+|0*]/;$/.to,$/.from}

say bin-sum-diff 15; # (4 0)
say bin-sum-diff 16; # (5 4)

say bin-sum-diff 20; # (4 2)
# 2**4==16, 2**2==4; 16+4 == 20

say bin-sum-diff 40; # (5 3)
say bin-sum-diff 264; # (8 3)
say bin-sum-diff 17179867136; # (34 11)

1

পিএইচপি, 73 বাইট

আমি জোনাথনের পাইথন 2 সলিউশনটি 54 বাইট (+13 ওভারহেড) এর জন্য অনুলিপি করতে পারতাম,
তবে ভিন্ন কিছু নিয়ে আসতে চাইতাম।

ফাইল এ সংরক্ষণ করুন, তারপরে phpবা এর সাথে সম্পাদন করুন php-cgi

<?=strlen($n=decbin($argv[1]))-!!strpos($n,'01')._.strpos(strrev($n),49);

মুদ্রণ aএবং bএকটি আন্ডারস্কোর দ্বারা পৃথক, কোনও সমাধান নেই।

স্বতন্ত্র সমাধান, 96 বাইট

<?=preg_match('#^(10*1|(1+))(0*)$#',decbin($argv[1]),$m)?strlen($m[0])-!$m[2]._.strlen($m[3]):_;

মুদ্রণ aএবং bএকটি আন্ডারস্কোর দ্বারা পৃথক; কোনও সমাধানের একমাত্র আন্ডারস্কোর।

এমনকি এটি আরও 11 টি বাইটের জন্য আপনাকে অপারেশনকে বলে:
কেবল কোডের সাথে প্রথম আন্ডারস্কোরটি প্রতিস্থাপন করুন '-+'[!$m[2]]


যদি আমি প্রতিধ্বনি স্ট্র্লিনে 67 try চেষ্টা করি ($ n = ডেকবিন ($ আরজিভি [1])) - !! স্ট্রপোস ($ n, '01 ') .'- +' [! $ N [2]] $ ঢ), 49); এটি আমাকে 6 + 0 ফেরত দেয় যা 65
জার্গ হালসারম্যান

@ জার্গএলসারম্যান: 67 এর কোনও সমাধান নেই; কোনও সমাধানের জন্য আচরণ অপরিজ্ঞাত নয়; সুতরাং এটি 67 এর জন্য কী প্রিন্ট করে তা বিবেচনা করে না
টাইটাস

0

পিএইচপি, 117 বাইট

if(preg_match("#^(1+|(10*1))0*$#",$b=decbin($k=$argv[1]),$t))echo($l=strlen($b))-($t[2]?1:0).",",$l+~strrpos($b,"1");

বর্ধিত সংস্করণ 4 কেস

$l=strlen($b=decbin($k=$argv[1]));
// Case 1: n=2(n-1)=n+n or n=n*(2-1)=2n-n 
if(preg_match('#^100*$#',$b))echo($l-2).'a+'.($l-2).':'.$l.'a-'.($l-1);
// Case 2: n-m
elseif(preg_match('#^1+0*$#',$b)){echo $l.'b-',strpos($b,"0")?$l-strpos($b,"0"):0;}
// Case 3: n+m 
elseif(preg_match('#^10*10*$#',$b))echo ($l-1).'c+',$l-strrpos($b,"1")-1;
else echo "Nothing";

সংক্ষিপ্ত সংস্করণ ইউনিয়ন কেস 1 এবং 3 এবং কেস 3 এর পার্থক্য তৈরি করে এবং উভয় সংস্করণে কেস 4 কোনও আউটপুট দেয় না।

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