একটি 8 বিট সংযোজক প্রয়োগ করুন


12

চ্যালেঞ্জ

একটি ফাংশন প্রয়োগ করুন যা দুটি পূর্ণসংখ্যাকে গ্রহণ করে যার মান 0 - 255 থেকে শুরু করে 256 মোডের পূর্ণসংখ্যার যোগফল দেয় You আপনি কেবল বিটওয়াইজ নেগেশন (~), বিটওয়াইস বা (|), বিট শিফটিং অপারেটর (>>, <<) ব্যবহার করতে পারেন , এবং অ্যাসাইনমেন্ট (=)।

আপনি যে জিনিসগুলি ব্যবহার করতে পারবেন না সেগুলির মধ্যে অন্তর্ভুক্ত রয়েছে (তবে সীমাবদ্ধ নয়)

  • সংযোজন, বিয়োগ, গুণ এবং ভাগ
  • loops
  • শর্তাধীন বিবৃতি
  • ফাংশন কল

বাইনারি বা, বাইনারি প্রত্যাখ্যান এবং বিট শিফট ক্রিয়াকলাপগুলির সবচেয়ে কম ব্যবহার । টাই হওয়ার সময়ে সর্বাধিক জনপ্রিয় সমাধানটি জয়ী হয়। সর্বদা হিসাবে, স্ট্যান্ডার্ড লুফোলস প্রয়োগ হয়।

এখানে একটি সাধারণ 2-বিট অ্যাডারের উদাহরণ। এটিতে 107 এর মোট স্কোরের জন্য 77 বাইনারি অবহেলা, 28 বাইনারি ও 2 বিট-শিফট ব্যবহার করা হয় (এটি সি প্রিপ্রসেসরটি চালিয়ে দেখা যায় gcc -E)। এটিগুলি অপসারণ #defineএবং ফলাফলের এক্সপ্রেশনগুলি সরল করে আরও বেশি দক্ষ করা যেতে পারে , তবে আমি তাদের পরিষ্কার রেখেছি।

#include <stdio.h>

#define and(a, b) (~((~a)|(~b)))
#define xor(a, b) (and(~a,b) | and(a,~b))

int adder(int a, int b)
{
    int x, carry;
    x = xor(and(a, 1), and(b, 1));
    carry = and(and(a, 1), and(b, 1));
    carry = xor(xor(and(a, 2), and(b, 2)), (carry << 1));
    x = x | carry;
    return x;
}

int main(int argc, char **argv)
{
    int i, j;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            if (adder(i, j) != (i + j) % 4) {
                printf("Failed on %d + %d = %d\n", i, j, adder(i, j));
            }
        }
    }
}

আপডেট: উদাহরণ যুক্ত হয়েছে এবং স্কোরিং ক্রাইটার পরিবর্তন হয়েছে


2
কেন বিটওয়াইজ "এবং"?
rdans

@ রায়ান বেশিরভাগ মানুষ এনওআর গেটের চেয়ে ন্যানড গেটের সাথে বেশি পরিচিত:
অরবি

1
পুনরাবৃত্তি একটি লুপ হিসাবে গণনা করা হয়?
rdans

@ রায়ান রিকার্সনটি একটি লুপ হিসাবে গণ্য হবে, যদিও আমি নিশ্চিত নই যে আপনি শর্তাধীন বিবৃতি ব্যতীত কীভাবে এটি প্রয়োগ করবেন।
অরবি

ওভারফ্লো সংজ্ঞায়িত করা হয়েছে বা আমি যদি কিছু প্রবাহিত করি তবে কেবলমাত্র আউটপুট দিতে পারি?
Comintern

উত্তর:


8

পাইথন, 36 অপারেশন

"8" প্যারামিটারে লগারিদমিক এমন একটি পদ্ধতি!

def add(a,b):
    H = a&b   #4 for AND
    L = a|b   #1 
    NX = H | (~L) #2
    K = NX 

    H = H | ~(K | ~(H<<1)) #5
    K = K | (K<<1) #2

    H = H | ~(K | ~(H<<2)) #5
    K = K | (K<<2) #2

    H = H | ~(K | ~(H<<4)) #5

    carry = H<<1 #1

    neg_res = NX ^ carry  #7 for XOR
    res_mod_256 = ~(neg_res|-256) #2
    return res_mod_256

ধারণাটি হ'ল কোন সূচকগুলি ওভারফ্লো এবং বহন করে। প্রথমদিকে, এটি ঠিক এমন জায়গাগুলি যেখানে উভয় এবং aদু'জনের bএকটি রয়েছে 1। তবে বহন করা বিটগুলি যেহেতু আরও উপচে পড়তে পারে, তাই এটি পুনরাবৃত্তভাবে নির্ধারণ করা দরকার।

পরের সূচকে প্রতিটি সূচকে উপচে পড়ার পরিবর্তে আমরা 1 সূচক, তারপরে 2 টি সূচক, তারপরে 4 সূচকগুলি সরিয়ে প্রক্রিয়াটি গতিতে বাড়িয়ে দিয়েছি যেখানে একটি ওভারফ্লো ঘটেছে (এইচ) এবং যেখানে ওভারফ্লো আর ঘটতে পারে না এমন জায়গাগুলি মনে রাখতে (K) )।


47 টি অপারেশন সহ একটি সহজ পুনরাবৃত্তি সমাধান :

def add(a,b):
    H = a&b   #4 for AND
    L = a|b   #1 
    NX = H | (~L) #2

    c=H<<1  #1

    for _ in range(6): #6*5
        d = (~c)|NX
        e = ~d
        c = c|(e<<1)

    res = c ^ NX  #7 for XOR

    res_mod_256 = ~(res|-256) #2
    return res_mod_256

পরীক্ষা অনুলিপি, যে কেউ এটি অনুলিপি করতে চায় for

errors=[]
for a in range(256):
    for b in range(256):
        res = add(a,b)
        if res!=(a+b)%256: errors+=[(a,b,res)]

print(len(errors),errors[:10])

9

সি - 0

এটি ~, |, >>, <<, এবং = এর বাইরে অপারেটর ব্যবহার করে তবে কাস্টিং এবং কমা অপারেটরগুলি ব্যবহার করে সমাধানগুলি দেখতে পাচ্ছি, তাই আমার ধারণা অনুমান করা নিষিদ্ধ অপারেটরগুলি ব্যবহার না করে বিধিটি খুব কঠোর নয়।

unsigned char sum(unsigned char x, unsigned char y)
{
    static unsigned char z[] = {
        0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
        16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
        32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
        48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
        64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
        80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
        96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
        112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
        128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
        144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
        160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
        176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
        192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
        208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
        224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
        240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
        0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
        16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
        32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
        48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
        64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
        80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
        96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
        112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
        128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
        144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
        160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
        176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
        192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
        208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
        224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
        240,241,242,243,244,245,246,247,248,249,250,251,252,253,254
    };

    return (&z[x])[y];
}

এটি অবশ্যই একটি ফাঁক, তবে এটি দেখানোর জন্য +1।
অরবি

7

অজগর, স্কোর = 83 80

def g(x,y):
    for i in xrange(7):
        nx = ~x
        ny = ~y
        x,y = ~(x|ny)|~(nx|y), (~(nx|ny))<<1
    x = ~(x|~y)|~(~x|y)
    return ~(~x|256)

লুপটি আনরোল করুন। এটি লুপ প্রতি 10 টি অপস 7 বারের লুপ, শেষ জোরের জন্য 7 এবং শেষে 9 তম বিটের স্কোয়াশ।

সমীকরণটি x+y = x^y + 2*(x&y)8 বার পুনরাবৃত্তি করে এটি কার্যকর করে। প্রতিবার নীচে আরও একটি শূন্য বিট রয়েছে y


7

সি, স্কোর: 77 60

এটির জাহান্নামের জন্য কেবল গল্ফড, 206 169 131 বাইট:

#define F c=((~(~c|~m))|n)<<1;
a(x,y){int m=(~(x|~y))|~(~x|y),n=~(~x|~y),c;F F F F F F F return (unsigned char)(~(m|~c))|~(~m|c);}

সম্প্রসারিত:

int add(x,y)
{
    int m=(~(x|~y))|~(~x|y);
    int n=~(~x|~y);
    int c = 0;
    c=((~(~c|~m))|n)<<1; 
    c=((~(~c|~m))|n)<<1; 
    c=((~(~c|~m))|n)<<1; 
    c=((~(~c|~m))|n)<<1; 
    c=((~(~c|~m))|n)<<1;    
    c=((~(~c|~m))|n)<<1; 
    c=((~(~c|~m))|n)<<1; 
    return (int)((unsigned char)(~(m|~c))|~(~m|c));
}

মূলত একই সমাধান (গাণিতিকভাবে) যা @ কিথরান্ডাল @ জুয়ানিকার্নোরো নিয়ে এসেছিল, তবে আর কোনও অপারেটর ব্যবহার না করে প্রথম 8 বিটের পরে সবকিছু মুছে ফেলার জন্য ভেরিয়েবল টাইপ এবং পয়েন্টারগুলির সাথে দ্রুত এবং আলগা খেলার সি এর ক্ষমতা গ্রহণ করে।

মেশিনের এন্ডিয়ান-নেস এবং আকার () একটি ইনট এবং একটি চরের উপর নির্ভর করে তবে সঠিক পয়েন্টার ম্যাথের সাথে বেশিরভাগ মেশিন নির্দিষ্ট অ্যাপ্লিকেশনগুলিতে পোর্ট করতে সক্ষম হওয়া উচিত।

সম্পাদনা: এটি চ্যালেঞ্জ যে সি (বা অন্যান্য নিম্ন স্তরের ভাষাগুলি) এর একটি পৃথক উপরের হাত থাকবে - যদি না কেউ অ্যালগরিদম নিয়ে আসে যা বহন করে না।


আপনি যদি সেইভাবে মোড়কে পরিচালনা করতে চলেছেন তবে আপনি কেবল কাস্ট করতে পারেন unsigned char। এটি ক্লিনার এবং আরও বহনযোগ্য।
অরবি

@ অরবি - আমার ধারণা unsignedকোড টাইপটি টাইপ করা আমার কাছে স্বাভাবিকভাবে আসে না code আপনি অবশ্যই ঠিক - আপডেট হয়েছে।
Com

4

পাইথন - স্কোর 66 64

def xand(a,b):
    return ~(~a|~b) #4

def xxor(a,b):
    return (~(a|~b))|~(~a|b) #7

def s(a,b):
    axb = xxor(a,b)   #7
    ayb = xand(a,b)   #4

    C = 0
    for i in range(1,8):
        C = ((xand(C,axb))|ayb)<<1    #(1+1+4)x7=6x7=42

    return xxor(axb,xand(C,255))    #7 + 4 = 11
    #total: 7+4+42+11 = 64

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


3
খুব ভাল কাজ, তবে আপনার কোডটি সঠিকভাবে চারপাশে মোড়ানো হয় না (অর্থাত্ s(255,2)তার 257পরিবর্তে ফিরে আসে 1)। আপনি আপনার শেষ লাইনে return ~(~xxor(axb,C)|256) 3 পয়েন্ট যুক্ত করে এটি পরিবর্তন করতে পারেন ।
অরবি

2

সি ++ - স্কোর: 113

#define ands(x, y) ~(~x | ~y) << 1
#define xorm(x, y) ~(y | ~(x | y)) | ~(x | ~(x | y))

int add(int x, int y)
{
int x1 = xorm(x, y);
int y1 = ands(x, y);

int x2 = xorm(x1, y1);
int y2 = ands(x1, y1);

int x3 = xorm(x2, y2);
int y3 = ands(x2, y2);

int x4 = xorm(x3, y3);
int y4 = ands(x3, y3);

int x5 = xorm(x4, y4);
int y5 = ands(x4, y4);

int x6 = xorm(x5, y5);
int y6 = ands(x5, y5);

int x7 = xorm(x6, y6);
int y7 = ands(x6, y6);

int x8 = xorm(x7, y7);
int y8 = ands(x7, y7);

return (x8 | y8) % 256;
}

add(1, 255)আমার জন্য @ রায়ান 128 ফিরিয়ে দিচ্ছে
অরবি

@ এখনই এটি ঠিক করা হয়েছে
rdans d

%অনুমতি অপারেটর, যথা তালিকায় নয় ~, |, >>, এবং <<। সঙ্গে এটি প্রতিস্থাপন করতে পারেন ands(x8|y8, 255)>>1?
অরবি

আসলে, ~(~x8 | y8 | 0xFFFFFF00)আপনার স্কোরটি 4++ দিয়ে দুর্দান্তভাবে চালিত করবে trick
অরবি

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