মাইনাইফ ব্রেইনফাক


22

আপনার চ্যালেঞ্জটি এই নিয়ম অনুসারে ব্রেনফাক কোডকে ছোট করা :

  • যে কোনও একটি নয় সেটিকে সরিয়ে ফেলুন +-><[].,
  • ধারাবাহিক +বা -অক্ষরের যে কোনও গ্রুপের জন্য , যদি +s এবং -s এর পরিমাণ একই হয় তবে সেগুলি সরান।
  • উপরের মত একই করুন, >এবং সাথে <
  • +-><অক্ষরগুলির ক্রমগুলি সরিয়ে ফেলুন যদি তারা কিছু না করে। উদাহরণস্বরূপ, আপনার অপসারণ করা উচিত +>-<->+<। (এটি কার্যকর করা সবচেয়ে কঠিন এবং কার্যকরতম হতে পারে)) আপনি কোনও মিথ্যা ধনাত্মকতা না পেয়েছেন তা নিশ্চিত করুন, যেমন +>-<+>-<সরিয়ে দেওয়া উচিত নয়।

পরীক্ষার কেস:

ইনপুট

++++++[->++++++<]>.   prints a $
[-]<                  resets tape
>,[>,]<[.<]           reverses NUL terminated input string
++-->><<              does nothing

আউটপুট

++++++[->++++++<]>.[-],[>,]<[.<]

ইনপুট

Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<

আউটপুট

+++>-<+>---<

আপনি চাইলে ইনপুট এবং আউটপুট গ্রহণ করতে পারেন - stdin / stdout, একটি ফাংশন, ইত্যাদি, তবে ইনপুট হার্ডকোড নাও থাকতে পারে।

এটি , তাই চরিত্র গণনায় সবচেয়ে সংক্ষিপ্ত কোডটি জিততে পারে।


4
আমি জানি এটি একটি পুরানো চ্যালেঞ্জ, তবে পরীক্ষার কেসগুলি অপর্যাপ্ত। ++>>++<<--আউটপুট করা উচিত >>++<<, এবং এটি আবৃত ছিল না। দয়া করে আরও পরীক্ষার কেস যুক্ত করুন।
mbomb007

@ mbomb007 আপনি শেষ পরীক্ষার কেসটি পরীক্ষা করেছেন +++>-<+>---<,? অপ্রয়োজনীয় পয়েন্টার চলন এড়াতে এটি ছোট করা যেতে পারে, তবে প্রত্যাশিত আউটপুট এটিকে অপরিবর্তিত রাখে। প্রশ্ন এবং উত্তর উভয়ের দিকে তাকানোর উপর ভিত্তি করে আমার বোঝার বিষয়টি হ'ল দুরকনব স্পষ্টভাবে স্পষ্টভাবে নেওয়া হচ্ছে বলে; আমরা কোনো নো অপ সংলগ্ন নিষ্কাশন আবশ্যক +-><যেমন স্পষ্টভাবে বিবৃত সিকোয়েন্স, এবং যে অতিক্রম এটি আপনার উদাহরণ হিসাবে অতিরিক্ত minifying করতে অনুমোদনযোগ্য ++>>++<<--, এবং আমরা যতদিন rearrangements করতে পারেন হিসাবে তারা কোড, উদাঃ কার্যকারিতা পরিবর্তন করবেন না >+<+বা +>+<
মিচ শোয়ার্টজ

@ মিচসওয়ার্টজ "+ -> <টি অক্ষরের ক্রমগুলি সরিয়ে ফেলুন যদি তারা কিছুই না করে example উদাহরণস্বরূপ, আপনার অপসারণ করা উচিত +>-<->+<((এটি কার্যকর করা সবচেয়ে কঠিন এবং কঠিনতম হতে পারে)) নিশ্চিত করুন যে আপনি কোনও মিথ্যা ইতিবাচক না পেয়েছেন, যেমন +>-<+>-<, যা অপসারণ করা উচিত নয়। " - এটি এক ধরণের অস্পষ্ট
mbomb007

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

1
ওহ, সুতরাং আমাদের কেবল মিলিত ক্রমগুলি সরাতে হবে?
mbomb007

উত্তর:


10

বিদ্রোহী - 104

_/^_$/$</([^][<>.,+-]|\+-|-\+|<>|><)//((?<X>(<|>))+[+-]+(?!\2)(?<-X><|>)+(?(X)(?!)))([+-]+)/$3$1/.+/$>$&

ব্যবহার:

ইনপুট: স্টিডিন থেকে একটি লাইন পড়ে।

আউটপুট: স্টডআউটে একটি লাইন মুদ্রণ করে।

ব্যতিক্রমসমূহ *:

  • প্রবেশের _ফলে কিছুই আউটপুট না করে পড়ার এবং ব্যবহার করার অন্য লাইন ঘটে।
  • ++++>----<পরিবর্তে দ্বিতীয় পরীক্ষার ফলাফল +++>-<+>---<। তবে ঠিক আছে, তাই না? ;)
  • >-<+ইত্যাদি প্রতিস্থাপিত হয় +>-<ইত্যাদি

ভক্ষক:

অসঙ্গতি # 3 প্রয়োগ করা জিনিসগুলিকে বেশ তুচ্ছ করে তোলে।

* এটি কোনও বাগ নয়, এটি একটি বৈশিষ্ট্য!


"এটি কোনও বাগ এটির বৈশিষ্ট্য নয়" +1!
রোহান ঝুনঝুনওয়ালা

36

ব্রেইনফাক, 579 বাইট

,[<<+>>>>+<<[[<+>>+<-]++++++[>-------<-]>-[-[-[-[--------------[--[<+++++[>-----
-<-]>+[--[<<[-]>>-]]<]>[>>-<<<<<[-]<[<]<<<[<]>>>>>>>>[<]<-[+>]+[->+]>>>>+>[<-]<[
>+<-<]>]<]>[<<<[-]-[<]>>>>>>>>>>>[<]<<<<<<[<]<-[+>]+[-<+]<<<+<[>-<<<]>[-<+<]]]<]
>[+>[-<]<[<<]<[-]>>]]<]+>[-[<-]<[>+>+<<-<]<[-]>+>]<<[>-]>[,>]<]<+<[>]>[>>>[<<<<[
-<]<<<]>>>+>>>>[<<<<->>>>[>>>[-<]>>>>]]]>[<<<[<+[-->>]]>[-[.[-]]]>[<]>[<<++++++[
>+++++++<-]>+>>[<<.>>-]<<++>-[<.>-]+++[<+++++>-]+<<<<<<+>[<<[>->>>>>.[[-]<<<<]<<
<+>>>]>[->->>>>[-]]]<[->+[>>>>>]>>[<]<<<<<<<<[[-]<]>[++.[-]>>>>>>>]<]]>>]<[>>>>>
>>]+[-<<<<<[-]<<],]

বিন্যাস এবং কিছু মন্তব্য সহ:

,
[
  <<+>> >>+<<
  [
    [<+> >+<-]
    ++++++[>-------<-]
    >-
    [
      not plus
      -
      [
        not comma
        -
        [
          not minus
          -
          [
            not period
            --------------
            [
              not less than
              --
              [
                not greater than
                <+++++[>------<-]>+
                [
                  not open bracket
                  --
                  [
                    not close bracket
                    <<[-]>>-
                  ]
                ]
                <
              ]
              >
              [
                greater than
                >>-<<
                <<<[-]<[<]<<<[<]
                >>>>>>>>[<]
                <-[+>]
                +[->+]
                >>>>+>[<-]
                <[>+<-<]
                >
              ]
              <
            ]
            >
            [
              less than
              <<<[-]-[<]
              >>>> >>>>>>>[<]
              <<<<<<[<]
              <-[+>]
              +[-<+]
              <<<+<[>-<<<]
              >[-<+<]
            ]
          ]
          <
        ]
        >
        [
          minus
          +>[-<]
          <[<<]
          <[-]>>
        ]
      ]
      <
    ]
    +>
    [
      plus
      -[<-]
      <[>+>+<<-<]
      <[-]>+>
    ]
    <<
    [
      comma or period or bracket
      >-
    ]
    >[,>]
    <
  ]
  comma or period or bracket or eof
  <+<
  [
    start and end same cell
    >
  ]
  >
  [
    >>>
    [
      <<<<[-<]<<<
    ]
    >>>+>>>>
    [
      start right of end
      <<<<->>>>
      [>>>[-<]>>>>]
    ]
  ]
  >
  [
    <<<
    [
      <+[-->>]
    ]
    >[-[.[-]]]
    >[<]
    >
    [
      <<++++++[>+++++++<-]>+>>
      [<<.>>-]
      <<++>-[<.>-]
      +++[<+++++>-]
      +<<<<< <+>
      [
        <<
        [
          go left
          >->>>>>.
          [[-]<<<<]
          <<<+>>>
        ]
        >
        [
          toggle left right
          ->->>>>[-]
        ]
      ]
      <
      [
        toggle right left
        ->+[>>>>>]>>[<]
        <<<<<<<<
        [
          [-]<
        ]
        >
        [
          go right
          ++.[-]
          >>>>>>>
        ]
        <
      ]
    ]
    >>
  ]
  <[>>>>>>>]
  +[-<<<<<[-]<<]
  ,
]

এটি কিথ র্যান্ডাল এর সমাধান হিসাবে একই পদ্ধতির ব্যবহার করে, +-<>সিমুলেশন দ্বারা সর্বোত্তমভাবে সমস্ত ধরণের অনুক্রমকে মাইনাইফ করে। উদাহরণস্বরূপ, +++>-<+>---<হয়ে ++++>----<এবং >+<+<<+>+<->>>>হয়ে +<+>>+>

এটি অনলাইনে চেষ্টা করুন। (যদি একটি সিমুলেটেড সেলটির নিখুঁত মান 256 এর কাছাকাছি হয় তবে ওভারফ্লো সমস্যা হবে))

সামগ্রিক কাঠামো হয়

while not EOF:
  while not EOF and next char not in ",.[]":
    process char
  print minified sequence (followed by the char in ",.[]" if applicable)

টেপটি 7-সেল নোডে বিভক্ত; অভ্যন্তরীণ লুপের শুরুতে, মেমরির বিন্যাসটি হয়

0 s 0 c 0 a b

যেখানে sশুরু কক্ষের জন্য বুলিয়ান পতাকা, cএটি বর্তমান চরিত্রটি, aসিমুলেটেড সেল মান (এক প্লাস) এর নেতিবাচক অংশ, এবং সিমুলেটেড সেল মানের bইতিবাচক অংশ।

যখন মিনিফাইড সিকোয়েন্সটি মুদ্রণ করা হচ্ছে তখন মেমরির বিন্যাসটি হয়

d n e 0 0 a b

যেখানে dনির্দেশনার জন্য একটি বুলিয়ান ফ্ল্যাগে হয়, aএবং bআগের মতই হয় (কিন্তু হয়ে এক / শূন্য যখন মুদ্রিত), এবং nএবং eশেষ নোড শুধুমাত্র অশূন্য হয়; nনোডটি কতবার দেখা হয়েছে তার সাথে সম্পর্কিত এবং eএটি চরের মান যা অভ্যন্তরীণ লুপকে থামিয়েছে (প্লাস ওয়ান)।

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

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


2
সূত্র: ব্রেইনফাক। লক্ষ্য: ব্রেনফাক। +1
এরিক আউটগল্ফার


1
আমি এটি কিছুটা মনোযোগ আকর্ষণ করব এবং এক বা
দুদিনের মধ্যে অনুদান দেব

1
@ মিচশওয়ার্টজ আপনি কি নিজের কোডটির বিপরীতে আপনার কোডটি পরীক্ষা করতে পেরেছিলেন? আপনি আসলে এটি সংক্ষিপ্ত করতে পারেন! #meta
ওয়ালিওয়েস্ট

1
@ ওয়ালিওয়েস্ট (এটি by বাইট সংরক্ষণ করতে দেখা যাচ্ছে!) কিছুই নয়, পারমিলিংকের কোডটির লাইন ব্রেক রয়েছে।
ডেনিস

7

পাইথন, 404 অক্ষর

এই কোডটি সমস্ত অনুচ্ছেদের একটি নিখুঁত অপ্টিমাইজেশন করে +-<>। আপনি চেয়েছিলেন চেয়ে কিছুটা বেশি, কিন্তু আপনি সেখানে যান।

M=lambda n:'+'*n+'-'*-n                                                           
def S(b):                                                                         
 s=p=0;t=[0];G,L='><'                                                             
 for c in b:                                                                      
  if'+'==c:t[p]+=1                                                                
  if'-'==c:t[p]-=1                                                                
  if G==c:p+=1;t+=[0]                                                             
  if L==c:s+=1;t=[0]+t                                                            
 if p<s:k=len(t)-1;t,p,s,G,L=t[::-1],k-p,k-s,L,G                                  
 r=[i for i,n in enumerate(t)if n]+[s,p];a,b=min(r),max(r);return(s-a)*L+''.join(M(n)+G for n in t[a:b])+M(t[b])+(b-p)*L                                           
s=b=''                                                                            
for c in raw_input():                                                             
 if c in'[].,':s+=S(b)+c;b=''                                                     
 else:b+=c                                                                        
print s+S(b) 

এটি টেপটিতে +-<>অপারেশনগুলি অনুকরণ করে কাজ করে tsটেপে আরম্ভের অবস্থান এবং pবর্তমান অবস্থান। সিমুলেশন করার পরে, এটি [a,b]অপ্টিমাল পাসের পরিমাণটি কী পরিমাণে চালিত হওয়া প্রয়োজন এবং সমস্ত উত্তম পাসে সমস্ত +/- করে তা নির্ধারণ করে।


1

কফিস্ক্রিপ্ট - 403 397

i=prompt().replace /[^\]\[,.+-><]/g,''
x=(c)->
 t={};p=n=0
 for d in c
  t[p]?=0;switch d
   when'+'then n=1;t[p]++;when'-'then n=1;t[p]--;when'<'then p--;when'>'then p++
 (n=0if v!=0)for k,v of t;n
s=e=0;((e++;(i=(i.substr 0,s)+i.substr e;e=s=0)if x (i.substr s,e-s).split "")while(i[e]||0)!in['[',']',0];e=++s)while s<=i.length
r=/(\+-|-\+|<>|><|^[<>]$)/g
i=i.replace r,'' while r.test i
alert i

ডেমো (দয়া করে এখানে বিট ব্যবহারের জন্য ক্ষমা করুন, পুরো URL টি মার্কডাউনটি ভেঙে দেবে)

সঙ্কুচিত সংস্করণ (ডাব্লু / ডিবাগ কোড):

console.clear()
input = """Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<"""

input = input.replace /[^\]\[,.+-><]/g, ''
console.log input

execute = (code) ->
  stack = {}
  item = 0
  console.log code
  nop = false
  for char in code
    switch char
      when '+' then nop = true; stack[item]?=0;stack[item]++
      when '-' then nop = true; stack[item]?=0;stack[item]--
      when '<' then item--
      when '>' then item++
  console.debug stack
  (nop = false if v != 0) for k,v of stack
  nop
start = 0
end = 0

while start <= input.length
 while input.charAt(end) not in [ '[', ']', '' ]
  end++
  if execute (input.substring start, end).split("")
    input = (input.substring 0, start) + input.substring end
    end = start = 0
    console.log input
 end = ++start
input = input.replace /(\+-|-\+|<>|><|^(<|>)$)/g, '' while /(\+-|-\+|<>|><)/.test input
console.log 'Result: ' + input

কফিস্ক্রিপ্ট ডেমো পোস্ট করার একটি বিকল্প উপায় হ'ল জেএসফিডাল । বাম মার্জিনে একটি "ভাষা" কনফিগারেশন ফল রয়েছে যা আপনাকে জেএসের পরিবর্তে কফিস্ক্রিপ্ট ব্যবহার করতে দেয়।
পিটার টেলর

@ পিটার টেইলর ধন্যবাদ, আমি জেএসফিডাল সম্পর্কে আগে জানতাম, তবে এটি
কফি স্ক্রিপ্টটি

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