# Source: http://www.99-bottles-of-beer.net/language-brainfuck-1718.html

# 99 bottles of beer in Brainfuck
# Copyright (C) 2008 Raphael Bois
# 1671 brainf*ck instructions.
# Published under GPL v2

Initialization
++    Counter for loop (a)
>+    unused
>++   Counter for loop (b)
>     Flag for 'no more'
>+    Flag for not 'no more'
>>>   (5) to (7) : temporary values
++++++++++[->+>+>++++++++++<<<]>>>    10 10 100 in (8) (9) (10)
>++++++++++   10 in (11)
[-
   >+++++           50  in (12)
   >++++++++++      100 in (13)
   >+++++++++++     110 in (14)
   >++++++++        80  in (15)
   >++++++++        80  in (16)
   >+++             30  in (17)
   >++++            40  in (18)
   >+               10  in (19)
   <<<<<<<<]
+
>-- +             48  '0'   plus 1 in (12)
>++ +             102 'f'   plus 1 in (13)
>+++++ +          115 's'   plus 1 in (14)
>-- +             78  'N'   plus 1 in (15)
>++++ +           84  'T'   plus 1 in (16)
>++ +             32  ' '   plus 1 in (17)
>++++ +           44  comma plus 1 in (18)
> +               10  LF    plus 1 in (19)

stuff for writing parts of the song
>+   select stuff
>+   select stuff
>+   write song part 3
>++  write song part 1
>+   write song part 2
>+   Flag for 'end of song'
>++  Flag for not 'end of song'

All bytes are at val plus 1
Go back to (7) with final initialization step (remove 1 to all bytes)
[-<]

<<<<<<< at (0)
[ loop (a)
-

>> at (2)
[ loop (b)

  >>>>>>>> at (10)
  [ start loop

    <<<<<<< at (3)
    [->[-]
      print '(N|n)o more'
      >>>>>>>>>>>.  '(N|n)'
      <----.        'o'
      >>>.          ' '
      <<<--.        'm'
      ++.           'o'
      +++.+         'r'
      <-.+          'e'
      <<+<<<<<<<<
    ]+> at (4)
    [-<[-]>>>>> at (9)
      prints number (using (9) and (10))
      [>>>+<<<<+<+<+>>>-]<<<[->>>+<<<]> at (6)
      [>>>>>>+<<<<<<-]>>>>>[[-]>.<]<<<<[>>>>>-<<<<<-]>> at (9)
      [<<+<+<+>>>>-]<<<<[->>>>+<<<<]> at (6)
      [>>>>>>+<<<<<<-]>>>>>>.<<<<<[>>>>>-<<<<<-] at (7)

      memorize in (11) if (10) not 1
      >>>[-<<<+<+>>>>]<<<<[->>>>+<<<<]>-[[-]>>>>+<<<<]<<< at (4)
    ]+

    >>>>>>>> at (12)
    print ' bottle(s) of beer'
    >>>>>.      ' '
    <<<<----.    'b'
    >----.       'o'
    +++++..-     'tt'
    <++++++++++. 'l'
    -------.     'e'
    <<[[-]>>>.<<<]>> 's' if (11)==1 ie if (10)!=1
    >>>>.        ' '
    <<<----.     'o'
    <+.          'f'
    >>>>.        ' '
    <<<<----.    'b'
    +++..+       'ee'
    >+++.+       'r'

    [>] at (20)

    +>+>[->+<<-<-
         print ' on the wall' DOT LF LF
         <<<.            ' '
         <<<----.        'o'
         -.              'n'
         >>>.            ' '
         <<<++++++.      't'
         <++.            'h'
         ---.            'e'
         >>>>.           ' '
         <<<+++.         'w'
         <----.          'a'
         +++++++++++..   'll'
         ------>----     reset to 'f' and 's'
         >---------- ---------- ---------- -- sets (15) to 'N'

         >>>++.--  DOT
         >..       LF LF
    >>>] at (22)

    >>>[->[-]<<<<<<<[<]<[-]>>[>]>>>>>]+ if end of song reset bottles counter
    >[-<[-] at (25)
      <<<< at (21)
      [->>[->+<<<<-
           print ' on the wall' COMMA ' '
           <<<.            ' '
           <<<----.        'o'
           -.              'n'
           >>>.            ' '
           <<<++++++.      't'
           <++.            'h'
           ---.            'e'
           >>>>.           ' '
           <<<+++.         'w'
           <----.          'a'
           +++++++++++..   'll'

           ------>----     reset (13) and (14) to 'f' and 's'
           >++++++++++ ++++++++++ ++++++++++ ++ sets (15) to 'n'

           >>>.            comma
           <.              ' '
      >>>>>>]<<]< at (20)

      [->>>>[-<<+< at (21)
             <<<++.--       DOT
             >.             LF

             [<]<<<<<<<< at (3)
             [->[-]<]+>  at (4)
             [-<[-]>
               >>>>>>>>>>>>.  'T'
               <<<-----.      'a'
               ++++++++++.    'k'
               ------.        'e'
               >>>>.          ' '
               <<<----.       'o'
               -.             'n'
               <.             'e'
               >>>>.          ' '
               <<<<-.         'd'
               >+.            'o'
               ++++++++.      'w'
               ---------.     'n'
               >>>.           ' '
               <<<<---.       'a'
               >.             'n'
               <+++.          'd'
               >>>>.          ' '
               <<<++.         'p'
               <---.          'a'
               >+++..         'ss'
               >>>.           ' '
               <<<<++++++++.  'i'
               >+.            't'
               >>>.           ' '
               <<<<--------.  'a'
               >--.           'r'
               ---.           'o'
               ++++++.        'u'
               -------.       'n'
               <+++.          'd'
               ++>+++++       reset (13) and (14) to 'f' and 's'
               >>>>.          comma
               <.             ' '

               [<]<<<<<<< at (4)
             ]+

            >>>>>> at (10)
            decrements values
            -<<<+>>[<<[-]<+<+>>>>-]<<<<[>-<[-]]>[->>>+<<<]>[->->+++++++++<<]>>> at (10)

         >>[>]>>>>] at (24)
      <<<<] at (20)

    >>>>>>]+ at (26)

    <<<<<<<[<]< at (10)
  ]
  +<+
  <<<<<<+< at (2)
  -
]

print 'Go to the store and buy some more' comma ' '

  >>>>>>>>>>[>]>>>>> at (25)
  [->[-]<]+> at (26)
  [-<[-]
    <<<<<<<<< at (16)
    -------------.   'G'
    <<----.          'o'
    >>>.             ' '
    <<<+++++.        't'
    -----.           'o'
    >>>.             ' '
    <<<+++++.        't'
    <++.             'h'
    ---.             'e'
    >>>>.            ' '
    <<<-.            's'
    +.               't'
    -----.           'o'
    +++.             'r'
    <.               'e'
    >>>>.            ' '
    <<<<----.        'a'
    >----.           'n'
    <+++.            'd'
    >>>>.            ' '
    <<<<--.          'b'
    >+++++++.        'u'
    ++++.            'y'
    >>>.             ' '
    <<<------.       's'
    ----.            'o'
    --.              'm'
    <+++.            'e'
    >>>>.            ' '
    <<<.             'm'
    ++.              'o'
    +++.+            'r'
    <.+              'e'
    >>>>>.           coma
    <.               ' '
    >>>>>>>>>
  ]+

  Initialize last loop to print final '99 bottles of beer on the wall' DOT
  <[-]+<[-]<[-]<[-]+<<< at (19)
  [<]<[-]<[-]<[-]<[-] at (7)
  ++++++++++[->+>+>++++++++++<<<]>->->-
  <<<<<<[-]+<[-]<+<< at (0)
]