বুদ্ধিমান বিট অপারেশন


16

আমি গল্ফ dcখেলতে পছন্দ করি তবে আমি মাঝে মাঝে হতাশ হয়ে পড়ে কারণ dcবিটওয়াইজ অপারেশন হয় না।

চ্যালেঞ্জ

চার নামে ফাংশন যা গ, bitwise অপারেশন সমতুল্য বাস্তবায়ন প্রদান &, |, ~এবং ^(, bitwise ও, বা, এবং XOR যাও)। প্রতিটি ফাংশনে দুটি অপারেন্ড ~নেবে ( কেবলমাত্র একটিই লাগে) যা কমপক্ষে 32-বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যার হয়। প্রতিটি ফাংশন অপারেটসের মতো একই বিট-প্রস্থের একটি স্বাক্ষরবিহীন পূর্ণসংখ্যার ফিরিয়ে দেবে।

সীমাবদ্ধতা

আপনি কেবল সেই অপারেশনগুলি ব্যবহার করতে পারেন যা সমর্থিত dc। এইগুলো:

  • + - * / পাটিগণিত সংযোজন, বিয়োগ, গুণ এবং বিভাগ
  • ~ মডুলো (বা ডিভোমড যদি আপনার ভাষা এটি সমর্থন করে)
  • ^ exponentiation
  • | মডুলার exponentiation
  • v বর্গমূল
  • > >= == != <= < মান সমতা / বৈষম্য অপারেটর
  • >> <<বিট শিফট অপারেটর। dcএগুলি নেই, তবে যেহেতু এগুলি 2 টির ক্ষমতা দ্বারা বিভাজন / গুণনের ক্ষেত্রে তুচ্ছভাবে প্রয়োগ করা হয়, তখন আমি এগুলি অনুমোদিত করব।

dcআমার নিয়ন্ত্রণ স্ট্রাকচারগুলি (পুনরাবৃত্ত) ম্যাক্রোগুলি এবং (ইন) সমতা ক্রিয়াকলাপগুলি ব্যবহার করে আড়ম্বরপূর্ণভাবে নির্মিত হবে। আপনার ভাষার অন্তর্নির্মিত নিয়ন্ত্রণ কাঠামো যা ব্যবহার করতে পারেন।

আপনি লজিকাল অপারেটরগুলিও ব্যবহার করতে পারেন && || ! , যদিও এগুলি সরাসরি না পাওয়া যায় dc

আপনি bitwise অপারেটরদের ব্যবহার করা উচিত নয় & , |, ~এবং ^বা কোন ফাংশন যে জাভাস্ক্রিপ্টে গার্বেজ তাদের বাস্তবায়ন।

এছাড়াও আপনাকে অবশ্যই স্ট্রিং অপারেটর বা ফাংশনগুলি অন্তর্নির্মিত বেস-রূপান্তর করতে হবে না।


আপনার উত্তর যাচাই করতে সহায়তার জন্য দয়া করে একটি পরীক্ষা প্রোগ্রাম বা অনলাইন সংকলক স্নিপেট (গল্ফ স্কোর অন্তর্ভুক্ত নয়) সরবরাহ বিবেচনা করুন।


প্যারামিটার হিসাবে কাঙ্ক্ষিত অপারেশন গ্রহণ করা এমন একটি ফাংশন আমরা কি প্রয়োগ করতে পারি? এছাড়াও, আমরা কি বিট-শিফটের জন্য স্ট্যান্ড-ইন হিসাবে 2 দ্বারা পূর্ণসংখ্যা-ভাগ করতে পারি?
xnor

@ xnor আপনাকে অবশ্যই চারটি অপারেটরগুলির প্রতিটি বাস্তবায়ন করে এমন 4 টি পাবলিক ফাংশন সরবরাহ করতে হবে। আপনার কাছে সাধারণ / সহায়ক ব্যক্তিগত পদ্ধতি / ফাংশন থাকতে পারে যা চারটি পাবলিক ফাংশন দ্বারা ডাকা হয়, তবে এগুলি সমস্তকে গল্ফ স্কোরের অন্তর্ভুক্ত করা দরকার।
ডিজিটাল ট্রমা

7
@xnor আপনাকে এবং আপনি কেবল xnor অপারেটরকে প্রয়োগ করতে হবে ;-)
ডিজিটাল ট্রমা

আমি কি চারটি বেনামী ফাংশনের একটি তালিকা তৈরি করতে পারি?
xnor

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

উত্তর:


4

সি, 134

সি প্রিপ্রসেসর অপব্যবহার করতে বেশ মজা। মূলত এই ম্যাক্রো 3 ফাংশন নির্ধারণ, a, o, এবং x, জন্য and, orএবং xorযথাক্রমে। এই ক্রিয়াকলাপগুলির জন্য অ্যালগরিদমের মধ্যে কেবলমাত্র পার্থক্য হ'ল ফলটিতে কিছুটা সেট করার মানদণ্ড।

notফাংশন হয় n

#define f(n,c)n(a,b){for(r=0,i=31;i+1;--i)if(((a>>i)%2+(b>>i)%2)c)r+=1<<i;return r;}
i,r;n(a){return 0xffffffff-a;}f(a,/2)f(o,)f(x,%2)

পরীক্ষক প্রোগ্রাম (একটি দীর্ঘ সময় নেয়, আমি একেবারেই অনুকূলিতকরণে কোনও সময় ব্যয় করি নি, তবে এটি MAX_INT সম্পর্কিত সম্পর্কিতগুলি ছাড়াও প্রতিটি পরীক্ষার ক্ষেত্রে পরীক্ষা করে দেখায়):

#define m_assert(expected, condition, actual)\
    if(!((expected) condition (actual)))\
        printf("assert fail @ line %i, expected: %x, actual %x, condition "#condition"\n", __LINE__, expected, actual);

int main()  {
    unsigned int j,k;
    for(j=0; j<0xffff; ++j)    {
        m_assert(~j, ==, n(j));
        for(k=0; k<0xffff; ++k)    {
            m_assert(j & k, ==, a(j,k));
            m_assert(j | k, ==, o(j,k));
            m_assert(j ^ k, ==, x(j,k));
        }
    }

1
উফ। ভুলে গেছি। ঠিক আছে এখন।
ছদ্মনাম

4

76 বাইট ised

ইসিডে বিটওয়াইজ অপারেশনগুলিও থাকে না - সাধারণত বিরক্তিকর, তবে এখন স্বাগতম, কারণ আমাদের এগুলি বাস্তবায়িত করা দরকার

ফাংশনগুলি সংখ্যাযুক্ত মেমরি স্লটে সংরক্ষণ করা হবে (কোনও ভার্বোজের নাম নেই)।

বাইনারি থেকে এবং থেকে রূপান্তর:

@5{:x/2^[32]%2:};
@6{:x@:2^[32]:};

হতে পারে না @1{:$6::{1-$5::x}:}তবে এটি কেবল বিয়োগ করা স্পষ্টতই সহজ:

@1{:2^32-x-1:};

বা:

@2{:$6::{$5::{x_0}:+$5::{x_1}>0}:};

এবং:

@3{:$6::{$5::{x_0}:*$5::{x_1}}:};

XOR যাও:

@4{:$6::{$5::{x_0}:<>$5::{x_1}}:};

এটি আমাদের 156 বাইটে নিয়ে আসবে (নিউলাইন এবং সেমিকোলন সহ)। একটি পরীক্ষার কোডটি কেবলমাত্র (পরের দিকে নয়, OR, এবং, XOR, $ 1, $ 2, $ 3, $ 4 নামে পাওয়া যাবে):

> $1::{6}
4294967289
> $2::{12 11}
15
> $3::{12 11}
8
> $4::{12 11}
7

তবে অবশ্যই আমাদের এবং যা প্রয়োজন তা হ'ল জিনিসগুলি সরল করা যায়:

@1{:2^32-x-1:};
@2{:@+{2^U{?{$5::x}%32}}:};
@3{:${1 2 1}::x:};
@4{:$3::{$2::x${1 2}::x}:};
@5{:x/2^[32]%2:};

এটি 109 টি অক্ষর। যখন নিউলাইনস এবং সেমিকোলনগুলি এড়িয়ে যায় এবং আরও কিছুটা গল্ফিংয়ের সাথে আমাদের 76 টি অক্ষর থাকে:

@3{@1{:2^32-x-1:}@2{:@+{2^U{?{x/2^[32]%2}%32}}:}$1}@4{{:$2::x${1 2}::x:}$3};

1

নিম (537) (490)

নিম সংকলক 0.10.2

আমি নিম জানতে শেখার জন্য একটি কারণ খুঁজছিলাম তাই আমরা এখানে যাই।

কোড গল্ফের জন্য, আমি ভেরিয়েবল পরামিতি এবং অন্তর্নিহিত রিটার্নস লাভ করেছি। ভেরিয়েবল পরামিতি, প্রতিটি নথিপত্র কম স্ট্যাক দক্ষ। ব্যক্তিগতভাবে, আমি অন্তর্ভুক্ত রিটার্নগুলি পড়ার পক্ষে আরও কঠিন এবং সম্ভবত কেবলমাত্র তুচ্ছ পদ্ধতিতে ব্যবহার করব।

অ্যালগরিদম হিসাবে, তারা যথেষ্ট সহজ। না বাদে সমস্ত ক্রিয়াকলাপের জন্য, আমরা প্রতিটি বিট তুলনা করি এবং ম্যানুয়ালি সেগুলি আমাদের প্রত্যাশিত সত্য টেবিলের সাথে তুলনা করি। আমাদের আউটপুট ভেরিয়েবলের পথে প্রতিটি বিটটি প্রয়োজনীয় হিসাবে সেট করুন। নিমে, ফলাফলটি অন্তর্ভুক্ত প্রত্যাবর্তনের মান।

আমি নিশ্চিত ছিলাম না যে আমাদের দুটি বিলিয়ান শর্ত জোর করে বিল্ট-ইন OR এবং AND ব্যবহারের অনুমতি দেওয়া হয়েছিল যাতে নোট জিরো পদ্ধতিটি তাদের জায়গায় স্থাপন করা হয়েছিল।

proc s(x, y, b: var int)=
  x = x div 2
  y = y div 2
  b *= 2

proc n(x: var int): int =
  return -(x+1)

proc a(x, y: var int): int =
  var b = 1
  while x > 0 and y > 0:
    if (x mod 2  + y mod 2) == 2:
      result += b

    s(x,y,b)

proc o(x, y: var int): int =
  var b = 1
  while x + y > 0:
    if (x mod 2 + y mod 2) >= 1:
      result += b

    s(x,y,b)

proc r(x, y: var int): int =
  var b = 1
  while x + y > 0:
    if (x mod 2 + y mod 2) == 1:
      result += b

    s(x,y,b)

এখনও আরও একটি ভাল পদ্ধতি খুঁজছেন ...

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


@ মারিয়াটিডালটগ পরিষ্কার করার জন্য ধন্যবাদ!
cory.todd

আমি এটি পুনরুত্পাদন করতে পারি না। আপনার ক্যালকুলেটরটি বেস -16 মোডে রয়েছে?
cory.todd

আমি ছদ্মনাম 117 এর মতো একটি পরীক্ষার জোতা যুক্ত করেছি।
cory.todd

1

সিজেম, 71 বাইট

{:F;0{:R;2md@2md@+F~!2I#*R+}64fI\;\;}:B{"2-"B}:A{'!B}:O{0SB}:N{'(B}:X];

ব্যাখ্যা

"B : UInt64 UInt64 String -> UInt64
 Computes a bitwise operation on the two given unsigned integers. The operation
 is defined by the logical inverse of the result of evaluating the given string
 given the sum of two input bits.";
{
  :F;             "Save the operation string.";
  0               "Initialize the result to 0.";
  {               "For I from 0 through 63:";
    :R;             "Save the result.";
    2md@2md@        "Divide each input by 2 and collect the remainders as the
                     next pair of bits to process.";
    +F~!            "Compute the logical inverse of the result of evaluating
                     the operation string given the sum of the two bits.";
    2I#*            "Adjust the resulting bit to be in the correct output
                     position by multiplying it by 2^I.";
    R+              "Add the location-adjusted bit to the result.";
  }64fI
  \;\;            "Clean up.";
}:B

"A : UInt64 UInt64 -> UInt64
 Computes the bitwise AND of the two given unsigned integers.
 This is done by passing the inputs along to B with an operation such that:
   bit_out = !((bit_in_1 + bit_in_2) - 2)";
{"2-"B}:A

"O : UInt64 UInt64 -> UInt64
 Computes the bitwise OR of the two given unsigned integers.
 This is done by passing the inputs along to B with an operation such that:
   bit_out = !(!(bit_in_1 + bit_in_2))";
{'!B}:O

"N : UInt64 -> UInt64
 Computes the bitwise NOT of the given unsigned integer.
 This is done by passing the input and 0 along to B with an operation such that:
   bit_out = !((bit_in + 0))";
{0SB}:N

"X : UInt64 UInt64 -> UInt64
 Computes the bitwise XOR of the two given unsigned integers.
 This is done by passing the inputs along to B with an operation such that:
   bit_out = !((bit_in_1 + bit_in_2) - 1)";
{'(B}:X

];              "Clean up.";

পরীক্ষা স্যুট

এই কোডটি আমার এবং, বা, না এবং এক্সওর ফাংশনগুলির 100 টি সমানভাবে বিতরণ করা 64-বিট স্বাক্ষরযুক্ত ইনপুটগুলির সাথে 100 বার সঞ্চালিত হয় এবং ফলাফলটি বিল্ট-ইন অপারেটরের দ্বারা উত্পাদিত সাথে তুলনা করে। ইওল অপারেটরের কৃত্রিম ব্যবহারের কারণে এটি বেশ ধীর এবং অনলাইন দোভাষীর সাথে প্রায় এক মিনিট সময় নিতে পারে। তবে যদি সবকিছু ঠিকঠাক হয় তবে নির্বাহের ফলাফলটি কোনও আউটপুট ছাড়াই শেষ হওয়া উচিত, কারণ যে কোনও তাত্পর্য পাওয়া যায় তা মুদ্রিত হয়।

N:L;
{:F;0{:R;2md@2md@+F~!2I#*R+}64fI\;\;}:B{"2-"B}:A{'!B}:O{0SB}:N{'(B}:X];
{;Y32#__mr*\mr+}2e2%2/{~:U;:V;"A&O|X^"2/{[{US@SV" = "UV5$~L}/9$2$={];}{]oLo}?}/"N~"[{U" = "U3$~Y64#(&L}/6$2$={];}{]oLo}?}/

0

জাভাস্ক্রিপ্ট 294 267

@ অ্যালেক্সা'র এবং @ কেনেটিমের পরামর্শ দিয়ে আরও কয়েকটি বাইট ছাঁটাই করতে সক্ষম হয়েছিল।

কার্যাবলী:

B=(n,m,t)=>{for(var p=4294967296,y=0;p>=1;p/=2)y+=t=='x'&&(n>=p||m>=p)&& !(n>=p&&m>=p)?p:0,y+=t=='a'&&n>=p&&m>=p?p:0,y+=t=='o'&&(n>=p||m>=p)?p:0,n-=n>=p?p:0,m-=m>=p?p:0
return y}
N=(n)=>{return 4294967295-n}
A=(n,m)=>B(n,m,'a')
O=(n,m)=>B(n,m,'o')
X=(n,m)=>B(n,m,'x')

উদাহরণ:

var n = 300;
var m = 256;
console.log(X(n,m) + ", " + (n ^ m));
console.log(O(n,m) + ", " + (n | m));
console.log(A(n,m) + ", " + (n & m));
console.log(N(n) + ", " + (~n>>>0));
console.log(N(m) + ", " + (~m>>>0));

আউটপুট:

44, 44
300, 300
256, 256
4294966995, 4294966995
4294967039, 4294967039

2
আপনাকে চারটি সার্বজনীন ফাংশন সরবরাহ করতে হবে - প্রতিটি ওআর এর জন্য একটি OR না এবং এক্সওআর (আপনার কাছে সাধারণ / সহায়ক ব্যক্তিগত পদ্ধতি / ফাংশন থাকতে পারে যা চারটি পাবলিক ফাংশন দ্বারা ডাকা হয়)। এছাড়াও, আপনি নিখোঁজ রয়েছেন - সম্ভবত এইগুলির মধ্যে সবচেয়ে সহজ
ডিজিটাল ট্রমা

ধন্যবাদ @ অ্যালেক্সা। আমি বাইটগুলি যুক্ত করেছি এবং আরও কিছু গল্ফ করেছি।
ওল্ফহ্যামার

আপনি পরে স্থানটি হারাতে forএবং এর সাথে প্রতিস্থাপন function B(n,m,t)করতে পারেন B=(n,m,t)=>। একইভাবে অন্যান্য ফাংশনগুলির জন্য।
অ্যালেক্স এ।

42 আপনি 4*(1<<30)4294967296 এবং 4294967295 এর জন্য ব্যবহার করতে পারেন -1>>>0varএখানে কি সত্যই প্রয়োজনীয়? (n,m)=>B(n,m,'a')(n,m)=>{return B(n,m,'a')}
Instead
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.