সুপার ভাঁজ নম্বর


10

আমরা ইতিমধ্যে এখানে একটি ভাঁজ সংখ্যা সংজ্ঞায়িত করেছি ।

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

ভাঁজ অ্যালগরিদম নিম্নলিখিত হিসাবে যায়:

  • বাইনারি উপস্থাপনা নিন

    যেমন 5882

    1011011111010
    
  • এটি তিনটি পার্টিশনে বিভক্ত। প্রথম অর্ধেক, শেষ অর্ধেক এবং মাঝারি অঙ্ক (যদি এর মধ্যে বিচিত্র সংখ্যার অঙ্ক থাকে)

    101101 1 111010
    
  • মাঝের অঙ্কটি শূন্য হলে এই সংখ্যাটি ভাঁজ করা যাবে না

  • দ্বিতীয়ার্ধকে বিপরীত করুন এবং প্রথমার্ধে সুপারম্পোজড

    010111
    101101
    
  • অঙ্কগুলি জায়গায় যুক্ত করুন

    111212
    
  • যদি ফলাফলের মধ্যে 2 টি থাকে তবে সংখ্যাটি ভাঁজ করা যায় না অন্যথায় নতুন সংখ্যাটি ভাঁজ অ্যালগরিদমের ফলাফল।

একটি নম্বর হ'ল একটি সুপার ফোল্ডিং নম্বর যদি এটিকে একটানা স্ট্রিংয়ে ফোল্ড করা যায়। (সমস্ত ফোল্ডিং নম্বরগুলিও সুপার ফোল্ডিং নম্বর)

আপনার টাস্কটি এমন একটি কোড লিখতে হয় যা একটি সংখ্যায় লাগে এবং যদি সত্যটি একটি ফোল্ডিং নম্বর হয় এবং অন্যথায় মিথ্যা হয় তবে সত্যবাদী মানটি আউটপুট করে। আপনার প্রোগ্রামের আকারে আপনাকে স্কোর করা হবে।

উদাহরণ

5200

বাইনারি রূপান্তর:

1010001010000

অর্ধেক বিভক্ত:

101000 1 010000

মাঝখানের একটি হ'ল তাই আমরা অর্ধেকটি সুপারপোজ করি:

000010
101000

তাদের যুক্ত করেছে:

101010

কোনও দ্বিগুণ নেই তাই আমরা অর্ধে স্প্লিট চালিয়ে যাব:

101 010

ভাঁজ:

010
101

111

ফলাফল 111(দশমিক in) সুতরাং এটি একটি সুপার ফোল্ডিং নম্বর।

পরীক্ষার কেস

প্রথম 100 সুপার ফোল্ডিং নম্বরগুলি হ'ল:

[1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596]

2
যদি আমার ভুল না 3হয় তবে পরীক্ষার কেসগুলিতে আবার কীভাবে লুক্কায়িত হলেন? এটি কীভাবে ভাঁজ করা যায় তা আমি দেখতে পাচ্ছি না, যেহেতু এটি বিভক্ত হয়ে যায় 1 1, সঙ্গে সঙ্গে একটি দেওয়া 2। বা আপনি কি বলছেন যে এটি ভাঁজ করা শূন্যগুণকেও গণনা করা হয়?
Geobits

@ জিওবিটস 3 সেখানে থাকার কথা। আমি এবার চেক করেছি;)। তিনটি ১১ টি তাই এটি কেবল শূন্য ফাইলগুলিতে পাওয়া যায়
অ্যাডহক গার্ফ হান্টার

আমি মনে করি এটি শীর্ষের কাছাকাছি একটি নোট রাখার উপযুক্ত হতে পারে, আপনি অন্য ভাঁজ সংখ্যা প্রশ্নের সাথে লিঙ্ক করার ঠিক পরে যা এই প্রশ্নের পৃথক ভাঁজগুলি আলাদা পদ্ধতি ব্যবহার করবে তা নির্দেশ করে।
জোনাথন অ্যালান

উত্তর:


9

কোড গল্ফে আমার প্রথম শটটি এখানে:

পাইথন 3, 167 বাইট

167 বাইট যদি ট্যাব বা একক স্পেস ফাঁসির জন্য ব্যবহৃত হয়

def f(n):
 B=bin(n)[2:];L=len(B);M=L//2
 if'1'*L==B:return 1
 S=str(int(B[:M])+int(B[:-M-1:-1]))
 return 0if(~L%2==0and'0'==B[M])or'2'in S else{S}=={'1'}or f(int(S,2))

সম্পাদনা করুন: নীচে প্রত্যেকের সহায়তার জন্য ধন্যবাদ, উপরের কোডটি 232 বাইটের মূল আকার থেকে হ্রাস পেয়েছে!


1
পিপিসিজিতে আপনাকে স্বাগতম! আপনি পরে স্পেস সরিয়ে বাইট একটি গুচ্ছ সংরক্ষণ করতে পারবেন :s, এবং ফিরে 0এবং 1পরিবর্তে Trueএবং False
স্টিভেন এইচ।

ধন্যবাদ স্টিভেন। এছাড়াও, আমি 100% নিশ্চিত নই যে আমি বাইটের দৈর্ঘ্যটি সঠিকভাবে গণনা করেছি।
কাপোসি

1
আমি 232 বাইট দেখছি । আমাকে একটি সেকেন্ড দিন এবং আমি এটি আরও কিছুটা গল্ফ দেওয়ার চেষ্টা করতে পারি।
স্টিভেন এইচ।

আমি এই ব্যবহৃত পরিমাপ: bytesizematters.com
Kapocsi

1
@ কাপোসসি, বাইটসাইজমেটারস ডট কম নতুন নিউলাইনগুলি ভুল বলে গণ্য করেছেন। মোটেরেফ.in এর সাথে তুলনা করুন , 5 ডিজিট এবং 5 টি নতুন লাইন 10 বাইট হওয়া উচিত, আমি 14 বাইটাইজ করেছিলাম না ... এটি 232.
লিনাস

5

জাভা 7, 202 বাইট

boolean g(Integer a){byte[]b=a.toString(a,2).getBytes();int i=0,l=b.length,o=0,c,z=(a+1&a)==0?-1:1;for(;i<l/2&z>0;o+=o+c*2,z*=c>1|(l%2>0&b[l/2]<49)?0:1)c=b[i]+b[l-++i]-96;return z<0?1>0:z<1?0>1:g(o/2);}

পুরানো ভাঁজ ফাংশনটিকে পুনরাবৃত্তিযোগ্য করে তুলতে কিছুটা প্রচেষ্টা নিয়েছিল, তবে এটি এখানে। এটা পাপ হিসাবে কুৎসিত, সত্য বলতে। আমি আরও একবার গল্ফ করতে পারি কিনা তা দেখার জন্য আমাকে সকালে একবার দেখতে হবে, যেহেতু এখনই সন্ধানের জন্য আমি সবেই দাঁড়াতে পারি।

লাইন বিরতি সহ:

boolean g(Integer a){
    byte[]b=a.toString(a,2).getBytes();
    int i=0,l=b.length,o=0,c,z=(a+1&a)==0?-1:1;
    for(;i<l/2&z>0;o+=o+c*2,z*=c>1|(l%2>0&b[l/2]<49)?0:1)
        c=b[i]+b[l-++i]-96;
    return z<0?1>0:z<1?0>1:g(o/2);
}

3

সিজেম , 47 44 বাইট

ri2b{_W%.+__0e=)\_,1>\0-X+:*3<*&}{_,2/<}w2-!

এটি অনলাইন চেষ্টা করুন! অথবা একটি নির্দিষ্ট নম্বর পর্যন্ত সুপার ফোল্ডিং নম্বরগুলির একটি তালিকা তৈরি করুন
গল্ফিংয়ের প্রচেষ্টা এখানে দেখা যায় ।


কোডটি নিম্নলিখিত ধাপগুলিতে ভেঙে যায়:

ri2b                e# get input in binary
{                   e# While fold is legal
 _W%.+_             e#   "fold" the whole number onto itself
 _0e=)\             e#   count zeros and add 1 (I)
 _,1>\              e#   size check, leave 0 if singleton (II)*
 0-X+:*3<           e#   product of 2s, leave 0 if too many (III)
 *&                 e#   (II AND III) AND parity of I
}{                  e# Do
 _,2/<              e#   slice opposite to the actual fold**
}w                  e# End while
2-!                 e# return 1 if "fold" ended in all 2s

সম্পাদনা: এই সংস্করণটি কমবেশি পূর্ববর্তী সংস্করণে ডি মরগানের আইন পদ্ধতির প্রয়োজন।

* সিঙ্গলটনে চালানোর সমস্যাটি হ'ল আমরা স্লাইসের পরে খালি স্ট্রিংয়ের সাথে আটকে যাই।

** যদি বাইনারি সংখ্যাটি সুপার ফোল্ডিং হয় তবে এর মিরর চিত্রটি (প্রয়োজনে 0 টি শীর্ষস্থানীয়) রয়েছে। এটি ডান অর্ধেক গ্রহণের উপর একটি বাইট সংরক্ষণ করে।


2

জাভাস্ক্রিপ্ট, 149 বাইট

f=(i,n=i.toString(2),l=n.length,m=l/2|0)=>/^1*$/.test(n)?1:/[^01]/.test(n)|!+n[m]&l?0:f(0,+n.slice(0,m)+ +n.slice(m+l%2).split``.reverse().join``+"")

একটি পুনরাবৃত্তি ফাংশন সংজ্ঞায়িত করে।

ব্যাখ্যা:

f=(i                       //Defines the function: i is input
,n=i.toString(2)           //n is the current number
,l=n.length                //l is the length of the number,
,m=l/2|0)=>                //m is the index of the center character
/^1*$/.test(n)?1:          //returns 1 if the number is all ones
/[^01]/.test(n)            //returns 0 if the number has any chars other than 0 or 1
|!+n[m]&l?0:               //or if the middle char is 0
f(0,+n.slice(0,m)+ +n.slice(m+l%2).split``.reverse().join``+"")
                           //otherwise recurses using the first half of the number plus the second half

m=l>>1, /2/.test(n), n.slice(l-m)(অথবা বিপরীত স্ট্রিং যেভাবেই)। আমি মনে করি আপনি যদি ব্যর্থতা এবং সাফল্যের ক্ষেত্রে স্যুইচ করেন তবে আপনি ব্যবহার করতে পারেন /0/.test(n)?f(...):1
নীল

2

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

f=(n,[h,...r]=n.toString(2),b='')=>++n&-n-n?h?f(2,r,r[0]?b+(h- -r.pop()):+h?b:2):!isNaN(n=+('0b'+b))&&f(n):1

ফর্ম্যাট এবং মন্তব্য

f = (                               // given:
  n,                                // - n = integer to process
  [h, ...r] = n.toString(2),        // - h = highest bit, r = remaining low bits
  b = ''                            // - b = folded binary string
) =>                                //
  ++n & -n - n ?                    // if n is not of the form 2^N - 1:
    h ?                             //   if there's still at least one bit to process:
      f(                            //     do a recursive call with:
        2,                          //     - n = 2 to make the 2^N - 1 test fail
        r,                          //     - r = remaining bits
        r[0] ?                      //     - if there's at least one remaining low bit:
          b + (h - -r.pop())        //       append sum of highest bit + lowest bit to b
        : +h ? b : 2                //       else, h is the middle bit: let b unchanged
      )                             //       if it is set or force error if it's not
    : !isNaN(n = +('0b' + b)) &&    //   else, if b is a valid binary string:
      f(n)                          //     relaunch the entire process on it
  : 1                               // else: n is a super folding number -> success

ডেমো

f=(n,[h,...r]=n.toString(2),b='')=>++n&-n-n?h?f(2,r,r[0]?b+(h- -r.pop()):+h?b:2):!isNaN(n=+('0b'+b))&&f(n):1

// testing integers in [1 .. 99]
for(var i = 1; i < 100; i++) {
  f(i) && console.log(i);
}

// testing integers in [1500 .. 1599]
for(var i = 1500; i < 1600; i++) {
  f(i) && console.log(i);
}


2

পার্ল, 71 70 বাইট

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

STDIN এ নম্বর দিন

superfolding.pl:

#!/usr/bin/perl -p
$_=sprintf"%b",$_;s%.%/\G0$/?2:/.\B/g&&$&+chop%eg while/0/>/2/;$_=!$&

1

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

f=lambda n,r=0:f(bin(n)[2:],'')if r<''else(r==''and{'1'}==set(n)or(n in'1'and f(r,'')+2)or n!='0'and'11'!=n[0]+n[-1]and f(n[1:-1],r+max(n[0],n[-1])))%2

ideone

একটি দ্বিগুণ-পুনরাবৃত্তি ফাংশন যা একটি পূর্ণসংখ্যার লাগে n, এবং ফিরে আসে 0বা 1

rভাড়ার ফলাফল উভয়কেই অনুমতি দেওয়ার জন্য এবং বর্তমানে আমাদের কাছে এটি জানতে একটি পরিবর্তনশীল বজায় রাখা হয়: একটি পূর্ণসংখ্যা রয়েছে (প্রথম কেবল); (বাইরের) ভাঁজ করার চেষ্টা করার জন্য একটি নতুন বাইনারি স্ট্রিং রয়েছে; বা ভাঁজ হয় (অভ্যন্তরীণ)।

প্রথম পাসে nরয়েছে এবং পূর্ণসংখ্যা, যা <''পাইথন 2 এ রয়েছে তাই বাইনারি স্ট্রিংতে কাস্ট করে পুনরাবৃত্তি শুরু হয়।

পরবর্তী ক্রিয়াকলাপটি হয়েছে r=''এবং সুতরাং পরীক্ষা করে পরীক্ষা {'1'}==set(n)চালানো হয় একটি ধারাবাহিক স্ট্রিং পরীক্ষা করার জন্য 1(আরএইচএস হতে পারে না {n}কারণ আমাদের পরে এই পয়েন্টটি পাস করার প্রয়োজন হতে পারে r=''এবং একটি ফাঁকা nযখন এটি একটি অভিধান যা সমান হবে না {'1'}, একটি সেট হবে)।

যদি এটি সন্তুষ্ট না হয় তবে অভ্যন্তরীণ লেজের মানদণ্ড পরীক্ষা করা হয়েছে (এমনকি অপ্রয়োজনীয় হলেও): যদি খালি স্ট্রিং বা একক হয় n in'1'যখন সত্যের কাছে মূল্যায়ন করা হয়, তারপরে একটি নতুন বাহ্যিক পুনরাবৃত্তি স্থাপন করে, তারপরে ভাঁজযুক্ত, বাইনারি স্ট্রিং স্থাপন করে এবং মধ্যে । আক্ষরিকটি এই ফাংশন কলের ফলাফলের সাথে যুক্ত করা হয়েছে যাতে পরবর্তী অংশে (কোনও লজিকাল ডানদিকে ) পড়ে না যায় যা পরে সংশোধন করা হয়।n1rn''r2or

যদি এটি সত্যবাদী মান না হয় (সমস্ত অ-শূন্য পূর্ণসংখ্যা পাইথনে সত্যবাদী হয়) তবে বাইরের লেজ পুনরাবৃত্তির মানদণ্ডের জন্য পরীক্ষা করা হয়: n!=0একটি মধ্যম সহ কেস বাদ দেয় 0এবং বাইরের দুটি অক্ষর পরীক্ষিত হয় যে তারা 2স্ট্রিং কনটেনটেশনের সাথে যোগ করে না '11'!=n[0]+n[-1]; যদি উভয় এই সত্য রাখা বাইরের বিট থেকে বাতিল করা হয় nসঙ্গে n[1:-1], এবং তারপর একটি 1সংযোজন করা হয় rআছে যদি বাইরে এক অন্যথায় একটি 0আসলে ব্যবহার করে, হয় '1'>'0'সঙ্গে পাইথন মধ্যে max(n[0],n[-1])

অবশেষে 2প্রতিটি অভ্যন্তরীণ পুনরাবৃত্তিতে সংযোজনটি সংশোধন করা হয় %2


0

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

for($n=$argv[1];$n!=$c;$n=($a=$n>>.5+$e)|($b=$n&$c=(1<<$e/=2)-1))if($a&$b||($e=1+log($n,2))&!(1&$n>>$e/2))die(1);

ত্রুটি (কোড 1) সহ প্রস্থান করে যদি আর্গুমেন্টটি সুপার-ফোল্ডিং না হয়, 0অন্য কোড । সাথে চালাও -r
ইনপুট 0সত্য (কোড 0) ফিরে আসবে ।

ভাঙ্গন

for($n=$argv[1];            
    $n!=$c;                 // loop while $n is != mask
                            // (first iteration: $c is null)
    $n=                     // add left half and right half to new number
        ($a=$n>>.5+$e)      // 7. $a=left half
        |
        ($b=$n&             // 6. $b=right half
            $c=(1<<$e/=2)-1 // 5. $c=mask for right half
        )
)
    if($a&$b                // 1. if any bit is set in both halves
                            // (first iteration: $a and $b are null -> no bits set)
        ||                  // or
        ($e=1+log($n,2))    // 2. get length of number
        &
        !(1&$n>>$e/2)       // 3. if the middle bit is not set -> 1
                            // 4. tests bit 0 in length --> and if length is odd
    )
    die(1);                 // -- exit with error

0

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

function f($b){if(!$b)return;if(!strpos($b,"0"))return 1;for($n="",$i=0;$i<($l=strlen($b))>>1;)$n.=$b[$i]+$b[$l-++$i];if($l%2&&!$b[$i]||strstr($n,"2"))return;return f($n);}echo f(decbin($argv[1]));

সম্প্রসারিত

function f($b){
    if(!$b)return; # remove 0
    if(!strpos($b,"0"))return 1; # say okay alternative preg_match("#^1+$#",$b)
    for($n="",$i=0;$i<($l=strlen($b))>>1;)$n.=$b[$i]+$b[$l-++$i]; #add first half and second reverse
    if($l%2&&!$b[$i]||strstr($n,"2"))return; #if middle == zero or in new string is a 2 then it's not a number that we search
    return f($n); #recursive beginning
}
echo f(decbin($argv[1]));

সত্য মান <10000

1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596, 1644, 1716, 1764, 1824, 1848, 1896, 1968, 2016, 2047, 2050, 2054, 2058, 2064, 2068, 2072, 2110, 2142, 2176, 2180, 2184, 2222, 2254, 2306, 2320, 2358, 2390, 2432, 2470, 2502, 2562, 2576, 2618, 2650, 2688, 2730, 2762, 2866, 2898, 2978, 3010, 3072, 3076, 3080, 3132, 3164, 3244, 3276, 3328, 3380, 3412, 3492, 3524, 3584, 3640, 3672, 3752, 3784, 3888, 3920, 4000, 4032,4095, 4162, 4166, 4170, 4176, 4180, 4184, 4222, 4318, 4416, 4420, 4424, 4462, 4558, 4674, 4688, 4726, 4822, 4928, 4966, 5062, 5186, 5200, 5242, 5338, 5440, 5482, 5578, 5746, 5842, 5986, 6082, 6208, 6212, 6216, 6268, 6364, 6508, 6604, 6720, 6772, 6868, 7012, 7108, 7232, 7288, 7384, 7528, 7624, 7792, 7888, 8032, 8128, 8191, 8202, 8206, 8218, 8232, 8236, 8248, 8318, 8382, 8456, 8460, 8472, 8542, 8606, 8714, 8744, 8814, 8878, 8968, 9038, 9102, 9218, 9222, 9234, 9248, 9252, 9264, 9334, 9398, 9472, 9476, 9488, 9558, 9622, 9730, 9760, 9830, 9894, 99848128, 8191, 8202, 8206, 8218, 8232, 8236, 8248, 8318, 8382, 8456, 8460, 8472, 8542, 8606, 8714, 8744, 8814, 8878, 8968, 9038, 9102, 9218, 9222, 9234, 9248, 9252, 9264, 9334, 9398, 9472, 9476, 9488, 9558, 9622, 9730, 9760, 9830, 9894, 99848128, 8191, 8202, 8206, 8218, 8232, 8236, 8248, 8318, 8382, 8456, 8460, 8472, 8542, 8606, 8714, 8744, 8814, 8878, 8968, 9038, 9102, 9218, 9222, 9234, 9248, 9252, 9264, 9334, 9398, 9472, 9476, 9488, 9558, 9622, 9730, 9760, 9830, 9894, 9984

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