Mеmоrу

From Esolang
Jump to navigation Jump to search
Not to be confused with Memory.

Mеmоrу (or Remember, uniсоdе-free), is created by user:iddi01, inspired by the fact that to-do lists sometimes contain "Remember x" entries for very important stuff, and sometimes you need to add more entries to Remember that entry, eventually causing an infinite loop.

An interesting thing about Mеmоrу is the pseudo-random abilities triggered by broken programs.

Execution

The interpreter Remembered the first entry of a to-do list, and following it, Remembering more each time. The interpreter only knows XOR logic, so if being prompted for a second time to Remember something, it forgets it! Each cycle, it executes everything it Remembered from execution of the last cycle. If the state of the Memory had not been changed from the last cycle, it checks its Memory.

If the whole list is Remembered, execution is Forgot. Otherwise, the uniсоdе value of individual numbers of Forgotten list entries is output in top-down order, and a new entry is added on the lowest positive unoccupied number and is Remembered. If only one entry is Forgotten, the new entry is "Remember: x" where x is the number of the Forgotten entry, otherwise it is "Remember everything above". Then it continues the normal execution sequence. Speaking of which, these are the only allowed (case sensitive) entries in the list:

Remember: x

Where x is the number of the entry that will be Remembered. Note that two entries can have the same number, allowing the execution to fork, and the entries does not necessarily need to be in numerical order.

Remember everything above

Self-explanatory, but Remember that Remembering is a XOR operation.

Remember everything below
Occupy: x

Marks the number x as occupied, preventing it to appear in entry additions.

Do nothing

Input should be added to the end of the program with each character being an entry with the number being the uniсоdе value of the character and the operation being Do nothing. That doesn't mean "Do nothing" can't be added into a program.

Trying to add anything else to the list will place a horrible scene into your Memory if the interpreter is working correctly. (and this is serious!)

Example of a complete list entry:

32. Do nothing

Entries must be separated by lines.

Ехаmрlеѕ

Pseudo-randomly output uniсоdе

This should be taken as an error, for being the most common outcome of a broken program. But the following is a one-line program that does it:

0. Remember: 1

Infinite loop without output

This is also a demonstration of same-number entries.

0. Remember: 0
0. Remember: 0

This works on all extensions with an even number of entries, but odd-numbered ones instead loops with output.

Hello World

Trying to output a given string at an arbitrary point of execution is however very difficult.

0. Do nothing
72. Do nothing
101. Do nothing
108. Do nothing
108. Do nothing
111. Do nothing
44. Do nothing
32. Do nothing
87. Do nothing
111. Do nothing
114. Do nothing
108. Do nothing
100. Do nothing
33. Do nothing

Cat program

The null program is a cat program, similarly to Fuеuе.

To make a true cat program (avoid losing the first character of input):

0. Do nothing

To make a true null program:

0. Remember everything below

Truth machine

This outputs uniсоdе if the input is 0, so it's not a true truth machine.

2. Remember: 3
3. Remember: 49
3. Occupy: 0
3. Remember: 48
48. Remember: 1
49. Remember: 0

Anything else is extremely difficult to make.

The interpreter, in Python

#program input and parsing
program = [input("Program (interrupt to exit): ")]
try:
    while True:
        program += [input()]
except KeyboardInterrupt:
    occupied = set()
    memory = []
    oldmem = []
    indexes = {}
    for line in range(len(program)):
        ind = program[line].index('. ')
        no_ = int(program[line][:ind])
        occupied.update({no_})
        memory.append(0)
        oldmem.append(0)
        indexes[no_] = [line] if no_ not in indexes else indexes[no_] + [line] 
        program[line] = program[line][ind+2:]
        if ': ' in program[line]:
            ind = program[line].index(': ')
            comm = program[line][:ind]
            program[line] = int(program[line][ind+2:])
        else:
            comm = program[line]
        program[line] = (no_, comm, program[line])
    memory[0] = 1
    #main program    
    forgot = 1
    while forgot:
        while True:
            newmem = memory[:]
            for index in range(len(program)):
                if memory[index] and not oldmem[index]:
                    oldmem[index] = 1
                    line = program[index]
                    if line[1] == "Remember":
                        try:
                            for ind in indexes[line[2]]:
                                newmem[ind] ^= 1
                                oldmem[ind] = 0
                        except KeyError:
                            newmem[index] = 0
                    elif line[1] == "Remember everything above":
                        for ind in range(index):
                            newmem[ind] ^= 1
                            oldmem[ind] = 0
                    elif line[1] == "Remember everything below":                            
                        for ind in range(index+1, len(memory)):
                            newmem[ind] ^= 1
                            oldmem[ind] = 0
                    elif line[1] == "Occupy":
                        occupied.update({line[2]})
                    elif line[1] == "Do nothing":
                        "DO NOTHING! i said do nothing! why do you force me to add something here?!"
                    else:

#the purpose of the code in this block is to create terror in suddenly seeing a red screen (in most cases) and that Python "broke" after this

                        import sys
                        import time
                        sys.stderr.write("Unknown command, use Do nothing to do nothing. ████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████" + "█" * 40251)
                        sys.stdout.close()
                        sys.stderr.close()
                        time.sleep(180)
                        print("now look, you have broke Python.")
            if newmem == memory:
                break
            else:
                memory = newmem
        forgot = set()
        for m in range(len(program)):
            if not memory[m]:
                no_ = program[m][0]
                forgot.update({no_})
                print(chr(no_), end="")
        if forgot:
            no_ = 0
            while no_ in occupied:
                no_ += 1
            if len(forgot) == 1:
                program.append((no_, "Remember", forgot.pop()))
                forgot = 1
            else:
                program.append((no_, "Remember everything above"))
            occupied.update({no_})
            indexes[no_] = [len(program) - 1]
            memory.append(1)
            oldmem.append(0)