डबल, XOR और इसे फिर से करें


20

हम किसी भी पूर्णांक n> 0 के लिए फ़ंक्शन g को g (n) = n XOR (n * 2) के रूप में परिभाषित करते हैं ।

यह देखते हुए x> 0 , छोटी से छोटी पूर्णांक लगता है y> 0 ऐसी है कि जी कश्मीर (y) = एक्स कुछ के लिए कश्मीर> 0

उदाहरण

x = 549

549 = 483 XOR (483 * 2)     (as binary: 1000100101 = 111100011 XOR 1111000110)
483 = 161 XOR (161 * 2)     (as binary:  111100011 =  10100001 XOR  101000010)

जिसका अर्थ है कि जी 2 (161) = 549 । हम आगे नहीं जा सकते, क्योंकि ऐसा कोई n नहीं है जो g (n) = 161 है । तो, के लिए अपेक्षित आउटपुट एक्स = 549 है y = 161

नियम

  • आप अमान्य प्रविष्टियों का समर्थन करने वाले नहीं हैं। इनपुट वैल्यू x के लिए एक जोड़ी (y, k) मौजूद होने की गारंटी है ।
  • यह , इसलिए बाइट्स में सबसे कम जवाब जीतता है!

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

     3 -->     1
     5 -->     1
     6 -->     2
     9 -->     7
    10 -->     2
    23 -->    13
    85 -->     1
   549 -->   161
   960 -->    64
  1023 -->   341
  1155 -->   213
  1542 -->     2
  9999 -->  2819
 57308 --> 19124
 57311 -->   223
983055 -->     1

3
संबंधित OEIS: A048274 जो अनुक्रम हैa(n) = g(n)
Giuseppe

जवाबों:


5

जावा 8, 68 57 53 52 बाइट्स

n->{for(int i=0;i<n;)i-=(i*2^i)==n?n=i:-1;return n;}

-5 बाइट्स @ ओलिवियरग्रेगायर के लिए धन्यवाद ।

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

स्पष्टीकरण:

n->{                 // Method with integer as both parameter and return-type
  for(int i=0;i<n;)  //  Loop `i` in the range (1,n)
    i-=(i*2^i)==n?   //   If `i*2` XOR-ed with `i` equals `n`
        n=i          //    Set `n` to `i`, and set `i` to 0 to reset the loop
       :             //   Else:
        -1;          //    Increase `i` by 1 to go to the next iteration
  return n;}         //  Return `n` after the entire loop

1
n->{for(int i=0;i<n;)i-=(i*2^i)==n?n=i:-1;return n;}(52 बाइट्स)। क्षमा करें ^ ^ '
ओलिवियर ग्रेजायर

@ OlivierGrégoire और भी स्मार्ट, धन्यवाद!
केविन क्रूज़सेन

for(int i=0;n>i-=i+i^i^n?-1:n=i;);?
टाइटस

@ टिट्स मुझे डर है कि मैं जावा में काम नहीं करने जा रहा हूं (हालांकि मैंने अपने पुनरावृत्त जावास्क्रिप्ट उत्तर में उस दृष्टिकोण का उपयोग किया है )। जावा i+i^i^n?में बूलियन नहीं है, इसलिए यह संकलन भी नहीं करेगा। इसके अलावा, n>i-=...कोष्ठक ( n>(i-=...)) की आवश्यकता होगी , और n=iत्रिगुट के अन्य-खंड में अनुमति नहीं है-यदि, केवल अगर-खंड में (यह आखिरी मुझे पता नहीं क्यों, लेकिन यह दुर्भाग्य से जावा में है )।
केविन क्रूज़सेन

1
@KevinCruijssen "और n=iternary-if के अन्य-खंड में अनुमति नहीं है"। क्योंकि जावा इसे पार्स करेगा (i-=(i*2^i)!=n?-1:n)=iजो कि अवैध है।
ओलिवियर ग्रैगोइरे


3

जावास्क्रिप्ट, 53 बाइट्स

f=x=>(i=0,y=(G=x=>x&&(i^=x&1)+2*G(x>>1))(x),i?x:f(y))

Gहै g^-1जो निर्धारित करते हैं, iकरने के लिए 0करता है, तो सफलता, सेट iकरने के लिए 1करता है, तो विफल रहा है।


1
यह वह तरीका था जिसका मैंने उपयोग करने की कोशिश की, हालांकि मैं 50-बाइट संस्करण के साथ आया था f=n=>(g=n=>n<2?0/!n:n%2+2*g(n/2^n%2))(n)?f(g(n)):n:। अफसोस की बात है कि उबाऊ दृष्टिकोण 12 बाइट्स छोटा है।
नील

3

पायथ , 13 12 10 बाइट्स

उनके सुझाव के बाद @MrXcoder, और 2 और बाइट्स के लिए 1 बाइट का धन्यवाद सहेजा गया

fqQ.W<HQxy

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

स्पष्टीकरण:

fqQ.W<HQxyZZT   Implicit: Q=eval(input()), trailing ZZT inferred

f               Return the first T in [1,2,3...] where the following is truthy
   .W       T     Functional while - loop until condition is true, starting value T
     <HQ            Condition: continue while iteration value (H) less than input
        xyZZ        Body: xor iteration value (Z) with double (y) iteration value (Z)
 qQ               Is the result of the above equal to input?

1
आप T12 बाइट्स के लिए अनुगामी छोड़ सकते हैं ।
श्री Xcoder

3

आर , 73 65 बाइट्स

f=function(x){for(i in 1:x)if(x==bitwXor(i,i*2)){i=f(i);break};i}

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

बहुत बहुत धन्यवाद Giuseppe (-8) अपने tweaks के कारण, इतना सरल अभी तक बहुत प्रभावी है


1
के रूप में तुम्हारा के पिछले जवाब करने का विरोध किया, क्योंकि इस समारोह पुनरावर्ती है, तो आप करते हैं की जरूरत है f=के बाद से समारोह आवश्यकताओं के बंधे होने के लिए fठीक से काम करने के लिए। कहा जा रहा है, अच्छा काम है, और मुझसे एक +1 ले लो!
ग्यूसेप

2
तुम भी अपने तर्क के कुछ फिर से कर सकते हैं और 65 बाइट्स के
Giuseppe


2

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

⁺¿अंतिम गैर-शून्य तत्व वापस करने के लिए उपयोग करें (धन्यवाद -1 बाइट के लिए डेनिस)

^Ḥ)i$⁺¿

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

जानवर बल फिर से जीतता है :(


1
^Ḥ)i$⁺¿एक बाइट बचाता है।
डेनिस

और यह 2x धीमी है।
user202729

2

सी (जीसीसी) , 57 56 55 51 बाइट्स

  • छत के लिए धन्यवाद एक बाइट को बचाया ; !=-
  • सहेजा एक बाइट पाँच करने के लिए धन्यवाद बाइट्स Rogem ; टर्निरी एक्सप्रेशन और gcc quirks का उपयोग करना।
X(O,R){for(R=1;R;O=R?R:O)for(R=O;--R&&(R^2*R)-O;);}

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


1
+1 के लिएX(O,R)
JayCe

@ceilingcat अच्छा सुझाव, धन्यवाद।
जोनाथन फ्रेच

for(R=1;R;O=R?R:O)एक बाइट बचाता है।

R=O;अंत में अनावश्यक प्रतीत होता है, आपको एक और 4 बाइट्स बचाता है।

@Rogem लगता है, धन्यवाद।
जोनाथन फ्रीच

2

Z80Golf , 22 बाइट्स

00000000: 1600 1803 4216 007a b830 097a 82aa b828  ....B..z.0.z...(
00000010: f314 18f3 78c9                           ....x.

पोर्ट ऑफ @ केविनक्रूजसेन के जावा उत्तर

9 के इनपुट के साथ उदाहरण! इसे ऑनलाइन आज़माएं!

85 के इनपुट के साथ उदाहरण-इसे ऑनलाइन आज़माएं!

सभा:

;d=loop counter
;b=input and output
f:
	ld d,0
	jr loop
	begin:
	ld b,d
	ld d,0
	loop:
		ld a,d
		cp b
		jr nc,end	; if d==b end
		ld a,d
		add d		; mul by 2
		xor d
		cp b
		jr z,begin	; if (d*2)^d==b set b to d
		inc d
		jr loop
	end:
	ld a,b
	ret

फ़ंक्शन को कॉल करने और परिणाम प्रिंट करने के लिए विधानसभा उदाहरण:

ld b,9 ; input to the function, in this case 9
call f
add 30h ; ASCII char '0'
call 8000h ; putchar
halt

यदि आप aइसके बजाय लूप काउंटर बनाते हैं d, तो आप दोनों बार ld d,0निर्देशों को बदल सकते हैं xor a, जो दो बाइट्स बचाता है।
मिशा लावरोव


1

जावास्क्रिप्ट (Node.js), 48 45 38 बाइट्स

f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n

-7 बाइट्स के लिए धन्यवाद @ निले मेरे निचे के पुनरावर्ती संस्करण बनाने के लिए। बड़े परीक्षण मामलों के लिए काम नहीं करता है।

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


Iterative 45 बाइट्स संस्करण जो सभी परीक्षण मामलों के लिए काम करता है:

n=>{for(i=0;i<n;)i-=i*2^i^n?-1:n=i;return n;}

मेरे जावा उत्तर का पोर्ट।
-3 बाइट्स @Arnauld को धन्यवाद ।

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


1
आप कर सकते हैं i-=i*2^i^n?-1:n=i(लेकिन दुर्भाग्य से जावा में नहीं)।
अरनुलद

जावा में बूलियन के लिए @Arnauld का अनुमान लगाया जा सकता है 1। धन्यवाद!
केविन क्रूज़सेन

1
38 बाइट्स को पुनरावर्ती लिखा गया (बड़े इनपुट के लिए काम नहीं करता है):f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n
नील

1

रूबी , 39 बाइट्स

f=->x,y=x{y<1?x:x==y^y*2?f[y]:f[x,y-1]}

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

जैसा कि पुनरावर्ती संस्करण के लिए अपेक्षित है, बाद वाले परीक्षण मामलों पर "स्टैक स्तर बहुत गहरा" के बारे में शिकायत करता है।


1

जेली , 11 9 बाइट्स

BÄḂṛḄß$Ṫ?

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

टिप्स: छोरों के बजाय पुनरावर्ती फ़ंक्शन का उपयोग करें।


बहुत तेजी से, दुर्भाग्य से जानवर बल दृष्टिकोण से हार जाता है।

ध्यान दें कि:

  • के लिए x> 0 , f (x)> x
  • popcount (f (x)) सम है, जहाँ popcount (n) n में सेट बिट्स की संख्या है ।
  • यदि n में भी पॉपकाउंट है, तो x मौजूद है जैसे कि f (x) = n
  • चलो बी (एक्स) की बाइनरी प्रतिनिधित्व हो एक्स , और पी (एल) सूची हो एल पिछले हटाया तत्व के साथ। तब B (x) B (B (f (x))) का संचित XOR है ।

तो, हम बार-बार:

  • इसकी बाइनरी प्रतिनिधित्व की गणना करें ( B)
  • तो संचित XOR ले (प्रयोग ^\या ÄḂ, वे एक ही प्रभाव है)।
  • जाँच करें कि क्या ( ?) संचित XOR की पूँछ (अंतिम तत्व) ( ) नॉनज़रो (विषम पॉपकाउंट) है
    • यदि ऐसा है, तो द्विआधारी सूची को वापस दशमलव में बदलें और पुनर्खरीद करें।
    • यदि नहीं, तो इनपुट लौटाता है ( )।

9 बाइट्स:B^\⁸Ḅß$Ṫ?
लीक नून

1

फोर्थ (gforth) , 71 बाइट्स

: f 0 begin 2dup dup 2* xor = if nip 0 else 1+ then 2dup < until drop ;

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

व्याख्या

0                 \ add an index variable to the top of the stack
begin             \ start an indefinite loop
  2dup            \ duplicate the top two stack items (n and i)
  dup 2* xor =    \ calculate i xor 2i and check if equal to n
  if nip 0        \ if equal, drop n (making i the new n) and use 0 as the new i
  else 1+         \ otherwise just increment i by 1
  then            \ end the if-statement
  2dup <          \ duplicate the top two stack items and check if n < i
until             \ if previous statement is true, end the loop
drop              \ drop i, leaving n on top of the stack

1

पर्ल 6 , 44 बाइट्स

{({first {($^a+^2*$a)==$_},^$_}...^!*).tail}

कोशिश करो

विस्तारित:

{  # bare block lambda with implicit parameter $_

  (
    # generate a sequence

    # no need to seed the sequence with $_, as the following block will
    # default to using the outer $_
    # $_, 

    { # parameter $_

      first
        {  # block with placeholder parameter $a

          ( $^a +^ 2 * $a ) # double (numeric) xor
          == $_             # is it equal to the previous value
        },

        ^$_  # Range up to and excluding the previous value ( 0..^$_ )
    }

    ...^  # keep doing that until: (and throw away last value)

    !*    # it doesn't return a trueish value

  ).tail  # return the last generated value
}



1

एफ #, 92 बाइट्स

let rec o i=
 let r=Seq.tryFind(fun x->x^^^x*2=i){1..i-1}
 if r.IsNone then i else o r.Value

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

1 से नंबर तक पुनरावर्ती जाँच करता है i-1। यदि कोई मेल है, तो उस संख्या के लिए एक छोटा चेक करें। यदि कोई मिलान नहीं है, तो इनपुट नंबर लौटाएं।


1

जावास्क्रिप्ट (Node.js) , 40 बाइट्स

f=n=>g(n)%2?n:f(g(n)/2)
g=x=>x&&x^g(x/2)

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

-1 बाइट्स के लिए धन्यवाद झबरा।

मेरे जैली जवाब का पोर्ट ।

अंत में एक भाषा है जहां यह दृष्टिकोण छोटा है ( उफ़ )। (मैंने पायथन और जावा की कोशिश की , यह काम नहीं करता है)

क्या कोई समझा सकता है कि मैं /2इसके बजाय क्यों उपयोग कर सकता हूं >>1?


1
x/2अंकगणित अंडरफ्लो के कारण काम करता है। किसी भी IEEE 754 नंबर का मूल्यांकन अंततः 0 के रूप में किया जाएगा जब 2 पर्याप्त समय से विभाजित किया जाएगा। (और XOR'd होने पर दशमलव भाग को केवल अनदेखा कर दिया जाता है, इसलिए यह परिणाम को प्रभावित नहीं करता है।)
अरनौल्ड


@ शैगी चकित है कि यह काम करता है। मुझे पता है कि यह पायथन और लुआ आदि के लिए काम करता है, लेकिन जावास्क्रिप्ट नहीं।
user202729

falseपिछले यात्रा पर लौटे परोक्ष करने के लिए डाला जाता है 0बिटवाइज़ XOR ऑपरेटर द्वारा।
झबरा

@ शैगी वास्तव में, कोई falseभी शामिल नहीं है । जेएस &&पायथन / लुआ को लगभग पहचान देता है and
user202729

1

के (ngn / k) , 32 26 बाइट्स

{$[*|a:2!+\2\x;x;2/-1_a]}/

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

{ } तर्क के साथ एक कार्य है x

/ अभिसरण तक इसे लागू करता है

$[ ; ; ] अगर तब या

2\xके द्विआधारी अंक x(यह ngn / k के लिए विशिष्ट है)

+\ आंशिक रकम

2! मॉड २

a: को आवंटित a

*|अंतिम - रिवर्स ( |) और पहले प्राप्त करें ( *)

यदि उपरोक्त 1 है, xतो वापस कर दिया जाएगा

अन्यथा:

-1_a के अंतिम तत्व को छोड़ दें a

2/ बाइनरी डिकोड


0

सी, 62 बाइट्स

केविन क्रूज़सेन के जावा पर आधारित:

int n(int j){for(int i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}

परीक्षा करना:

#include <stdio.h>
int n(int j);
#define p(i) printf("%6d --> %5d\n", i, n(i))
int main(void)
{
    p(3);
    p(5);
    p(6);
    p(9);
    p(10);
    p(23);
    p(85);
    p(549);
    p(960);
    p(1023);
    p(1155);
    p(1542);
    p(9999);
    p(57308);
    p(57311);
    p(983055);
}

जब चलाया जाता है, तो परीक्षण कार्यक्रम आउटपुट होता है:

     3 -->     1
     5 -->     1
     6 -->     2
     9 -->     7
    10 -->     2
    23 -->    13
    85 -->     1
   549 -->   161
   960 -->    64
  1023 -->   341
  1155 -->   213
  1542 -->     2
  9999 -->  2819
 57308 --> 19124
 57311 -->   223
983055 -->     1

सी, 54 बाइट्स

केवल C89 या K & R C के साथ काम करता है:

n(j){for(i=0;i<j;)i-=(i*2^i)==j?j=i:-1;return j;}


int n(int j){for(int i=0;j>i-=i*2^i^j?-1:j=i;);return j;}क्या ये 57 बाइट्स काम करते हैं?
टाइटस

0

वोल्फ्राम लैंग्वेज (गणितज्ञ) , 58 बाइट्स

Min[{#}//.x_:>Select[Range@#,MemberQ[x,#|BitXor[#,2#]]&]]&

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

एक सूची के साथ शुरू होता है जिसमें सिर्फ इनपुट होता है। सूची को उन सभी पूर्णांकों द्वारा सूची में बदल देता है जो या तो पहले से ही हैं, या डबल-एंड-एक्सर ऑपरेशन द्वारा इसमें मैप करते हैं। फिर //.एक निश्चित बिंदु तक पहुंचने तक ऐसा करने के लिए कहता है। उत्तर परिणाम का सबसे कम तत्व है।

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