আমার সন্ধ্যা থেকে আমার প্রতিক্রিয়া বিয়োগ করুন


19

একটি অ-নেতিবাচক পূর্ণসংখ্যা দেওয়া, এর সমান সংখ্যার যোগফল এবং তার বিজোড় অঙ্কগুলির যোগকের মধ্যে পরম পার্থক্যটি প্রদান করুন।

ডিফল্ট বিধি

  • স্ট্যান্ডার্ড লুফোলস প্রযোজ্য।

  • আপনি কোনও স্ট্যান্ডার্ড ইনপুট / আউটপুট পদ্ধতিতে ইনপুট নিতে এবং আউটপুট সরবরাহ করতে পারেন।

  • আপনি স্ট্রিং হিসাবে, একটি পূর্ণসংখ্যা হিসাবে বা অঙ্কের তালিকা হিসাবে ইনপুট নিতে পারেন।

  • এটি , তাই প্রতিটি ভাষার বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী!

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

ইনপুট ~> আউটপুট

0 ~> 0 (| 0-0 | = 0)
1 ~> 1 (| 1-0 | = 1)
12 ~> 1 (| 2-1 | = 1)
333 ~> 9 (| 0- (3 + 3 + 3) | = 9)
459 ~> 10 (| 4- (5 + 9) | = 10)
2469 ~> 3 (| (2 + 4 + 6) -9 | = 3)
1234 ~> 2 (| (2 + 4) - (1 + 3) | = 2)

1
আমরা কি ইনটগুলির তালিকা হিসাবে ইনপুট নিতে পারি?
Adám

4
@ মিস্টার এক্সকোডার এটি খুব তুচ্ছ হবে না। এটি চ্যালেঞ্জটিকে অহেতুক জটিল করে তোলে এবং এটি একটি স্বেচ্ছাসেবী প্রয়োজনীয়তা যা বাইটগুলি যুক্ত করে।
Okx

4
@ মিঃ এক্সকোডারটি গিরগিটি চ্যালেঞ্জ করবেন না । আপনি যে সর্বাধিক গুরুত্বপূর্ণ বাক্যটি এখানে দেখতে চাইছেন তা হ'ল দুটি বা ততোধিক সম্পর্কযুক্ত মূল চ্যালেঞ্জগুলিকে একের মধ্যে সংমিশ্রণ করা - চ্যালেঞ্জটিকে পৃথক চ্যালেঞ্জে বিভক্ত করা বা অপ্রয়োজনীয় অংশগুলি বাদ
দেওয়ার বিষয়টি বিবেচনা করুন

1
* চেমেল চ্যালেঞ্জ
ক্যালকুলেটরফলাইন

1
আমি @ ওকেক্স বিধি পরিবর্তন করেছি। অঙ্কের তালিকা হিসাবে গ্রহণের অনুমতি এখন । আমি এখনও মনে করি না যদিও এটি এটিকে ফ্লফি করে তুলবে।
মিঃ এক্সকডার

উত্তর:


8

জেলি , 6 বাইট

-*æ.¹A

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

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

-*æ.¹A  Main link. Argument: A (digit array)

-*      Raise -1 to A's digits, yielding 1 for even digits and -1 for odd ones.
    ¹   Identity; yield A.
  æ.    Take the dot product of the units and the digits.
     A  Apply absolute value.

তালিকা হিসাবে ইনপুট নিয়ে আপনি 1 বাইট সংরক্ষণ করতে পারেন।
ক্যালকুলেটরফলাইন

আমি আছি একটি তালিকা হিসাবে ইনপুট গ্রহণ।
ডেনিস

আমি সংশোধন 2 সম্পর্কে বলছি
ক্যালকুলেটরফলাইন

Raise -1 to A's digits, yielding 1 for even digits and 0 for odd ones.উম্ম, আমার মনে হয় আপনি কিছুটা বা অন্য কিছু
গোলমাল করেছেন

2
@ এরিকথআউটগল্ফার একের পর এক ত্রুটি ডরান।
ডেনিস

8

শেঞ্জেন আই / ও এমসিএক্সএক্সএক্সএক্সএক্সএক্স স্ক্রিপ্টস, 197 (126 + 71) বাইট

চিপ 1 (এমসি 6000):

  • x0: তালিকা হিসাবে ইনপুট
  • x2: চিপ 2 এক্স 1
  • x3: এমসি 4010
mov 0 dat
j:
mov x0 acc
mov 70 x3
mov -1 x3
mov acc x3
mul x3
mov acc x2
mov dat acc
add 1
tlt acc 3
mov acc dat
+jmp j
slx x0

চিপ 2 (এমসি 4000):

  • p0: আউটপুট
  • x0: এমসি 4010
  • x1: চিপ 1 এক্স 2
mov x1 acc
add x1
add x1
mov 30 x0
mov 0 x0
mov acc x0
mov x0 p0
slx x1

1
(আপনি আমাদের একটি করতে <!-- -->মন্তব্য কোড অধিকার একটি তালিকা পর গর্ত ইত্যাদি বোজানো পাঠ্যের পরিবর্তে পেতে, বা 4 আরো জায়গা মাধ্যমে কোডের ইন্ডেন্ট।।)
মাদুর

5

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

পূর্ণসংখ্যার তালিকা হিসাবে নেয়। এটি অনলাইনে চেষ্টা করুন

lambda A:abs(sum((-1)**i*i for i in A))

-3 বাইটস @ মিঃ এক্সএক্সকোডারকে
ধন্যবাদ -1 বাইট @ ওওএসকে ধন্যবাদ


1
ব্যবহার করুন [i,-i][i%2]পরিবর্তে i%2and i or -iজন্য 40 বাইট
মিঃ এক্সকোডার

2
(-1)**i*i39 বাইটের জন্য
ovs

5

টিআই-বেসিক, 18 9 বাইট

abs(sum((-1)^AnsAns

ব্যাখ্যা

তালিকার প্রতিটি ডিজিটকে তার পাওয়ার থেকে -1 দ্বারা গুণ করে প্রতিটি সংখ্যার সংখ্যার যোগফল যোগ করার আগে তা উপেক্ষা করে।


4

সি (জিসিসি) , 59 58 57 বাইট

i;f(char*v){for(i=0;*v;v++)i+=*v%2?*v-48:48-*v;v=abs(i);}

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


1
যদি এটি সহায়তা করে তবে আমি নিয়মগুলি পরিবর্তন করেছি এবং আপনি এখন তালিকা হিসাবে ইনপুট নিতে সক্ষম। আশা করি এটি বাইটস সাশ্রয় করবে। আমি সি জানি না, সুতরাং এটি কেবল একটি পরামর্শ।
মিঃ এক্সকোডার

4

আর, 30 29 বাইট

abs(sum((d=scan())-2*d*d%%2))

d = scan() একের পর এক সংখ্যায় ইনপুট নম্বর নেয়।

-১ বাইট @ জিউজ্পে ধন্যবাদ!


এটি বেশ চমৎকার! এখানে তৈরি করতে হবে 1 বাইট সঞ্চয়, যদিও:abs(sum((d=scan())-2*d*d%%2))
জিউসেপ

@ জিউসেপ ধন্যবাদ, ভাল টিপ, সম্পাদিত!
নিউটুল

4

সি #, 57 বাইট

namespace System.Linq{i=>Math.Abs(i.Sum(n=>n%2<1?n:-n))}

যেমন ইনপুট লাগে iএবং ঋণাত্মক থেকে মতভেদ চালু করার মাধ্যমে পূর্ণসংখ্যার অঙ্কের।


এখানে প্রথম উত্তর। আমাকে যদি এই পুরো জিনিসটি একটি আসল সি # প্রোগ্রামের মধ্যে আবৃত করতে হয় এবং সেই বাইটগুলিও গণনা করতে হয় তবে কোনও ক্লু নেই।
টাইকব

আপনাকে বয়লারপ্লেট অন্তর্ভুক্ত namespace System.Linq{করতে হবে এবং একটি আসল ফাংশন করতে হবে। রেফারেন্সের জন্য অন্যান্য সি # উত্তর দেখুন
জনাব এক্সকোডার 21

@ মিঃ এক্সকোডার তথ্যের জন্য ধন্যবাদ। ভাবলাম আমি পেয়েছি। আমার বাইট গণনাটি প্রায় দ্বিগুণ হয়েছে = (
এলওএল

হ্যাঁ, সি # সত্যিই সেরা গল্ফিং ভাষা নয়
মিঃ এক্সকোডার

@ মিঃ এক্সকোডার নোপ, তবে আমি ভেবেছিলাম যে নিয়মগুলি শিথিল হয়ে গেছে কারণ আমি প্রথম পৃষ্ঠায় নেমস্পেসের জিনিসগুলি ছাড়াই একটি পাতলা সংস্করণ দেখেছি এবং একটিও দেখিনি Main। কেবলমাত্র কারণ আমি ভেবেছিলাম আমি এটি দিয়ে উত্তর দেব। ওহ ওয়েলস
টাইকব

4

গণিত, 20 বাইট

Abs@Tr[(-1)^(g=#)g]&

সংখ্যার একটি তালিকা ইনপুট হিসাবে গ্রহণ করে

"নতুন নিয়ম" সম্পর্কে আমাকে জানানোর জন্য @ এলএলএএমএনওয়াইপি-র বিশেষ থেক্স


আমাকে মার! :) আপনার সম্ভবত দরকার নেই *
গ্রেগ মার্টিন

এখন যে ওপি প্রয়োজনীয়তাগুলি শিথিল করেছে আপনার কোড তুচ্ছভাবে আরও ছোট হতে পারে। +1
এলএলএএমএনওয়াইপি


3

নিম , 7 বাইট

ΓDᛃΞ𝐍}𝐬

ব্যাখ্যা:

Γ        Apply the following to each element in the input array
 D         Duplicate
  ᛃ        Modulo 2, then perform logical NOT
   Ξ       If truthy, then:
    𝐍        Multiply by -1
      }  Close all currently running loops/conditionals etc
       𝐬 Sum the resulting array

কার মধ্যে এমন একটি বিল্টিন নেই যা 2 দ্বারা মোডগুলি পরে যৌক্তিকভাবে ফলাফলটি নোট করে?
কেয়ার্ড কোইনারিংহিং

@ কায়ারডকোইনরিঙ্গিংহিং এটি মূলত 'কিনা কিনা তা চেক করুন "
ওকেক্স

3

এপিএল, 8 বাইট

|⊢+.ׯ1*⊢

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

কিভাবে?

¯1*⊢- -1 এন জন্য n

[ 4 5 91 ¯1 ¯1]

⊢+.×- এর সাথে উল্লম্ব গুণ o, তার পরে যোগফল

[ +/ 4 5 9 × 1 ¯1 ¯1+/ 4 ¯5 ¯9¯10]

| - পরম মান


আপনি দয়া করে একটি পরীক্ষার পরিবেশ সরবরাহ করতে পারেন?
মিঃ এক্সকোডার

@ মিঃ এক্সকোডার যুক্ত হয়েছে
ইউরিয়েল

|⊢+.ׯ1*⊢ নতুন ইনপুট স্পেক সঙ্গে।
Ad:18m

@ অ্যাডম ধন্যবাদ বিশ্বাস করতে পারি না আমি পণ্য মিস করেছি।
ইউরিয়েল

আপনি ব্যাখ্যা আরও বিস্তারিত প্রদান করতে পারেন? এই পদ্ধতিটি জেতে পোর্ট করা যায়? আমি বর্তমানে কী ব্যবহার করছি (আমার উত্তর দেখুন) তবে এই পদ্ধতিটি কয়েক বাইট শেভ করতে পারে ...
জোনা

3

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

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

a=>a.map(d=>s+=d&1?d:-d,s=0)&&s>0?s:-s

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


3

সম্পাদনা: আরও গল্ফ কেন্দ্রিক পদ্ধতির:

এক্সেল, ৪২ 36 29 বাইট

ম্যাজিক অক্টোপাস উরনের জন্য 6 বাইট সংরক্ষণ করা ডেনিসের -1 ^ পদ্ধতির (যা আমি শিখেছি, এক্সেলে অ্যারেতে কাজ করে) ব্যবহার করে 7 বাইট সংরক্ষণ করেছেন

=ABS(SUMPRODUCT(A:A,-1^A:A))

ইনপুট দেওয়ার জন্য একটি কলামে পূর্ণসংখ্যার একটি তালিকা নেয়। সম্ভবত আরও গল্ফ করা যেতে পারে, বা স্ট্রিং সংস্করণ ব্যবহার করে ইনপুটটির জন্য এ 1 এ স্ট্রিং গ্রহণ করুন।

এক্সেল, 256 বাইট

=ABS(LEN(SUBSTITUTE(A1,1,""))-2*LEN(SUBSTITUTE(A1,2,""))+3*LEN(SUBSTITUTE(A1,3,""))-4*LEN(SUBSTITUTE(A1,4,""))+5*LEN(SUBSTITUTE(A1,5,""))-6*LEN(SUBSTITUTE(A1,6,""))+7*LEN(SUBSTITUTE(A1,7,""))-8*LEN(SUBSTITUTE(A1,8,""))+9*LEN(SUBSTITUTE(A1,9,""))-5*LEN(A1))

এখানে চিত্র বর্ণনা লিখুন


1
অস্বীকৃতি, শুধুমাত্র দৈর্ঘ্যের 100 এর কম সংখ্যার জন্য কাজ করে
ম্যাজিক অক্টোপাস ভস্মাধার

1
এ তে স্যুইচিং: এ 6 বাইট সংরক্ষণ করে এবং সেই সমস্যাটি সরিয়ে দেয়।
চিহ্নিত করুন

বাহ, আমার এক্সেল জ্ঞান স্যারের জন্য আমার গঠনমূলক সমালোচনা খুব কমই বাইটস সংরক্ষণ করে।
ম্যাজিক অক্টোপাস উরান

এছাড়াও, You may take input as a String, as an Integer or as a list of digits.আপনার 42 বাইটের কারণে আপনার ব্যবহার করা উত্তর হওয়া উচিত।
ম্যাজিক অক্টোপাস উরন

প্রথমটি একটি হাস্যকর চেষ্টা ছিল, তবে আমি সেগুলি ঘুরিয়ে দেব।
চিহ্নিত করুন


2

কাস্তে , 7 বাইট

≠0ṁṠ!¡_

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

ইনপুট হিসাবে অঙ্কের একটি তালিকা নেয়।

এখনও একটি "অ্যাবস" বিল্টিন অনুপস্থিত, তবে একটি ভাল ফলাফল সমস্ত একই :)

ব্যাখ্যা

Ṡ!¡_এমন একটি ফাংশন যা একটি সংখ্যা নেয় nএবং তারপরে n-1ফাংশনের _(অবহেলা) বার প্রয়োগ করে n। এটি ফলাফল nবিজোড় nবা -nএমনকি জন্য ফলাফল n

একটি তালিকার প্রতিটি উপাদানগুলিতে একটি ফাংশন প্রয়োগ করে ফলাফলগুলি যোগ করে।

≠0 একটি সংখ্যা এবং 0 এর মধ্যে সম্পূর্ণ পার্থক্য প্রদান করে।


2

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

-1 পাওয়ার ট্রিকের জন্য ডেনিসকে ধন্যবাদ । অঙ্কের তালিকা হিসাবে ইনপুট নেয়

®sm*OÄ

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

ব্যাখ্যা

®sm*OÄ                                               Example [4, 5, 9]
®      # Push -1                                   % STACK: -1
 sm    # Take -1 to the power of every number      % STACK: [1, -1, -1]
         in the input list 
   *   # Multiply with original input              % Multiply [1, -1, -1] with [4, 5, 9] results in STACK: [4, -5, -9]
    O  # Sum them all together                     % STACK: -10
     Ä # Absolute value                            % STACK: 10
       # Implicit print

আমি ব্যাখ্যা অনুসরণ করতে পারি না। আপনি একটি উদাহরণ যোগ করুন দয়া করে?
তিতাস

@ টিটাস আপনি সেখানে যান আশা করি এটা সাহায্য করবে :)
দাতবোই

এবং এখানে আমি È2*<*Oএকটি নোংরা নৈমিত্তিক মত ছিল ।
ম্যাজিক অক্টোপাস উরান

2

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

while(~$n=$argn[$i++])$s+=$n&1?$n:-$n;echo abs($s);

$sবিজোড় হলে ডিজিট যুক্ত করে , এমনকি যদি বিয়োগ করে। পাইপ হিসাবে চালান -nR

অথবা

while(~$n=$argn[$i++])$s+=(-1)**$n*$n;echo abs($s);

ডেনিস´ -1পাওয়ার ট্রিক ব্যবহার করে।


2

গণিত, 67 বাইট

(s=#;Abs[Subtract@@(Tr@Select[IntegerDigits@s,#]&/@{EvenQ,OddQ})])&

2

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

for(;~$n=$argn[$i++];)${eo[$n&1]}+=$n;echo abs($e-$o);

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

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

একটি অ্যারেতে সমান এবং বিজোড় অঙ্কগুলি সঞ্চয় করুন

for(;~$n=$argn[$i++];)$r[$n&1]+=$n;echo abs($r[0]-$r[1]);

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

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

দুটি ভেরিয়েবলে সম এবং বিজোড় অঙ্কগুলি সঞ্চয় করুন

for(;~$n=$argn[$i++];)$n&1?$o+=$n:$e+=$n;echo abs($e-$o);

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


54 বাইট: বিজোড় যোগফল ${1}এবং সমষ্টি ${0}:while(~$n=$argn[$i++])${$n&1}+=$n;echo abs(${1}-${0});
তিতাস

@ টিটুস আমার কাছে মনে হয় `এর জন্য (; ~ $ n = $ আরগান [$ i ++];) $ {ইও [$ n & 1]} + = $ n; ইকো অ্যাবস ($ ই- $ ও); also এছাড়াও একটি সুন্দর রূপ । বা আমরা এটি আরও গাণিতিক করতে পারি for(;~$n=$argn[$i++];$s+=$n)$u+=($n&1)*$n;echo abs($s-2*$u);এবং for(;~$n=$argn[$i++];)$u+=(($n&1)-.5)*2*$n;echo abs($u);এটি একটি আকর্ষণীয় উপায়
জার্গ হালসারম্যান


1

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

{abs sum $_ Z*.map(*%2*2-1)}

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

ইনপুট হিসাবে অঙ্কের একটি তালিকা নেয়।

  • $_ ইনপুট আর্গুমেন্ট।
  • .map(* % 2 * 2 - 1)প্রতিটি ডিজিটকে মানচিত্রে 1বা হয়-1 অঙ্কটি যথাক্রমে বিজোড় বা এমনকি যথাক্রমে কিনা তার উপর নির্ভর করে।
  • Z* সংখ্যার সমান / বিজোড় তালিকার সংখ্যার মূল তালিকাটি জিপ করে lic

1

Braingolf , 18 বাইট

{.2%?M|}&+v&+c-!s*

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

অঙ্কের তালিকা হিসাবে ইনপুট নেয়

ব্যাখ্যা

{.2%?M|}&+v&+c-!s*  Implicit input from commandline args
{......}            Foreach loop, runs on each item in the stack..
 .2%                ..Parity check, push 1 if odd, 0 if even
    ?               ..If last item != 0 (pops last item)..
     M              ....Move last item to next stack
      |             ..Endif
        &+          Sum entire stack
          v&+       Switch to next stack and sum entire stack
             c-     Collapse into stack1 and subtract
               !s   Sign check, push 1 if last item is positive, -1 if last item is
                    negative, 0 if last item is 0
                 *  Multiply last item by sign, gets absolute value
                    Implicit output

1

আর, 72 43 বাইট

b=(d=scan())%%2<1;abs(sum(d[b])-sum(d[!b]))

প্রথমে d = scan()সংখ্যাটিকে ইনপুট হিসাবে গ্রহণ করে, একের পর এক অঙ্ক (@ জিউস্পি মন্তব্যকে ধন্যবাদ!)
তারপরে, অঙ্কগুলির সমতা অনুসারে প্রতিটি সূচকে একটি বা মানকে b = d %% 2 <1সংযুক্ত করে । অতএব, মান এমনকি সংখ্যার জন্য, এবং হয় বিজোড় মানের জন্য।bTRUEFALSEbTRUE!bTRUE

Finaly, abs(sum(d[b]) - sum(d[!b]))কাজ করে।


<1এর চেয়ে এক বাইট ছোট ==0, তবে মনে রাখবেন আপনি অঙ্কের তালিকা হিসাবে ইনপুটও নিতে পারেন।
জিউসেপে

@ জিউসেপ ওয়েল স্পট! ধন্যবাদ!
ফ্রেডেরিক





1

x86-64 মেশিন কোড, 30 বাইট

31 C0 99 8B 4C B7 FC F6 C1 01 74 04 01 CA EB 02 01 C8 FF CE 75 ED 29 D0 99 31 D0 29 D0 C3

উপরের কোডটি এমন একটি ফাংশন সংজ্ঞায়িত করে যা পূর্ণসংখ্যার অঙ্কের তালিকা / অ্যারে গ্রহণ করে এবং তার সমান সংখ্যার যোগফল এবং তার বিজোড় অঙ্কগুলির যোগফলের মধ্যে পরম পার্থক্য প্রদান করে।

সি হিসাবে , সমাবেশ ভাষা প্রথম শ্রেণীর ধরণের হিসাবে তালিকাগুলি বা অ্যারেগুলি প্রয়োগ করে না, বরং তাদেরকে পয়েন্টার এবং দৈর্ঘ্যের সংমিশ্রণ হিসাবে উপস্থাপন করে। অতএব, আমি এই ফাংশনটি দুটি পরামিতি গ্রহণ করার ব্যবস্থা করেছি: প্রথমটি হ'ল অঙ্কের তালিকার শুরুর দিকে একটি পয়েন্টার এবং দ্বিতীয়টি হল পূর্ণসংখ্যা যা তালিকার মোট দৈর্ঘ্য নির্দিষ্ট করে (সংখ্যার এক নম্বর, এক সূচকযুক্ত) ।

ফাংশনটি সিস্টেম ভি এএমডি .৪ কলিং কনভেনশনকে সম্মতি জানায় যা জ্ঞানু / ইউএনআইএক্স সিস্টেমের উপর প্রমিত। বিশেষত, প্রথম প্যারামিটার (তালিকার শুরুতে পয়েন্টার) পাস করা হয়েছে RDI(এটি যেমন 64৪-বিট কোড, এটি একটি -৪-বিট পয়েন্টার) এবং দ্বিতীয় পরামিতি (তালিকার দৈর্ঘ্য) এখানে পাস করা হয় ESI( এটি কেবলমাত্র একটি 32-বিট মান, কারণ এটি খেলতে পর্যাপ্ত সংখ্যাগুলির চেয়ে বেশি এবং স্বাভাবিকভাবেই এটি শূন্য নয় বলে ধরে নেওয়া হয়)। ফলাফলটি EAXরেজিস্টারে ফিরে আসে ।

এটি যদি আরও পরিষ্কার হয় তবে এটি সি প্রোটোটাইপ (এবং আপনি এটি সি থেকে ফাংশনটি কল করতে ব্যবহার করতে পারেন):

int OddsAndEvens(int *ptrDigits, int length);

অবহেলিত সমাবেশ মেমোনমিক্স:

; parameter 1 (RDI) == pointer to list of integer digits
; parameter 2 (ESI) == number of integer digits in list (assumes non-zero, of course)
OddsAndEvens:
   xor  eax, eax              ; EAX = 0 (accumulator for evens)
   cdq                        ; EDX = 0 (accumulator for odds)
.IterateDigits:
   mov  ecx, [rdi+rsi*4-4]    ; load next digit from list
   test cl, 1                 ; test last bit to see if even or odd
   jz   .IsEven               ; jump if last bit == 0 (even)
.IsOdd:                       ; fall through if last bit != 0 (odd)
   add  edx, ecx              ; add value to odds accumulator
   jmp  .Continue             ; keep looping
.IsEven:
   add  eax, ecx              ; add value to evens accumulator
.Continue:                    ; fall through
   dec  esi                   ; decrement count of digits in list
   jnz  .IterateDigits        ; keep looping as long as there are digits left

   sub  eax, edx              ; subtract odds accumulator from evens accumulator

   ; abs
   cdq                        ; sign-extend EAX into EDX
   xor  eax, edx              ; XOR sign bit in with the number
   sub  eax, edx              ; subtract sign bit

   ret                        ; return with final result in EAX

এখানে কোডের একটি সংক্ষিপ্ত পদচারণা:

  • প্রথমত, আমরা নিবন্ধগুলি শূন্য করি EAXএবং EDXএটি সমান এবং বিজোড় অঙ্কগুলির যোগফল যোগ করতে ব্যবহৃত হবে। EAXরেজিস্টার দ্বারা পরিষ্কার করা হয় XORনিজেই (2 বাইটস) সঙ্গে এটি ing, এবং তারপর EDXরেজিস্টার সাইন-ব্যাপ্ত তা EAX (দ্বারা পরিষ্কার করা হয় CDQ, 1 বাইট)।
  • তারপরে, আমরা লুপটিতে যাই যা অ্যারেতে সমস্ত সংখ্যার মধ্য দিয়ে পুনরাবৃত্তি করে। এটি একটি অঙ্ক পুনরুদ্ধার করে, এটি সমান বা বিজোড় কিনা তা পরীক্ষা করে (সর্বনিম্ন-তাত্পর্যপূর্ণ বিটটি পরীক্ষা করে, যা মানটি যদি সমান হয় তবে 1 হয় বা এটি বিজোড় হলে 1 হয়) এবং তারপরে লাফ দেয় বা পড়ে যায়, যোগ করে যোগ করে উপযুক্ত সঞ্চয়ের মান। লুপের নীচে, আমরা অঙ্কের কাউন্টারটি হ্রাস করব ( ESI) এবং যতক্ষণ না এটি শূন্যহীন হয় ততক্ষণ লুপিং চালিয়ে যাব (যেমন, তালিকায় আরও অঙ্কগুলি পুনরুদ্ধার করার জন্য যতক্ষণ থাকবে)।

    এখানে মুশকিল জিনিস হ'ল প্রাথমিক এমওভি নির্দেশনা, যা x86-এ সম্ভব সবচেয়ে জটিল সম্বোধন মোড ব্যবহার করে। * এটি RDIবেস নিবন্ধ হিসাবে (তালিকার শুরুতে নির্দেশক), স্কেলগুলি RSI(দৈর্ঘ্যের কাউন্টার, যা সূচক হিসাবে কাজ করে) 4 দ্বারা (একটি পূর্ণসংখ্যার আকার, বাইটে) যোগ করে এবং এটি বেসকে যুক্ত করে, এবং তারপরে মোট থেকে ৪ টি বিয়োগ করে (কারণ দৈর্ঘ্যের কাউন্টারটি এক-ভিত্তিক এবং আমাদের অফসেটটি শূন্য-ভিত্তিক হওয়া দরকার)। এটি অ্যারেতে অঙ্কের ঠিকানা দেয় যা পরে ECXরেজিস্টারে লোড হয় ।

  • লুপটি শেষ হওয়ার পরে, আমরা সন্ধ্যা ( EAX -= EDX) থেকে প্রতিকূলের বিয়োগফলটি করি ।

  • পরিশেষে, আমরা একটি সাধারণ কৌশল ব্যবহার করে পরম মানটি গণনা করি most একই absফাংশনের জন্য বেশিরভাগ সি সংকলক দ্বারা ব্যবহৃত । এই কৌশলটি এখানে কীভাবে কাজ করে সে সম্পর্কে আমি বিশদে যাব না; ইঙ্গিতগুলির জন্য কোড মন্তব্যগুলি দেখুন বা একটি ওয়েব অনুসন্ধান করুন।

__ * কোডিংটি
সহজ সম্বোধনের মোডগুলি ব্যবহার করার জন্য পুনরায় লেখা যেতে পারে, তবে এটি কোনও ছোট হয় না। আমি একটি বিকল্প বাস্তবায়ন নিয়ে আসতে সক্ষম হয়েছি RDIযা লুপের মাধ্যমে প্রতিবার এটি 8 টি দ্বারা নিখুঁত হয় এবং বাড়িয়ে দেয় তবে আপনাকে এখনও কাউন্টারটি কমিয়ে আনতে হয় ESI, এটি একই 30 বাইট হিসাবে পরিণত হয়েছিল। প্রাথমিকভাবে যা আমাকে আশা দিয়েছিল তা add eax, DWORD PTR [rdi]হ'ল এটি কেবল 2 বাইট, দুটি নিবন্ধিত মান যুক্ত করার মতো। এই বাস্তবায়নটি এখানে, যদি কেউ আমাকে কিছুটা প্রচেষ্টা চালিয়ে যায় :-)

                    OddsAndEvens_Alt:
31 C0                   xor    eax, eax
99                      cdq
                    .IterateDigits:
F6 07 01                test   BYTE PTR [rdi], 1
74 04                   je     .IsEven
                    .IsOdd:
03 17                   add    edx, DWORD PTR [rdi]
EB 02                   jmp    .Continue
                    .IsEven:
03 07                   add    eax, DWORD PTR [rdi]
                    .Continue:
48 83 C7 08             add    rdi, 8
FF CE                   dec    esi
75 ED                   jne    .IterateDigits
29 D0                   sub    eax, edx
99                      cdq
31 D0                   xor    eax, edx
29 D0                   sub    eax, edx
C3                      ret


1

টিআই-বেসিক, 11 6 বাইট

abs(sum(Anscos(πAns

তালিকা হিসাবে ইনপুট নেয়। i²^Ansদুটি বাইট ওভার সাশ্রয় করে (-1)^Ansকারণ আমাদের প্রথম বন্ধনী প্রয়োজন নেই।

abs(sum(Anscos(πAns
           cos(πAns                  1 for evens, -1 for odds
        Ans                          Multiply by original list
abs(sum(                             Sum the list and take absolute value, which also
                                     fixes rounding errors from cos(.

1

জে, 14 বাইট

|-/(2&|+//.[),

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

ব্যাখ্যা

|                absolute value of
 -/              the difference between
                 the items on the list returned by this fork
   (2&|          is an item odd? (1 for yes, 0 for no)
       +//.      the "key" verb /. which partitions on above (even / odd) then sums
           [)    identity, ie, the list of digits passed
             ,   turn it into a list (to handle 1 element case)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.