POV-Ray : Newsgroups : povray.general : untested red-black tree using AI : untested red-black tree using AI Server Time
26 Mar 2025 14:28:06 EDT (-0400)
  untested red-black tree using AI  
From: ingo
Date: 7 Mar 2025 04:10:00
Message: <web.67cab70c95a6e16b17bac71e8ffb8ce3@news.povray.org>
A trick that can help AI's to write POV-Ray code, "force" them to write simple
python code, only using arrays. Classes and numpy & co are not allowed. AI's are
well trained on Python and bare bones python isn't far of POV-Ray.

I didn't test any of the code. It's just for illustatration.

Me: "can you generate python code for a red black tree, without the use of
external libraries (like numpy). Only use arrays and no classes"

it to three attempts before it (Copilot) dropped classes.

%<------%<------%<------
# Implementation of Red-Black Tree in Python using arrays and no classes

# NIL node is represented by 0
NIL = 0

# Tree structure as arrays
tree = [None]  # Store keys
color = [NIL]  # Color array: 0 for BLACK, 1 for RED
left = [NIL]
right = [NIL]
parent = [NIL]

# Root of the tree
root = NIL

def insert(key):
    global root

    new_node = len(tree)
    tree.append(key)
    color.append(1)  # New node is RED
    left.append(NIL)
    right.append(NIL)
    parent.append(NIL)

    parent_node = NIL
    current = root

    while current != NIL:
        parent_node = current
        if key < tree[current]:
            current = left[current]
        else:
            current = right[current]

    parent[new_node] = parent_node

    if parent_node == NIL:
        root = new_node
    elif key < tree[parent_node]:
        left[parent_node] = new_node
    else:
        right[parent_node] = new_node

    insert_fixup(new_node)

def insert_fixup(node):
    global root

    while node != root and color[parent[node]] == 1:
        if parent[node] == left[parent[parent[node]]]:
            uncle = right[parent[parent[node]]]
            if color[uncle] == 1:
                color[parent[node]] = 0
                color[uncle] = 0
                color[parent[parent[node]]] = 1
                node = parent[parent[node]]
            else:
                if node == right[parent[node]]:
                    node = parent[node]
                    left_rotate(node)
                color[parent[node]] = 0
                color[parent[parent[node]]] = 1
                right_rotate(parent[parent[node]])
        else:
            uncle = left[parent[parent[node]]]
            if color[uncle] == 1:
                color[parent[node]] = 0
                color[uncle] = 0
                color[parent[parent[node]]] = 1
                node = parent[parent[node]]
            else:
                if node == left[parent[node]]:
                    node = parent[node]
                    right_rotate(node)
                color[parent[node]] = 0
                color[parent[parent[node]]] = 1
                left_rotate(parent[parent[node]])
    color[root] = 0

def left_rotate(x):
    global root

    y = right[x]
    right[x] = left[y]
    if left[y] != NIL:
        parent[left[y]] = x
    parent[y] = parent[x]
    if parent[x] == NIL:
        root = y
    elif x == left[parent[x]]:
        left[parent[x]] = y
    else:
        right[parent[x]] = y
    left[y] = x
    parent[x] = y

def right_rotate(y):
    global root

    x = left[y]
    left[y] = right[x]
    if right[x] != NIL:
        parent[right[x]] = y
    parent[x] = parent[y]
    if parent[y] == NIL:
        root = x
    elif y == right[parent[y]]:
        right[parent[y]] = x
    else:
        left[parent[y]] = x
    right[x] = y
    parent[y] = x

# Example usage
insert(10)
insert(20)
insert(30)
insert(15)
insert(25)

# For debugging: print the tree structure
def print_tree():
    for i in range(1, len(tree)):
        print(f"Node {i}: key={tree[i]}, color={'RED' if color[i] == 1 else
'BLACK'}, left={left[i]}, right={right[i]}, parent={parent[i]}")

print_tree()

%<------%<------%<------


Me: "can you convert the code to POV-Ray?"


%<------%<------%<------
#declare NIL = 0; // NIL node is represented by 0

#declare tree = array[1] { NIL }; // Tree structure as an array
#declare color = array[1] { NIL }; // Color array: 0 for BLACK, 1 for RED
#declare left = array[1] { NIL };
#declare right = array[1] { NIL };
#declare parent = array[1] { NIL };
#declare root = NIL; // Root of the tree

#macro Insert(key)
    #declare new_node = dimension_size(tree, 1);
    #declare tree = concat(tree, array[1] { key });
    #declare color = concat(color, array[1] { 1 }); // New node is RED
    #declare left = concat(left, array[1] { NIL });
    #declare right = concat(right, array[1] { NIL });
    #declare parent = concat(parent, array[1] { NIL });

    #declare parent_node = NIL;
    #declare current = root;

    #while (current != NIL)
        #declare parent_node = current;
        #if (key < tree[current])
            #declare current = left[current];
        #else
            #declare current = right[current];
        #end
    #end

    #declare parent[new_node] = parent_node;

    #if (parent_node == NIL)
        #declare root = new_node;
    #elif (key < tree[parent_node])
        #declare left[parent_node] = new_node;
    #else
        #declare right[parent_node] = new_node;
    #end

    InsertFixup(new_node);
#end

#macro InsertFixup(node)
    #while (node != root & color[parent[node]] == 1)
        #if (parent[node] == left[parent[parent[node]]])
            #declare uncle = right[parent[parent[node]]];
            #if (color[uncle] == 1)
                #declare color[parent[node]] = 0;
                #declare color[uncle] = 0;
                #declare color[parent[parent[node]]] = 1;
                #declare node = parent[parent[node]];
            #else
                #if (node == right[parent[node]])
                    #declare node = parent[node];
                    LeftRotate(node);
                #end
                #declare color[parent[node]] = 0;
                #declare color[parent[parent[node]]] = 1;
                RightRotate(parent[parent[node]]);
            #end
        #else
            #declare uncle = left[parent[parent[node]]];
            #if (color[uncle] == 1)
                #declare color[parent[node]] = 0;
                #declare color[uncle] = 0;
                #declare color[parent[parent[node]]] = 1;
                #declare node = parent[parent[node]];
            #else
                #if (node == left[parent[node]])
                    #declare node = parent[node];
                    RightRotate(node);
                #end
                #declare color[parent[node]] = 0;
                #declare color[parent[parent[node]]] = 1;
                LeftRotate(parent[parent[node]]);
            #end
        #end
    #end
    #declare color[root] = 0;
#end

#macro LeftRotate(x)
    #declare y = right[x];
    #declare right[x] = left[y];
    #if (left[y] != NIL)
        #declare parent[left[y]] = x;
    #end
    #declare parent[y] = parent[x];
    #if (parent[x] == NIL)
        #declare root = y;
    #elif (x == left[parent[x]])
        #declare left[parent[x]] = y;
    #else
        #declare right[parent[x]] = y;
    #end
    #declare left[y] = x;
    #declare parent[x] = y;
#end

#macro RightRotate(y)
    #declare x = left[y];
    #declare left[y] = right[x];
    #if (right[x] != NIL)
        #declare parent[right[x]] = y;
    #end
    #declare parent[x] = parent[y];
    #if (parent[y] == NIL)
        #declare root = x;
    #elif (y == right[parent[y]])
        #declare right[parent[y]] = x;
    #else
        #declare left[parent[y]] = x;
    #end
    #declare right[x] = y;
    #declare parent[y] = x;
#end

// Example usage
Insert(10);
Insert(20);
Insert(30);
Insert(15);
Insert(25);
%<------%<------%<------


ingo


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.