বাইনারি সাবস্ট্রিংসের যোগফল


16

এই চ্যালেঞ্জটি সহজ, একটি দশমিক সংখ্যা দেওয়া, বাইনারি রূপান্তরিত এবং বাইনারি সংখ্যার উপ-স্ট্রিংগুলির যোগফল গণনা করুন, যার দৈর্ঘ্য মূল সংখ্যার চেয়ে কম। এখানে একটি উদাহরণ:

Input:
  11
Binary:
  11 -> 1011
Substrings:
  101 = 5
  011 = 3
  10  = 2
  01  = 1
  11  = 3
  1   = 1
  0   = 0
  1   = 1
  1   = 1
Sum:
  5+3+2+1+3+1+0+1+1=17
Output:
  17

আপনার প্রোগ্রামটি বাইনারি সাব-স্ট্রিংগুলির যোগফল হিসাবে ইনপুট হিসাবে আউটপুট হিসাবে একক দশমিক পূর্ণসংখ্যার গ্রহণ করা উচিত, যেমন উপরে বর্ণিত। আপনি ধরে নিতে পারেন ইনপুটটির বাইনারি উপস্থাপনায় সর্বদা দুটি সংখ্যার বেশি থাকবে এবং ইনপুটটিতে আপনার প্রোগ্রামটির সম্পাদনার সময় কোনও ত্রুটি ঘটবে না।

এটি , বাইট জেতে সংক্ষিপ্ততম কোড!

পরীক্ষার কেস:

2  => 1
3  => 2
4  => 3
5  => 5
6  => 7
7  => 9
8  => 7
9  => 10
10 => 14
11 => 17

4
কৌতূহলজনকভাবে, পূর্ণ দৈর্ঘ্যের সাবস্ট্রিং বাদ দেওয়া একটি উল্লেখযোগ্য অতিরিক্ত চ্যালেঞ্জ।
পিটার টেলর

উত্তর:


12

জেলি, 10 7 বাইট

BṡRḄFS_

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

কিভাবে এটা কাজ করে

BṡRḄFS_  Main link. Input: n

B        Convert n to base 2.
  R      Yield [1, ..., n].
 ṡ       Get all overlapping slices of lengths 1 to n.
         This yields empty arrays if the slice size is longer than the binary list.
   Ḅ     Convert each binary list to integer.
    F    Flatten the resulting, nested list.
     S   Compute the sum of the result.
      _  Subtract n from the sum.

এনকোডিং আপনাকে সেই প্রোগ্রামের জন্য 1 বাইট / চর দেয়?
টবির স্পিড



6

সিজেম, 27 21 বাইট

আমাকে by বাইট বাঁচাতে সাহায্য করার জন্য ডেনিসে চিত্কার!

q~:Q{)Q2bew2fb~}%1bQ-

কেবল সিজেমের নতুন সংস্করণ (টিআইওতে উপলব্ধ) এর সাথে কাজ করে। এটি অনলাইনে চেষ্টা করুন !

পুরাতন রুপ:

qi2b_,,0-\f{ew}{{2b}%}%e_:+

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


5

পাইথন 3, 111 টি অক্ষর

N=bin(int(input()))[2:];L=len(N);r=range;print(sum(int(n,2)for n in[N[j:j+i]for i in r(1,L)for j in r(L-i+1)]))

সম্পাদনা : ব্যাখ্যা:

N=bin(int(input()))[2:]

ইনপুট স্ট্রিংটিকে একটি int তে রূপান্তর করুন, তারপরে একটি বাইনারি স্ট্রিং-এ INT করুন এবং এর প্রথম দুটি অক্ষর সরান, যেহেতু binপদ্ধতিটির বিন্যাসে স্ট্রিংটি ফেরত দেয়0b...

বাইনারি স্ট্রিংয়ের সমস্ত সাবস্ট্রিংগুলি নিন, দশমিকের সাহায্যে এগুলিকে রূপান্তর করুন int(n, 2)এবং তাদের যোগফল দিন।

[N[j:j+i]for i in r(1,L)for j in r(L-i+1)]

সমস্ত সাবস্ট্রিংয়ের একটি তালিকা। অবরুদ্ধ সংস্করণ:

def all_substrings(N):
    result = []
    for i in range(1, len(N)):
        for j in range(len(N) - i + 1):
            result.append(N[j:j+i])
    return result

আশাকরি এটা সাহায্য করবে.


4

সিজেএম (22 বাইট)

এটি বর্তমান সেরা সিজেএম উত্তরের চেয়ে এক বাইট দীর্ঘ, তবে সম্ভবত এই পদ্ধতিটি বেশ কয়েকটি অন্যান্য ভাষায় বেশ লাভজনকভাবে মানিয়ে নেওয়া যেতে পারে।

3,ri_2b_,,:).*\+fbW%:-

অনলাইন ডেমো

বিশ্লেষণ

মনে করুন যে প্রশ্ন ছিল

বাইনারি সংখ্যার উপ-স্ট্রিংয়ের যোগফল গণনা করুন

বিট ছাড়া

যার দৈর্ঘ্য মূল সংখ্যার চেয়ে কম

তারপরে এটি দেখানো খুব কঠিন নয় যে মোট ওজনের সাথে সবচেয়ে উল্লেখযোগ্য বিট ঘটে 1*(2^B-1)যেখানে Bবিটের সংখ্যা রয়েছে; দ্বিতীয় সবচেয়ে গুরুত্বপূর্ণ বিট মোট ওজন সঙ্গে ঘটে 2*(2^(B-1)-1); নিচে Bth- সবচেয়ে গুরুত্বপূর্ণ বিট, যা মোট ওজন সঙ্গে ঘটে B*(2^1-1)

মূল সংখ্যাটির বিয়োগকে এখন বিবেচনায় xনিয়ে আমরা সমষ্টিটি শেষ করি

sum_i (x & 2^i) * 2^i * 2*(B-i)  -  sum_i (x & 2^i) * (B-i)  -  x

ব্যবচ্ছেদ

3,        e# Put [0 1 2] on the stack - we'll need it later
ri_       e# Get the input x and copy it
2b        e# Convert the copy to base 2
_,,:).*   e# Pointwise multiply by 1 plus the index
\+        e# Append x to the resulting array, giving A
fb        e# Map a base conversion
W%:-      e# Reverse and fold a subtraction

বেস 2 তে রূপান্তরটি মূল যোগফলের প্রথম অংশ দেয় x; বেস 1 দ্বিতীয় অংশ প্লাস দেয় x; এবং বেস 0 তে কেবলমাত্র দেয় x, তাই বেস -1 কে বেস -2 থেকে xবি বাতিল করে বেস বাতিল করুন, এবং বেস -0 কে বিয়োগ করা পছন্দসই ফলাফল দেয়।


3

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

n=>[...n.toString(2)].map(c=>[...s+=c].map((_,i)=>n-='0b'+s.slice(i)),s='')|-n

বাইরের বাইনারি উপস্থাপনের mapশীর্ষস্থানীয় সাবস্ট্রিংগুলি তৈরি করে n; অভ্যন্তরীণ একটি শীর্ষস্থানীয় সাবস্ট্রিংগুলির অনুসরণকারী সাবস্ট্রিংগুলি বের করে, এভাবে মূল বাইনারি উপস্থাপনাসহ সমস্ত সম্ভাব্য সাবস্ট্রিংগুলি coveringেকে দেয়।

প্রতিটি সাবস্ট্রিং বাইনারি থেকে দশমিক দিকে রূপান্তরিত হয় এবং মূল ইনপুট থেকে বিয়োগ করা হয় কারণ এগুলি একসাথে যুক্ত করা এবং মূল ইনপুট বিয়োগের চেয়ে সামান্য খাটো।


2

গণিত, 73 70 বাইট

Tr[FromDigits[#,2]&/@StringCases[#~IntegerString~2,__,Overlaps->All]]&

ফাংশন। Integer-> পূর্ণসংখ্যা


1
একটি আফসোস গণিতের সাবলিস্টগুলি মোকাবেলার জন্য দুর্দান্ত সরঞ্জাম নেই।
এ সিমন্স

1

রেটিনা , 64

.*
$*
+`(1+)\1
$1a
a1
1
r&!M`.*
&!M`.*
^.*

+`1(a*)\b
a$.1$*1;
;

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

মঞ্চের বর্ণনার মাধ্যমে একটি উচ্চ স্তরের পর্যায়: দশমিককে অ্যানারিতে রূপান্তর করুন, বাইনারিতে অখণ্ডিত করুন, উপসর্গ পান, উপসর্গের প্রত্যয় পাবেন, আসল সংখ্যাটি ফেলে দিন, বাইনারিকে আনারিতে রূপান্তর করুন, ফেরতের গণনায়। গল্ফিংয়ের কাজ শেষ হয়ে গেলে আমি আরও বিশদ বিবরণ লিখব, এই পর্যায়ে অনেকগুলি সন্দেহজনক বলে মনে হচ্ছে ...


1

সি, 71 বাইট

f(n){int a=0,m=0,i;for(;++m<n;m+=m)for(i=n;i+i>m;i/=2)a+=i&m;return a;}

আমরা একটি সঞ্চয়ী aএবং মাস্ক বজায় রাখি m। মুখোশটি 1 থেকে শুরু হয় এবং প্রতিবার বাইরের লুপের চারপাশে আরও একবার লম্বা হয়। অভ্যন্তরীণ লুপে, একটি অনুলিপিi মাস্কের চেয়ে ছোট না হওয়া পর্যন্ত ক্রমশ ডান স্থানান্তরিত হয়, প্রতিবার মুখোশযুক্ত মানটি জমা করে।

পরীক্ষা প্রোগ্রাম

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
    while (*++argv) {
        int n = atoi(*argv);
        printf("%d -> %d\n", n, f(n));
    }
    return 0;
}

টেস্ট আউটপুট

./73793 $(seq 0 11)
0 -> 0
1 -> 0
2 -> 1
3 -> 2
4 -> 3
5 -> 5
6 -> 7
7 -> 9
8 -> 7
9 -> 10
10 -> 14
11 -> 17

1

সি #, 148 বাইট

int x(int i){int s,r=0,j=i,p=System.Convert.ToString(i,2).Length+1,k;for(;--p>-1;){k=j;s=-1;for(;++s<p;)r+=(k>>=1);j=(i&((1<<p-1)-1))<<1;}return r;}

বা, যদি আমি "স্ট্যাটিক সিস্টেম ব্যবহার করে ম্যাথ; আমদানি" যুক্ত করি; তারপরে 138 এর সাথে

int x(int i){int s,r=0,j=i,p=(int)Round(Log(i,2)+1.49,0),k;for(;--p>-1;){k=j;s=-1;for(;++s<p;)r+=(k>>=1);j=(i&((1<<p-1)-1))<<1;}return r;}

সি # এর মতো ওওপি ভাষাগুলি এ জাতীয় প্রতিযোগিতা জিততে পারে না, তবে আমি যাইহোক এটি চেষ্টা করে দেখতে চাই। এখানে আরও সুশোভিত সংস্করণ + পরীক্ষক।

class Program
{
    // Tester: 50 bytes
    static void Main(string[] args)
    {
        int i=2;
        do System.Console.WriteLine($"{i} -> {x(i++)}"); while (i < 12);
        System.Console.Read();
    }
    // Function: 65 bytes (size according to ILDASM.exe)
    static int x(int iOrg)
    {
        int pos, shift, retVal=0, iPrev=iOrg, iTemp;
        pos = System.Convert.ToString(iOrg, 2).Length;
        do {
            iTemp = iPrev; shift = 0;
            do retVal += (iTemp >>= 1); while (++shift < pos);
            iPrev = (iOrg & ((1 << pos - 1) - 1)) << 1;
        } while (--pos > -1); 
        return retVal;
    }
}

নেস্টেড ডু-উইল আইটেম্পের ডান স্থানান্তরিত মান যুক্ত করে (এটি বরাদ্দ করার পরে) যতক্ষণ না শিফট +১ টি ছোট থাকে ততক্ষণ পোজ হয়। পরের লাইনটি আইপ্রেভের পরবর্তী স্থানান্তরিত মান গণনা করে

x1 = 1 << p -1; // 1 << 4 -1 = 8 [1000]
x2 = x1 - 1;    // 8 -  1 = 7    [0111]
x3 = i & x2;    // 1011 & 0111 = 0011 
x4 = x3 << 1;   // 0011 << 1 = 00110
i2 = x4;

x1 আন্ড এক্স 2 মাস্ক গণনা করে, এক্স 3 এটি প্রয়োগ করে এবং তারপর এটি বাম-শিফট করে, যেহেতু সর্বশেষ সংখ্যাটি সর্বদা বাদ পড়ে। 11 এর জন্য, এটি এর মতো দেখাচ্ছে:

START -> _1011[11]
101
10
1   -->  X0110[6], r=0+5+2+1=8
 011
 01
 0  -->  XX110[6], r=8+4=12
  11
  1 -->  XXX10[2], r=12+4=16
   1 ->  XXXX0[X], r=16+1=17

আমি জানি, সি এর বেশিরভাগ উত্তর সি-তেও নির্বিঘ্নে কাজ করে (@ টনি-স্পিড সমস্যা ছাড়াই কাজ করেছিল), তবে আমি এই উদ্দেশ্যটিকে অস্বীকার করব। এছাড়াও, আমি নিজেকে শেষ না করা পর্যন্ত আমি মন্তব্যগুলির দিকে নজর রাখিনি (ভাল, বোল্ড শিরোনামগুলি বাদ দিয়ে), সুতরাং এটি "সি এর মতো" করার কোনও বিপদ নেই।
DW.com

0

পাওয়ারশেল ভি 2 +, 138 বাইট

param($a)$a=[convert]::ToString($a,2);(($b=$a.length-1)..1|%{$l=$_;0..($b-$l+1)|%{[convert]::ToInt32($a.substring($_,$l),2)}})-join'+'|iex

Ooof। বাইনারি থেকে / থেকে রূপান্তরটি ব্যয়বহুল।

ইনপুট নেয় $a, তারপরে .NET কলটি[convert]::ToString($a,2) বাইনারি উপস্থাপনায় পরিণত করতে ব্যবহার করে । সেখান থেকে, আমরা দুটি লুপ দিয়ে যাই - প্রথমটি স্ট্রিংয়ের শেষে থেকে নীচে 1এবং দ্বিতীয়টি উপরের দিক থেকে গণনা করা হয় 0। (প্রথমটি হল স্ট্রিংয়ের টান আনার জন্য কতক্ষণ সময় থাকে এবং দ্বিতীয়টি স্ট্রিংটিতে স্ট্রিংটি শুরু করার সূচি হয়)) আমরা একটি সহায়ক সেট করি$l এটি অভ্যন্তরীণ লুপের মধ্য দিয়ে যাওয়ার জন্য ।

ভিতরের লুপের অভ্যন্তরে, আমরা বেস থেকে উপযুক্তটিকে পূর্ণসংখ্যায় রূপান্তর করতে আরেকটি .NET কল[convert]::ToInt32() ব্যবহার করি । তারপরে প্রতিটি পাইপলাইনে রেখে দেওয়া হয়। আমরা পেরেন্সের সাথে সেগুলি সমস্ত একটি এবং তাদের সাথে এক সাথে সংযুক্ত করি , তারপরে টস অফ (সংক্ষিপ্ত এবং অনুরূপ-ইশ টু )।.substring()2()-join+iexInvoke-Expressioneval

আমার কাছে মনে হয় .NET কলগুলিতে সঠিকভাবে কল করার জন্য এই প্রযুক্তিগতভাবে v2 বা আরও নতুন প্রয়োজন।

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