''' Score validator for PPCG question 'Brainfuck subprograms with unique outputs' Expects brainfuck code from standard input. Forked from https://g...content-available-to-author-only...b.com/TieSoul/Multilang/blob/master/brainfuck.py ''' def balanced(r): o=0 for c in r: if c=='[': o+=1 elif c==']': o-=1 if o<0: return False if o==0: return True else: return False def evaluate(r,maxstep=20000): if not balanced(r): return None s = [0] i = 0 j = 0 step = 0 try: while j in range(len(r)) and step < maxstep: if r[j] == '>': i += 1 if i >= len(s): s.append(0) elif r[j] == '<': i -= 1 if i < 0: return None elif r[j] == '+': s[i] = (s[i] + 1) % 256 elif r[j] == '-': s[i] = (s[i] - 1) % 256 elif r[j] == '.': return s[i] elif r[j] == ',': s[i] = 0 elif r[j] == '[': if s[i] == 0: loopcount = 1 while loopcount > 0: j += 1 if r[j] == '[': loopcount += 1 elif r[j] == ']': loopcount -= 1 elif r[j] == ']': if s[i] != 0: loopcount = 1 while loopcount > 0: j -= 1 if r[j] == ']': loopcount += 1 elif r[j] == '[': loopcount -= 1 j += 1 step += 1 return None except: return None if __name__ == '__main__': s=input() vs=set() for i in range(len(s)): subs=s[0:i]+s[i+1:] v=evaluate(subs) vs.add(v) print(subs,'=>',v) vs.discard(None) print('\nUnique outputs are',sorted(vs)) print('\nScore is ',len(vs),' for ',s,' (length = ',len(s),')',sep='')
++,+[-]+><.-,-.
+,+[-]+><.-,-. => 1 +,+[-]+><.-,-. => 1 +++[-]+><.-,-. => 1 ++,[-]+><.-,-. => 1 ++,+-]+><.-,-. => None ++,+[]+><.-,-. => None ++,+[-+><.-,-. => None ++,+[-]><.-,-. => 0 ++,+[-]+<.-,-. => None ++,+[-]+>.-,-. => 0 ++,+[-]+><-,-. => 255 ++,+[-]+><.,-. => 1 ++,+[-]+><.--. => 1 ++,+[-]+><.-,. => 1 ++,+[-]+><.-,- => 1 Unique outputs are [0, 1, 255] Score is 3 for ++,+[-]+><.-,-. (length = 15)