ব্রেইনফাকের বিটওয়াইস অপারেটররা


13

আপনার কাজটি হ'ল নিম্নলিখিত বাইনারি অপারেটরগুলির জন্য একটি করে ব্রেইনফাক প্রোগ্রাম তৈরি করা। প্রতিটি প্রোগ্রামের ইনপুট থেকে এক বা দুটি 8-বিট সংখ্যা (A এবং B) নেওয়া উচিত এবং নির্দিষ্ট ক্রিয়াকলাপটি গণনা করা উচিত:

  1. A XOR B
  2. A AND B
  3. A OR B
  4. A Shifted Left by 1 (circular shift)
  5. NOT A

আপনাকে সমস্ত 5 বাস্তবায়ন করতে হবে না Score স্কোর দ্বারা গণনা করা হয়:

#totalCharacters + {4000 * #problemsNotCompleted}

সুতরাং বৈধ স্কোরগুলি শূন্য (সেরা) থেকে শুরু করে 20,000 পর্যন্ত (কোনও কিছুই শেষ হয়নি)।

আপনি ফলাফলটি কোথায় সঞ্চয় করবেন বা আপনি ইনপুটটি সংরক্ষণ করেন কিনা তা আমার কোনও মাথাব্যথা নেই। 8-বিট সেল এবং কেবলমাত্র ডানদিকে আপনার প্রয়োজন খালি সেলগুলি ধরে নিন।

আপনি ধরে নিতে পারেন যে মেমরির অবস্থানটি আপনার জন্য সবচেয়ে ভাল কাজ করে সেই সংখ্যাগুলি ইতিমধ্যে রয়েছে তাই আপনাকে আইও অপারেশন সম্পর্কে চিন্তা করার দরকার নেই।


আমরা কী একই রকম ন্যূনতম ভাষায় যেমন আইটকে কাজটি সমাধান করতে পারি?
FUZxxl

যতক্ষণ না বিটওয়াইস অপারেটরগুলি নির্মিত না থাকে ততক্ষণ আমার অন্য কোনও ভাষায় আপত্তি নেই।
ক্যাপচার্যাগ

উত্তর:


7

স্কোর: 275

এটি বাইনারি কাউন্টার দিয়ে এগুলি প্রসারিত করার জন্য আরও ভাল কাজ করে। A বা B 0 হওয়ার সম্ভাবনাটি কম স্বজ্ঞাত অংশগুলির সাথে মোকাবিলা করে আমি প্রথম তিনটির প্রকৃত বিট ম্যানিপুলেশনে ননডেস্ট্রাক্টিভ প্রবাহ নিয়ন্ত্রণ ব্যবহারের পক্ষে লাভজনক উপায় খুঁজে পাইনি। ঘটনাচক্রে এগুলি সমস্ত 16-বিট কোষের সাথে ধীরে ধীরে এবং 32-বিটের সাথে ধীরে ধীরে কাজ করা উচিত।

এক্সওআর, 86

ধরে নেওয়া যায় যে এ এবং বি কোষগুলিতে 1 এবং 2 তে রয়েছে, কক্ষ 2 তে একটি এক্সআর বি সঞ্চয় করে, পয়েন্টার 0 কোষে শুরু হয় এবং 5 কোষে শেষ হয়।

-[[>>>>>>[>>>]++[-<<<]<<<-]>]>>>[<]>[[>[>-<-]>[<<<<<<+>>>>>>[-]]>]+[<[<<<++>>>-]<<]>>]

এবং, 78

ধরে নেওয়া যায় যে এ এবং বি কোষগুলিতে 1 এবং 2 কোষে রয়েছে, কক্ষ 4 এ এআর বি সঞ্চয় করে, পয়েন্টার 0 কোষে শুরু হয় এবং 5 কোষে শেষ হয়।

-[[>>>>>>[>>>]++[-<<<]<<<-]>]>>>[<]>[[>[>[<<<<+>>>>-]<-]>+>]<[<[<<<++>>>-]<<]]

বা, 86

ধরে নেওয়া যায় যে এ এবং বি কোষগুলিতে 1 এবং 2 কোষে রয়েছে, কক্ষের 2 বা এ বা বি সঞ্চয় করে, পয়েন্টার 0 কোষে শুরু হয় এবং 5 কোষে শেষ হয়।

-[[>>>>>>[>>>]++[-<<<]<<<-]>]>>>[<]>[[>[>+<-]>[<<<<<<+>>>>>>[-]]>]+[<[<<<++>>>-]<<]>>]

রোল, 18

ধরে নিন A কক্ষ 0 এ রয়েছে, 1 কক্ষ 1 তে একটি রোল 1 সঞ্চয় করে, পয়েন্টার শুরু হয় এবং সেল 0 এ শেষ হয়।

[>++[>>]<[>+>]<<-]

নয়, 7

ধরে নেওয়া হয় A কক্ষ 0 এ রয়েছে, 1 কক্ষ 1 এ নয়, পয়েন্টার শুরু হয় এবং সেল 0 এ শেষ হবে।

+[>-<-]

এটি সত্যিই সংক্ষিপ্ত এবং বেশ দুর্দান্ত। +1
অনুলিপি করুন

গুরুতরভাবে চিত্তাকর্ষক উন্নতি।
ক্যাপচারাইগ

8

স্কোর: 686

সমস্ত স্নিপেটগুলি ধরে নিচ্ছে যে সংখ্যাগুলি ইতিমধ্যে 0 এবং 1 সেলে লোড হয়েছে এবং পয়েন্টারটি 0 কোষে দেখায় I আমি যদি পরে চ্যালেঞ্জের প্রয়োজন হয় তবে আমি একটি এটোই স্নিপেট যুক্ত করতে পারি। আপাতত, আপনি এইভাবে কোডটি ব্যবহার করে দেখতে পারেন:

+++++++++>    number 1
++++<         number 2


এক্সওআর, 221

ফলাফলটি সেল 10 এ লেখা হয়, পয়েন্টারটি 5 কক্ষে শেষ হয়

>>>>>++++++++[-<<<<<[->>+<<[->>->+<]>>[->>>>+<<]<<<<]>>>[-<<<+>>>]<<[->+<[->->+>
>>>>]>[->>>>>+>>]<<<<<<<<]>>[-<<+>>]>>>[->>+<<]>[>[-<->]<[->+<]]>[[-]<<<[->+>-<<
]>[-<+>]+>+++++++[-<[->>++<<]>>[-<<+>>]<]<[->>>>+<<<<]>>]<<<]

এবং, 209

ফলাফলটি সেল 10 এ লেখা হয়, পয়েন্টারটি 5 কক্ষে শেষ হয়

>>>>>++++++++[-<<<<<[->>+<<[->>->+<]>>[->>>>+<<]<<<<]>>>[-<<<+>>>]<<[->+<[->->+>
>>>>]>[->>>>>+>>]<<<<<<<<]>>[-<<+>>]>>>[->[->+<]<]>[-]>[-<<<[->+>-<<]>[-<+>]+>++
+++++[-<[->>++<<]>>[-<<+>>]<]<[->>>>+<<<<]>>]<<<]

বা, 211

ফলাফলটি সেল 10 এ লেখা হয়, পয়েন্টারটি 5 কক্ষে শেষ হয়

>>>>>++++++++[-<<<<<[->>+<<[->>->+<]>>[->>>>+<<]<<<<]>>>[-<<<+>>>]<<[->+<[->->+>
>>>>]>[->>>>>+>>]<<<<<<<<]>>[-<<+>>]>>>[->>+<<]>[->+<]>[[-]<<<[->+>-<<]>[-<+>]+>
+++++++[-<[->>++<<]>>[-<<+>>]<]<[->>>>+<<<<]>>]<<<]

বামদিকে ঘোরান, 38

ফলাফলটি সেল 1 এ লিখিত হয়, পয়েন্টারটি 4 কক্ষে শেষ হয়

[->++>+<[>-]>[->>+<]<<<]>>>>[-<<<+>>>]

নয়, 7

ফলাফল 1 কক্ষে লিখিত হয়, পয়েন্টার 0 সেলে শেষ হয়

+[+>+<]


ব্যাখ্যা:

এক্সওআর, এবং এবং এবং সমস্ত একই ধরণের ফ্যাশনে কাজ করে: প্রতিটি সংখ্যার জন্য n / 2 গণনা করুন এবং এন মোড 2 মনে রাখবেন the একক বিটের জন্য লজিক্যাল এক্সওআর / এবং / অথবা গণনা করুন। যদি ফলাফল বিট সেট করা থাকে তবে ফলাফলটিতে 2 ^ n যুক্ত করুন। 8 বার পুনরাবৃত্তি করুন।

এটি আমি ব্যবহৃত মেমরি বিন্যাস:

 0      1        2        3      4        5         6        7
n1  |  n2  |  marker  |  n/2  |  0  |  counter  |  bit1  |  bit2  |

  8        9        10
temp  |  temp  |  result

এখানে XOR এর উত্স (সংখ্যাগুলি নির্দেশ করে যে সময়ে পয়েন্টারটি কোথায় রয়েছে):

>>>>>
++++ ++++ counter
[
    -
    <<<<<

    divide n1 by two
    [ 0 
        -
        >>+ set marker 2
        << 0
        [->>->+<] dec marker inc n/2
        >> 2 or 4
        [->>>>+<<] 
        <<<<
    ]
    >>>
    [-<<<+>>>]
    <<

    divide n2 by two
    [ 1
        -
        >+ set marker 2
        < 1
        [->->+>>>>>] dec marker inc n/2
        > 2 or 9
        [->>>>>+>>]
        <<<< <<<< 
    ]
    >>[-<<+>>] 3

    >>> 6

    [->>+<<]>[>[-<->]<[->+<]]>  one bit xor 8

    [
        [-]<<< 5
        [->+>-<<] copy counter negative
        > 6
        [-<+>]
        +> 7
        ++++ +++  cell 6 contains a one and cell 7 how many bits to shift
        [-<[->>++<<]>>[-<<+>>]<]  2^n
        < 6
        [->>>>+<<<<]
        >> 8
    ]

    <<<
]


বাম ঘোরার জন্য, আবার 2n শূন্য কিনা তা নির্ধারণের জন্য আবার সেল 2-তে একটি চিহ্নিতকারী রয়েছে, যেহেতু আপনি কেবলমাত্র কোনও ঘর সরাসরি শূন্য নয় কিনা তা নির্ধারণ করতে পারেন। যদি তা হয় তবে একটি ক্যারি বিট 4 কোষে লেখা হয় এবং পরে 2n এ যুক্ত হয়। এটি মেমরির বিন্যাস:

0      1        2       3       4   
n  |  2n  |  marker  |  0  |  carry 

মহান কাজ! প্রতিটি প্রোগ্রামটি কনসোল থেকে ইনপুট নেওয়ার জন্য আমার উদ্দেশ্য ছিল, তবে আমি এটির বিষয়ে যত বেশি চিন্তা করি, আপনার পথটি ঠিকঠাক কাজ করে। আপনাকে যুক্ত করার দরকার নেই ,>,<। আমি প্রশ্ন সম্পাদনা করব।
ক্যাপচার্যাগ

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

@ সিএমপি পরে আমি একটি ব্যাখ্যা যুক্ত করব
অনুলিপি

3

স্কোর (বর্তমান): 12038 837 / -

প্রোগ্রামগুলি ধারনা করে যে সংখ্যাগুলি সেল ,বা তার দ্বারা সুনির্দিষ্টভাবে যা কিছু নির্দিষ্ট করা হয়েছে তাতে লোড করা হয়েছে । এটিও ধরে নিয়েছে যে সমস্ত কক্ষগুলি 8-বিট স্বাক্ষরবিহীনভাবে প্রয়োজন মতো মোড়কে। প্রতিটি স্নিপেটের শুরুতে নম্বরগুলি সেল 0 (এবং প্রয়োজনে 1) এ লোড করা হয়।

বিট অপারেশন - 799

বিট অপারেশন একই সাধারণ কাঠামো অনুসরণ করে।

Firstly, we define a divmod 2 (DM2) function.
CELLS:   A  B   C  D
INPUT:  *A  0   0  0
OUTPUT: *0 A/2 A%2 0
dp@A; while{
  dec A,2; inc B,1; dp@A; inc A,1
  while{ #Check if A was 1 at the start
    dec D,1; pour A,C; dp@A;
  }
  dec C,1; pour C,A; inc D,1; dp@D
  #If A was 1 at the start, D will be 1 here
  while{ 
    dec D,1; inc C,1; dec B,1; dp@D
  }
  dp@A
}
Translated into BF, we have
    [->+<[>>>-<<<[->>+<<]]>>-[<<+>>-]>+[-<+<->>]<<<]
I'm not that good at BF, so my algorithm may not be the smallest.

Next, we define the program.
In this, we assume that the numbers are loaded in $2 (cell 2) and $3.

inc $1,8; dp@1 {
  dec  $1
  pour $3,$6
  DM2  $2        # result in $3,$4
  DM2  $6        # result in $7,$8
  pour $7, $2
  pour $8,$5
  bop  $4,$5     # result in $6
  pour $1,$5
  pour $5,$4,$1
  down $4,$5     # decrease $4 till 0, decrease $5 by same amount
  inc  $5,#7
  shl  $6,$5
  pour $6,$0     # $0 is result
  dp@  1
}
#Now, the result is in $0

Translated to BF (with linebreaks for readability):
  >++++++++[
    ->>[->>>+<<<]<
    [->+<[>>>-<<<[->>+<<]]>>-[<<+>>-]>+[-<+<->>]<<<]>>>>  #DM2 $2
    [->+<[>>>-<<<[->>+<<]]>>-[<<+>>-]>+[-<+<->>]<<<]>     #DM2 $6
    [-<<<<<+>>>>>]>
    [-<<<+>>>]<<<<
    (bop)<<<
    [->>>>+<<<<]>>>>
    [<+<<<+>>>>-]<
    [->-<]>
    +++++++
    [->[-<<++>>]<<[->>+<<]>]
    [-<<<<<<+>>>>>>]
    <<<<<
  ]

Replace (bop) by the appropriate expression.

XOR works like this: (252-5+15=262)
  [->-<]>[[-]>+<]
AND works like this: (252-5+11=258)
  [>[>+<-]<-]
OR  works like this: (252-5+32=279)
  [->>>+<<<]>[->>+<<]>>[[-]<+>]<<<

So, combining these, we have a total of 262+258+279=799 D:

বাম দিকে ঘুরান, 1 - 31 / -

নম্বরটি A0 ঘরে লোড করা হয়।

Pseudocode
    $0 := A
    $1 := $0 << 1    # this has the effect of discarding the top bit of A
    $2 := $0
    $3 := $0 << 1
    $2 -= $1 >> 1    # $2 now contains the top bit of A
    if $2 then $3++  # $3 now contains A rotated left 1
    res:= $3         # the result is in cell 3 now

Real code
    [->++>+>++<<<]>[-->-<]>[>+<[-]]
If you don't always need the pointer in the same position,
substitute [>+>] for the last loop (3 less chars).
However, the pointer will then sometimes end up in position 2, sometimes in position 4.

না এ - 7

নম্বরটি A0 ঘরে লোড করা হয়।

Pseudocode
    $0  := A
    $0  += 1
    $1  := 256-$0   #since ~A=255-A
    res := $1

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