ডাবল, এক্সওআর এবং এটি আবার করুন


20

আমরা ফাংশন নির্ধারণ যেমন গ্রাম (ঢ) = ঢ XOR যাও (ঢ * 2) কোন পূর্ণসংখ্যা জন্য এন> 0

প্রদত্ত X> 0 , ক্ষুদ্রতম পূর্ণসংখ্যা এটি Y> 0 যেমন যে (Y) = x এর কিছু ট> 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 । আমরা কোনও যেতে পারে না, যেমন কিছু নেই এন যেমন যে ছ (ঢ) = 161 । সুতরাং, জন্য প্রত্যাশিত আউটপুট এক্স = 549 হয় y = 161

বিধি

  • আপনার অবৈধ এন্ট্রিগুলি সমর্থন করার কথা নয়। ইনপুট মান x এর জন্য একটি জোড় (y, কে) থাকার নিশ্চয়তা রয়েছে ।
  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর!

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

     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
সম্পর্কিত ওইআইএস : A048274 যা অনুক্রমa(n) = g(n)
জিউসেপ

উত্তর:


5

জাভা 8, 68 57 53 52 বাইট

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

-5 ধন্যবাদ বাইট @ OlivierGrégoire

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

ব্যাখ্যা:

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 বাইট) দুঃখিত ^^ '
অলিভিয়ার গ্রাগোয়ার

@ অলিভিয়ারগ্রোওয়ের এমনকি স্মার্ট, ধন্যবাদ!
কেভিন ক্রুজসসেন

for(int i=0;n>i-=i+i^i^n?-1:n=i;);?
তিতাস

@ টিটাস আমি ভয় করি যে এটি জাভাতে কাজ করবে না (যদিও আমি আমার পুনরুক্তিযোগ্য জাভাস্ক্রিপ্ট উত্তরে সেই পদ্ধতিটি ব্যবহার করেছি )। জাভাতে i+i^i^n?কোনও বুলিয়ান নয়, তাই এটি সংকলনও করে না। n>i-=...তদ্ব্যতীত , প্রথম বন্ধনী ( n>(i-=...)) দরকার হবে , এবং n=iকেবল তিন-স্তরের ক্ষেত্রে-যদি কেবল-ক্লজ (এটির শেষটি আমি কেন জানি না, তবে জাভাতে দুর্ভাগ্যক্রমে এটি কী )।
কেভিন ক্রুইজসেন

1
@ কেভিন ক্রুইজসেন "এবং ত্রৈমাসিকের n=iঅন্য- ধারাতে অনুমোদিত নয়-যদি" কারণ জাভা এটি (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 বাইট

@ মিআরএক্সকোডারকে 1 বাইট ধন্যবাদ এবং তাদের পরামর্শ অনুসরণ করে আরও 2 টি বাইট সংরক্ষণ করা হয়েছে

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 বাইটের জন্য পিছনে ফেলে দিতে পারেন ।
মিঃ এক্সকোডার

3

আর , 73 65 বাইট

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

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

আপনার টুইটের কারণে অনেকটা জিউসেপ (-8) ধন্যবাদ , এত সহজ তবে খুব কার্যকর


1
আপনার আগের উত্তরটির বিপরীতে, কারণ এই ফাংশনটি পুনরাবৃত্ত, সুতরাং আপনার প্রয়োজনটি f=যেহেতু fসঠিকভাবে কাজ করতে বাধ্য হওয়া দরকার । বলা হচ্ছে, দুর্দান্ত কাজ, এবং আমার কাছ থেকে একটি +1 নিন!
জিউসেপে

2
আপনি আপনার যুক্তিটির কিছুটা পুনরায় জিগার করতে পারেন এবং এটিকে 65 বাইটে
জিউসেপ


2

জেলি , 8 7 বাইট

⁺¿সর্বশেষ অ-শূন্য উপাদানটি ফিরে আসার জন্য ব্যবহার করুন (-১ বাইটের জন্য ডেনিসকে ধন্যবাদ)

^Ḥ)i$⁺¿

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

বর্বর বাহিনী আবার জিতেছে :(


1
^Ḥ)i$⁺¿একটি বাইট সংরক্ষণ করে।
ডেনিস

এবং এটি 2x ধীর।
ব্যবহারকারী 202729

2

সি (জিসিসি) , 57 56 55 51 বাইট

  • সিলিংক্যাটকে একটি বাইট ধন্যবাদ সংরক্ষণ করা ; !=-
  • সংরক্ষিত একটি বাইট থেকে পাঁচ ধন্যবাদ বাইট Rogem ; টেরিনারি এক্সপ্রেশন এবং জিসিসি কিরক ব্যবহার করে।
X(O,R){for(R=1;R;O=R?R:O)for(R=O;--R&&(R^2*R)-O;);}

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


1
+1 এর জন্যX(O,R)
জেসি

@ সেলিংক্যাট ভাল পরামর্শ, ধন্যবাদ।
জোনাথন ফ্রেচ

for(R=1;R;O=R?R:O)একটি বাইট সংরক্ষণ করে।

R=O;শেষে অপ্রয়োজনীয় বলে মনে হচ্ছে, আপনাকে আরও 4 বাইট সংরক্ষণ করবে।

@ রোজম, ধন্যবাদ মনে হচ্ছে।
জোনাথন ফ্রেচ

2

জেড 80 গল্ফ , 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

জাভাস্ক্রিপ্ট (নোড.জেএস), 48 45 38 বাইট

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

-7 বাইটস নীচে আমার পুনরাবৃত্ত সংস্করণটির পুনরাবৃত্ত সংস্করণ তৈরি করার জন্য @ নীলকে ধন্যবাদ জানায়। বড় পরীক্ষার ক্ষেত্রে কাজ করে না।

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


আইট্রেটিভ 45 বাইট সংস্করণ যা সমস্ত পরীক্ষার ক্ষেত্রে কাজ করে:

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

আমার জাভা উত্তর পোর্ট।
-3 বাইট ধন্যবাদ @ আরনাউল্ডকে জানায়

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


1
আপনি করতে পারেন i-=i*2^i^n?-1:n=i(তবে দুর্ভাগ্যক্রমে জাভাতে নেই)।
আর্নল্ড

@ আর্নল্ড চিত্রিত করেছেন যে জাভা বুলিয়ানটির পক্ষে কেবল জেএসে কিছু সম্ভব ছিল 1। ধন্যবাদ!
কেভিন ক্রুজসেন

1
পুনরাবৃত্তভাবে লেখা 38 বাইট (বৃহত ইনপুটগুলির জন্য কাজ করে না):f=(n,i=0)=>i<n?i*2^i^n?f(n,i+1):f(i):n
নীল


1

জেলি , 11 9 বাইট

BÄḂṛḄß$Ṫ?

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

টিপস: লুপগুলির পরিবর্তে পুনরাবৃত্ত ফাংশন ব্যবহার করুন।


খুব দ্রুত, দুর্ভাগ্যক্রমে হিংস্র শক্তি পদ্ধতির কাছে হেরে যায়।

মনে রাখবেন যে:

  • জন্য X> 0 , চ (x)> এক্স
  • পপকাউন্ট (এফ (এক্স)) সমান , যেখানে পপকઉન્ટ (এন) এন-তে সেট বিটের সংখ্যা ।
  • যদি n এরও পপকাউন্ট থাকে তবে এর সাথে x এর মতো f (x) = n রয়েছে
  • যাক বি (x) এর বাইনারি উপস্থাপনা হতে এক্স , এবং P (ঠ) তালিকা হতে গত মুছে উপাদান সঙ্গে। তারপরে বি (এক্স) হ'ল Ṗ (বি (এফ (এক্স)) এর সঞ্চিত এক্সওআর

সুতরাং, আমরা বারবার:

  • এর বাইনারি উপস্থাপনা গণনা করুন ( B)
  • তারপরে জমে থাকা XOR নিন (ব্যবহার করুন ^\বা ÄḂ, তাদের একই প্রভাব রয়েছে)।
  • ( ?) জমে থাকা XOR এর লেজ (শেষ উপাদান) ( ) ননজারো (বিজোড় পপকাউন্ট) কিনা পরীক্ষা করুন
    • যদি তা হয় তবে বাইনারি তালিকাটি দশমিক ও পুনরাবৃত্তিতে ফিরে রূপান্তর করুন।
    • যদি তা না হয় তবে ইনপুট ( ) প্রদান করে।


1

ফোর্থ (গফার্থ) , 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

জাভাস্ক্রিপ্ট (নোড.জেএস) , 40 বাইট

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

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

ধন্যবাদ শেগি -1 বাইট জন্য।

আমার জেলি উত্তর পোর্ট ।

অবশেষে এমন একটি ভাষা রয়েছে যেখানে এই পদ্ধতির সংক্ষিপ্ততা ( উফ )। (আমি পাইথন এবং জাভা চেষ্টা করেছি , এটি কাজ করে না)

আমি /2পরিবর্তে ব্যবহার করতে পারি কেন কেউ ব্যাখ্যা করতে পারেন >>1?


1
x/2পাটিগণিত আন্ডারফ্লো কারণে কাজ করে। যে কোনও আইইইই 754 নম্বরটি পর্যাপ্ত 2 বার দ্বারা বিভাজিত হয়ে শেষ পর্যন্ত 0 হিসাবে মূল্যায়ন করা হবে । (এবং দশমিক অংশটি সহজেই XO'd এড়ানোর পরে উপেক্ষা করা হবে, সুতরাং এটি ফলাফলকে প্রভাবিত করে না))
আর্নল্ড


@ শেগি অবাক হলেন যে এটি কার্যকর হয়। আমি জানি এটি পাইথন এবং লুয়া ইত্যাদির জন্য কাজ করে তবে জাভাস্ক্রিপ্ট নয়।
ব্যবহারকারী 202729

falseগত পুনরাবৃত্তির উপর ফিরে পরোক্ষভাবে কাস্ট করা হয় 0, bitwise XOR যাও অপারেটর দ্বারা।
শেগি

@ শেগি আসলে বাস্তবে কোনও falseজড়িত নেই । জেএস &&পাইথন / লুয়ার সাথে প্রায় একই রকম আচরণ করে and
ব্যবহারকারী 202729

1

কে (এনএনজি / কে) , 32 26 বাইট

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

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

{ } যুক্তি সহ একটি ফাংশন x

/ একীকরণ পর্যন্ত এটি প্রয়োগ করে

$[ ; ; ] যদি-তারপর-আর

2\xবাইনারি অঙ্কগুলি x(এটি ngn / k এর সাথে নির্দিষ্ট)

+\ আংশিক পরিমাণ

2! Mod 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 বাইট

কেবল সি 98 বা কেএন্ডআর সি নিয়ে কাজ করে:

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#]]&]]&

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

কেবল ইনপুট সমেত একটি তালিকা দিয়ে শুরু হয়। স্বতঃস্ফূর্তভাবে সমস্ত ইন্টিজারগুলির দ্বারা তালিকাটি প্রতিস্থাপন করা হয় যা হয় এটি ইতিমধ্যে রয়েছে বা ডাবল এবং জোর ক্রিয়াকলাপ দ্বারা এটিতে ম্যাপ করুন। তারপরে //.একটি নির্দিষ্ট পয়েন্টে পৌঁছা পর্যন্ত এটি করতে বলে। উত্তরটি ফলাফলের সর্বনিম্ন উপাদান।

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