কিছু বিট টগল করুন এবং একটি স্কোয়ার পান


26

পূর্ণসংখ্যা একটি প্রদত্ত , আপনি বিট যে প্রয়োজন বিপর্যস্ত করা ন্যূনতম সংখ্যা খুঁজে বের করতে হবে এটি একটি পরিণত বর্গ সংখ্যা । আপনি কেবলমাত্র সবচেয়ে তাত্পর্যপূর্ণ নীচে বিটগুলি উল্টাতে পারবেন ।এন>3এন

উদাহরণ

  • এন=4 ইতিমধ্যে একটি বর্গ সংখ্যা ( ), সুতরাং প্রত্যাশিত আউটপুট ।220
  • এন=24 বিট: ( ) বর্গক্ষেত্রে পরিণত করা যেতে পারে , সুতরাং প্রত্যাশিত আউটপুট ।110001100125=521
  • এন=22 একক বিট উল্টিয়ে স্কোয়ার সংখ্যায় রূপান্তর করা যায় না (সম্ভাব্য ফলাফল , , এবং ) তবে এটি 2 বিট উল্টিয়ে করা যেতে পারে: ( ), সুতরাং প্রত্যাশিত আউটপুট ।23201830101101000016=422

বিধি

  • যদি আপনার কোডটি খুব ধীর হয় বা বড় টেস্ট-কেসগুলির জন্য ত্রুটি ছুড়ে দেয় তবে এটি ঠিক আছে তবে এটি কমপক্ষে 1 মিনিটেরও কম সময়ে সমর্থন করবে ।3<N<10000
  • এটি !

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

    Input | Output
----------+--------
        4 | 0
       22 | 2
       24 | 1
       30 | 3
       94 | 4
      831 | 5
      832 | 1
     1055 | 4
     6495 | 6
     9999 | 4
    40063 | 6
   247614 | 7        (smallest N for which the answer is 7)
  1049310 | 7        (clear them all!)
  7361278 | 8        (smallest N for which the answer is 8)
100048606 | 8        (a bigger "8")

অথবা অনুলিপি / কাস্টম বান্ধব বিন্যাসে:

[4,22,24,30,94,831,832,1055,6495,9999,40063,247614,1049310,7361278,100048606]

প্রায় অর্ধেক উত্তর 100048606টিআইও-তে কার্যকর হয় না , এটি কি সমস্যা?
ম্যাজিক অক্টোপাস আরন

@ ম্যাজিক অ্যাক্টোপাস ইউরন ধন্যবাদ, আমি আরও স্পষ্ট করতে নিয়মগুলি আপডেট করেছি যে সমর্থন করা supportingচ্ছিক । N10000
আর্নৌল্ড


@ কিউআর হ্যাঁ, সম্ভবত অথবা আপনি যদি কঠোরভাবে যেতে চান: প্রদত্ত , সবচেয়ে ছোট এনটি খুঁজে নিন যাতে এফ ( এন ) = কেkN(এন)=
আর্নৌল্ড

উত্তর:


14

রুবি, 74 বাইট

->n{(1..n).map{|x|a=(n^x*x).to_s 2;a.size>Math.log2(n)?n:a.count(?1)}.min}

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

এটি কেবল ক্রমটি জেনারেট করে (যা পর্যাপ্ত পরিমাণের চেয়ে অনেক বেশি), এটি এন এর সাথে এক্সওআরস করে , এবং তারপরে বিটের সংখ্যা কম হলে এর বাইনারি উপস্থাপনায় 1 এর সংখ্যা গ্রহণ করে চেয়ে বা সমান লগ ইন করুন 2 এন , অথবা এন অন্যথায়। এরপরে এটি বিটদের ন্যূনতম সংখ্যায় উল্টে যায়। রিটার্নিং এন ফ্লিপ বিট সংখ্যা পরিবর্তে সর্বোচ্চ বিট ফ্লিপ তার চেয়ে অনেক বেশী হয় যখন লগ 2 এন ন্যূনতম হিসেবে নির্বাচিত হওয়া থেকে এইসব ক্ষেত্রে বাধা দেয়, যেমন এন[12,22,...,এন2]এনলগ2এনএনএনলগ2এনএন এটি সর্বদা বিটের সংখ্যার চেয়ে বেশি হবে।

বাইট সংরক্ষণের জন্য পিকলোকে ধন্যবাদ ।


আপনি ব্যবহার করে একটি বাইট সংরক্ষণ করতে পারবেন (n^x*x).to_s 2;...পরিবর্তে(n^x*x).to_s(2);...
পিকলু

@ পাইকলো বিশ্বাস করতে পারছি না যে আমি এটি মিস করেছি, ধন্যবাদ!
ডুরকনব

6

জেলি , 12 বাইট

²,BẈEðƇ²^B§Ṃ

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

একটি পরীক্ষা স্যুট পরীক্ষা করে দেখুন!

মোনাডিক লিঙ্ক। গল্ফযোগ্য হতে হবে। তবে ³এস থেকে মুক্তি পাওয়ার কোনও উপায় চিন্তা করতে আমি খুব বোকা । এটি আমার প্রথম উত্তর যা আমি সাফল্যের সাথে একটি ডায়াডিক চেইনের সাথে সাধারণভাবে ফিল্টারিং / ম্যাপিং / লুপিং ব্যবহার করি \ o /

ব্যাখ্যা

², BẈEðƇ² ^ B§Ṃ - সম্পূর্ণ প্রোগ্রাম / Monadic লিঙ্ক। যুক্তিটি কল করুন এন।
     ðƇ - নিম্নলিখিত ডায়াডিক চেইনের সাথে ফিল্টার-কিপ [1 ... এন]:
², BẈE - বর্তমান আইটেমের বর্গক্ষেত্রের এন এর সমান বিট দৈর্ঘ্য রয়েছে।
² - স্কয়ার
 , - এন এর সাথে যুক্ত করুন
  বি - উভয় বাইনারি রূপান্তর।
   Ẉ - তাদের দৈর্ঘ্য পুনরুদ্ধার করুন।
    ই - এবং তারা সমান কিনা তা পরীক্ষা করে দেখুন।
       ² ^ - ফিল্টারিংয়ের পরে ফলাফলগুলি স্কোয়ার করুন এবং তাদের এন এর সাথে এক্সওআর করুন
         বি - প্রত্যেকের বাইনারি উপস্থাপনা।
          § - প্রত্যেকের যোগফল। বাইনারিতে 1 টি সংখ্যা গণনা করে।
           Ṃ - সর্বনিম্ন।

5

হুশ , 20 বাইট

▼mΣfo¬→S↑(Mo¤ż≠↔ḋİ□ḋ

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

ব্যাখ্যা

▼mΣf(¬→)S↑(M(¤ż≠↔ḋ)İ□ḋ) -- example input n=4
        S↑(           ) -- take n from n applied to (..)
                     ḋ  -- | convert to binary: [1,0,0]
                   İ□   -- | squares: [1,4,9,16,...]
           M(     )     -- | map with argument ([1,0,0]; example with 1)
                 ḋ      -- | | convert to binary: [1]
             ¤  ↔       -- | | reverse both arguments of: [1] [0,0,1]
              ż≠        -- | | | zip with inequality (absolute difference) keeping longer elements: [1,0,1]
                        -- | : [[1,0,1],[0,0,0],[1,0,1,1],[0,0,1,0,1],[1,0,1,1,1],....
                        -- : [[1,0,1],[0,0,0],[1,0,1,1],[0,0,1,0,1]]
    f(  )               -- filter elements where
       →                -- | last element
      ¬                 -- | is zero
                        -- : [[0,0,0]]
 mΣ                     -- sum each: [0]
▼                       -- minimum: 0

▼mΣfo¬←ṠMz≠ȯfo£İ□ḋπŀ2Lḋ2 বাইট সংরক্ষণ RIP আপনি নিখুঁত স্কোর স্কোর।
মিঃ এক্সকোডার

@ মিঃ এক্সকোডার: স্কোরের জন্য লজ্জা .. তবে আমি এখন আরও 16 টি লক্ষ্য করে আরও কিছু থেকে মুক্তি পেয়েছি; পি
ბიმო

5

পার্ল 6 , 65 বাইট

{min map {+$^a.base(2).comb(~1) if sqrt($a+^$_)!~~/\./},^2**.msb}

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

সংখ্যার বর্গমূলের স্ট্রিং উপস্থাপনায় একটি সময় সন্ধান করে নিখুঁত বর্গক্ষেত্রের পরীক্ষার জন্য আমি কিছুটা নোংরা বোধ করি, তবে ... বাইটগুলি শেভ করার জন্য কিছুই।


4

05 এ বি 1 ই , 20 15 বাইট

Lnʒ‚b€gË}^b€SOß

-5 বাইটস তার জেলি উত্তরের একটি বন্দর ব্যবহার করে @ মিস্টার এক্সকোডারকে ধন্যবাদ ।

এটি অনলাইনে চেষ্টা করুন বা সমস্ত পরীক্ষার কেস যাচাই করুন (সবচেয়ে বড় তিনটি পরীক্ষার কেস সরানো হয়েছে কারণ তারা 60 সেকেন্ড পরে সময়সীমা নির্ধারণ করে; এখনও অন্য পরীক্ষার ক্ষেত্রে প্রায় 35-45 সেকেন্ড লাগে)।

ব্যাখ্যা:

L            # Create a list in the range [1, input]
             #  i.e. 22 → [0,1,2,...,20,21,22]
 n           # Take the square of each
             #  i.e. [0,1,2,...,20,21,22] → [0,1,4,...,400,441,484]
  ʒ     }    # Filter this list by:
   ,         #  Pair the current value with the input
             #   i.e. 0 and 22 → [0,22]
             #   i.e. 25 and 22 → [25,22]
    b        #  Convert both to binary strings
             #   i.e. [0,22] → ['0','10110']
             #   i.e. [25,22] →  ['10000','11001']
     g      #  Take the length of both
             #   i.e. ['0','10110'] → [1,5]
             #   ['10000','11001'] → [5,5]
       Ë     #  Check if both are equal
             #   i.e. [1,5] → 0 (falsey)
             #   i.e. [5,5] → 1 (truthy)
^            # After we've filtered, Bitwise-XOR each with the input
             #  i.e. [16,25] and 22 → [6,15]
 b           # Convert each to a binary string again
             #  i.e. [6,15] → ['110','1111']
  S         # Change the binary strings to a list of digits
             #  i.e. ['110','1111'] → [['1','1','0'],['1','1','1','1']]
    O        # Take the sum of each
             #  i.e. [['1','1','0'],['1','1','1','1']] → [2,4]
ß            # And then take the lowest value in the list
             #  i.e. [2,4] → 2

1
ঠিক আছে তাহলে, একটি বৈধ 15 byter: Lnʒ‚b€gË}^b€SOß। দুর্ভাগ্যক্রমে এটি আপনার পরীক্ষার স্যুটটি ভেঙে
ফেলেছে

1
@ মিঃ এক্সকোডার ধন্যবাদ! আমি কিছু গল্ফ করার পরে আমার টেস্ট স্যুট প্রায় সবসময়ই ভেঙে যায় .. এক্সডি তবে এটি এখন ঠিক হয়ে গেছে।
কেভিন ক্রুইজসেন 19

আমি অনুমান করি যে আমি 05AB1E ¯ \ _ (ツ) _ / su তে পরীক্ষা স্যুট লিখতে ভাল নই, আপনি এটি ঠিক করে দিয়েছেন তা খুব সুন্দর :)
মিঃ এক্সকোডার

3

জাভা (জেডিকে 10) , 110 বাইট

n->{int i=1,s=1,b,m=99,h=n.highestOneBit(n);for(;s<h*2;s=++i*i)m=(s^n)<h&&(b=n.bitCount(s^n))<m?b:m;return m;}

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


1
আপনি বিটওয়াইজ করে এবং &লজিকাল এবং এর পরিবর্তে 1 বাইট সংরক্ষণ করতে পারেন&&
kirbyquerby

3

গাইয়া , 18 বাইট

আমার জেলি উত্তর কাছাকাছি বন্দর ।

s¦⟪,b¦l¦y⟫⁇⟪^bΣ⟫¦⌋

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

ভাঙ্গন

s¦⟪, b¦l¦y⟫⁇ ⟪^ bΣ⟫¦⌋ - সম্পূর্ণ প্রোগ্রাম। আসুন ইনপুট কল করুন।
s¦ - প্রতিটি পূর্ণসংখ্যার স্কোয়ার [1 ... এন]।
  ⟪⟫⁇ - যখন কোনও নির্দিষ্ট শর্ত পূরণ করে তখন তাদের নির্বাচন করুন through
                     একটি ডায়াডিক ব্লক একটি ডায়াডিক ব্লক ব্যবহার করা একটি বাইট সংরক্ষণ করে কারণ
                     ইনপুট, এন, স্পষ্টভাবে অন্য যুক্তি হিসাবে ব্যবহৃত হয়।
   , - বর্তমান তালিকায় এন এবং তালিকায় এন যুক্ত করুন।
    b¦ - তাদের বাইনারি রূপান্তর করুন।
      l¦ - তাদের দৈর্ঘ্য পান।
        y - তারপরে তারা সমান কিনা তা পরীক্ষা করে দেখুন।
           ⟫¦ ⟫¦ - একটি ডায়ডিক ব্লকের মাধ্যমে সমস্ত বৈধ পূর্ণসংখ্যার চালান।
            ^ - এক্স এর সাথে এন এর সাথে প্রতিটি
             BΣ - বাইনারি এবং যোগফলে রূপান্তর করুন (বাইনারে 1s গণনা করুন)
                 ⌋ - সর্বনিম্ন।

2

ব্র্যাচ্ল্যাগ , 56 41 বাইট

এটি কোনও দৈর্ঘ্যের রেকর্ড ভঙ্গ করবে না তবে ভেবেছিল আমি যেভাবেই পোস্ট করব

⟨⟨{⟦^₂ᵐḃᵐ}{h∋Q.l~t?∧}ᶠ{ḃl}⟩zḃᶠ⟩{z{∋≠}ᶜ}ᵐ⌋

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


জাস্ট জিপ করা জিনিস thing আমি ডিনার থেকে ফিরে আসার পরে এটি সংক্ষিপ্ত করব
ক্রপ্পেব

1
@ আর্নল্ড হ্যাঁ, মূল সমস্যাটি হ'ল আমি প্রতিটি রেঞ্জের জন্য (০, এন + ১) আমি পরিসীমাটি পুনরায় গণনা করেছি, এটি স্কোয়ার এবং বাইনারি করেছিলাম। এটিকে বাইরে রেখে আরও কিছু বাইট রিক্রুয়ার করা হয়েছে তবে এখনই তা দ্রুত
ক্রপ্পেব

2

x86-64 বিধানসভা, 37 বাইট

বাইটকোড:

53 89 fb 89 f9 0f bd f7 89 c8 f7 e0 70 12 0f bd
d0 39 f2 75 0b 31 f8 f3 0f b8 c0 39 d8 0f 42 d8
e2 e6 93 5b c3

সুন্দরভাবে, এটি এক সেকেন্ডেরও কম সময়ে সর্বোচ্চ উদাহরণটিও গণনা করে।

অ্যালগরিদমের হৃদয় যথারীতি xor / পপকাউন্ট।

    push %rbx
    /* we use ebx as our global accumulator, to see what the lowest bit
     * difference is */
    /* it needs to be initialized to something big enough, fortunately the
     * answer will always be less than the initial argument */
    mov %edi,%ebx
    mov %edi,%ecx
    bsr %edi,%esi
.L1:
    mov %ecx,%eax
    mul %eax
    jo cont     /* this square doesn't even fit into eax */
    bsr %eax,%edx
    cmp %esi,%edx
    jnz cont    /* can't invert bits higher than esi */
    xor %edi,%eax
    popcnt %eax,%eax
    cmp %ebx,%eax   /* if eax < ebx */
    cmovb %eax,%ebx
cont:
    loop .L1
    xchg %ebx,%eax
    pop %rbx
    retq

আপনার অন্তত এক প্রতিস্থাপন সুপারিশ movএকটি সঙ্গে গুলিxchg
ceilingcat

যতদূর আমি বলতে পারি যে কেবলমাত্র একটিই বাইট ( mov %ecx,%eax) বাঁচাতে পারে এবং আমি%% এক্সেক্সকে সেখানে মরতে দিতে পারি না।
ObsequiousNewt

1

ওল্ফ্রাম ভাষা (গণিত) , 67 বাইট

Min@DigitCount[l=BitLength;#~BitXor~Pick[s=Range@#^2,l@s,l@#],2,1]&

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

লাগে {1,2,...,এন}এবং তাদের স্কোয়ার। এর পরে, একই সঙ্গে সংখ্যাগুলি BitLengthইনপুট হিসাবে হয় Picked, এবং BitXorইনপুট সঙ্গে ed। এর পরে, Minimum DigitCountএর 1বাইনারি মধ্যে গুলি ফিরিয়ে দেওয়া হয়।


1

কাঠকয়লা , 31 বাইট

NθI⌊EΦEθ↨×ιι²⁼LιL↨θ²ΣE↨責⁼λ§ιμ

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

Nθ                              Input N
       θ                        N
      E                         Map over implicit range
          ιι                    Current value (twice)
         ×                      Multiply
        ↨   ²                   Convert to base 2
     Φ                          Filter over result
               ι                Current value
                  θ             N
                 ↨ ²            Convert to base 2
              L L               Length
             ⁼                  Equals
    E                           Map over result
                       θ        N
                      ↨ ²       Convert to base 2
                     E          Map over digits
                           λ    Current base 2 digit of N
                             ι  Current base 2 value
                              μ Inner index
                            §   Get digit of value
                          ⁼     Equals
                         ¬      Not (i.e. XOR)
                    Σ           Take the sum
   ⌊                            Take the minimum
  I                             Cast to string
                                Implicitly print




1

সি (জিসিসি) ,  93  91 বাইট

g(n){n=n?n%2+g(n/2):0;}m;i;d;f(n){m=99;for(i=0;++i*i<2*n;m=g(d=i*i^n)<m&d<n/2?g(d):m);n=m;}

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


সম্পাদনা: আমি মনে করি যে আমার মূল সমাধানটি ( এটি অনলাইনে চেষ্টা করুন! ) বৈধ নয়, কারণ ভেরিয়েবলগুলির মধ্যে mএকটি, গ্লোবালকে কিছু বাইট সংরক্ষণ না করে নির্দিষ্ট ধরণের উল্লেখ না করেই আরম্ভ করা হয়েছিল f(n)এবং তাই কলগুলির মধ্যে পুনরায় পুনর্নিযুক্ত করতে হয়েছিল


অবরুদ্ধ এবং মন্তব্য করা কোড:

g(n){n=n?n%2+g(n/2):0;} // returns the number of bits equal to 1 in n
m; //miminum hamming distance between n and a square
i; //counter to browse squares
d; //bitwise difference between n and a square
f(n){m=99; //initialize m to 99 > size of int (in bits)
    for(
        i=0;
        ++i*i<2*n; //get the next square number, stop if it's greater than 2*n
        g(d=i*i^n)<m&&d<n/2&&(m=g(d)) //calculate d and hamming distance
//      ^~~~~~~~~~~^ if the hamming distance is less than the minimum
//                    ^~~~^ and the most significant bit of n did not change (the most significant bit contains at least half the value)
//                           ^~~~~~~^ then update m
       );
    n=m;} // output m

সম্পাদনা:

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