আমি কি কুলেন নম্বর?


25

একটি কুলেন নম্বর হ'ল যে কোনও সংখ্যা যা সূত্রটি ব্যবহার করে তৈরি অনুক্রমের মধ্যে থাকে:

সি (এন) = (এন * 2 ^ n) +1।

তোমার কাজ:

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা কোনও ইনপুট গ্রহণ করে এবং ইনপুটটি কুলেন নম্বর কিনা তার উপর ভিত্তি করে সত্যবাদী / মিথ্যা মান দেয়।

ইনপুট:

0 এবং 10 ^ 9 (সমেত) এর মধ্যে একটি অ-নেতিবাচক পূর্ণসংখ্যা।

আউটপুট:

সত্যবাদী / মিথ্যা মান যা ইনপুটটি কুলেন সংখ্যা কিনা তা নির্দেশ করে।

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

Input:    Output:
1   --->  truthy
3   --->  truthy
5   --->  falsy
9   --->  truthy
12  --->  falsy
25  --->  truthy

স্কোরিং:

এটি , তাই বাইট জিতে সর্বনিম্ন স্কোর।


1
এন এর পরিসর কত ? বিশেষত, 1 একটি কুলেন সংখ্যা?

3
@ ais523 অনুযায়ী OEIS , এটা। n0-ভিত্তিক বলে মনে হচ্ছে।
স্টেইনবার্গ

যথেষ্ট ফর্সা। শুধু জানতে কিনা আমার জেলি উত্তর একটি থাকতে হবে প্রয়োজনীয় বা Rতাতে :-)


উম্ম, ডাউনটাতে কি আছে?
গ্রিফন - মনিকা

উত্তর:



16

x86_64 মেশিন কোড ( সিস্টেম ভি এবিআই ), 28 27 বাইট

-1 বাইটকে ধন্যবাদ @ কোডি গ্রে, ধন্যবাদ!

একটি ধ্রুবক সময় অ্যালগরিদম!

_cullen:
   0:   0f bd cf    bsrl    %edi, %ecx
   3:   0f bd c1    bsrl    %ecx, %eax
   6:   89 ca       movl    %ecx, %edx
   8:   29 c2       subl    %eax, %edx
   a:   0f bd c2    bsrl    %edx, %eax
   d:   29 c1       subl    %eax, %ecx
   f:   d3 e1       shll    %cl, %ecx
  11:   ff c1       incl    %ecx
  13:   31 c0       xorl    %eax, %eax
  15:   39 f9       cmpl    %edi, %ecx
  17:   0f 94 c0    sete    %al
  1a:   c3          retq

ব্যাখ্যা:

যাক Y একটি পূর্ণসংখ্যা এবং x=y*2^y + 1। টেকিং লগ, আমরা আছে y + log2(y) = log2(x-1)এভাবে y=log2(x-1)-log2(y)। Y এর মান পিছনে প্লাগ করে আমরা পাই y=log2(x-1)-log2(log2(x-1)-log2(y))। এই আরো এক সময় এরকম, আমরা প্রাপ্ত: y=log2(x-1)-log2[log2(x-1)-log2(log2(x-1)-log2(log2(x-1)-log2(y)))]

আসুন আমরা সর্বশেষ শর্তাদি সরিয়ে ফেলি (এর আদেশ অনুসারে log2(log2(log2(log2(x)))), এটি নিরাপদ হওয়া উচিত!), এবং ধরে নিই যে x-1≈xআমরা পেয়েছি: y≈log2(x)-log2[log2(x)-log2(log2(x))]

এখন, লেট f(n) = floor(log2(n)), নিজে যাচাই করা যেতে পারে যে yঠিক দ্বারা উদ্ধার করা যেতে পারে: y=f(x)-f[f(x)-f(f(x))]জন্য Y <26 , এবং এইভাবে এক্স ⩽ 10 ^ 9 , যেমন চ্যালেঞ্জ দ্বারা নির্দিষ্ট (1)

অ্যালগরিদম তারপর কেবল কম্পিউটিং নিয়ে গঠিত Y দেওয়া এক্স , এবং যাচাই করুন যে এক্স == Y * 2 ^ Y + 1 টি । কৌশলটি হ'ল f(n)কেবল bsrনির্দেশ (বিট-স্ক্যান বিপরীত) হিসাবে প্রয়োগ করা যেতে পারে , যা এন -এর মধ্যে প্রথম 1-বিটের সূচকটি দেয় এবং y*2^yযেমন y << y

বিস্তারিত কোড:

_cullen:                                 ; int cullen(int x) {
   0:   0f bd cf    bsrl    %edi, %ecx   ;  int fx = f(x);
   3:   0f bd c1    bsrl    %ecx, %eax   ;  int ffx = f(f(x));
   6:   89 ca       movl    %ecx, %edx   
   8:   29 c2       subl    %eax, %edx   ;  int a = fx - ffx;
   a:   0f bd c2    bsrl    %edx, %eax   ;  int ffxffx = f(a);
   d:   29 c1       subl    %eax, %ecx   ;  int y = fx - ffxffx;
   f:   d3 e1       shll    %cl, %ecx    ;  int x_ = y<<y;
  11:   ff c1       incl    %ecx         ;  x_++;
  13:   31 c0       xorl    %eax, %eax
  15:   39 f9       cmpl    %edi, %ecx
  17:   0f 94 c0    sete    %al
  1a:   c3          retq                 ;  return (x_ == x);
                                         ; }

(1) বাস্তবে, এই সমতা 50000 অবধি y এর মান ধারণ করে ।


4
হ্যাঁ, আমি নিশ্চিত যে এই চ্যালেঞ্জের জন্য এটি সবচেয়ে আকর্ষণীয় কোড হিসাবে যোগ্যতা অর্জন করে pretty +1
গ্রিফন - মনিকা

1
প্রাক-এক্সওরিং eaxআপনাকে movzbl1 বাইট সংরক্ষণের অনুমতি দেয় eliminate আপনার আগে এক্সওআর করা দরকার cmplতাই এটি পতাকাগুলি নিবিড়ভাবে না ফেলে তবে অবশ্যই এটি ঠিক আছে কারণ এর পরে কিছুই নির্ভর করে না eax। অথবা, আপনি কেবল সিদ্ধান্ত নিতে পারেন যে পদ্ধতিটি কেবল নীচের 8 টি বিটগুলিতে একটি বুলিয়ান দেয়, সমস্ত 3 বাইট সংরক্ষণ করে!
কোডি গ্রে

@ কোডি গ্রে আসলেই, আপনাকে অনেক ধন্যবাদ :)
ইয়োন

7

জেলি , 7 6 বাইট

Ḷæ«`i’

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

কমান্ড-লাইন আর্গুমেন্ট হিসাবে ইনপুট নেয়। যদি কোনও কুলেন নম্বর সি ( এন ) দেওয়া হয়, তবে এন +1 আউটপুট দেয় (যা জেলিতে সত্য, এটি একটি ননজারো পূর্ণসংখ্যা;; লক্ষ্য করুন যে আমরা এন ≥0 পেয়েছি কারণ ইনপুটটি একটি পূর্ণসংখ্যা এবং নেতিবাচক এন সহ কুলেন সংখ্যা কখনই পূর্ণসংখ্য হয় না) । যদি একটি নন-কুলেন নম্বর দেওয়া হয় তবে 0 প্রদান করে, যা জেলিতে মিথ্যা।

ব্যাখ্যা

Ḷæ«`i’
Ḷ        Form a range from 0 to (the input minus 1)
 æ«      Left-shift each element in the range by 
   `       itself
    i’   Look for (the input minus 1) in the resulting array

মূলত, কুলেন সংখ্যা বিয়োগের একটি অ্যারের গঠন করুন, তারপরে এতে ইনপুট বিয়োগের জন্য সন্ধান করুন। যদি ইনপুটটি একটি কুলেন নম্বর হয় তবে আমরা এটি সন্ধান করব, অন্যথায় আমরা তা করব না। নোট করুন যে অ্যারেটি ইনপুটটিতে পৌঁছানোর জন্য প্রয়োজনীয় যথেষ্ট দীর্ঘ, কারণ সি ( এন ) সর্বদা n এর চেয়ে বড় ।


7

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

নীলকে ধন্যবাদ 2 বাইট সংরক্ষণ করুন

f=(n,k,x=k<<k^1)=>x<n?f(n,-~k):x==n

ডেমো


নেই x<n?f(n,k+1):x==nকাজ করে?
নিল

@ নীল এটি নিশ্চিত করে। :-)
আর্নল্ড

+ ~ K কেন কাজ করে, যখন কে + 1 কলস্ট্যাক ওভারলোড করে?
trlkly

@trlkly মূলত, undefined+1===NaNকিন্তু -~undefined===1। আপনি এই সম্পর্কে আরও পড়তে পারেন এখানে
আর্নল্ড



3

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

for(;$argn>$c=1+2**$n*$n++;);echo$argn==$c;

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


কি $argnএকটি বিশেষ পরিবর্তনশীল? এটিকে পরিবর্তন করা থেকে $a: 6 বাইট বাঁচাতে হবে tio.run/##K8go@G9jX5BRwKWSaKtkaGaoZP0/...
Topher

@ টফর হ্যাঁ $argnউপলভ্য যদি আপনি কমান্ড লাইন থেকে পিএইচপি চালান -Rবিকল্পটি সহ
জার্গ হালসারম্যান

3

05 এ বি 1 ই , 7 বাইট

ÝDo*¹<å

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

ব্যাখ্যা:

ÝDo*¹<å Example input: 9. Stack: [9]
Ý       Range 0-input. Stack: [[0,1,2,3,4,5,6,7,8,9]]
 D      Duplicate. Stack: [[0,1,2,3,4,5,6,7,8,9],[0,1,2,3,4,5,6,7,8,9]]
  o     2** each item in the list. Stack: [[0,1,2,3,4,5,6,7,8,9], [1,2,4,8,16,32,64,128,256,512]]
   *    Multiply the two lists. Stack: [[0, 2, 8, 24, 64, 160, 384, 896, 2048, 4608]]
    ¹   Push input again. Stack: [[0, 2, 8, 24, 64, 160, 384, 896, 2048, 4608],9]
     <  Decrement. Stack: [[0, 2, 8, 24, 64, 160, 384, 896, 2048, 4608],8]
      å Is the first item of the stack in the second item? Stack: [1]
        Implicit print.

3

আর , 53 51 46 বাইট

pryr::f(x%in%lapply(0:x,function(y)(y*2^y+1)))

বেনামে ফাংশন। x[0, x] এ n এর জন্য ক্রম সি (এন) এ উত্পন্ন হয়েছে কিনা তা পরীক্ষা করে দেখুন।

জিউসেপ্পে গল্ফ করা 3 বাইট

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


x%in%...পরিবর্তে ব্যবহার any(x==...); এটি আপনাকে 4 বাইট ফেলে দেবে
জিউসেপ

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

3

সি, সি ++, জাভা, সি #, ডি: 70 বাইট

এই সমস্ত ভাষার মধ্যে মিলের কারণে, এই কোডটি প্রতিটিটির জন্য কাজ করে

int c(int n){for(int i=0;i<30;++i)if((1<<i)*i+1==n)return 1;return 0;}

আমি এবার অপটিমাইজড ডি সংস্করণটি পোস্ট করব, কিছু সুন্দর ডি-নির্দিষ্ট কৌশল ব্যবহার করা যেতে পারে।
জাকারি

সুপারিশ i=30;i--;)if(i<<i==n-1)পরিবর্তেi=0;i<30;++i)if((1<<i)*i+1==n)
ceilingcat


2

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

f=lambda n,i=0:i<<i!=n-1and f(n,i+1)

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

ক্র্যাশ / ক্রাশ না করে আউটপুটগুলি যেমন বর্তমানে এই মেটা কনসেন্সাস দ্বারা অনুমোদিত ।


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

i=0
n=input()-1
while i<<i<n:i+=1
i<<i>n<c

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

প্রস্থান কোড মাধ্যমে আউটপুট


2

আর , 26 বাইট

a=0:26;scan()%in%(1+a*2^a)

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

অন্যান্য আর উত্তর চেয়ে কিছুটা ভিন্ন পদ্ধতির ; থেকে পড়ে stdinএবং যেহেতু ইনপুটটি 0 থেকে 10 ^ 9 এর মধ্যে গ্যারান্টিযুক্ত তাই আমাদের কেবল n0 থেকে 26 এর মধ্যে পরীক্ষা করতে হবে ।


মনে নেই কখনই scan()। ভাল কাজ.
বিএলটি

2

এপিএল (ডায়ালগ) , 9 বাইট

এন = 1 এর কেসটি কাভার করার জন্য ⎕IO←0এটি অনেক সিস্টেমে ডিফল্টর প্রয়োজন ।

⊢∊1+⍳×2*⍳

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

 [হয়] এন (যুক্তি)

 একজন সদস্য

1 এক

+ যোগ

আমি ntegers 0 ... ( এন -1)

× বার

2 দুই

* এর শক্তি

আমি ntegers 0 ... ( এন -1)


সুতরাং, "বহু সিস্টেমে ডিফল্ট" এর অর্থ কি এটি বিদ্যমান ?
জাকারি

@ জ্যাচারý হ্যাঁ, ⎕IO←0অ-স্ট্যান্ডার্ড বলা ভুল হবে , কারণ প্রত্যেকবারই কোনও স্পেসিফিকেশন না রেখেই সত্যই এটি সর্বদা সেট করা থাকে।
অ্যাডম

ভাল। আমি নিশ্চিতভাবে এমওয়াইতে সেই কৌশলটি ব্যবহার করতে যাচ্ছি (এবং আমি যদি কখনও সুযোগ পাই তবে আমার কাছে নন -0 এবং নন -1 সূচক উত্স থাকতে পারে)।
জাকারি

@ জ্যাচারý এর জন্য কি সেই আসল ইনস্টল বেস / সংস্করণগুলির প্রয়োজন হবে না যেখানে এই মানগুলি ডিফল্ট হয়? যেমন SAX এ এবং এনএনজি ⎕IO←0,।
Adám

হ্যাঁ, আমি অনুমান করি। এবং আমার কাছে তিনটি আইওটা রয়েছে, তাই আমি মনে করি এটি কোনওভাবেই ব্যবহৃত হবে না।
জাকারিয়া

2

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

[n<<n|1for n in range(26)].count

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

পর্যন্ত কুলেন সংখ্যার তালিকা তৈরি করে 10^9, তারপরে এটিতে ইনপুটটি প্রদর্শিত হবে তার গণনা। ভিনসেন্টকে n<<n|1পরিবর্তে (n<<n)+12 বাইট সংরক্ষণ করার জন্য ধন্যবাদ জানাই।


আপনি n<<n|1( n<<nএমনকি হয়ে) ব্যবহার করে দুটি বাইট সংরক্ষণ করতে পারেন
ভিনসেন্ট

এটি জন্য ব্যর্থ 838860801। আপনার প্রয়োজন range(26), কারণ পরিসীমা অন্তর্ভুক্ত নয়।
mbomb007

@ mbomb007 ধন্যবাদ আমি এটি কিছুক্ষণের জন্য করেছি এবং এখনও কখনও কখনও ভুলে যাওয়ার ব্যাপ্তিগুলি ডান-এক্সক্লুসিভ।
xnor

2

ডি, 65 বাইট

এটি @ হাটসুপয়েন্টারকুনের অ্যালগরিদম থেকে ডি তে বন্দরের (মূলটি ইতিমধ্যে ডি কোড ছিল, তবে এটি ডি-নির্দিষ্ট কৌশলগুলির সাথে রয়েছে)

T c(T)(T n){for(T i;i<30;++i)if((1<<i)*i+1==n)return 1;return 0;}

কিভাবে? (ডি নির্দিষ্ট কৌশল)

ডি এর টেম্পলেট সিস্টেমটি সি ++ এর চেয়ে ছোট এবং প্রকার নির্ধারণ করতে পারে। এবং ডি ঘোষণার পরেও এর পরিবর্তনশীলগুলি ডিফল্ট হিসাবে সূচনা করে initial


1

গণিত, 30 বাইট

MemberQ[(r=Range@#-1)2^r+1,#]&

খাঁটি ফাংশন ইনপুট হিসাবে হিসাবে একটি nonnegative পূর্ণসংখ্যা গ্রহণ এবং ফিরে Trueবা False। ইনপুট হয়, তাহলে n, তারপর (r=Range@#-1)পরিবর্তনশীল সেট করে rহতে {0, 1, ..., n-1}, এবং তারপর r2^r+1vectorially প্রথম নির্ণয় nকালেন নম্বর। MemberQ[...,#]তারপরে nতালিকার কোনও উপাদান কিনা তা পরীক্ষা করে দেখুন।



1

এক্সেল ভিবিএ, 45 বাইট

বেনামে VBE অবিলম্বে উইন্ডো ফাংশন যা ঘর থেকে ইনপুট নেয় [A1]এবং ভিবিই তাত্ক্ষণিক উইন্ডোতে আউটপুট নেয়

অবশ্যই একটি পরিষ্কার মডিউলে চালানো উচিত বা i, j এর মান থাকতে হবে রানের মধ্যে 0 এর ডিফল্ট মানটিতে পুনরায় সেট করা

While j<[A1]:j=(i*2 ^ i)+1:i=i+1:Wend:?j=[A1]

ইনপুট আউটপুট

VBE তাত্ক্ষণিক উইন্ডোতে দেখা গেছে I / O

[A1]=25
While j<[A1]:j=(i*2 ^ i)+1:i=i+1:Wend:?j=[A1]
True

[A1]=1: i=0:j=0 ''# clearing module values
While j<[A1]:j=(i*2 ^ i)+1:i=i+1:Wend:?j=[A1]
True    

[A1]=5: i=0:j=0 ''# clearing module values
While j<[A1]:j=(i*2 ^ i)+1:i=i+1:Wend:?j=[A1]
False 

1

সুই-প্রোলগ, 69 বাইট

f(X)এটি সফল হয় যদি এটি কোনও মান খুঁজে পেতে পারে যেখানে এক্স = আমি * 2 ^ আই + 1। পরিসীমা ইঙ্গিতটি স্ট্যাকের জায়গার বাইরে চলে যাওয়া বন্ধ করে দেয়, তবে প্রশ্ন অনুমানে কুলেন সংখ্যার 10 up 9 অবধি পরিসরের জন্য এটি যথেষ্ট।

:-use_module(library(clpfd)).
f(X):-I in 0..30,X#=I*2^I+1,label([I]).

যেমন

f(838860801).
true


1

টিআই-বেসিক, 17 বাইট

max(Ans=seq(X2^X+1,X,0,25

ব্যাখ্যা

seq(X2^X+1,X,0,25 Generate a list of Cullen numbers in the range
Ans=              Compare the input to each element in the list, returning a list of 0 or 1
max(              Take the maximum of the list, which is 1 if any element matched

আপনি এটিতে একটি ব্যাখ্যা যুক্ত করতে চাইতে পারেন।
গ্রিফন - মনিকা

সম্পন্ন, টিপটির জন্য ধন্যবাদ।
ক্যালক 84মানিয়াক

এটি কার্যকর, তবে একটি কমান্ড-বাই-কমান্ডের ব্যাখ্যাটি সাধারণত বেশিরভাগ উত্সগুলি অর্জন করতে সহায়তা করে। আমি এই উত্তরের ব্যাখ্যা মত কিছু করতে recendend হবে । আমি জানি না কেন কেউ কেন আপনার পোস্টকে নিম্নচাপ দিয়েছে। আপনি যখন এটি করেন তখন কোনও মন্তব্য করা সাধারণ সৌজন্য বিষয়, যদিও এই ধারণাটি প্রায়শই উপেক্ষা করা হয়।
গ্রিফোন - মনিকা

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

0

কিউবিআইসি , 24 বাইট

[0,:|~a*(2^a)+1=b|_Xq}?0

ব্যাখ্যা

[0,:|           FOR a = 0 to b (input from cmd line)
~a*(2^a)+1=b    IF calculating this a results in b
|_Xq            THEN quit, printing 1
}               NEXT a
?0              We haven't quit early, so print 0 and end.

0

কে , 19 বাইট

{&1=x-{x**/x#2}'!x}

এটি অনলাইনে চেষ্টা করুন। সত্যবাদী এটির মধ্যে একটি নম্বর সহ একটি অ্যারে: ,3বা এটি সেটার ,0। মিথ্যা হ'ল একটি খালি অ্যারে: ()বা !0আপনার অনুবাদকের উপর নির্ভর করে।



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