একটি শব্দের বাইনারি বিভক্তির যোগফল গণনা করুন


22

sইনপুট হিসাবে মুদ্রণযোগ্য ASCII- অক্ষর সমন্বিত একটি স্ট্রিং নিন এবং এর "বাইনারি বিভক্তির যোগফল" আউটপুট করুন। ব্যাখ্যা দরকার?

বাইনারি বিভক্তির যোগফল আপনি কীভাবে পাবেন?

আমরা A4নীচের ব্যাখ্যায় উদাহরণ হিসাবে স্ট্রিংটি ব্যবহার করব ।

  • অক্ষরগুলিকে বাইনারি রূপান্তর করুন, প্রতিটি বর্ণকে 7-বিট ASCII চরিত্র হিসাবে বিবেচনা করুন

    A -> ASCII 65 -> 1000001
    4 -> ASCII 52 -> 0110100
    
  • বাইনারি সংখ্যাগুলিকে একটি নতুন বাইনারি সংখ্যায় সংযুক্ত করুন

    A4 -> 1000001 & 0110100 -> 10000010110100
    
  • অংশ, কোথায় নতুন বাইনারি সংখ্যাকে বিভক্ত 1একটি থাকতে পারে 0তার বাঁদিকে। আপনি একটানা 1গুলি বিভক্ত করা উচিত নয় ।

    10000010110100 -> 100000, 10, 110, 100
    
  • এই বাইনারি সংখ্যাগুলিকে দশমিক রূপান্তর করুন

    100000, 10, 110, 100 -> 32, 2, 6, 4
    
  • এই সংখ্যার যোগফল নিন:

    32 + 2 + 6 + 4 = 44
    

সুতরাং, স্ট্রিংয়ের আউটপুট A4হওয়া উচিত 44


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

a
49

A4
44

codegolf
570

Hello, World!
795

2
আমি মনে করি ASCII রূপান্তর পদক্ষেপ ব্যতীত এটি একটি দুর্দান্ত চ্যালেঞ্জ হতে পারে, কেবল ইনপুট হিসাবে দ্বিতীয় ধাপের পরে (দশমিক) সংখ্যাটি গ্রহণ করে।
xnor

আসলে, 8372আসলে।
xnor

1
@ এক্সনর, আপনি ঠিক থাকতে পারেন, এবং এটি আরও পরিষ্কার হবে। যদিও অক্টোবায় এটি সমাধান করার জন্য আমি মজা পেয়েছি এবং আমি আশা করি অন্যরাও এটি সমাধান করা উপভোগ করবেন :)
স্টিভি গ্রিফিন

উত্তর:


12

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

-5 বাইট ধন্যবাদ আদনানকে
-5 বাইট ধন্যবাদ xnor

s=0
for c in input():s=s*128+ord(c)
print eval(bin(s).replace('01','0+0b1'))

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

for c in input():s=s*128+ord(c)সংখ্যাসূচকভাবে ASCII রূপান্তর করতে, যেখানে বিভাজন এবং যোগফলের জন্য 7 বার (ধাপ 1 এবং 2) *128বাম শিফটে ব্যবহৃত হয় (ধাপ 3, 4 এবং 5)s
eval(('0'+new_bin).replace('01','0+0b1'))


দারুণ কৌশল eval! এরকম হওয়া ASCII রূপান্তর সংখ্যাসূচকভাবে কিছু বাইট পরিমাণ সঞ্চয় হয়।
xnor

7

জেলি , 13 বাইট

Oḅ128BŒg;2/ḄS

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

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

Oḅ128BŒg;2/ḄS  Main link. Argument: s (string)

O              Ordinal; map characters to their code points.
 ḅ128          Unbase 128; convert the resulting list from base 128 to integer.
     B         Binary; Convert the resulting integer to base 2.
      Œg       Group consecutive, equal bits.
        ;2/    Concatenate all non-overlapping pairs.
           Ḅ   Unbinary; convert from base 2 to integer.
            S  Take the sum.

আমি বেস রূপান্তর এর কৌশলটি এর আগে মিস করেছি।
জোনাথন অ্যালান

আহ, দুর্দান্ত কৌশল!
আদনান

6

এমএটিএল , 14 বাইট

YB!'1+0*'XXZBs

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

ব্যাখ্যা

'A4'উদাহরণ হিসাবে ইনপুট বিবেচনা করুন ।

YB        % Implicit input. Convert to binary using characters '0' and '1'. 
          % Gives a char matrix, where each row corresponds to a number
          % STACK: ['1000001'; '0110100']
!         % Transpose. This is necessary because MATL uses column-major 
          % order when linearizing a matrix into a vector
          % STACK: ['10'; '01'; '01'; '00'; '01'; '00'; '10']
'1+0*'    % Push this string: regexp pattern
          % STACK: ['10'; '01'; '01'; '00'; '01'; '00'; '10'], '1+0*'
XX        % Regexp. Linearizes the first input into a row (in column-major
          % order), and pushes a cell array of substrings that match the
          % pattern given by the second input
          % STACK: {'100000'; '10'; 110'; '100'}
ZB        % Convert each string into a decimal number. Gives numeric vector
          % STACK: [32; 2; 6; 4]
s         % Sum. Implicitly display
          % STACK: 44

5

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

কোড:

Çžy+b€¦JTR021:2¡CO

ব্যাখ্যা:

Ç                   # Take the ASCII value of each character
 žy+                # Add 128 to each value (to pad each with enough zeros)
    b               # Convert to binary
     €¦             # Remove the first character
       J            # Join the array
        TR021:      # Replace 01 by 021
              2¡    # Split on the number 2
                C   # Convert from binary to decimal
                 O  # Sum them all up

05AB1E এনকোডিং ব্যবহার করে । এটি অনলাইন চেষ্টা করুন!


5

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

Çžy+b€¦Jγ2ôJCO

আমার জেলি উত্তরের একটি বন্দর , আদনানের 05 এবি 1 উত্তর থেকে 128 অফসেট ব্যবহার করে (আমি লিখেছি জেলি উত্তরটির 256 এর চেয়ে বেশি ) using

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

কিভাবে?

Çžy+b€¦Jγ2ôJCO
Ç              - to ordinals
   +           - add
 žy            - literal 128
    b          - to binary
     €         - for each
      ¦        -   dequeue
       J       - join
        γ      - group into chunks of equal elements
          ô    - split into chunks of
         2     - literal 2
           J   - join
            C  - from binary
             O - sum

3

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

s=>eval(s.replace(/./g,c=>(128+c.charCodeAt()).toString(2).slice(1)).replace(/1+/g,'+0b$&'))

সম্পাদনা করুন: @ কনরও ব্রায়েনের কিছু সহায়তায় 5 বাইট সংরক্ষণ করা হয়েছে।


আমার নিজস্ব সমাধানটিও ছিল 97 বাইট, s=>eval([...s].map(e=>(e.charCodeAt()+128).toString(2).slice(1)).join``.replace(/1+0*/g,'+0b$&'))আপনি আমার প্রতিস্থাপন পদ্ধতিটি বাইট সংরক্ষণ করতে ব্যবহার করতে পারেন, আমি মনে করি
কনর ও'ব্রায়েন

1
@ কনোরও ব্রায়ান বাইটের চেয়ে বেশি, আমার মনে হয়!
নিল

ওও, এন আই সি ই: ডি
কনর ও'ব্রায়েন

3

জাপট , 18 12 বাইট

c_¤ùT7Ãò< xÍ
c_           // Firstly, take the input and map over it as charcodes.
  ¤          // Take the binary representation of each item
   ùT7       // and left-pad it with zeroes to standardize the items.
      Ã      // After all of the above,
       ò<    // partition the result where ever a 0 precedes a 1.
          xÍ // Then sum the numbers from base 2.

একক স্ট্রিং হিসাবে ইনপুট নেয়।
অন্যান্য উত্তর দ্বারা ব্যবহৃত 128 বা 256 সংযোজনটিও চেষ্টা করে দেখলাম, তবে 0-প্যাডিং ব্যবহার করা সংক্ষিপ্ত ছিল।

একটি সম্পূর্ণ খুব বড় 6 কামিয়ে ধন্যবাদ বাইট ETHproductions এবং অলিভার

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


আপনি এখানে আরও বেশি অটো-ফাংশন ব্যবহার করতে পারেন: òÈ<YÃহতে পারে ò<(পিছনের স্থান সহ), এবং Ën2Ãxহতে পারে xn2। আপনি কমাতে সংরক্ষণের Tজায়গায়ও ব্যবহার করতে পারেন 0। (এছাড়াও, আমাদের যোগদান নির্দ্বিধায় Japt চ্যাটরুম যদি কখনও প্রশ্ন থাকে বা golfing সঙ্গে :-) সাহায্য চাই)
ETHproductions

@ ইথ প্রডাকশন আবার ধন্যবাদ, বিশেষত Tকৌতুকের জন্য, আপনি জানেন না (আব) এর জন্য ভেরিয়েবল ব্যবহার করতে পারেন, এটি খুব সহজ y xn2সংকলিত হওয়ার পরে অটো-ফাংশনটি কিছুটা অদ্ভুত দেখাচ্ছে x("n", 2), তাই আমি মনে করি তাদের পিছনে যুক্তি পুরোপুরি বুঝতে পারার আগেও এটি কিছুটা সময় নেবে। আপনার সহায়তায়, জাপ্ট সমাধানটি এখন জেলি উত্তর সহ প্রথম স্থানের জন্য বাঁধা আছে ।
নিট

ETHproductions সম্প্রতি জন্য একটি শর্টকাট তৈরি n2: Í। এটি এখনও টিআইও-তে আঘাত করেনি তবে আপনি এটি এখানে ব্যবহার করতে পারেন: ethproductions.github.io/japt/?v=1.4.5&code=Y1+k+VQ3w/…
অলিভার

@ অলিভার বাহ, এটি খুব রক্তক্ষরণ প্রান্ত, এটি এখনও দোভাষী শর্টকাট রেফারেন্সে আচ্ছাদিত নয়। অনেক ধন্যবাদ!
নিত

2

জেলি , 16 15 বাইট

-1 ডেনিস করার বাইট ধন্যবাদ (1 দ্বারা চেপ্টা যখন একটি পূর্ণ চেপ্টা জরিমানা প্রয়োজন নেই - প্রতিস্থাপন ;/সঙ্গে F)

O+⁹Bṫ€3FŒg;2/ḄS

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

কিভাবে?

O+⁹Bṫ€3FŒg;2/ḄS - Main link: list of characters, s    e.g. "A4"
O               - cast to ordinal (vectorises)        [65,52]
  ⁹             - literal 256
 +              - add (vectorises)                    [321, 308]
   B            - convert to binary (vectorises)      [[1,0,1,0,0,0,0,0,1],[1,0,0,1,1,0,1,0,0]]
    ṫ€3         - tail €ach from index 3              [[1,0,0,0,0,0,1],[0,1,1,0,1,0,0]]
       F        - reduce with concatenation           [1,0,0,0,0,0,1,0,1,1,0,1,0,0]
        Œg      - group runs of equal elements        [[1],[0,0,0,0,0],[1],[0],[1,1],[0],[1],[0,0]]
          ;2/   - pairwise reduce with concatenation  [[1,0,0,0,0,0],[1,0],[1,1,0],[1,0,0]]
             Ḅ  - convert from binary (vectorises)    [32,2,6,4]
              S - sum                                 44

1
;/সঙ্গে প্রতিস্থাপন করা যেতে পারে F
ডেনিস

2

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

for(;$c=ord($argn[$i++]);)$r.=sprintf("%07b",$c);$t=mb_split("(?<=0)(?=1)",$r);echo array_sum(array_map(bindec,$t));

অনলাইন সংস্করণ

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

for(;$c=ord($argn[$i++]);)$r.=sprintf("%07b",$c);$t=preg_split("#0\K(?=1)#",$r);echo array_sum(array_map(bindec,$t));

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

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

for(;$c=ord($argn[$i++]);)$r.=sprintf("%07b",$c);preg_match_all("#1+0+#",$r,$t);foreach($t[0]as$b)$s+=bindec($b);echo$s;

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

অথবা

for(;$c=ord($argn[$i++]);)$r.=sprintf("%07b",$c);preg_match_all("#1+0+#",$r,$t);echo array_sum(array_map(bindec,$t[0]));


1

[এফ #], 249 245 বাইট

open System
let rec c a=function|[]->[a]|'0'::'1'::y->(a+"0")::(c""('1'::y))|x::y->c(a+string x)y
let x i=c""(String.Join("",(Seq.map(fun c->Convert.ToString(int c,2).PadLeft(7,'0'))i))|>Seq.toList)|>Seq.map(fun c->Convert.ToInt32(c,2))|>Seq.sum

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

দ্রষ্টব্য: tio.run এর সংস্করণটির শিরোনামটিতে "ওপেন সিস্টেম" রয়েছে, আমি তার গণনাটি উপরের কোডটিতে যুক্ত করেছি। আমদানিতে কী বিধি রয়েছে তা আমি নিশ্চিত নই।

Ungolfed

let rec convert acc = function
    | [] -> [acc]
    | '0'::'1'::xs -> (acc + "0") :: (convert "" ('1'::xs))
    | x::xs -> convert (acc + string x) xs

let calculateSum input =
    let binary = Seq.map (fun x -> Convert.ToString(int x, 2).PadLeft(7, '0')) input

    String.Join("", binary)
    |> Seq.toList
    |> convert ""
    |>Seq.map (fun x -> Convert.ToInt32(x, 2))
    |>Seq.sum

যদি open Systemসি # এর মতো হয় using System;তবে হ্যাঁ আপনার এটি গণনাতে অন্তর্ভুক্ত করা দরকার। আপনি যদি এফ # তে এটি করতে পারেন তবে যা যা আছে তা আপনি পুরোপুরি যোগ্যতা অর্জন করতে পারেন System। উদাহরণস্বরূপ, সি # এর System.Console...পরিবর্তেusing System;Console...
TheLethalCoder

@ লেটলকোডার এটি হ্যাঁ, একই। এছাড়াও, এটিকে স্পষ্ট করার জন্য ধন্যবাদ :) আমি "ওপেন .." সংস্করণটি বেছে নিয়েছি কারণ এটি কেবল স্ট্রিংই নয়, সেই নামস্থানে বসবাসকারী রূপান্তরও করে।
ব্রুনার

0

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

{sum map {:2(~$_)},.comb».ord».fmt('%07b').join~~m:g/11*0*/}

.ordsপরিবর্তে ব্যবহার করুন .comb».ord। উপসর্গ [~]প্রায়শই এর পরিবর্তে ব্যবহার করা যেতে পারে .join। জিনিসটি combকরে যা বিদ্যমান m:g/…/11*0*/সংক্ষিপ্ত করা যেতে পারে /1+0*/। আমি সাথে এসেছি{sum map {:2($_)},comb /1+0*/,[~] .ords».fmt('%07b')}
ব্র্যাড গিলবার্ট বি

0

জে , 34 বাইট

[:+/@(,#.;.1~1,1=2#.\,)(7#2)#:3&u:

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

ব্যাখ্যা

[:+/@(,#.;.1~1,1=2#.\,)(7#2)#:3&u:  Input: array of characters S
                              3&u:  Get ASCII values of each character
                       (7#2)        Array with 7 copies of the value 2
                            #:      Convert each value to a base 2 array with length 7
[:  (                 )             Operate on those binary values
                     ,                Flatten it
                 2  \                 For each infix of size 2
                  #.                    Convert it to decimal from binary
               1=                     Test each value for equality to 1
             1,                       Prepend a 1
      ,                               The flattened binary values
         ;.1~                         Chop that at each occurrence of a 1
       #.                               Convert each chop from binary to decimal
 +/@                                Reduce by addition

0

গণিত 193 বাইট

f=FromDigits;l=Flatten;(S=Split@l@Table[PadLeft[IntegerDigits[ToCharacterCode@#,2][[k]],7],{k,StringLength@#}];Plus@@Table[f[RealDigits@f@Join[S[[i]],S[[i+1]]],2],{i,1,Length@S-1,2}]+Last@l@S)&

আপনি করছেন 7 বাইট সংরক্ষণ করতে পারবেন f=FromDigits;l=Flatten;শুরুতে, এবং তারপর যাদের দুটি ফাংশন সমস্ত উদাহরণ প্রতিস্থাপন fএবং l
নম্বরমানিয়াক

0

জে , 40 বাইট

+/>#.&.>(1,}.|.1 0 E.|.b)<;.1 b=.,#:a.i.

ব্যবহার:

+/>#.&.>(1,}.|.1 0 E.|.b)<;.1 b=.,#:a.i.'A4'

44 প্রদান করে


0

ক্লোজার, 150 বাইট

#(loop[[c & C](for[i % j[64 32 16 8 4 2 1]](mod(quot(int i)j)2))p 0 r 0 R 0](if c(if(=(dec c)p 0)(recur C c 1(+ R r))(recur C c(+(* 2 r)c)R))(+ R r)))

আমি আশা করছিলাম এএসসিআইআই থেকে বাইটে রূপান্তরকরণ এর চেয়ে কম ছিল। rবর্তমান ফলাফলটি Rসংগ্রহ করতে এবং মোট ফলাফল সংগ্রহ করার জন্য প্রকৃত লুপের দেহটি বেশ ছোট । পূর্ববর্তী বিটটি যদি pহয় 0এবং বর্তমান বিটটি cহয় 1তবে আমরা একটি নতুন অংশ বিভক্ত করে জমা হয়ে Rযাব, অন্যথায় আমরা আপডেট করেছিলাম rএবং Rএটি যেমন ছিল তেমন রাখি ।


0

পাইথন 123 বাইট

lambda w:sum(map(lambda x:int(x,2),"".join(map(lambda x:bin(ord(x))[2:].zfill(7),list(w))).replace("01","0:1").split(":")))

আপডেট হয়েছে, মার্টিন ইন্ডারকে ধন্যবাদ


1
পিপিসিজিতে আপনাকে স্বাগতম! সমস্ত উত্তরের হয় পুরো প্রোগ্রাম বা কলযোগ্য ফাংশন হওয়া প্রয়োজন (স্নিপেটের বিপরীতে যেখানে ইনপুটটি হার্ডকডযুক্ত ভেরিয়েবলের মধ্যে সংরক্ষণ করা হয়)। ফাংশনটি নামবিহীন হতে পারে, তবে lambda w:আপনার উত্তরটি বৈধ করার জন্য একটি সহ যথেষ্ট।
মার্টিন এন্ডার

দুঃখিত, আমি সম্ভবত এটি ভাল বাক্য না। আপনার সম্পাদনাটি এখনও অবৈধ কারণ ক) ইনপুটটি হার্ডকোডযুক্ত, খ) যদি এটি একটি সম্পূর্ণ প্রোগ্রাম হয় তবে এটি ফলাফলটি মুদ্রণ করে না। একটি পূর্ণ প্রোগ্রামের জন্য আপনাকে স্ট্যান্ডার্ড ইনপুট বা কমান্ড-লাইন আর্গুমেন্ট থেকে ইনপুটটি পড়তে হবে এবং ফলাফলটি স্ট্যান্ডার্ড আউটপুটে মুদ্রণ করতে হবে। এ কারণেই আমি বলেছি এটি যুক্ত করে আপনি কোনও ফাংশন হিসাবে জমা দিলে এটি সম্ভবত সবচেয়ে সহজ lambda w:
মার্টিন ইন্ডার

ওহ, ঠিক আছে, আমি এটি পেয়েছি, এটি যথেষ্ট হবে: f = ল্যাম্বদা ডাব্লু: যোগ (মানচিত্র (ল্যাম্বডা এক্স: ইন (এক্স, 2)), ""। যোগ দিন (মানচিত্র (ল্যাম্বদা এক্স: বিন (অর্ড (এক্স)) ) [2:]। Zfill (7), তালিকা (w))) প্রতিস্থাপন করুন ("01", "0: 1")। বিভক্ত (":")))
শ্যাডোক্যাটজ

হ্যাঁ, এটি বৈধ এমনকি আপনার প্রয়োজনও নেই f=, কারণ আমরা বেনামে ফাংশনগুলিকে অনুমতি দিই (যদি না আপনি পুনরাবৃত্ত কলগুলির জন্য ফাংশনটির নাম উল্লেখ না করেন)।
মার্টিন এেন্ডার 21

0

কে (ওকে) , 31 বাইট

সমাধান:

+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$

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

উদাহরণ:

+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$,"a"
49
+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$"A4"
44
+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$"codegolf"
570
+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$"Hello, World!"
795

ব্যাখ্যা:

ASCII মানগুলিতে রূপান্তর করুন, 7-বিট বাইনারি রূপান্তর করুন, সমতল করুন, কোথায় আলাদা হবে তা সন্ধান করুন এবং যেখানে ভিন্ন ভিন্ন তা খুঁজে পেতে মূল তালিকার বিপরীতে 1। এই সূচকগুলি কাটা, দশমিকটিতে ফিরে রূপান্তর করুন এবং যোগফল করুন:

+/2/'_[;x]&x&~~':x:,/(7#2)\'`i$ / the solution
                            `i$ / convert to integer
                     (7#2)      / draw from 2, 7 times => 2 2 2 2 2 2 2
                          \'    / decode each (convert to binary)
                   ,/           / flatten
                 x:             / save as x
             ~~':               / not-not-each previous (differ)
            &                   / and with
           x                    / x
          &                     / indices where true
     _[;x]                      / projection, cut x at ...
  2/'                           / encode each (convert from binary)
+/                              / sum up

বোনাস

কে 4 - তেও একটি 31 বাইট সংস্করণ পরিচালনা করেছেন, তবে এর জন্য টিআইও নেই বলে আমি আমার ওকে সমাধান পোস্ট করছি।

+/2/:'_[;x]@&x&~~':x:,/1_'0b\:'

0

এপিএল (ডায়ালগ) , 30 বাইট

{+/2⊥¨(1∘+⊆⊢)∊¯7↑¨2⊥⍣¯1¨⎕UCS⍵}

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

কিভাবে?

⎕UCS⍵ - ইউনিকোডিফাই

2⊥⍣¯1¨ - বাইনারি প্রতিটি এনকোড

¯7↑¨ - এবং জিরো সহ 7 টি জায়গায় বাম দিকে প্যাড

- চ্যাপ্টা

1∘+⊆⊢ - স্ব দ্বারা বিভাজন এক এক দ্বারা বৃদ্ধি

2⊥¨ - বাইনারি থেকে প্রতিটি ডিকোড

+/ - যোগফল

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