একটি মস্তিষ্ক-ফ্ল্যাক ক্লাসিক দোভাষী লিখুন!


18

ব্রেন-ফ্লাক (ব্রেনফ ** কে এবং ফ্লাক-ওভারস্টোর মধ্যে একটি ক্রস) একটি স্ট্যাক-ভিত্তিক রহস্যময় ভাষা। এই চ্যালেঞ্জটি পোস্ট হওয়ার পরে, ভাষাটি বিকশিত হয়েছে এবং আপডেট হয়েছে তবে ভাষার এই প্রথম সংশোধনটি "ব্রেইন-ফ্লাক ক্লাসিক" হিসাবে পরিচিত।

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

ভাষা

ব্রেন-ফ্ল্যাকের দুটি স্ট্যাক রয়েছে, যা 'বাম' এবং 'ডান' নামে পরিচিত। সক্রিয় স্ট্যাকটি বাম দিকে শুরু হয়। যদি একটি খালি স্ট্যাক পপড বা উঁকি দেওয়া হয় তবে এটি 0 ফিরে আসবে There কোনও ভেরিয়েবল নেই। প্রোগ্রামটি শুরু হওয়ার সাথে সাথে প্রতিটি ইনপুট ক্রমানুসারে সক্রিয় স্ট্যাকের দিকে এগিয়ে যায় (যাতে শেষ ইনপুট স্ট্যাকের শীর্ষে থাকে)।

মস্তিষ্ক-ফ্ল্যাক প্রোগ্রামের একমাত্র বৈধ অক্ষর ()[]{}<>এবং সেগুলি সর্বদা ভারসাম্যপূর্ণ হওয়া উচিত । যদি সেখানে অবৈধ অক্ষর থাকে, বা বন্ধনীগুলি মেলে না, আপনি অনির্ধারিত আচরণ পান। কিছু বৈধ।

আছে: ফাংশন দুই ধরনের হয় Nilads এবং Monads । একজন nilad একটি ফাংশন যে 0 আর্গুমেন্ট নেয়। এখানে সমস্ত নীলাড রয়েছে:

  • () +1 টি।
  • [] -1।
  • {} সক্রিয় স্ট্যাকটি পপ করুন।
  • <> সক্রিয় স্ট্যাক টগল করুন।

এগুলি যখন মূল্যায়ন করা হয় তখন তারা একত্রে সম্মিলিত হয়। সক্রিয় স্ট্যাকের উপরে যদি আমাদের একটি '3' থাকে তবে এই স্নিপেট:

()(){}

থেকে মূল্যায়ন করবেন 1 + 1 + active.pop()যা 5. মূল্যায়ন করবেন <>0 মূল্যায়ন করে।

মনাদাদের একটি যুক্তি, ব্রেন-ফ্লাক কোডের এক অংশ take এখানে সমস্ত মনদাদ রয়েছে:

  • (n) সক্রিয় স্ট্যাকের উপর 'n' চাপুন।
  • [n] একটি এনটি এবং একটি নতুন লাইন হিসাবে 'এন' মুদ্রণ করুন।
  • {foo}অ্যাক্টিভ.পিেক ()! = 0 এর সময়, ফুফু করুন। মূল্যায়ন 0¹।
  • <foo> ফু কার্যকর করুন, তবে 0 হিসাবে মূল্যায়ন করুন।

এই ফাংশনগুলি তাদের মধ্যে মানটিও ফিরিয়ে দেবে, তাই

(()()())

3 এবং ধাক্কা দেবে

[()()()]

3 মুদ্রণ করবে কিন্তু

[(()()())]

প্রিন্ট এবং ধাক্কা 3।

প্রোগ্রামটি সম্পাদন সম্পন্ন হলে, সক্রিয় স্ট্যাকের প্রতিটি মান বাকী একটি নতুন লাইনের সাথে একটি পূর্ণসংখ্যা হিসাবে মুদ্রিত হয়। অন্যান্য স্ট্যাকের মানগুলি উপেক্ষা করা হয়।

নিয়মাবলী:

  • আপনার প্রোগ্রামটি অবশ্যই (-128, 127) রেঞ্জের সংখ্যা এবং কমপক্ষে 255 স্ট্যাক আকারের সমর্থন করবে you আপনি যদি বড় সমর্থন করেন তবে দুর্দান্ত।

  • আন্ডারফ্লো / ওভারফ্লো অপরিশোধিত।

নমুনা আইও:

খালি প্রোগ্রাম:

ইনপুট: কিছুই নয়

আউটপুট: কিছুই নয়

সংযোজন. সূত্র:

({}{})

ইনপুট:

2, 3

আউটপুট:

5

বিয়োগ। সূত্র:

({}<>){({}[])<>({}[])<>}<>

ইনপুট:

2, 3

আউটপুট:

-1

গুণ। সূত্র:

({}<>)<>({}[]){({}[])<>(({}))<>}<>{({}<>{})<>}<>

ইনপুট:

7, 8

আউটপুট:

56

ফিবানচি। সূত্র:

<>((()))<>{({}[])<>({}<>)<>(({})<>({}<>))<>}<>

ইনপুট:

5

আউটপুট:

13
8
5
3
2
1
1

সত্য যন্ত্র

{[({})]}

স্ট্যান্ডার্ড লুফোলগুলি প্রয়োগ হয় এবং বাইটের মধ্যে সংক্ষিপ্ত উত্তর।


  • ।: এটি আসলে আমার পক্ষ থেকে একটি ভুল ছিল। {...} এটির সমস্ত রানগুলির যোগফলের মূল্যায়ন করা উচিত যা ব্রেন ফ্ল্যাঙ্কের দুর্দান্ত বৈশিষ্ট্যগুলির মধ্যে আইএমও। তবে, এই চ্যালেঞ্জের উদ্দেশ্যে, ধরে নিন যে {...} 0 হিসাবে মূল্যায়ন করা হয়েছে।

প্রোগ্রামটি পরিচালনা করার জন্য ন্যূনতম পূর্ণসংখ্যার মান সম্পর্কিত কোনও নিয়ম আছে?
0 '

মোনাড কী {...}মূল্যায়ন করে?
নীল

বিয়োগ আর্গুমেন্ট কোন ক্রমে? আমি যা প্রত্যাশা করি তা প্রত্যাখ্যান করছি।
নীল

@ নীল এই সম্পর্কে দুঃখিত। মোনাড {...}0 টিতে মূল্যায়ন করে Also এছাড়াও, যুক্তিগুলি ক্রমে চাপ দেওয়া হয়, তাই 2ধাক্কা দেওয়া হয়, পরে 3ধাক্কা দেওয়া হয়, সুতরাং যখন প্রোগ্রাম শুরু হয়, তখন দ্বিতীয় ইনপুট ( 3) স্ট্যাকের শীর্ষে থাকে। পোস্টে থাকা দুজনকেই আমি স্পষ্ট করব।
ডিজেএমসিএমহেম

উত্তর:


6

পিপ -n , 151 148 101 98 বাইট

YRVg;VqR^"{}()<>[]";,8R J,8<>2AL,8("POy|i o0Syl1v0W@y{ }1yPU$+[ ]&@y0 1P$+[ ]"R0" (V{"R1"i}) "^s)y

কমান্ড-লাইন আর্গুমেন্ট এবং স্টিডিনের ব্রেইন-ফ্ল্যাক কোড হিসাবে ইনপুটগুলির তালিকা গ্রহণ করে। এটি অনলাইন চেষ্টা করুন!

সম্পাদনা: অনুবাদ এবং বিকাশ কৌশলটিতে স্যুইচ করে আমার আসল পদ্ধতির উপরে পুরো প্রচুর বাইট সংরক্ষণ করা হয়েছে ved

অবহেলিত এবং মন্তব্য

এই সংস্করণটিতে পাইপ কোডটি দেখানো কিছু ডিবাগ আউটপুটও অন্তর্ভুক্ত রয়েছে যা অনুবাদ থেকে প্রাপ্ত ফলাফল, পাশাপাশি মৃত্যুদন্ড কার্যকর করার পরে স্ট্যাকের সামগ্রী রয়েছে।

;;; Setup ;;;

; y is the active stack, l is the off-stack
; y is initialized from command-line arguments
y:RVg   (reversed to put the last input at the top)
; l is preset to empty list by default

; p is the program (read from stdin)
p:q

; Translate from braces to numbers 0-7 (we do this so that the
; later replacement step won't try to replace the braces in the
; Pip code)
p R: ^"()[]{}<>" 0,8

;;; Replace nilads with the appropriate code ;;;

; () => o (variable preset to 1)
p R: 01 "o"

; [] => v (variable preset to -1)
p R: 23 "v"

; {} => POy|i
; Pop y; return that value OR i (variable preset to 0)
p R: 45 "POy|i"

; <> => (V{Syli})
; Eval the code Syl to swap stacks y and l, then return i (i.e. 0)
p R: 67 "(V{Syli})"

;;; Replace monads with the appropriate code ;;;

; ( ) => yPU$+[ ]&@y
; Sum ($+) the inside and push (PU) the sum onto y; return
; the just-pushed value, which is the first element of y (@y)
; y will always be truthy (nonempty), since we just pushed a value onto it
p R: 0 "yPU$+["
p R: 1 "]&@y"

; [ ] => P$+[ ]
; Sum ($+) the inside, print (P) the sum, and return it
p R: 2 "P$+["
p R: 3 "]"

; { } => (V{W@y{ }i})
; Eval the code W@y{ }, which wraps the inside in curly braces
; and runs it while (W) the first element of y (@y) is truthy
; (i.e. not zero, and not nil from an empty stack)
; Then return i (i.e. 0)
p R: 4 "(V{W@y{"
p R: 5 "}i})"

; < > => (V{ i})
; Eval the inside, then return i (i.e. 0)
p R: 6 "(V{"
p R: 7 "i})"

; Debug: print the resulting translated code and a blank line
Pp.n

;;; Run the code ;;;

; Eval the translated code
(Vp)

; Output the active stack, newline-separated
PyJn

; Debug: print the active stack and the off-stack
P"Active stack: ".RPy
"Off-stack: ".RPl

এই চ্যালেঞ্জের চেয়ে পিপ কি নতুন?
DJMcMayhem

@ ডিজেএমসিমেহেম নাপ ! আমি চ্যালেঞ্জের চেয়ে নতুন কোনও বৈশিষ্ট্যও ব্যবহার করছি না।
DLosc

59

ব্রেন-ফ্লাক ক্লাসিক , 1271 1247 1239 বাইট

<>(()){<>((([][][][][])<(((({}){})(({})({}))[])({}(({})({}({})({}{}(<>)))))[])>{()<{}>}{})<{{}}{}>())}{}<>(<(({()(((<>))<>)}{}{<({}(([][][])((({})({}))[]{})){})>((){[]<({}{})((){[]<({}{}<>((({})({})){}{}){})(<>)>}{}){{}{}<>(<({}{}())>)(<>)}>}{}){(<{}{}{}((<>))<>>)}{}}<>)<{({}[]<({}<>)<>{(<{}>)<>{<>({}[])}{}<>({}<>)(<>)}{}>)}{}<>>)>)<>{(({}[])(){(<{}>)<><(({})[])>[][][][]{()()()()(<{}>)}{}<>}{}<>)<>}<>{}{(({})<({()<<>({}<>)>}{})>([]))((){[](<(({}()()(<>))()()()){(<{}>)<>}>)}{}<>){{}((){[]<({}())((){[]<({}())((){[]<({}())((){[]<({}())((){[]<({}())((){[]<({}())((){[](<{}<>{({}<>)<>}{}(({}))({<{}({}<>)<>>{}(<<>({}[]<>)>)}<><{({}<>)<>}>{})>)}{}){{}{}(<([])>)}>}{}){{}<>{({}<>)<>}{}((({})())<{({}[]<({}<>)<>>)}>{}){({}[]<><({}<><({()<({}[]<({}<>)<>>)>}{}<>)><>)<>({()<({}[]<({}<>)<>>)>}{}<>)>)}<>(<{({}<>)<>}>)}>}{}){{}{}(<(())>)}>}{}){(<{}{}>)<>{({}<>)<>}{}(({}))({<{}({}<>)<>>({})(<<>({}<>)>)}<><{({}<>)<>}>){{}([][][])<>(((<{}>)<>))}}>}{}){{}(<([{}])>)}>}{}){{}((<{}>))}>}{}){{}(({})(<()>)<<>{({}<>)<>}{}({}()<>)<>>)<>(<({}<>)>)<>{({}<>)<>}}{}(<({}<({}<>)<>>{})<>({}<>)>)<>(<({}())>)}{}({}<{({}[]<({}<>)<>>)}{}>){((({}[]<>){(<{}({}<>)>)}{}())<{({}()<({}<>)<>(({})[])>{[][](<{}>)}{})}{}>()){{}(<>)}}{}}{}{({}[]<[{}]>)}{}{({}[]<{}>)}{}

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

{...}মোনাডে অবস্থার সাথে বাগ ফিক্সিং থেকে +4 বাইট এবং বিভিন্ন গল্ফ থেকে -36 বাইট

কোডের 1238 বাইট, -aপতাকাটির জন্য +1 বাইট (যা ভাষা পতাকার সাথে মিলিত হতে পারে)।

এটি এখন {...}চ্যালেঞ্জের বিশদ অনুসারে শূন্য হিসাবে মূল্যায়ন করে। নোট করুন যে ব্রেন-ফ্ল্যাক নিজেই {...}এই চ্যালেঞ্জ পোস্ট হওয়ার দু'দিন আগে 7 ই মে, 2016 বাগবিক্সের পরে সমস্ত রানের যোগফল হিসাবে মূল্যায়ন করেছে।

নিম্নলিখিত রেকর্ডটি {...}সমস্ত রানের যোগফল হিসাবে মস্তিষ্ক-ফ্লাক ক্লাসিককে সঠিকভাবে ব্যাখ্যা করে । দু'জন অনুবাদকের মধ্যে একমাত্র পার্থক্য {}হ'ল একটি নীলাদ স্থাপন করা।

<>(()){<>((([][][][][])<(((({}){})(({})({}))[])({}(({})({}({})({}{}(<>)))))[])>{()<{}>}{})<{{}}{}>())}{}<>(<(({()(((<>))<>)}{}{<({}(([][][])((({})({}))[]{})){})>((){[]<({}{})((){[]<({}{}<>((({})({})){}{}){})(<>)>}{}){{}{}<>(<({}{}())>)(<>)}>}{}){(<{}{}{}((<>))<>>)}{}}<>)<{({}[]<({}<>)<>{(<{}>)<>{<>({}[])}{}<>({}<>)(<>)}{}>)}{}<>>)>)<>{(({}[])(){(<{}>)<><(({})[])>[][][][]{()()()()(<{}>)}{}<>}{}<>)<>}<>{}{(({})<({()<<>({}<>)>}{})>([]))((){[](<(({}()()(<>))()()()){(<{}>)<>}>)}{}<>){{}((){[]<({}())((){[]<({}())((){[]<({}())((){[]<({}())((){[]<({}())((){[]<({}())((){[](<{}<>{({}<>)<>}{}(({}))({<{}({}<>)<>>{}(<<>({}[]<>)>)}<><{({}<>)<>}>{})>)}{}){{}{}(<([])>)}>}{}){{}<>{({}<>)<>}{}((({})())<{({}[]<({}<>)<>>)}>{}){({}[]<><({}<><({()<({}[]<({}<>)<>>)>}{}<>)><>)<>({()<({}[]<({}<>)<>>)>}{}<>)>)}<>(<{({}<>)<>}>)}>}{}){{}{}(<(())>)}>}{}){(<{}>)<>{({}<>)<>}{}(({}))({<{}({}<>)<>>({})(<<>({}<>)>)}<><{({}<>)<>}>{}){{}([][][])<>(((<{}>)<>))}}>}{}){{}(<([{}])>)}>}{}){{}((<{}>))}>}{}){{}(({})(<()>)<<>{({}<>)<>}{}({}()<>)<>>)<>(<({}<>)>)<>{({}<>)<>}}{}(<({}<({}<>)<>>{})<>({}<>)>)<>(<({}())>)}{}({}<{({}[]<({}<>)<>>)}{}>){((({}[]<>){(<{}({}<>)>)}{}())<{({}()<({}<>)<>(({})[])>{[][](<{}>)}{})}{}>()){{}(<>)}}{}}{}{({}[]<[{}]>)}{}{({}[]<{}>)}{}

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

ইনপুট (উভয় দোভাষীর কাছে) ব্যাখ্যা করার ব্রেন-ফ্ল্যাক ক্লাসিক প্রোগ্রাম, তারপরে একটি নতুন লাইন, তারপরে একটি পৃথক পূর্ণসংখ্যার তালিকা। ইনপুটটিতে কোনও বৈধতা দেওয়া হয় না। প্রোগ্রাম বা ইনপুট ফাঁকা থাকলেও নতুন লাইনটি প্রয়োজনীয়।

প্রথম পদক্ষেপটি বন্ধনী দিয়ে শুরু করে সমস্ত ইনপুট পার্স করা হয়:

# Move to right stack, and push 1 to allow loop to start
<>(())
{
   # While keeping -5 on third stack:
   <>((([][][][][])<

       # Pop bracket or newline k from left stack, and push 0, k-10, k-40, k-60, k-91, k-123 on right stack
       (((({}){})(({})({}))[])({}(({})({}({})({}{}(<>)))))[])

   # Search this list for a zero, and push the number of nonzero entries popped minus 5 
   # (thus replacing the 0 if it was destroyed)
   >{()<{}>}{})

   # Remove rest of list, and push the same number plus 1
   # Result is -4 for {, -3 for [, -2 for <, -1 for (, 0 for newline, or 1 for everything else (assumed closing bracket)
   <{{}}{}>())

# Repeat until newline found
}{}<>

তারপরে পূর্ণসংখ্যাগুলি পার্স করা হয়। এটি সাধারণত প্রয়োজন হয় না, তবে ইনপুটটিকে ASCII হিসাবে নেওয়া হয়েছিল। যদিও এটিতে রূপালী আস্তরণ রয়েছে: পাঠ্য ইনপুট আমাদের স্ট্যাকের উচ্চতা নির্ধারণ করতে সহায়তা করে, যা আমাদের যখন স্ট্যাকের উচ্চতা নীলাদে অ্যাক্সেস না করে তখন জিনিসগুলি সহজতর করে।

পূর্ণসংখ্যাগুলি দ্বিতীয় স্ট্যাকের দুটি সংখ্যায় বিভক্ত করা হয়: পরম মানের জন্য একটি এবং চিহ্নের জন্য একটি। এরপরে এটিকে প্রথম স্ট্যাকের দিকে নিয়ে যাওয়া হয়।

বর্ণিত স্ট্যাকগুলি নীচের ক্রমে কোডের নীচে প্রথম স্ট্যাকের মধ্যে সংরক্ষণ করা হয়: বর্তমান স্ট্যাকের উচ্চতা, বর্তমান স্ট্যাক, অন্যান্য স্ট্যাকের উচ্চতা, অন্যান্য স্ট্যাক। অন্যান্য স্ট্যাকের উচ্চতার 0 টি এই মুহুর্তে ধাক্কা দেওয়ার দরকার নেই, কারণ এটি প্রথমবার পড়ার পরে নিখুঁত শূন্য হবে।

(<((

    # If stack nonempty, register first stack entry.
    {()(((<>))<>)}{}

    # For each byte k of input:
    {

        # Push -3, -13, and k-32
        <({}(([][][])((({})({}))[]{})){})>

        # Evaluate to 1 if space
        # If not space (32):
        ((){[]<

            # If not minus (45):
            ({}{})((){[]<

                # Replace top of right stack (n) with 10*n + (k-48)
                ({}{}<>((({})({})){}{}){})(<>)

            # Else (i.e., if minus):
            >}{}){

                # Remove excess "else" entry and -3
                {}{}

                # Set sign to negative (and destroy magnitude that shouldn't even be there yet)
                <>(<({}{}())>)(<>)}

        # Else (i.e., if space):
        >}{}){

            # Remove working data for byte, and push two more 0s onto right stack
            (<{}{}{}((<>))<>>)

    # Push number of integers found
    }{}}<>)

    # For each integer:
    <{({}[]<

        # Move magnitude back to left stack
        ({}<>)<>

        # If sign is negative, negate
        {(<{}>)<>{<>({}[])}{}<>({}<>)(<>)}{}

    >)}{}

    # Push stack height onto stack
    <>>)

# Push 0
>)

কোডটির উপস্থাপনাটি এখন আবার বাম স্ট্যাকে সরানো হয়েছে। জিনিসগুলি পরে সহজ করার জন্য, আমরা নীলাদের প্রারম্ভিক বন্ধনীগুলি থেকে 4 টি বিয়োগ করি, যাতে প্রতিটি ক্রিয়াকলাপের -1 থেকে -8 অবধি একটি অনন্য পূর্ণসংখ্যা থাকে।

# For each bracket in the code:
<>{

    # Push k-1 and evaluate to k
    (({}[])()

    # If not closing bracket:
    {

        # Check next bracket (previously checked, since we started at the end here)
        (<{}>)<><(({})[])>

        # Subtract 4 if next bracket is closing bracket
        # Inverting this condition would save 8 bytes here, but cost 12 bytes later.
        [][][][]{()()()()(<{}>)}{}

    <>}{}

    # Push result onto left stack
    <>)

<>}<>{}

প্রোগ্রামটির মূল অংশটি হ'ল নির্দেশগুলি ব্যাখ্যা করে। মূল লুপের প্রতিটি পুনরাবৃত্তির শুরুতে, বর্তমান নির্দেশটি বাম স্ট্যাকের শীর্ষে রয়েছে, তার পরে সমস্ত কিছু একই স্ট্যাকের নীচে এবং ডান স্ট্যাকের আগে যা কিছু রয়েছে তার আগে। আমি এটি একটি নির্দিষ্ট পৃষ্ঠায় খোলা বই হিসাবে ভিজ্যুয়ালাইজড ঝোঁক।

{

    (

        # Get current instruction
        ({})

        # Move all code to left stack, and track the current position in code
        <({()<<>({}<>)>}{})>

        # Push -1, signifying that the code will move forward to just before a matching }.
        # In most cases, this will become 0 (do nothing special) before it is acted upon
        ([])

    # Push instruction minus 1
    )

    # If opening bracket:
    ((){[](<

        # Push instruction+1 and instruction+4
        (({}()()(<>))()()())

        # If instruction+4 is nonzero (not loop monad), replace the earlier -1 with 0 to cancel forward seek
        # This would be clearer as {(<{}>)<>(<{}>)<>}, but that would be unnecessarily verbose
        {(<{}>)<>}

    # Else (i.e., if closing bracket):
    >)}{}<>){

# If closing bracket, parse command
# Post-condition for all: if not moving to {, pop two and push evaluation, 0.
# (For nilads, can assume second from top is 0.)
# If moving to {, pop one, push -3, 0, 0.

        # Seven nested if/else statements, corresponding to eight possible instruction.
        # The "else" statements end with 0 already on the stack, so no need to push a 0 except in the innermost if.
        # Each one beyond the first increments the instruction by 1 to compare the result with 0
        # Each instruction will pop the instruction, leaving only its evaluation (with a 0 on top).
        {}((){[]<
        ({}())((){[]<
        ({}())((){[]<
        ({}())((){[]<
        ({}())((){[]<
        ({}())((){[]<
        ({}())((){[](<

            # -7: pop
            # Pop instruction to reveal existing 0 evaluation
            {}

            # Move code out of the way to access stack
            <>{({}<>)<>}{}

            # Duplicate stack height (only useful if stack height is zero)
            (({}))

            (

                # If stack height nonzero
                {

                    # Save stack height on second stack
                    <{}({}<>)<>>

                    # Pop stack
                    {}

                    # Move stack height back and subtract 1
                    (<<>({}[]<>)>)

                }

                # Move code back to normal position
                <><{({}<>)<>}>{}

            # Evaluate as popped entry (0 if nothing popped)
            )

        # (else)
        >)}{}){

            # -6: -1 nilad
            # Just evaluate as -1
            {}{}(<([])>)

        # (else)
        }>}{}){

            # -5: swap nilad
            # Move code out of the way to access stack
            {}<>{({}<>)<>}{}

            # Number of integers to move: stack height + 1 (namely, the stack height and every entry in the stack)
            ((({})())

            # Move to second stack
            <{({}[]<({}<>)<>>)}>{}

            # Do (stack height + 1) times again
            ){({}[]<><

                # Get stack element
                ({}<><

                    # Move alternate (interpreted) stack to second (real) stack, and push length on top of it
                    ({()<({}[]<({}<>)<>>)>}{}<>)

                # Push current stack element below alternate stack
                ><>)

                # Move alternate stack back above newly pushed element
                <>({()<({}[]<({}<>)<>>)>}{}<>)

            >)}

            # Move code back to normal position
            <>(<{({}<>)<>}>)

        # (else)
        }>}{}){

            # -4: 1
            # Just evaluate to 1
            {}{}(<(())>)

        # (else)
        }>}{}){

            # -3: loop
            # Create zero on stack while keeping existing evaluation
            # This becomes (<{}{}>) in the version that meets the challenge spec
            (<{}>)

            # Move code out of the way to access stack
            <>{({}<>)<>}{}

            # Duplicate stack height
            (({}))

            (

                # If stack height nonzero
                {

                    # Save stack height on second stack
                    <{}({}<>)<>>

                    # Peek at top of stack
                    ({})

                    # Move stack height back
                    (<<>({}<>)>)

                }

                # Move code back to normal position
                <><{({}<>)<>}>

            # Look at peeked entry
            # Remove the {} in the version meeting the challenge spec
            {})

            # If peeked entry is nonzero
            {

                # Replace -3 instruction on third stack
                {}([][][])

                # Replace loop indicator to 0 (to be incremented later to 1)
                <>(((<{}>)

                # Create dummy third stack entry to pop
                <>))

            }

        # (else)
        }>}{}){

            # -2: print
            # Just print evaluation without modifying it
            {}(<([{}])>)

        # (else)
        }>}{}){

            # -1: evaluate as zero
            # Just change evaluation to 0
            {}((<{}>))

        # else
        }>}{}){

            # 0: push
            # Get current evaluation (without modifying it)
            {}(({})

                # Create zero on stack as barrier
                (<()>)

                # Move code out of the way to access stack
                <<>{({}<>)<>}{}

                # Increment stack height and save on other stack
                ({}()<>)<>

            # Push evaluation
            >)

            # Move stack height back (and push zero)
            <>(<({}<>)>)

            # Move code back to normal position
            <>{({}<>)<>}

        }{}

        # Update third stack by adding evaluation to previous entry's evaluation
        # Previous entry's instruction is saved temporarily on left stack
        (<({}<({}<>)<>>{})<>({}<>)>)

        # Increment loop indicator
        # If instruction was loop monad and top of stack was nonzero, this increments 0 to 1 (search backward)
        # Otherwise, this increments -1 to 0 (do nothing)
        <>(<({}())>)

    }{}

    # While holding onto loop indicator
    ({}<

        # Go to immediately after executed symbol
        {({}[]<({}<>)<>>)}{}

    >)

    # If looping behavior:
    {

        # Switch stack and check if searching forward
        ((({}[]<>)

        # If so:
        {

            # Move just-executed { back to left stack, and move with it
            (<{}({}<>)>)

        }{}

        # Either way, we are currently looking at the just-executed bracket.
        # In addition, the position we wish to move to is on the current stack.

        # Push unmodified loop indicator as initial value in search
        ())

        # While value is nonzero:
        <{

            # Add 1
            ({}()

                # Move current instruction to other stack
                <({}<>)<>

                # Check whether next instruction is closing bracket
                (({})[])>

                # If opening bracket, subtract 2 from value
                {[][](<{}>)}{}

            )

        }{}>

        # If searching backward, move back to left stack
        ()){{}(<>)}

    }{}

}

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

# Pop the zero
{}

# Output current stack
{({}[]<[{}]>)}{}

# Discard other stack to avoid implicit printing
{({}[]<{}>)}{}

12
: ও কী ... ঠিক আছে, তাত্ক্ষণিক অনুগ্রহ করে। সুন্দর কাজ! : ডি
ডিজেএমসিএমহেম

4
আমাকে এই সোজা পেতে দাও ... আপনি যে ভাষার ব্যাখ্যা করতে হবে তার জন্য একটি দোভাষী তৈরি করেছেন। YoDawg
tisaconundrum

ঠিক আছে, কেন এটিতে কেবল 2 ডিজিটের আপভোট নম্বর থাকবে?
নিডজেজেকোব

এতে সঞ্চয়ের সঠিকভাবে প্রয়োগ করার ক্ষেত্রে ভাল কাজ {...}, যা আধুনিক মস্তিষ্ক-ফ্লাক এবং (আমার মনে হয়) মস্তিষ্ক-ফ্ল্যাক ক্লাসিকের সঠিক আচরণ, তবে আমি চ্যালেঞ্জটিতে লিখেছিলাম যে {...}0 হিসাবে মূল্যায়ন করে আপনি সম্ভবত একটি উল্লেখযোগ্য সংখ্যক বাইটের গল্ফ করতে পারেন এই কার্যকারিতাটি সরিয়ে দিয়ে, যদিও মূলটি প্রায় রাখা ভাল হবে কারণ এটি প্রযুক্তিগতভাবে আরও সাধারণভাবে (এই চ্যালেঞ্জের জন্য কেবল ভুল)
ডিজেএমসিএমহেম

@ ডিজেএমসিএমহেম ফিক্সড শুধু আমাকে ব্রেইন-ফ্ল্যাঙ্কের অনুমান সংস্করণের পুরো দোভাষীকে বন্দর করবেন না।
নাইট্রডন

8

APL, 255 257 বাইট

b←{S←(⌽⍺)⍬
e←{0=⍴⍵:0
v+∇⊃_ v←∇{r←⊂2↓⍵
'()'≡n←2↑⍵:r,1
'[]'≡n:r,¯1
'{}'≡n:r,{i←⊃⊃⊃S⋄S[1]↓⍨←1⋄i}⍬
'<>'≡n:r,0⊣S⌽⍨←1
r←⊂⍵↓⍨i←0⍳⍨(+\c=⍵)-+\')]>}'['([<{'⍳c←⊃⍵]=⍵
i←1↓¯1↓c←i↑⍵
'('=c←⊃c:r,S[1],⍨←⍺⍺i
'['=c:r,+⎕←⍺⍺i
'{'=c:r,{0≠⊃⊃⊃S:∇e i⋄0}⍬
'<'=c:r,0⊣⍺⍺i}⍵}
⎕←⍪⊃S⊣e⍵}

এটি প্রোগ্রামটিকে তার ডান আর্গুমেন্ট হিসাবে গ্রহণ করে এবং প্রোগ্রামটি তার বাম আর্গুমেন্ট হিসাবে গ্রহণ করে, যেমন:

      2 3 b '({}{})'
5
      2 3 b '({}<>){({}[])<>({}[])<>}<>'
¯1
      7 8 b '({}<>)<>({}[]){({}[])<>(({}))<>}<>{({}<>{})<>}<>'
56
      5 b '<>((()))<>{({}[])<>({}<>)<>(({})<>({}<>))<>}<>'
13
 8
 5
 3
 2
 1
 1

অবহেলিত সংস্করণ: এখানে


7

এপিএল (ডায়ালগ ক্লাসিক) , 146 বাইট

↑⍕¨s⊣{⍎⍕1 ¯1'(s↓⍨←1)⊢⊃s' '0⊣s t←t s' 's,⍨←+/∇¨a' '⎕←+/∇¨a' '∇{×⊃s:∇⍺⍺¨a⋄0}0' '0⊣+/∇¨a'[(⊃⍵)+4×⍬≢a1↓⍵]}¨⍎∊(')',⍨'(',¨⍕¨⍳4)[0,4,⍨'([{<'⍳⍞]⊣s←⌽⎕⊣t←⍬

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

একটি ক্লাসিক অন্য ব্যাখ্যা ব্যাখ্যা :)


6

পাইথন 3, 429 বাইট

import re
S='s+=[v];v=0';T='v+=s.pop()';i=0
d={'()':'v+=1','(':S,')':'a+=[v];'+T,'[]':'v-=1','[':S,']':'print(v);'+T,'<>':'a.reverse()','<':S,'>':T,'{}':'v+=0if a[-1]==""else a.pop()','{':S+';while a[-1]:','}':T}
def r(m):global i;t=m.group();i-=(t=='}');s=' '*i;i+=(t=='{');return''.join(s+r+'\n'for r in d[t].split(';'))
def g(c,*a):
 a,s,v=['']+list(a),[],0;exec(re.sub(r'[<({[]?[]})>]?',r,c));
 while a[-1]!="":print(a.pop())

যেমন ব্যবহার করা হয় g('[{}{}]', 2, 3)

এটি re.subঅজগর থেকে মস্তিষ্ক-ফ্ল্যাঙ্ক উত্সকে "সংকলন" করতে ব্যবহার করে এবং তারপরে অজগরটি কার্যকর করে। (ডিবাগিংয়ের জন্য, এর execসাথে প্রতিস্থাপন করুনprint পাইথন কোডের একটি তালিকা পেতে তার )

কোডগুলিতে লুপগুলি প্রচুর পরিমাণে বাইট খায় তবে সঠিকভাবে ইনডেন্টিং করা থাকে।


3

পাইথন, 616 বাইট

নির্দেশাবলী:

  1. অজগর দিয়ে চালাও
  2. [1,2,...]বিন্যাসে ইনপুট তালিকা , তারপরে এন্টার টিপুন
  3. প্রোগ্রাম আটকান / লিখুন, তারপরে আবার এন্টার টিপুন
  4. সম্পন্ন

মূলত, এই প্রোগ্রামটি যা করে তা হ'ল বার্ষিকভাবে মস্তিষ্ক-ফ্ল্যাঙ্ক কোডটিকে নীস্টযুক্ত তালিকায় "সংকলন" করা এবং সেই তালিকাটির পুনরাবৃত্তভাবে ব্যাখ্যা করা। দুটোকে একত্রিত করার সম্ভবত একটি উপায় আছে ...

আমি চেষ্টা করব এবং পরে যুক্তিটি পুনরায় কাজ করব।

y="([{<)]}>"
w,z,g=print,len,input
def c(s):
 if z(s)<1:return[]
 t,i,o=[],1,0
 t.append(y.index(s[0]))
 while z(t)>0:
  x=y.index(s[i])
  if x<4:t.append(x)
  else:o=t.pop()
  i+=1
 r=[[o,c(s[1:i-1])]]
 r.extend(c(s[i:]))
 return r
p=lambda t:t.pop()if z(t)>0 else 0
k=lambda t:t[z(t)-1]if z(t)>0 else 0
r,l=[],eval(g())
a=l
def i(u):
 v=0
 global a
 for t,n in u:
  if t<1:
   if n:o=i(n);v+=o;a.append(o)
   else:v+=1
  if t==1:
   if n:o=i(n);v+=o;w(o)
   else:v-=1
  if t==2:
   if n:
    while k(a)!=0:i(n)
   else:v+=p(a)
  if t>2:
   if n:i(n)
   elif a==l:a=r
   else:a=l
 return v
i(c(g()))
for n in a:w(n)

3

পার্ল 5.6, 419 414 বাইট

আমি এটি কিছুটা গল্ফ করেছি তবে সম্ভবত উন্নতির সুযোগ রয়েছে। কিছুটা পাঠযোগ্যতার জন্য এখানে নিউলাইনস এবং ট্যাবগুলি যুক্ত করা হয়েছে:

use Text::Balanced extract_bracketed;
$s=shift;
@a=reverse@ARGV;
sub p
{
    my($c)=@_;
    my$s=0;
    while(my$n=extract_bracketed($c)){
        $s+='()'eq$n||'{}'eq$n&&shift@a;
        $s-='[]'eq$n;
        @t=@a,@a=@i,@i=@t if'<>'eq$n;
        my$m=chop($n);
        $n=substr($n,1);
        if($n){
            p($n)while'}'eq$m&&$a[0];
            p($n)if'}'ne$m;
            $s+=$v,unshift@a,$v if')'eq$m;
            $s+=$v,print"n=$n m=$m v=$v\n"if']'eq$m;
        }
    }
    $v=$s;
}
p($s);
foreach(@a){
    print"$_\n";
}

1

পাইথন 2 , 361 , 348 বাইট

c,s=input();s=s,[]
a=s[0]
def w():global a,s;s=s[::-1];a=s[0];return 0
def p(c):a.append(c);return c
def n(c):print c;return c
z=lambda c:0
def l(f):
 global a
 while a and a[-1]:f()
 return 0
for x,y in zip("() ( [] {} <> [ < { } ] >".split(),"+1 +p( -1 +(len(a)and(a.pop())) +w() +n( +z( +l(lambda: ) ) )".split()):c=c.replace(x,y)
exec c
print a

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

-১ by বাইট @ মিঃ কে ধন্যবাদ সংরক্ষণ করেছে। Xcoder!

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