क्या मैं एक कुलेन नंबर हूँ?


25

कुलेन नंबर वह संख्या है जो सूत्र का उपयोग करके उत्पन्न अनुक्रम में निहित है:

C (n) = (n * 2 ^ n) +1।

आपका कार्य:

एक प्रोग्राम या फ़ंक्शन लिखें जो एक इनपुट प्राप्त करता है और एक सत्य / मिथ्या मूल्य पर आधारित है कि इनपुट एक कुलेन नंबर है।

इनपुट:

0 और 10 ^ 9 (समावेशी) के बीच एक गैर-नकारात्मक पूर्णांक।

आउटपुट:

एक सत्य / मिथ्या मूल्य जो इंगित करता है कि इनपुट एक कुलेन नंबर है।

परीक्षण के मामलों:

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

स्कोरिंग:

यह , इसलिए बाइट्स में सबसे कम स्कोर जीतता है।


1
N की सीमा क्या है ? विशेष रूप से, 1 एक कुलेन नंबर है?

3
@ A55 OEIS के अनुसार , यह है। n0-आधारित होने लगता है।
स्टीनबेरग

काफी उचित। बस यह जानने की जरूरत है कि क्या मेरे जेली उत्तर में एक होना चाहिए या R:-) :-)


उम्म, क्या गिरावट के साथ है?
ग्रिफन - मोनिका

जवाबों:



16

x86_64 मशीन कोड ( सिस्टम V ABI ), 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 + 1y + 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 के लिए , और इस प्रकार x as 10 ^ 9 , जैसा कि चुनौती (1) द्वारा निर्दिष्ट किया गया है ।

एल्गोरिथ्म में केवल कंप्यूटिंग y दिए गए x होते हैं , और उस x == y * 2 ^ y + 1 को सत्यापित करते हैं । चाल यह है कि f(n)बस bsrनिर्देश (बिट-स्कैन रिवर्स) के रूप में लागू किया जा सकता है , जो पहले 1-बिट के सूचकांक को n और, के 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);
                                         ; }

(१) वास्तव में, यह समानता ५०००० तक y के मूल्यों के लिए धारण करती है ।


4
खैर, मुझे पूरा यकीन है कि यह इस चुनौती के लिए अब तक का सबसे दिलचस्प कोड है। +1
ग्रिफ़ॉन - मोनिका

1
प्री-एक्सओआरिंग eaxआपको movzbl1 बाइट की बचत करते हुए खत्म करने की अनुमति देगा । आपको XOR करने से पहले cmplयह करने की आवश्यकता होगी ताकि यह झंडे को उलझाए नहीं, लेकिन यह पूरी तरह से ठीक है क्योंकि कुछ भी निर्भर नहीं करता है eax। या, आप बस यह तय कर सकते हैं कि विधि केवल 8 बिट्स में एक बूलियन लौटाती है, जिससे सभी 3 बाइट्स बचती हैं!
कोड़ी ग्रे

@CodyGray वास्तव में, बहुत बहुत धन्यवाद :)
योएन

7

जेली , 7 6 बाइट्स

Ḷæ«`i’

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

कमांड-लाइन तर्क के रूप में इनपुट लेता है। यदि Cullen नंबर C ( n ) दिया जाता है , तो n +1 आउटपुट होता है (जो कि जेली में सत्य है, एक नॉनो पूर्णांक होने के नाते; ध्यान दें कि हमारे पास n because0 है क्योंकि इनपुट एक पूर्णांक है, और नकारात्मक n वाले Cullen नंबर कभी पूर्णांक नहीं हैं) । यदि एक गैर-कुलेन नंबर दिया जाता है, तो रिटर्न 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

मूल रूप से, कलन संख्याओं को घटाकर एक सरणी बनाएं, फिर उसमें इनपुट ऋण एक की तलाश करें। यदि इनपुट एक कुलेन नंबर है, तो हम इसे ढूंढ लेंगे, अन्यथा हम नहीं करेंगे। ध्यान दें कि इनपुट तक पहुंचने के लिए सरणी आवश्यक रूप से लंबी है, क्योंकि C ( n ) हमेशा n से अधिक होती है ।


7

जावास्क्रिप्ट (ईएस 6), 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 काम क्यों करता है, जबकि k + 1 कॉलस्टैक को ओवरलोड करता है?
त्रिकली

@trlkly मूल रूप से, undefined+1===NaNलेकिन -~undefined===1। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं
अरनुलद


3

ओम , 8 बाइट्स

@Dº*≥Dlε

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

           Implicit input
@          Range [1,...,Input]
 D         Duplicate
  º        2^n each element
   *       Multiply those two array
    ≥      Increment everything (now I have an array of all Cullen Numbers)
     Dl    Push array length (= get input again, can't get again implicitly or using a function because it would be a string so I'd waste a byte again)
       ε   Is input in array?

3

PHP , 43 बाइट्स

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

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


है $argnएक विशेष चर? इसे बदलने के लिए $a: 6 बाइट्स की बचत होगी tio.run/##K8go@G9jX5BRwKWSaKtkaGaoZP0/...
Topher

$argnयदि आप कमांड लाइन से PHP को -Rऑप्शन के साथ चलाते हैं तो @topher Yes उपलब्ध है
Jörg Hülsermann

3

05AB1E , 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] में।

3 बाइट्स ग्यूसेप द्वारा गढ़ा गया।

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


के x%in%...बजाय का उपयोग करें any(x==...); कि तुम 4 बाइट छोड़ देंगे
Giuseppe

इसलिए अगर मैं इसे lapplyकेवल सदिश की जाँच करने के लिए बदलकर गोल्फ करता हूं , और scanफ़ंक्शन तर्क लेने के बजाय उपयोग करता हूं - मुझे @giuseppe का उत्तर मिलता है। इसे अलग से पोस्ट करने के लिए धन्यवाद, इसलिए मैं देख सकता हूं कि मैं क्या याद कर रहा हूं - मैं अपने दम पर कुछ कोशिश करके अधिक सीखता हूं, भले ही मैं आमतौर पर हार जाता हूं।
BLT

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)
छत


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()। अच्छा कार्य।
BLT

2

एपीएल (डायलॉग) , 9 बाइट्स

N = 1 के मामले को कवर करने के लिए , यह आवश्यक है ⎕IO←0जो कई प्रणालियों पर डिफ़ॉल्ट है।

⊢∊1+⍳×2*⍳

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

 [] एन (तर्क)

 का एक सदस्य

1 एक

+ प्लस

मैं ntegers 0 ... ( एन -1)

× बार

2 दो

* की शक्ति को

मैं ntegers 0 ... ( एन -1)


तो, "कई प्रणालियों पर डिफ़ॉल्ट" का अर्थ है कि यह अभी मौजूद है ?
ज़ाचारि

@ Zacharý हाँ, ⎕IO←0गैर-मानक को कॉल करना गलत होगा , क्योंकि वास्तव में हमेशा ऐसा ही होता है, जैसे कि हर बार कोई विनिर्देशन आवश्यक नहीं है।
आदम

कुंआ। अगर मुझे कभी मौका मिले तो मैं उस ट्रिक का इस्तेमाल MY में करूंगा (और MY में नॉन-0 और नॉन -1 इंडेक्स ऑरिजिन हो सकता है)।
ज़ाचारि

@ Zacharý को वास्तविक संस्थापन बेस / संस्करणों की आवश्यकता नहीं होगी जहाँ वे मान डिफ़ॉल्ट हैं? SAX और NGN में उदाहरण के लिए, ⎕IO←0
22

हाँ, मुझे लगता है कि यह होगा। और मेरे पास तीन iotas हैं, इसलिए मुझे लगता है कि इसका उपयोग किसी भी तरह से नहीं किया जाएगा।
ज़ाचरी

2

पायथन 2 , 32 बाइट्स

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

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

Cullen नंबरों की सूची तक बनाता है 10^9, फिर यह बताता है कि इसमें इनपुट कितनी बार दिखाई देता है। 2 बाइट बचाने के n<<n|1बजाय विंसेंट को इंगित करने के लिए धन्यवाद (n<<n)+1


आप दो बाइट्स n<<n|1( n<<nयहां तक ​​कि) का उपयोग करके बचा सकते हैं ;
विंसेंट

इसके लिए विफल रहता है 838860801। आपको जरूरत है range(26), क्योंकि सीमा समावेशी नहीं है।
mbomb007

@ mbomb007 धन्यवाद। मैंने इसे थोड़ी देर के लिए किया है और अभी भी कभी-कभी भूल जाते हैं कि रेंज राइट-एक्सक्लूसिव हैं।
xnor

2

डी, 65 बाइट्स

यह @ HatsuPointerKun के डी के लिए एक पोर्ट है (मूल पहले से ही डी कोड था, लेकिन यह डी-विशिष्ट चाल के साथ है)

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

कैसे? (डी विशिष्ट ट्रिक्स)

D का टेम्प्लेट सिस्टम C ++ के s से छोटा है, और यह निम्न प्रकार का हो सकता है। और डी भी घोषणा पर डिफ़ॉल्ट के लिए अपने चर को इनिशियलाइज़ करता है।


1

गणितज्ञ, 30 बाइट्स

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

शुद्ध कार्य इनपुट और वापसी Trueया के रूप में एक nonnegative पूर्णांक ले रहा है False। यदि इनपुट है n, तो होने (r=Range@#-1)वाले चर rको सेट करता है {0, 1, ..., n-1}, और फिर r2^r+1सदिश रूप से पहले nकुलेन नंबरों की गणना करता है । MemberQ[...,#]फिर जाँचता है कि nसूची का एक तत्व है या नहीं ।



1

एक्सेल VBA, 45 बाइट्स

बेनामी VBE तत्काल विंडो फ़ंक्शन जो VBE तत्काल विंडो में सेल [A1]और ouputs से इनपुट लेता है

एक साफ मॉड्यूल में चलना चाहिए या मेरे लिए मान हैं, मुझे रनों के बीच 0 के डिफ़ॉल्ट मान पर रीसेट करना चाहिए

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

इनपुट आउटपुट

I / O जैसा कि VBE तत्काल विंडो में देखा गया है

[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

Swi-Prolog, 69 बाइट्स

f(X)सफल होता है अगर यह एक मूल्य पा सकता है जहां मैं X = I * 2 ^ I + 1 है। रेंज हिंट इसे स्टैक स्पेस से बाहर चलाना बंद कर देता है, लेकिन यह प्रश्न क्रम में 10 ^ 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

आप इसमें स्पष्टीकरण जोड़ना चाह सकते हैं।
ग्रिएफॉन -

हो गया, टिप के लिए धन्यवाद।
कैल्कॉमानियाक

यह काम करता है, लेकिन एक कमांड-बाय-कमांड स्पष्टीकरण आमतौर पर अधिकांश उत्थान में मदद करता है। मैं इस उत्तर पर स्पष्टीकरण की तरह कुछ करने की प्रतिज्ञा करूंगा । मुझे नहीं पता कि किसी ने आपकी पोस्ट को क्यों अस्वीकृत कर दिया। जब आप ऐसा करते हैं तो आमतौर पर एक टिप्पणी छोड़ना आम बात है, हालांकि उस विचार को अक्सर नजरअंदाज कर दिया जाता है।
ग्रिफन - मोनिका

आपका स्वागत है। मुझे याद है कि जब मैं पहली बार साइट से जुड़ा था, तो लोगों ने मुझे इस प्रकार की बातें बताई थीं। बस एहसान पर गुजर रहा है।
ग्रिफन - मोनिका

0

QBIC , 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

k , 19 बाइट्स

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

इसे ऑनलाइन आज़माएं। ट्रू में एक संख्या के साथ एक सरणी है: ,3या ,0एट वगैरह। झूठा एक खाली सरणी है: ()या !0आपके दुभाषिया पर निर्भर करता है।



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