বাইনারি সাবস্ট্রিংস


17

বিএমও 2 2009 থেকে চতুর্থ সমস্যার দ্বারা অনুপ্রাণিত ।

ইনপুট বা পরামিতি হিসাবে ধনাত্মক পূর্ণসংখ্যা n প্রদান করে, এন এর বাইনারি প্রসারণে যার বাইনারি উপস্থাপনা ব্লক হিসাবে উপস্থিত হয় সেই ধনাত্মক পূর্ণসংখ্যার সংখ্যাটি প্রদান করুন ।

উদাহরণস্বরূপ, 13 -> 6 কারণ বাইনারিতে 13 টি 1101 এবং এর সাবস্ট্রিং রয়েছে 1101, 110, 101, 11, 10, 1। আমরা শূন্যের সাথে শুরু হওয়া বাইনারি সংখ্যাগুলি গণনা করি না এবং আমরা নিজেও শূন্য গণনা করি না।

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

13 -> 6
2008 -> 39
63 -> 6
65 -> 7
850 -> 24
459 -> 23
716 -> 22
425 -> 20
327 -> 16

আপনি সময় নিতে পারে এন নিম্নলিখিত কোন হিসাবে:

  • একটি পূর্ণসংখ্যা
  • বাইনারি উপস্থাপনের জন্য সত্যবাদী / মিথ্যা মানগুলির একটি তালিকা
  • বাইনারি উপস্থাপনের জন্য একটি স্ট্রিং
  • বেস 10 স্ট্রিং (যদিও আমি নিশ্চিত না যে কেন কেউ এটি করবে)

আপনার কোডটি যতটা সম্ভব সংক্ষিপ্ত করুন।


3
আপনি কি 63-> 5 এবং 6 টি নিশ্চিত করতে পারবেন? বিন ()৩) = 111111 -> ছয়টি স্বতন্ত্র ননজারো সাবস্ট্রিং
দ্বাইলান

সম্পর্কিত। (সাবস্ট্রিংয়ের পরিবর্তে উপসর্গগুলি ব্যবহার করে এবং নেতৃস্থানীয় শূন্যগুলিকে উপেক্ষা করে না))
মার্টিন ইন্ডার

1
টুইটারে সংশোধন করা হয়েছে।
0WJYxW9FMN

@ মার্টিনএেন্ডার এই সাইটে থাকার জন্য এটি কি যথেষ্ট আলাদা বা আমি এটি নকল হিসাবে মুছে ফেলতে পারি? আমি মনে করি এটি যথেষ্ট আলাদা, তবে আপনি আমার চেয়ে অনেক ভাল জানেন।
0WJYxW9FMN

@ J843136028 এটিকে নকল তৈরি না করার জন্য বড় পার্থক্য হ'ল অন্য চ্যালেঞ্জের সময় সীমাবদ্ধতা। আপনি ভাল আছেন। (সবেমাত্র লিঙ্কটি পোস্ট করেছেন, যাতে প্রতিদ্বন্দ্বিতা একে অপরের সাইডবারে প্রদর্শিত হয়))
মার্টিন ইন্ডার

উত্তর:


7

পাইথন 3, 54 50 বাইট

lambda n:sum(bin(i)[2:]in bin(n)for i in range(n))

রড এবং জোনাথন অ্যালানকে চারটি বাইট সংরক্ষণের জন্য ধন্যবাদ।


আপনি +1পরিসীমা থেকে bin(i)
রড

1
বস্তুত যেহেতু আমরা সবসময় গণনা nনিজেই এবং করছে সবসময় অগ্রাহ্য 0আমাদের গণনা আমরা পরিবর্তে সবসময় অগ্রাহ্য পারে nএবং সবসময় গণনা 0(বিন (ঢ) শুরু '0b...',) অত: পর আমরা অপসারণ করতে পারেন 1,এবং +1সম্পূর্ণরূপে এবং ছুটি bin(i)হিসাবে সংরক্ষণ করুন চার বাইট অনলাইনে চেষ্টা করুন!
জোনাথন অ্যালান

5

জেলি , 4 বাইট

ẆQSḢ

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

0গুলি এবং 1এর তালিকা হিসাবে ইনপুট নেয় ।

সংখ্যা সহ এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

ẆQSḢ Argument: B = list of bits, e.g. [1, 1, 0, 1]
Ẇ    Get B's non-empty sublists (i.e. [[1], [1], [0], [1], [1, 1], [1, 0], [0, 1], [1, 1, 0], [1, 0, 1], [1, 1, 0, 1]])
 Q   Keep first occurrences (i.e. [[1], [0], [1, 1], [1, 0], [0, 1], [1, 1, 0], [1, 0, 1], [1, 1, 0, 1]])
  S  Reduce by vectorized addition (i.e. [6, 4, 1, 1])
   Ḣ Pop first element (i.e. 6)

প্রমাণ এটি কাজ করে:

এই প্রোগ্রামটি একটি ইনপুট নম্বর পায়, এন । এই পণ্যটি প্রথম যে কাজটি করে তা হ'ল অবশ্যই এন 2 ( বেস 2 তে এন ) এর সাবস্ট্রিংগুলি গ্রহণ করুন । এর মধ্যে 0 বা 1 দিয়ে শুরু হওয়া সদৃশ সাবস্ট্রিংগুলি অন্তর্ভুক্ত ।

এর পরে, আমরা কেবল স্ট্রিং তালিকায় প্রতিটি মানের প্রথম উপস্থিতি রেখে অনন্য সাবস্ট্রিংগুলি গ্রহণ করি।

তারপরে, এই প্রোগ্রামটি তালিকার প্রথম উপাদানগুলির একসাথে যোগ করে, তারপরে দ্বিতীয় উপাদানগুলি, তৃতীয়, চতুর্থ, ইত্যাদি 0su চ্যালেঞ্জটি কার্যকরভাবে জিজ্ঞাসা করে যে 1 টি দিয়ে শুরু হওয়া কতগুলি অনন্য সাবস্ট্রিংগুলি এই সংখ্যাটির বাইনারি আকারে রয়েছে? । যেহেতু প্রতিটি প্রথম উপাদান গণনা করতে হবে 1, আমরা যথাযথ সাবস্ট্রিংগুলির জন্য ফিল্টারিংয়ের পরিবর্তে কেবল যোগ করতে পারি।

এখন, উপরে বর্ণিত সংক্ষেপের ফলাফলের তালিকার প্রথম উপাদানটি সাবস্ট্রিংগুলির প্রথম বিটের গণনা রাখে, তাই আমরা কেবল পপ করি এবং শেষ পর্যন্ত এটি ফিরিয়ে দেব।


4

অক্টাভা , 62 61 বাইট

@(n)sum(arrayfun(@(t)any(strfind((g=@dec2bin)(n),g(t))),1:n))

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

ব্যাখ্যা

ইনপুট করতে n, কোড থেকে সমস্ত সংখ্যার পরীক্ষা 1করতে nযদি তাদের বাইনারি উপস্থাপনা ইনপুটের বাইনারি উপস্থাপনা একটি সাবস্ট্রিং কিনা দেখতে।

@(n)                                                          % Anonymous function of n
        arrayfun(                                      ,1:n)  % Map over range 1:n
                 @(t)                                         % Anonymous function of t
                         strfind(               ,    )        % Indices of ...
                                                 g(t)         % t as binary string ...
                                 (g=@dec2bin)(n)              % within n as binary string
                     any(                             )       % True if contains nonzero
    sum(                                                    ) % Sum of array

3

05 এ বি 1 ই , 5 বাইট

বাইনারি স্ট্রিং হিসাবে ইনপুট নেয়।
শিরোনামটি পরীক্ষার স্বাচ্ছন্দ্যের জন্য পূর্ণসংখ্যার ইনপুটটিকে বাইনারিতে রূপান্তর করে।

ŒCÙĀO

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

ব্যাখ্যা

Œ        # push all substrings of input
 C       # convert to base-10 int
  Ù      # remove duplicates
   Ā     # truthify (convert non-zero elements to 1)
    O    # sum

ওহ্ ... আমি ভেবেছিলাম আমার ফিল্টারটি স্মার্ট। bŒʒć}Ùgতবে না, এটা আরও ভাল।
ম্যাজিক অক্টোপাস উরান


2

পাওয়ারশেল , 103 92 82 বাইট

param($s)(($s|%{$i..$s.count|%{-join$s[$i..$_]};$i++}|sort -u)-notmatch'^0').count

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

ইনপুটটিকে একটি অ্যারের হিসাবে 1এবং 0(পাওয়ারশেলের সত্যতা এবং মিথ্যা) হিসাবে নেয় । এর মধ্য দিয়ে লুপ $s(যেমন, ইনপুট অ্যারেতে কতগুলি উপাদান রয়েছে)। লুপ, বর্তমান সংখ্যা থেকে আমরা লুপ ইনসাইড (হিসেবে সংরক্ষিত $iপর্যন্ত) $s.count। প্রতিটি অভ্যন্তরীণ লুপ, আমরা -joinঅ্যারে একটি স্ট্রিং মধ্যে টুকরা। আমরা তখন sortসঙ্গে -unique পতাকা (যা তুলনায় খাটো selectসঙ্গে -unique পতাকা এবং আমরা পরোয়া করি না কিনা তারা বা সাজানো করছি নয়), ঐ যে দিয়ে শুরু করবেন না নেওয়া 0, এবং সামগ্রিক নেওয়া.count । এটি পাইপলাইনে রেখে গেছে এবং আউটপুট অন্তর্ভুক্ত।


2

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

f=(s,q="0b"+s)=>q&&s.includes((q--).toString(2))+f(s,q)

বাইনারি স্ট্রিং হিসাবে ইনপুট নেয়।

সংখ্যা এবং পুনরাবৃত্তি ফাংশন দিয়ে এটি করার একটি দুঃখজনক চেষ্টা এখানে:

f=(n,q=n)=>q&&(g=n=>n?n^q&(h=n=>n&&n|h(n>>1))(q)?g(n>>1):1:0)(n)+f(s,q-1)

ওল্ড অ্যাপ্রোচ, 74 বাইট

s=>(f=s=>+s?new Set([+s,...f(s.slice(1)),...f(s.slice(0,-1))]):[])(s).size

বাইনারি স্ট্রিং হিসাবে ইনপুটও নেয়।


1

পাইথন 2 ,  118  81 বাইট

37 বাইট সংরক্ষণের জন্য @ রডকে ধন্যবাদ!

lambda n:len({int(n[i:j+1],2)for i in range(len(n))for j in range(i,len(n))}-{0})

বাইনারি স্ট্রিং হিসাবে ইনপুট নেয়।

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

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

@ রডকে ধন্যবাদ!

lambda n:len({n[i:j+1]for i in range(len(n))for j in range(i,len(n))if'1'==n[i]})

বাইনারি স্ট্রিং হিসাবে ইনপুট নেয়।

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


আপনি ইনপুট হিসাবে একটি বাইনারি স্ট্রিং গ্রহণ করতে পারেন, আপনি set(...)সাথে {...}এবং এর xrangeসাথে প্রতিস্থাপন করতে পারেনrange
রড

আপনি +1রেঞ্জ থেকে স্লাইসে সরিয়ে s.startswithনিতে int(s,2) পারেন এবং এটিকে পছন্দ
রড

1
আপনি আপনার পুরানো পদ্ধতির রাখতে চান, তাহলে আপনি ব্যবহার করতে পারেন এই একই বাইট গণনা জন্য
ডান্ডা

1

জেলি , 5 বাইট

ẆḄQṠS

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

1 এবং 0 এর তালিকা হিসাবে ইনপুট নেয়। লিঙ্কটির পাদলেখগুলি পোস্টের প্রতিটি উদাহরণের সাথে ফাংশনটি প্রয়োগ করে।

জোনাথন অ্যালান নির্দেশ করেছেন যে ẆḄQTL5 বাইট বিকল্প যা Tপরমাণু ব্যবহার করে যা সমস্ত সত্যবাদী উপাদানগুলির সূচকগুলি খুঁজে পায়।

ব্যাখ্যা

বিন (13) = 1101 উদাহরণ হিসাবে নিন। ইনপুট হয়[1,1,0,1]

ẆḄQṠS
Ẇ       All contiguous sublists -> 1,1,0,1,11,10,01,110,101,1101 (each is represented as a list)
 Ḅ      From binary to decimal. Vectorizes to each element of the above list -> 1,1,0,1,3,2,1,6,5,13
  Q     Unique elements
   Ṡ    Sign. Positive nums -> 1 , 0 -> 0.
    S   Sum

05AB1E উত্তর থেকে "সত্যায়িত" (এই ক্ষেত্রে সাইন ইন) ধারণা নিয়েছেন


1
আপনি আসলে, জেলি এর Truthy ইনডেক্সে পরমাণু ব্যবহার করতে পারে T, সঙ্গেẆḄQTL
জনাথন অ্যালান

1

আর , 88 77 বাইট

function(x)sum(!!unique(strtoi(mapply(substring,x,n<-1:nchar(x),list(n)),2)))

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

বাইনারি স্ট্রিং হিসাবে ইনপুট নেয়।

ব্যবহার করে mapply, ইনপুটটির সমস্ত সাবস্ট্রিংয়ের একটি অ্যারে তৈরি করে । strtoiএগুলিকে বেস 2পূর্ণসংখ্যার হিসাবে রূপান্তর করে , এবং আমি ফলাফলটিতে !!এন্ট্রিগুলির লজিকাল রূপান্তর ( ) এর যোগফল গ্রহণ করি ।


1

রেটিনা , 37 29 বাইট

.+
*
+`(_+)\1
$1#
#_
_
wp`_.*

এটি অনলাইন চেষ্টা করুন! আমাকে কেবল রেটিনা ১.০ এর wসংশোধকটি চেষ্টা করে দেখতে হয়েছিল । সম্পাদনা করুন: @ মার্টিনইেন্ডারে 8 টি বাইট সংরক্ষণ করা হয়েছে। ব্যাখ্যা:

.+
*

দশমিক থেকে আনারিতে রূপান্তর করুন।

+`(_+)\1
$1#
#_
_

ব্যবহার করে, বাইনারিতে ইউনারী থেকে রূপান্তর করুন #জন্য 0এবং _1।

wp`_.*

সাবস্ট্রিংগুলি তৈরি করুন যা দিয়ে শুরু হয় 1, আমি বলতে চাইছি_wপরিবর্তক তাহলে সব সাবস্ট্রিং, শুধু প্রতিটি শুরুর দিকে দীর্ঘতম এক সাথে মিলে যায় _সময়, pপরিবর্তক deduplicates ম্যাচ। শেষ অবধি এটি ম্যাচের গণনা সুস্পষ্টভাবে ফিরে আসল।


আপনি ছাড়াও q(বা p) সংশোধক ব্যবহার করে শেষ তিনটি পর্যায় একটিকে রোল করতে পারেন w। আপনার Cস্পষ্টভাবে নির্দিষ্ট করে দেওয়ার দরকার নেই , কারণ এটি কেবলমাত্র একক উত্স বাকী থাকলে এটি ডিফল্ট স্টেজ টাইপ।
মার্টিন এন্ডার

@ মার্টিনইন্ডার ধন্যবাদ, আমি এখনও Mডিফল্ট ধরণের ধরণের হয়ে অভ্যস্ত !
নীল

ঠিক আছে, Cকিন্ডা যা Mব্যবহৃত হত। :)
মার্টিন এন্ডার

আমি জানি কেন এটি ডিফল্ট, এটি স্যুইচ করার অভ্যস্ত হয়ে উঠছে।
নীল

1

পাইথ , 8 বাইট

l #{vM.:

এখানে চেষ্টা করুন!

বাইনারি স্ট্রিং হিসাবে ইনপুট নেয়।

.:সমস্ত সাবস্ট্রিং তৈরি করে, vMপ্রতিটিকে মূল্যায়ন করে (এটি প্রতিটি বাইনারি থেকে রূপান্তর করে), {ডুপ্লিকেটগুলি, <space>#পরিচয় অনুসারে ফিল্টার দেয় এবং lদৈর্ঘ্য পায় gets


1

ওল্ফ্রাম ভাষা (ম্যাথমেটিকা) , 35 বাইট

বাইনারি উপস্থাপনার অনন্য উপসর্গগুলি গণনা করা হচ্ছে যা একটি দিয়ে শুরু হয়, যদিও আমি নিশ্চিত নই যে এই কোডটি এমনকি একটি ব্যাখ্যাও প্রয়োজন।

Union@Subsequences@#~Count~{1,___}&

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


কি করে ___?
ফ্রাউনফ্রোগ

প্যাটার্ন মিল, _ একটি একক আইটেম, __ এক বা একাধিক, ___ 0 বা আরও বেশি।
কেলি লোডার 20



0

জাভা, 232 বাইট

String b=toBin(n);
l.add(b);
for(int i=1;i<b.length();i++){
for(int j=0;j<=b.length()-i;j++){
String t="";
if((""+b.charAt(j)).equals("0"))continue;
for(int k=0;k<i;k++){
t+=""+b.charAt(j+k);
}
if(!l.contains(t))l.add(t);
}
}
return l.size();

যেখানে এন ইনপুট, বি হ'ল বাইনারি উপস্থাপনা এবং l সমস্ত সাবস্ট্রিংয়ের একটি তালিকা। এখানে প্রথমবার পোস্ট করা, অবশ্যই উন্নত করা দরকার, এবং কোনও ভুল নির্দ্বিধায় নির্দ্বিধায়! পাঠ্যতার জন্য সামান্য সম্পাদিত ited


পিপিসিজিতে আপনাকে স্বাগতম! আপনার পঠনযোগ্যতার জন্য নতুন লাইনের সন্নিবেশ সম্পর্কে, সাধারণত একটি স্কোরিং সংস্করণ থাকতে পছন্দ করা হয় যা শিরোনামে লিখিতভাবে বাইটের পরিমাণ হ'ল, এবং তারপরে পাঠযোগ্যতার জন্য একটি অতিরিক্ত অব্যক্ত বা কম-গল্ফযুক্ত সংস্করণ।
লাইকনি

@ লাইকনি মাথা উঁচু করার জন্য ধন্যবাদ! ভবিষ্যতের পোস্টগুলির জন্য মনে রাখবেন!
নিহিলিশ

String b=...,tএবং int i=...,j,kএকই ধরণের বারবার ঘোষণার জন্য অক্ষর সংরক্ষণ করা। আপনার কোডটি এন্ট্রি হিসাবেও যোগ্যতা অর্জন করবে না কারণ এটি একটি স্নিপেট, একটি সম্পূর্ণ প্রোগ্রাম বা কার্যকরী খণ্ড নয়, আপনাকে হয় একটি ফাংশন লিখতে হবে বা ল্যাম্বডা ফর্মটিতে আপনার কোডটি মোড়াতে হবে
ল্যাম্বদা আবদ্ধ করতে হবে

0

সহদূত , 35 বাইট

`-&1@`#@Unique@(UnBin=>Subsets@Bin)

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

সমতুল্যভাবে:

{#Unique[UnBin=>Subsets[Bin[_]]]-1}

ব্যাখ্যা

আমি দ্বিতীয় সংস্করণটি ব্যাখ্যা করব, কারণ এটি অনুসরণ করা সহজ (স্পষ্টতই):

{#Unique[UnBin=>Subsets[Bin[_]]]-1}
{                                 }   lambda: _ = first argument
                        Bin[_]        convert to binary
                Subsets[      ]       all subsets of input
         UnBin=>                      map UnBin over these subsets
  Unique[                      ]      remove all duplicates
 #                              -1    size - 1 (since subsets is improper)


0

জাভা 8, 160 159 158 বাইট

import java.util.*;b->{Set s=new HashSet();for(int l=b.length(),i=0,j;i<l;i++)for(j=l-i;j>0;s.add(new Long(b.substring(i,i+j--))))s.add(0L);return~-s.size();}

বাইনারি-স্ট্রিং হিসাবে ইনপুট।
আরও একটি ছোট উপায় থাকতে হবে ..>।>

ব্যাখ্যা:

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

import java.util.*;          // Required import for Set and HashSet
b->{                         // Method with String as parameter and integer as return-type
  Set s=new HashSet();       //  Create a Set
  for(int l=b.length(),      //  Set `l` to the length of the binary-String
      i=0,j;i<l;i++)         //  Loop from 0 up to `l` (exclusive)
    for(j=l-i;j>0;           //   Inner loop from `l-i` down to `0` (exclusive)
      s.add(new Long(b.substring(i,i+j--))))
                             //    Add every substring converted to number to the Set
      s.add(0L);             //    Add 0 to the Set
  return~-s.size();}         //  Return the amount of items in the Set minus 1 (for the 0)

0

সি ++, 110 বাইট

#include<set>
std::set<int>s;int f(int n){for(int i=1;i<n;i+=i+1)f(n&i);return n?s.insert(n),f(n/2):s.size();}

এটি একটি পুনরাবৃত্তি ফাংশন। আমরা std::setসদৃশগুলি উপেক্ষা করে মান গণনা করতে একটি ব্যবহার করি । দুটি পুনরাবৃত্ত কলগুলি মাস্কের বিটগুলি বামে ( f(n&i)) এবং ডানদিকে ছাড়াই (f(n/2) ) এর , শেষ পর্যন্ত সমস্ত সাবস্ট্রিংগুলি পূর্ণসংখ্যা হিসাবে উত্পাদন করে।

নোট করুন যে আপনি যদি আবার কল করতে চান তবে sঅবশ্যই কলগুলির মধ্যে সাফ হওয়া উচিত।

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

#include <cstdlib>
#include <iostream>

int main(int, char **argv)
{
    while (*++argv) {
        auto const n = std::atoi(*argv);
        s={};
        std::cout << n << " -> " << f(n) << std::endl;
    }
}

ফলাফল

./153846 13 2008 63 65 850 459 716 425 327
13 -> 6
2008 -> 39
63 -> 6
65 -> 7
850 -> 24
459 -> 23
716 -> 22
425 -> 20
327 -> 16



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