ब्रेनफॉक में बिटवाइज ऑपरेटर्स


13

आपका कार्य निम्नलिखित बाइनरी ऑपरेटरों में से प्रत्येक के लिए एक ब्रेनफक प्रोग्राम बनाना है। प्रत्येक प्रोग्राम को इनपुट से एक या दो 8-बिट संख्या (ए और बी) लेनी चाहिए और निर्दिष्ट ऑपरेशन की गणना करनी चाहिए:

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

आपको सभी को लागू करने की आवश्यकता नहीं है 5. स्कोर की गणना निम्न द्वारा की जाती है:

#totalCharacters + {4000 * #problemsNotCompleted}

तो वैध स्कोर शून्य (सर्वश्रेष्ठ) से 20,000 तक (कुछ भी पूरा नहीं) हैं।

मुझे परवाह नहीं है कि आप परिणाम कहां संग्रहीत करते हैं, या आप इनपुट संरक्षित करते हैं या नहीं। 8-बिट कोशिकाओं को मान लें, और जितनी खाली कोशिकाओं को आपको केवल दाईं ओर की आवश्यकता है।

आप मान सकते हैं कि नंबर पहले से ही हैं जो आपके लिए मेमोरी लोकेशन सबसे अच्छा काम करता है, इसलिए आपको IO ऑपरेशंस के बारे में चिंता करने की आवश्यकता नहीं है।


क्या हम आइओट जैसे उपमा न्यूनतम भाषा में कार्य को हल कर सकते हैं?
फ़ूजएक्सएक्सएक्सएल

मुझे किसी भी अन्य भाषाओं से कोई आपत्ति नहीं है, जब तक कि बिटकॉइन ऑपरेटरों में कोई निर्माण नहीं किया जाता है।
16

जवाबों:


7

स्कोर: 275

बाइनरी काउंटर के साथ इनका विस्तार करना बेहतर है। कम सहज अंग इस संभावना से निपटते हैं कि ए या बी 0. है। मुझे पहले तीन के वास्तविक बिट हेरफेर में नॉनस्टेस्ट्रक्टिव प्रवाह नियंत्रण का उपयोग करने के लिए एक लाभदायक तरीका नहीं मिला। संयोग से ये सभी 16-बिट कोशिकाओं के साथ और धीरे-धीरे 32-बिट के साथ ठीक काम करना चाहिए।

XOR, 86

मान लेता है कि A और B कक्ष 1 और 2 में हैं, A XOR B को कक्ष 2 में संग्रहीत करता है, सूचक सेल 0 में शुरू होता है और सेल 5 में समाप्त होता है।

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

और, 78

मान लेता है कि A और B कक्ष 1 और 2 में हैं, A OR B को कक्ष 4 में संग्रहीत करता है, सूचक कक्ष 0 में प्रारंभ होता है और कक्ष 5 में समाप्त होता है।

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

या, 86

मान लेता है कि A और B सेल 1 और 2 में हैं, A OR B को सेल 2 में रखता है, पॉइंटर सेल 0 में शुरू होता है और सेल 5 में समाप्त होता है।

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

रो, १ 18

मान लेता है कि A सेल 0 में है, सेल 1 में A ROL 1 को स्टोर करता है, पॉइंटर शुरू होता है और सेल 0 में समाप्त होता है।

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

नहीं, 7

मान लेता है कि A सेल 0 में है, सेल 1 में A नहीं है, सेल 0 में पॉइंटर शुरू और समाप्त होता है।

+[>-<-]

यह वास्तव में छोटा और बहुत अच्छा है। +1
कॉपी

गंभीर रूप से प्रभावशाली सुधार।
कैप्टनक्रिग

8

स्कोर: 686

सभी स्निपेट यह मानते हैं कि नंबर पहले से ही सेल 0 और 1 में लोड किए गए हैं और यह पॉइंटर सेल 0. पर इंगित करता है। यदि मुझे चुनौती के लिए आवश्यक है तो मैं बाद में एक एटोई स्निपेट जोड़ सकता हूं। अभी के लिए, आप इस तरह कोड की कोशिश कर सकते हैं:

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


XOR, 221

परिणाम सेल 10 को लिखा जाता है, पॉइंटर सेल 5 पर समाप्त होता है

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

और, 209

परिणाम सेल 10 को लिखा जाता है, पॉइंटर सेल 5 पर समाप्त होता है

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

या, 211

परिणाम सेल 10 को लिखा जाता है, पॉइंटर सेल 5 पर समाप्त होता है

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

बाएँ घुमाएँ, ३ 38

परिणाम सेल 1 को लिखा जाता है, सूचक सेल 4 पर समाप्त होता है

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

नहीं, 7

परिणाम सेल 1 को लिखा जाता है, सूचक सेल 0 पर समाप्त होता है

+[+>+<]


स्पष्टीकरण:

XOR, AND और OR सभी समान रूप से काम करते हैं: प्रत्येक संख्या के लिए n / 2 की गणना करें और n mod को याद रखें। 2 एकल बिट्स के लिए तार्किक XOR / AND / OR की गणना करें। यदि परिणामी बिट सेट है, तो परिणाम में 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
    ]

    <<<
]


बाएं घूमने के लिए, एक बार फिर सेल 2 में एक मार्कर होता है, यह निर्धारित करने के लिए कि 2 एन शून्य है, क्योंकि आप केवल यह निर्धारित कर सकते हैं कि सेल सीधे गैर-शून्य है या नहीं। यदि ऐसा है, तो एक कैरी बिट सेल 4 को लिखा जाता है और बाद में 2n में जोड़ा जाता है। यह मेमोरी लेआउट है:

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

अच्छा कार्य! मैंने प्रत्येक प्रोग्राम को कंसोल से इनपुट लेने का इरादा किया था, लेकिन जितना अधिक मैं इसके बारे में सोचता हूं, आपका तरीका ठीक काम करता है। आपको जोड़ने की कोई आवश्यकता नहीं है ,>,<। मैं प्रश्न संपादित करूंगा।
अक्टूबर

मुझे यह समझने में दिलचस्पी होगी कि ये कैसे काम कर रहे हैं। ऐसा लगता है कि आपके पहले तीन अंतरतम भाग को छोड़कर बहुत समान हैं, लेकिन मुझे यकीन नहीं है कि अगर आप किसी तरह के द्विआधारी विस्तार (इसलिए 8 कोशिकाओं की जरूरत है), या थोड़ा तुलना करके थोड़ा, या दोनों के कुछ संयोजन कर रहे हैं। के माध्यम से कदम से देखना मुश्किल है।
कैप्टनक्रिग

@ सीएमपी मैं बाद में एक स्पष्टीकरण जोड़ूंगा
कॉपी

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 / - घुमाएँ

Aसेल 0 में संख्या भरी हुई है।

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 नहीं

Aसेल 0 में संख्या भरी हुई है।

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

+[->-<]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.