# Python Cube Project



## Etotheipi (Mar 31, 2020)

I've been working on a little Python cube simulator type thing, partially just to learn Python better and partially to have a way to mess around with AI, alg genning and whatnot. So I made this thread for me to get help cause I'm a python newbie, and for people to suggest ideas for me to implement. I'm having a little trouble with getting the moves to work. The way I have it coded is I gave every position a 'sticker' could go a number 1-54, and then I have a list with 54 elements with the first letter of the color of the sticker in that space. So, if there was a blue sticker in position 34, then the 34th element of the list would be "b". Then the way I do moves on the cube is I made a Move class, which takes two lists as parameters. The first list has the numbers of all the stickers that will be moved, and the second list has the numbers of the places that the stickers will be moved to. So if you did:

move=Move([1,39],[39,1])

apply_move(move)

Then it should swap the stickers 1 and 39. But it doesn't seem to be working (The sticker at 1 is moved to position 39, but not the sticker at position 39 to 1). I can post my full code if needed.


----------



## KingTim96 (Mar 31, 2020)

I may not be much help but I have been messing around with python for a bit at my school and during the quarantine I have been making a couple side projects like a 3x3 and 4x4 timer. If you felt comfortable posting the full code that would help. Are you coding in an IDE (Pycharm, for example) or on the Command Line?


----------



## Etotheipi (Mar 31, 2020)

KingTim96 said:


> I may not be much help but I have been messing around with python for a bit at my school and during the quarantine I have been making a couple side projects like a 3x3 and 4x4 timer. If you felt comfortable posting the full code that would help. Are you coding in an IDE (Pycharm, for example) or on the Command Line?


I'm using Pycharm. I'm comfortable posting all my code, I trust the community and even if I do get plagiarized there would be evidence here I did it, and I am making this for fun, so it wouldn't matter. Here's the code:


Spoiler: Code





```
solved_cube = []
cube = []
colors = []


def apply_move(move):
    global cube
    pre_indices = move.pre_indices
    post_indices = move.post_indices
    next_cube = cube
    for i in range(len(pre_indices)):
        next_cube[post_indices[i]-1] = cube[pre_indices[i]-1]
        cube = next_cube


class Move:
    def __init__(self, pre_indices, post_indices):
        self.pre_indices = pre_indices
        self.post_indices = post_indices

    def inverted(self):
        return Move(self.post_indices, self.pre_indices)


def init_defaults():
    global cube
    global solved_cube
    global colors
    colors = ['w', 'y', 'g', 'r', 'b', 'o']

    for x in range(6):
        for y in range(9):
            solved_cube.append(colors[x])
    cube=solved_cube

R = Move([3, 6, 9, 21, 24, 27, 12, 15, 18, 43, 40, 37, 28, 30, 36, 34, 29, 33, 35, 31],
         [43, 40, 37, 3, 6, 9, 21, 24, 27, 12, 15, 18, 30, 36, 34, 28, 33, 35, 31, 29])
init_defaults()


test=Move([10,39,1],[39,10,1])
print(cube[38])
apply_move(test)
print(cube)
```


----------



## kubesolver (Mar 31, 2020)

this code is problematic


```
next_cube = cube
for i in range(len(pre_indices)):
    next_cube[post_indices-1] = cube[pre_indices-1]
    cube = next_cube
```

To see why try to understand the follwoing code:

```
first = [1,2,3]
second = first
second[0] = 10
print(first)
// [10, 2, 3]
```


----------



## Cubinwitdapizza (Mar 31, 2020)

I would he


Etotheipi said:


> I'm using Pycharm. I'm comfortable posting all my code, I trust the community and even if I do get plagiarized there would be evidence here I did it, and I am making this for fun, so it wouldn't matter. Here's the code:
> 
> 
> Spoiler: Code
> ...


Yes, i believe there is a button somewhere when you post something where u can enter code.


----------



## Etotheipi (Mar 31, 2020)

kubesolver said:


> this code is problematic
> 
> 
> ```
> ...


Thanks! Ill try again with my code =D How can I set lists equal with out linking them like that? Edit: Nvm I googled how, hopefully it works after I change it.


----------



## Filipe Teixeira (Mar 31, 2020)

Etotheipi said:


> I'm using Pycharm. I'm comfortable posting all my code, I trust the community and even if I do get plagiarized there would be evidence here I did it, and I am making this for fun, so it wouldn't matter. Here's the code:
> 
> 
> Spoiler: Code
> ...



eww global variables

create a cube class


----------



## Etotheipi (Mar 31, 2020)

Filipe Teixeira said:


> eww global variables
> 
> create a cube class


I m planning on doing that lol, right now I just want to be able to apply moves, then Ill make the cube class.


----------



## crazycuber36 (Mar 31, 2020)

Guys your a genius, combing two hobbies together is prettty cool


----------



## Etotheipi (Mar 31, 2020)

crazycuber36 said:


> Guys your a genius, combing two hobbies together is prettty cool


Cubing+programming has been done many times before me, it wasn't exactly a new idea, I just wanted a piece of the pie.


----------



## brododragon (Mar 31, 2020)

Etotheipi said:


> Cubing+programming has been done many times before me, it wasn't exactly a new idea, I just wanted a piece of the pie.


You're making me hungry.


----------



## Etotheipi (Mar 31, 2020)

brododragon said:


> You're making me hungry.


Your entire face is made out of various types of food, just eat that.


----------



## Filipe Teixeira (Mar 31, 2020)

> I just wanted a piece of the pie.



pie thon


----------



## brododragon (Mar 31, 2020)

Etotheipi said:


> Your entire face is made out of various types of food, just eat that.


I’m saving it for later.


----------



## Filipe Teixeira (Mar 31, 2020)

kubesolver said:


> this code is problematic
> 
> 
> ```
> ...


to fix that you can copy the list using


```
second = first[:]
```


----------



## Etotheipi (Mar 31, 2020)

Filipe Teixeira said:


> to fix that you can copy the list using
> 
> 
> ```
> ...


Yeah, thats what I found from a google search. =P


----------



## crazycuber36 (Mar 31, 2020)

Etotheipi said:


> Your entire face is made out of various types of food, just eat that.


thats not creepy


----------



## Etotheipi (Mar 31, 2020)

crazycuber36 said:


> thats not creepy


just look at his sig.


----------



## Etotheipi (Mar 31, 2020)

Ok, it now works when I do next_cube=cube[:], hooray!

Now time for a cube class so @Filipe Teixeira isn't disgusted and so its nice.


----------



## Etotheipi (Mar 31, 2020)

How do you guys think I should format sequences? I could do something where I just have a list with the moves, then I could just do something like:

```
for move in sequence:
     self.move(move)
```
Which would be really simple, but maybe some other way would be nicer.


----------



## brododragon (Mar 31, 2020)

Etotheipi said:


> How do you guys think I should format sequences? I could do something where I just have a list with the moves, then I could just do something like:
> 
> ```
> for move in sequence:
> ...


All my code is messy, so I can't really help.


----------



## Etotheipi (Mar 31, 2020)

brododragon said:


> All my code is messy, so I can't really help.


Ok, I think i'm just gonna go the list way for now. I think all I really need to do is code in other moves besides R, which shouldn't be that bad, and then I can do some funner stuff like alg genning.


----------



## brododragon (Mar 31, 2020)

Etotheipi said:


> Ok, I think i'm just gonna go the list way for now. I think all I really need to do is code in other moves besides R, which shouldn't be that bad, and then I can do some funner stuff like alg genning.


Ya. If you run into problems with it in the future, it shouldn't take too long to change.


----------



## Etotheipi (Mar 31, 2020)

I think the thing I want to find how to do now is to make a function that converts a sequence (A list of move objects in my code) into a single move object. Then I only need to manually code x, y, and R to make all possible moves. Any ideas on how to do that? I'm clueless.


----------



## brododragon (Mar 31, 2020)

Etotheipi said:


> I think the thing I want to find how to do now is to make a function that converts a sequence (A list of move objects in my code) into a single move object. Then I only need to manually code x, y, and R to make all possible moves. Any ideas on how to do that? I'm clueless.


This splits by spaces:

```
alg = input('Alg:') #Input
print(alg.split()) #Output alg split into list
```


----------



## Etotheipi (Mar 31, 2020)

brododragon said:


> This splits by spaces:
> 
> ```
> alg = input('Alg:') #Input
> ...


I don't quite see how that would help, could you explain more?


----------



## brododragon (Mar 31, 2020)

Etotheipi said:


> I don't quite see how that would help, could you explain more?


After running that you would have a list of moves in sequential order, meaning you could use a for() loop to apply moves.


----------



## kubesolver (Mar 31, 2020)

In my code for a similar purpose I have also numbered stickers on a cube.
And a sequence can be described as a list of numbers saying to which sticker a given sticker should move.
Sequence that changes nothing is [0, .., 24] for edges and corners respectively.
Each face turn can be described as 2 4-cycles of edges and 3 4-cycles of corners.

```
faces = {
     "R" : { "e": [[12,13,14,15], [1,19,9,5]], "c" :[[12,13,15,14], [5,1,18,9], [3,16,11,7]]},
     "U" : { "e": [[0,1,2,3], [20, 16, 12, 4]], "c" :[[0,1,3,2], [17,13,5,21], [16, 12, 4,20]]},
     "F" : { "e": [[4,5,6,7], [2, 15, 8, 21]], "c" :[[4,5,7,6], [2, 12, 9, 23], [3, 14, 8, 21]]},
     "L" : { "e": [[20,21,22,23], [3, 7, 11,17]], "c" :[[20, 21, 23, 22 ], [0, 4, 8, 19], [2, 6, 10, 17]]},
     "D" : { "e": [[8,9,10,11], [6,14,18,22]], "c" :[[8,9,11,10], [6, 14, 18, 22], [7, 15, 19, 23]]},
     "B" : { "e": [[16,17,18,19], [0,23,10,13]], "c" :[[16, 17, 19, 18], [1, 20, 10, 15], [0, 22, 11, 13]]},
```
and then you can apply those cycles to a sequence like this:

```
def apply4Cycle(target, cycle):
    c0,c1,c2,c3 = cycle
    t3 = target[c3]
    target[c3] = target[c2]
    target[c2] = target[c1]
    target[c1] = target[c0]
    target[c0] = t3
```

to achieve R' you can do R three times like this:

```
edgeCycles = faces["R"]["e"]
    cornerCycles = faces["R"]["c"]
    edges = list(range(24))
    corners = list(range(24))
    for i in range(3):
        for ec in edgeCycles:
            apply4Cycle(edges, ec)
        for cc in cornerCycles:
            apply4Cycle(corners, cc)
```


----------



## Etotheipi (Mar 31, 2020)

kubesolver said:


> In my code for a similar purpose I have also numbered stickers on a cube.
> And a sequence can be described as a list of numbers saying to which sticker a given sticker should move.
> Sequence that changes nothing is [0, .., 24] for edges and corners respectively.
> Each face turn can be described as 2 4-cycles of edges and 3 4-cycles of corners.
> ...


I was saying with my current move system, how would I turn a sequence, say R' B, into a single Move object, which I described earlier. I have a vague idea now, but it needs more work.


----------



## brododragon (Mar 31, 2020)

Etotheipi said:


> I was saying with my current move system, how would I turn a sequence, say R' B, into a single Move object, which I described earlier. I have a vague idea now, but it needs more work.


Here is a more complete version of the code:

```
alg = input('Alg:') #Input
algList = alg.split() #Split alg
for i in algList:
   self.move[i] #Apply move
```
self.move is just placeholder code for a move function.


----------



## Etotheipi (Mar 31, 2020)

brododragon said:


> Here is a more complete version of the code:
> 
> ```
> alg = input('Alg:') #Input
> ...


Ok, i'll keep alg.spilt() in mind, thanks. Is it part of some module?


----------



## CodingCuber (Mar 31, 2020)

crazycuber36 said:


> Guys your a genius, combing two hobbies together is prettty cool


*cough*


----------



## brododragon (Mar 31, 2020)

Etotheipi said:


> Ok, i'll keep alg.spilt() in mind, thanks. Is it part of some module?


No.


----------



## Etotheipi (Apr 1, 2020)

Ok. I'm confused. I made a function that takes a sequence of moves, and turns it into a Move object. So that works fine, which is good, but something weird happened. The way I made the function was I made a new Cube object in the function called cube, and one of my steps was changing the elements of cube.state into tuples. Then I did some code that outputted a Move object. when I tested my code, I made a new cube object to see if the program correctly turned the sequence [R, R] into an R2.
Then when I printed out cube.state to see if it did it correctly, all the values were tuples, even I used a different cube object to test and to use in the function. i printed their id's as well and they were different. Here's my code:

```
SOLVED = ['w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o']



class Move:
    def __init__(self, pre_indices, post_indices):
        self.pre_indices = pre_indices
        self.post_indices = post_indices

    def inverted(self):
        return Move(self.post_indices, self.pre_indices)


class Cube():
    def __init__(self, state=SOLVED):
        self.state = state

    def move(self, move):
        cube = self.state
        pre_indices = move.pre_indices
        post_indices = move.post_indices
        next_cube = cube[:]
        for i in range(len(pre_indices)):
            next_cube[post_indices[i] - 1] = cube[pre_indices[i] - 1]
        self.state = next_cube[:]

    def sequence(self, sequence):
        for move in sequence:
            self.move(move)


def move_from_sequence(sequence):
    cube = Cube()
    print(id(cube))
    cycle=0
    new_pre_indices=[]
    new_post_indices=[]
    item=()
    for sticker in cube.state:
        cycle += 1
        cube.state[cycle-1]=(sticker,cycle)
    cube.sequence(sequence)
    cycle=0
    for sticker in cube.state:
        cycle += 1
        item=cube.state[cycle-1]
        if cycle != item[1]:
            new_post_indices.append(cycle)
            new_pre_indices.append(item[1])

    return(Move(new_pre_indices,new_post_indices))

R = Move([3, 6, 9, 21, 24, 27, 12, 15, 18, 43, 40, 37, 28, 30, 36, 34, 29, 33, 35, 31],
         [43, 40, 37, 3, 6, 9, 21, 24, 27, 12, 15, 18, 30, 36, 34, 28, 33, 35, 31, 29])
cube=Cube()
print(id(cube))
R2=move_from_sequence([R,R])
print(cube.state)

cube.move(R2)
print(cube.state)
```


----------



## KingTim96 (Apr 1, 2020)

Man I am just not as experienced in python as I thought LOL. Im familiar with Object-Oriented coding in python but some of this stuff is beyond me. It seems like you found a fix in the issue of your first/original post. Only thing I could probably add is using the debugger to see exactly how your variables/values are being treated. Super handy tool especially in an IDE like Pycharm like you said you're using.


----------



## Etotheipi (Apr 1, 2020)

KingTim96 said:


> Man I am just not as experienced in python as I thought LOL. Im familiar with Object-Oriented coding in python but some of this stuff is beyond me. It seems like you found a fix in the issue of your first/original post. Only thing I could probably add is using the debugger to see exactly how your variables/values are being treated. Super handy tool especially in an IDE like Pycharm like you said you're using.


oooh, i didn't know Pycharm had a fancy debugger, figures though, since its a professional IDE lol. I'll try that. Also, part of you not getting my code may come from me being in-concise and stuff. Other peoples code is always harder to understand than your own.


----------



## Nmile7300 (Apr 1, 2020)

This is cool! Python was my first programming language, and now I mostly do iOS stuff with Xcode and swift.


----------



## Filipe Teixeira (Apr 1, 2020)

```
for sticker in cube.state:
        cycle += 1
        cube.state[cycle-1]=(sticker,cycle)
```

The problem might be here
You're generating a tuple


----------



## Etotheipi (Apr 1, 2020)

Filipe Teixeira said:


> ```
> for sticker in cube.state:
> cycle += 1
> cube.state[cycle-1]=(sticker,cycle)
> ...


I meant to make a tuple. I thinm the problem is I set th e default cube state to the list SOLVED, not SOLVED[:]. So then whenever any cube object gets changed it changes the default. Edit: Never mind, I tried that and it did nothing. Now I'm very confuzzled.


----------



## brododragon (Apr 1, 2020)

Etotheipi said:


> I meant to make a tuple. I thinm the problem is I set th e default cube state to the list SOLVED, not SOLVED[:]. So then whenever any cube object gets changed it changes the default. Edit: Never mind, I tried that and it did nothing. Now I'm very confuzzled.


I would just go through the code and print it until it turns into a tuple.


----------



## Etotheipi (Apr 1, 2020)

brododragon said:


> I would just go through the code and print it until it turns into a tuple.


I am turning it into a tuple on purpose, except I only want one cube object inside a function to become tuplified. I found a solution, if I just manually input SOLVED into the creation of the object, then its fine. So I guess I'll just do that.


----------



## xyzzy (Apr 1, 2020)

Etotheipi said:


> I gave every position a 'sticker' could go a number 1-54


Get used to zero indexing ASAP; it'll save you a lot of pain when using pretty much any mainstream programming language other than Lua.

Instead of: 1 to 54
Try: 0 to 53


----------



## shadowslice e (Apr 1, 2020)

xyzzy said:


> Get used to zero indexing ASAP; it'll save you a lot of pain when using pretty much any mainstream programming language other than Lua.


And fortran and matlab :/


----------



## Etotheipi (Apr 1, 2020)

xyzzy said:


> Get used to zero indexing ASAP; it'll save you a lot of pain when using pretty much any mainstream programming language other than Lua.
> 
> Instead of: 1 to 54
> Try: 0 to 53


Ill try, It was really stupid of me to not do that.


----------



## GenTheThief (Apr 1, 2020)

Oh, this is cool!
Last semester for my python class I made a virtual cube in thonny->tkinter as my final project.
It looks like you already have enough more experienced people helping you out, but I can post my code if you want to look at it. It's kind of really long.


----------



## I'm A Cuber (Apr 1, 2020)

Lol and I thought I was good at python


----------



## Etotheipi (Apr 1, 2020)

GenTheThief said:


> Oh, this is cool!
> Last semester for my python class I made a virtual cube in thonny->tkinter as my final project.
> It looks like you already have enough more experienced people helping you out, but I can post my code if you want to look at it. It's kind of really long.


That would be cool, but I think I'm good for now, I think visuals are a bit beyond my pyhton knowledge.


----------



## Etotheipi (Apr 2, 2020)

I think I might have solved the issue, I don't know yet but from my testing it seems to be fine.


----------



## Etotheipi (Apr 6, 2020)

Do you guys think I should change my move format to a list of tuples instead of two lists? Then it might look a little cleaner, and making moves might be easier. Plus in the process I can switch to zero indexing. I think if I keep working at it and I don't hit any really nasty bugs then I should be able to start making AI and taking ideas fairly quickly. (Also @Cubinwitdapizza am I allowed to bump my own threads as a pizzabumper?)


----------



## brododragon (Apr 6, 2020)

Etotheipi said:


> Do you guys think I should change my move format to a list of tuples instead of two lists? Then it might look a little cleaner, and making moves might be easier. Plus in the process I can switch to zero indexing. I think if I keep working at it and I don't hit any really nasty bugs then I should be able to start making AI and taking ideas fairly quickly. (Also @Cubinwitdapizza am I allowed to bump my own threads as a pizzabumper?)


Aren't tuples immutable?


----------



## Etotheipi (Apr 6, 2020)

brododragon said:


> Aren't tuples immutable?


They can't be changed, but I don't need to change them. I'd just need them to make something like R=Move([list of tuples])
then R would be a constant.


----------



## brododragon (Apr 6, 2020)

Etotheipi said:


> They can't be changed, but I don't need to change them. I'd just need them to make something like R=Move([list of tuples])
> then R would be a constant.


Then wouldn't you have to make a new constant for every move in an alg?


----------



## Etotheipi (Apr 6, 2020)

brododragon said:


> Then wouldn't you have to make a new constant for every move in an alg?


Nope. I'm planning to have it as a module, so then I can just do something like:

```
import EtotheipiCube as ec
R=ec.R
U=ec.U
sequence1=[R,U,R,U]
sequence2=[U,R,U]
```
And I only have to make 3 different moves manually, because you can make all moves with just x, y, and R.


----------



## brododragon (Apr 6, 2020)

Etotheipi said:


> And I only have to make 3 different moves manually, because you can make all moves with just x, y, and R.


Won't it make it faster to just manually do all moves?


----------



## Etotheipi (Apr 6, 2020)

brododragon said:


> Won't it make it faster to just manually do all moves?


No. Here's my R code, doing it 10 times over manually wouldn't be all that fun.

```
R = Move([3, 6, 9, 21, 24, 27, 12, 15, 18, 43, 40, 37, 28, 30, 36, 34, 29, 33, 35, 31],
         [43, 40, 37, 3, 6, 9, 21, 24, 27, 12, 15, 18, 30, 36, 34, 28, 33, 35, 31, 29])
```
But with a combination of moves, once I have x, y, and R, I can just say L is y2 R y2. Way easier.


----------



## brododragon (Apr 6, 2020)

Etotheipi said:


> No. Here's my R code, doing it 10 times over manually wouldn't be all that fun.
> 
> ```
> R = Move([3, 6, 9, 21, 24, 27, 12, 15, 18, 43, 40, 37, 28, 30, 36, 34, 29, 33, 35, 31],
> ...


Sorry I meant it would run faster. Would be a nightmare to code, though


----------



## Etotheipi (Apr 6, 2020)

brododragon said:


> Sorry I meant it would run faster. Would be a nightmare to code, though


Ok, I was wondering if you meant that. I don't think it will have that much impact, because I have a function that takes a list of moves, and turns it into a single move object, so I can just have that run on the module startup and it will be the same speed as the other manually coded moves.


----------



## Etotheipi (Apr 9, 2020)

Update: I have now reprogrammed the move format so its a little bit nicer to manually code in moves, and its nicer to use in general. Basically I merged the pre indices and post indices lists into a single indices list. And while doing so i switched to zero indexing. Ima keep on working at it.


----------



## brododragon (Apr 9, 2020)

Did you switch to tuples?


----------



## Etotheipi (Apr 9, 2020)

brododragon said:


> Did you switch to tuples?


Yes. It makes it a bit easier to understand, heres my old code for R:

```
R = Move([3, 6, 9, 21, 24, 27, 12, 15, 18, 43, 40, 37, 28, 30, 36, 34, 29, 33, 35, 31],[43, 40, 37, 3, 6, 9, 21, 24, 27, 12, 15, 18, 30, 36, 34, 28, 33, 35, 31, 29])
```
And heres my new:

```
R=Move([(8,36),(5,39),(2,42),(36,17),(39,14),(42,11),(17,26),(14,23),(11,20),(26,8),(23,5),(20,2),(27,29),(29,35),(35,33),(33,27),(28,32),(32,34),(34,30),(30,28)])
```


----------



## Etotheipi (Apr 9, 2020)

Yay! I think I got R and y working, so now I can make all face turns, which is good enough for now, I'll get slice moves working later. Can someone link me the RLFB only U and D algs?


----------



## Filipe Teixeira (Apr 9, 2020)

R L F2 B2 R' L' D R L F2 B2 R' L'


----------



## brododragon (Apr 9, 2020)

Etotheipi said:


> Yay! I think I got R and y working, so now I can make all face turns, which is good enough for now, I'll get slice moves working later. Can someone link me the RLFB only U and D algs?


Why not do x' y' R y x?


----------



## Etotheipi (Apr 9, 2020)

brododragon said:


> Why not do x' y' R y x?


I've only programmed y and R. Also, for some reason my code is doing an L' when I do y2 R y2. hmm


----------



## Etotheipi (Apr 9, 2020)

Filipe Teixeira said:


> R L F2 B2 R' L' D R L F2 B2 R' L'


Thanks


----------



## brododragon (Apr 9, 2020)

Etotheipi said:


> I've only programmed y and R. Also, for some reason my code is doing an L' when I do y2 R y2. hmm


Maybe your function that compacts an alg isn't working?


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> Maybe your function that compacts an alg isn't working?


Ya since I manually coded y, and since y moves every piece on the cube except two centers, its super long and theres lots of room for mistakes. Though I don't really know how the y moves would cause the problem I have. I'll check the compactor thingy.


----------



## Etotheipi (Apr 10, 2020)

Wait I messed up, you can't make U or D moves out of just RFLB can you? That means I'll have to manually code more rip.


----------



## Filipe Teixeira (Apr 10, 2020)

Yes you can. Nothing is impossible.
Just. Do. It.


----------



## Etotheipi (Apr 10, 2020)

I finished making x, y and R moves, so I made all the other moves, but it's giving me errors on the line where I first make other moves using x moves, and I have no idea why. Heres my code and the error log:


Spoiler: Code





```
SOLVED = ['w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'g', 'g', 'g', 'g',
          'g', 'g', 'g', 'g', 'g', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b',
          'b', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o']


class Move:
    def __init__(self, indices):
        self.indices = indices

    def inverted(self):
        inverted = []
        for item in self.indices: inverted.append((item[1], item[0]))
        return Move(inverted)


class Cube():
    def __init__(self, state=SOLVED):
        self.state = state[:]

    def move(self, move): # Function which applies a move to the cube object, takes a move object as its parameter
        cube = self.state[:]
        indices = move.indices
        next_cube = cube[:]
        for item in indices:
            next_cube[item[1]] = cube[item[0]]
        self.state = next_cube[:]

    def sequence(self, sequence):
        for move in sequence:
            self.move(move)


def move_from_sequence(sequence): # Turns a list of move objects into a single move object
    cube = Cube()
    cycle = 0
    new_indices = []

    item = ()
    for sticker in cube.state:
        cube.state[cycle] = (sticker, cycle)
        cycle += 1
    cube.sequence(sequence)
    cycle = 0
    for sticker in cube.state:
        item = cube.state[cycle]
        if cycle != item[1]:
            new_indices.append((item[1], cycle))
        cycle += 1
    cube.state = SOLVED[:]

    return Move(new_indices)


def cy(targets): # Makes manually coding moves easier by automating cycles of stickers, so you don't have to code
    # every swap by hand
    out = []
    for i in range(len(targets)): out.append((targets[i], targets[(i + 1) % len(targets)]))
    return out


# Manually coded moves:
R = Move(
    [(8, 36), (5, 39), (2, 42), (36, 17), (39, 14), (42, 11), (17, 26), (14, 23), (11, 20), (26, 8), (23, 5), (20, 2),
     (27, 29), (29, 35), (35, 33), (33, 27), (28, 32), (32, 34), (34, 30), (30, 28)])

y = Move(
    [(0, 2), (2, 8), (8, 6), (6, 0), (1, 5), (5, 7), (7, 3), (3, 1), (9, 15), (15, 17), (17, 11), (11, 9), (10, 12),
     (12, 16), (16, 14), (14, 10), (20, 47), (19, 46), (18, 45), (47, 38), (46, 37), (45, 36), (38, 29), (37, 28),
     (36, 27), (29, 20), (28, 19), (27, 18), (23, 50), (22, 49), (21, 48), (50, 41), (49, 40), (48, 39), (41, 32),
     (40, 31), (39, 30), (32, 23), (31, 22), (30, 21), (26, 53), (25, 52), (24, 51), (53, 44), (52, 43), (51, 42),
     (41, 32), (43, 34), (44, 35), (42, 33), (35, 26), (34, 25), (33, 24)])

x = Move(
    cy([20, 2, 42, 11]) + cy([19, 1, 43, 10]) + cy([18, 0, 44, 9]) + cy([23, 5, 39, 14]) + cy([22, 4, 40, 13]) + cy(
        [21, 3, 41, 12]) + cy([27, 29, 35, 33]) + cy([28, 32, 34, 30]) + cy([45, 51, 53, 47]) + cy(
        [46, 48, 52, 50]) + cy([26, 8, 36, 17]) + cy([25, 7, 37, 16]) + cy([24, 6, 38, 15]))

# Other moves out of the manually coded moves:

# x move setup
x2 = move_from_sequence([x, x])
x_ = x.inverted

# R move setup
R_ = R.inverted()
R2 = move_from_sequence([R, R])

# y move setup
y2 = move_from_sequence([y, y])
y_ = y.inverted()

# L move setup
L = move_from_sequence([y2, R, y2])
L_ = L.inverted()
L2 = move_from_sequence([L, L])

# F move setup
F = move_from_sequence([y_, R, y])
F2 = move_from_sequence([F, F])
F_ = F.inverted()

# B move setup
B = move_from_sequence([y, R, y_])
B_ = B.inverted()
B2 = move_from_sequence([B, B])

# U move setup
U = move_from_sequence([x_, y_, R, y, x])  # The code breaks down when I start using x moves, I don't know why.
U_ = U.inverted()
U2 = move_from_sequence([U, U])

# D move setup
D = move_from_sequence([x2, U, x2])
D_ = D.inverted()
D2 = move_from_sequence([D, D])

# M move setup
M = move_from_sequence([R, L_, x_])
M_ = M.inverted()
M2 = move_from_sequence([M, M])

z = move_from_sequence([x, y, x_])
z_ = z.inverted()
z2 = move_from_sequence([z, z])
```






Spoiler: Error log





```
Traceback (most recent call last):
  File "C:/Users/[Redacted cause it had my last name]/PycharmProjects/SalmonCube/SalmonCube.py", line 108, in <module>
    U = move_from_sequence([x_, y_, R, y, x])  # The code breaks down when I start using x moves, I don't know why.
  File "C:/Users/[Redacted]/PycharmProjects/SalmonCube/SalmonCube.py", line 42, in move_from_sequence
    cube.sequence(sequence)
  File "C:/Users/[Redacted]/PycharmProjects/SalmonCube/SalmonCube.py", line 30, in sequence
    self.move(move)
  File "C:/Users/[Redacted]/PycharmProjects/SalmonCube/SalmonCube.py", line 22, in move
    indices = move.indices
  AttributeError: 'function' object has no attribute 'indices'
```


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> I finished making x, y and R moves, so I made all the other moves, but it's giving me errors on the line where I first make other moves using x moves, and I have no idea why. Heres my code and the error log:
> 
> 
> Spoiler: Code
> ...


I dunno if I'm just being dumb, but it looks like Cube.move() has no attribute "indices"


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> I dunno if I'm just being dumb, but it looks like Cube.move() has no attribute "indices"


Thats kind of whats confusing me. I'm inputting a move object, which does have the attribut indices, but its saying its a function.


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> Thats kind of whats confusing me. I'm inputting a move object, which does have the attribut indices, but its saying its a function.


Have you tried self.indices?


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> Have you tried self.indices?


It is in the cube class, which doest have an indices attribute so it wou ld just give an error.


----------



## Etotheipi (Apr 10, 2020)

I solved it! I just commented out the code that broke it, and ran through my variables with print(type(variable)) to see what was causing the issue, and in my definition of x_ (I use underscores instead of apostrophes for inverse moves) I had it as 

x_=x.inverted

Instead of x_=x.inverted()

So it was assigning the function itself to x_, instead of the inverted value of x. 
Now I'm gonna actually test to see if the cube functions by going to the example solve game and inputting one of the scrambles and solutions from there to see if it succesfully solves it with that.


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> I solved it! I just commented out the code that broke it, and ran through my variables with print(type(variable)) to see what was causing the issue, and in my definition of x_ (I use underscores instead of apostrophes for inverse moves) I had it as
> 
> x_=x.inverted
> 
> ...


Yay! There's away's that great feeling that's immediately crushed by the next bug...


----------



## Etotheipi (Apr 10, 2020)

IT WORKED YAYAYAYYA!!!! I plugged a scramble into the thing, did it on my normal cube, and the top and bottom sides matched. I didn't check other but I'm quite sure they worked because when I plugged in WoowyBaby's FMC amazingness solution into it it solved it.


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> IT WORKED YAYAYAYYA!!!! I plugged a scramble into the thing, did it on my normal cube, and the top and bottom sides matched. I didn't check other but I'm quite sure they worked because when I plugged in WoowyBaby's FMC amazingness solution into it it solved it.


Ayy! When/how are you thinking of adding alg-genning?


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> Ayy! When/how are you thinking of adding alg-genning?


There are a lot of programs with alg genning, so I think I might focus on AI and stuff. Plus I don't like algs. But if i did do algs I think (Correct me if this totally wouldn't work) I might be able to make an object, which has one move stored in it, which then makes a number of child objects each with different moves, which each makes the same number more, and then each new object tests to see if its moves along with its parents and grandparents' moves solve the case, if not, it makes more child objects.


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> There are a lot of programs with alg genning, so I think I might focus on AI and stuff. Plus I don't like algs. But if i did do algs I think (Correct me if this totally wouldn't work) I might be able to make an object, which has one move stored in it, which then makes a number of child objects each with different moves, which each makes the same number more, and then each new object tests to see if its moves along with its parents and grandparents' moves solve the case, if not, it makes more child objects.


That seems like it would take a lot of CPU. Also, what do you mean by AI?


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> That seems like it would take a lot of CPU. Also, what do you mean by AI?


Artificial intelligence. Say I could make a program that you give a scramble, and it tries to block build with a neural network. Then I could look at its solutions for block building and see how I can use that to improve my own. Also it'd be really cool if there was an AI that simulated a human solving a cube, with limited vision, recog time, fingertricks etc


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> Artificial intelligence. Say I could make a program that you give a scramble, and it tries to block build with a neural network. Then I could look at its solutions for block building and see how I can use that to improve my own. Also it'd be really cool if there was an AI that simulated a human solving a cube, with limited vision, recog time, fingertricks etc


Ok. I know what Deep Learning and AI and Machine Learning and all that stuff is I was just wondering what you were going to do with it. About the blockbuilding: If you just want to have the AI solve a cube step by step that's pretty simple. You just make a seperately neural network for every step. The problem comes in when you want it to take advantage of luck. For example, if you instruct the AI to build a cross, it's perfectly good until it messes up an XCross. Maybe you could run one AI that looks for each cross (X, XX, XXX, F2L skip) and finishes the solve with each of them and sees which one has the lowest move-count? Of course, you would have a sort of tree as you compare each steps' different move-count depending on in which order you do things (like which order to solve F2L in). Of course, CFOP isn't the best example as it's human-optmized instead of computer-optimized. I dunno, maybe there's a simpler way to do it, that's just my two cents. As for human emulation, that should be pretty simple, just have the input only be what it can see, and have an AI take the output, find the fastest finger tricks, and add time between each one. The only hard one seemed to be recognition.


WOW that was a lot more than text I thought.


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> Ok. I know what Deep Learning and AI and Machine Learning and all that stuff is I was just wondering what you were going to do with it. About the blockbuilding: If you just want to have the AI solve a cube step by step that's pretty simple. You just make a seperately neural network for every step. The problem comes in when you want it to take advantage of luck. For example, if you instruct the AI to build a cross, it's perfectly good until it messes up an XCross. Maybe you could run one AI that looks for each cross (X, XX, XXX, F2L skip) and finishes the solve with each of them and sees which one has the lowest move-count? Of course, you would have a sort of tree as you compare each steps' different move-count depending on in which order you do things (like which order to solve F2L in). Of course, CFOP isn't the best example as it's human-optmized instead of computer-optimized. I dunno, maybe there's a simpler way to do it, that's just my two cents. As for human emulation, that should be pretty simple, just have the input only be what it can see, and have an AI take the output, find the fastest finger tricks, and add time between each one. The only hard one seemed to be recognition.


I don't really want it to try and solve the cube really, I just want it to make blocks efficiently so I can analyze it. Then it'd be easy to give the AI a 'score' of how well it's doing so the network can adapt, I would just use some function of the size of the block. Then I would probably just look to see what interesting strategies it comes up with. So hopefully the network will see the best options from past experience, it wouldn't break an XCross because it was trying to make a cross, because it would just be trying to make the biggest blocks possible, not a set goal. Although it probably would sacrifice a OLL skip or something because it wouldn't see it as a useful block, but I don't really care about that. Should I upload my full code again and a little guide explaining how to use it so if you guys want to fiddle with it or make suggestions you can?


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> I don't really want it to try and solve the cube really, I just want it to make blocks efficiently so I can analyze it. Then it'd be easy to give the AI a 'score' of how well it's doing so the network can adapt, I would just use some function of the size of the block. Then I would probably just look to see what interesting strategies it comes up with. So hopefully the network will see the best options from past experience, it wouldn't break an XCross because it was trying to make a cross, because it would just be trying to make the biggest blocks possible, not a set goal. Although it probably would sacrifice a OLL skip or something because it wouldn't see it as a useful block, but I don't really care about that. Should I upload my full code again and a little guide explaining how to use it so if you guys want to fiddle with it or make suggestions you can?


So it's just purely trying to build big blocks, no other instructions?


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> So it's just purely trying to build big blocks, no other instructions?


Yes. Thats one idea for a thing I might use it for.


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> Yes. Thats one idea for a thing I might use it for.


When and why would it stop?


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> When and why would it stop?


That's a good question, I don't really know. Maybe either when it solves the cube, or I guess I could make it give up if it spends too much time without making any progress.


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> That's a good question, I don't really know. Maybe either when it solves the cube, or I guess I could make it give up if it spends too much time without making any progress.


Maybe you could make a few specifications like: All corners must touch 2-3 edges, all edges must touch 1-2 corners, no more than x pieces can be under these conditions, and all pieces can only touch 3-5 centers.


----------



## PetrusQuber (Apr 10, 2020)

Me: Watches @brododragon and @Etotheipi ramble on about incomprehensible stuff, and still attempts to read every new post.


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> Maybe you could make a few specifications like: All corners must touch 2-3 edges, all edges must touch 1-2 corners, no more than x pieces can be under these conditions, and all pieces can only touch 3-5 centers.


Ya, that would be useful. Also I added undo and redo cause why not lol. I still need to test them though.


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> Also I added undo and redo cause why not lol.


Coding for fun is all about torturing yourself by adding so many features you have so much code when you get an error it takes literal weeks to debug.


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> Coding for fun is all about torturing yourself by adding so many features you have so much code when you get an error it takes literal weeks to debug.


Do you want to mess with the code? I can give an overview of how to use it.


----------



## brododragon (Apr 10, 2020)

Etotheipi said:


> Do you want to mess with the code? I can give an overview of how to use it.


I'm a python noob, but why not?


----------



## Etotheipi (Apr 10, 2020)

brododragon said:


> I'm a python noob, but why not?


Ok, I might just remove undo and redo for now cause itll take a while to debug, and I don't want to keep you waiting.


```
SOLVED = ['w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'w', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'g', 'g', 'g', 'g',
          'g', 'g', 'g', 'g', 'g', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b',
          'b', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o']


class Move:
    def __init__(self, indices):
        self.indices = indices

    def inverted(self):
        inverted = []
        for item in self.indices: inverted.append((item[1], item[0]))
        return Move(inverted)


class Cube:
    def __init__(self, state=SOLVED):
        self.state = state[:]

    def move(self, move):  # Function which applies a move to the cube object, takes a move object as its parameter
        cube = self.state[:]
        indices = move.indices[:]
        next_cube = cube[:]
        for item in indices:
            next_cube[item[1]] = cube[item[0]]
        self.state = next_cube[:]

    def sequence(self, sequence):
        for move in sequence:
            self.move(move)

    def is_state(self, state_args):
        for arg in state_args:
            if self.state[arg[1]] != arg[0]: return False
        return True


def move_from_sequence(sequence):  # Turns a list of move objects into a single move object
    cube = Cube()
    cycle = 0
    new_indices = []

    item = ()
    for sticker in cube.state:
        cube.state[cycle] = (sticker, cycle)
        cycle += 1
    cube.sequence(sequence)
    cycle = 0
    for sticker in cube.state:
        item = cube.state[cycle]
        if cycle != item[1]:
            new_indices.append((item[1], cycle))
        cycle += 1
    cube.state = SOLVED[:]

    return Move(new_indices)


def cy(targets):  # Makes manually coding moves easier by automating cycles of stickers, so you don't have to code
    # every swap by hand
    out = []
    for i in range(len(targets)): out.append((targets[i], targets[(i + 1) % len(targets)]))
    return out


# Manually coded moves:
R = Move(
    [(8, 36), (5, 39), (2, 42), (36, 17), (39, 14), (42, 11), (17, 26), (14, 23), (11, 20), (26, 8), (23, 5), (20, 2),
     (27, 29), (29, 35), (35, 33), (33, 27), (28, 32), (32, 34), (34, 30), (30, 28)])

y = Move(
    [(0, 2), (2, 8), (8, 6), (6, 0), (1, 5), (5, 7), (7, 3), (3, 1), (9, 15), (15, 17), (17, 11), (11, 9), (10, 12),
     (12, 16), (16, 14), (14, 10), (20, 47), (19, 46), (18, 45), (47, 38), (46, 37), (45, 36), (38, 29), (37, 28),
     (36, 27), (29, 20), (28, 19), (27, 18), (23, 50), (22, 49), (21, 48), (50, 41), (49, 40), (48, 39), (41, 32),
     (40, 31), (39, 30), (32, 23), (31, 22), (30, 21), (26, 53), (25, 52), (24, 51), (53, 44), (52, 43), (51, 42),
     (41, 32), (43, 34), (44, 35), (42, 33), (35, 26), (34, 25), (33, 24)])

x = Move(
    cy([20, 2, 42, 11]) + cy([19, 1, 43, 10]) + cy([18, 0, 44, 9]) + cy([23, 5, 39, 14]) + cy([22, 4, 40, 13]) + cy(
        [21, 3, 41, 12]) + cy([27, 29, 35, 33]) + cy([28, 32, 34, 30]) + cy([45, 51, 53, 47]) + cy(
        [46, 48, 52, 50]) + cy([26, 8, 36, 17]) + cy([25, 7, 37, 16]) + cy([24, 6, 38, 15]))

# Other moves out of the manually coded moves:

# x move setup
x2 = move_from_sequence([x, x])
x_ = x.inverted()

# R move setup
R_ = R.inverted()
R2 = move_from_sequence([R, R])

# y move setup
y2 = move_from_sequence([y, y])
y_ = y.inverted()

# L move setup
L = move_from_sequence([y2, R, y2])
L_ = L.inverted()
L2 = move_from_sequence([L, L])

# F move setup
F = move_from_sequence([y_, R, y])
F2 = move_from_sequence([F, F])
F_ = F.inverted()

# B move setup
B = move_from_sequence([y, R, y_])
B_ = B.inverted()
B2 = move_from_sequence([B, B])

# U move setup
U = move_from_sequence([x_, y_, R, y, x])  # The code breaks down when I start using x moves, I don't know why.
U_ = U.inverted()
U2 = move_from_sequence([U, U])

# D move setup
D = move_from_sequence([x2, U, x2])
D_ = D.inverted()
D2 = move_from_sequence([D, D])

# M move setup
M = move_from_sequence([R, L_, x_])
M_ = M.inverted()
M2 = move_from_sequence([M, M])

z = move_from_sequence([x, y, x_])
z_ = z.inverted()
z2 = move_from_sequence([z, z])
```
Copy pate that into a new python file, and then name it something. Then make a new file and do import whateveryounamedthefile
(I'm just gonna use e as the file name for simplicity)
Then, the first thing you'd probably want to do is make a Cube object, so you can do stuff.
like: cube= e.Cube()

then, to apply algs onto that cube, you do
cube.sequence([list of moves])
The moves would be things like e.R, e.R2 because they come from the 'e' file
if you want to check if the cube is in a certain state, you can do cube.is_state(listofstuff)
In the list you have tuples with a string with a letter for the color to check for, and a number of where to check for that color. So if you added ('g',34) to the list, it would check to see if there was a green sticker in position 34. You can add as many tuples as you want, and it will only return true if all of the stickers were in the right place. For any inverse move, say R', you do R_ instead because you can't use apostrophes in variable names. If you have other questions ask me.


----------



## Filipe Teixeira (Apr 10, 2020)

well done...


```
def cubeFromString(moves_string):
    moves_dict = dict(zip("R,R',R2,L,L',L2,U,U',U2,D,D',D2,B,B',B2,F,F',F2,x,x',x2,y,y',y2,z,z',z2,M,M',M2".split(','),
    [R,R_,R2,L,L_,L2,U,U_,U2,D,D_,D2,B,B_,B2,F,F_,F2,x,x_,x2,y,y_,y2,z,z_,z2,M,M_,M2]))
    move_from_sequence([moves_dict.get(move) for move in moves_string.split()])
   
cube = cubeFromString("R U R' U'")
```

Now you need to implement S, E, wide moves and a way to view the cube


----------



## brododragon (Apr 10, 2020)

Filipe Teixeira said:


> a way to view the cube


That should be pretty simple (in 2D). Just draw 54 squares in the shape of a squashed Rubik's cube and fill() each one differently, according to color.


----------



## Etotheipi (Apr 10, 2020)

Filipe Teixeira said:


> well done...
> 
> 
> ```
> ...


Ooohh nice, I might use that if its k with you. For viewing I'll probably do 2d like Brodo said and use turtle cause I have no clue how to use any other graphics stuff with python.


----------



## Filipe Teixeira (Apr 10, 2020)

Etotheipi said:


> Ooohh nice, I might use that if its k with you. For viewing I'll probably do 2d like Brodo said and use turtle cause I have no clue how to use any other graphics stuff with python.


of course, you can use it


----------



## Etotheipi (Apr 10, 2020)

Filipe Teixeira said:


> of course, you can use it


Although wouldn't it be simpler to split it and then do cube.sequence() on the split alg? Instead of making a new move object.


----------



## Etotheipi (Apr 11, 2020)

I got a visuals thingy now =D
The below image was from doing R2 U


----------



## brododragon (Apr 11, 2020)

Etotheipi said:


> I got a visuals thingy now =D
> The below image was from doing R2 U


That looks cool! You have way more perseverance then I have lol. Are your gonna add color picking?


----------



## Etotheipi (Apr 11, 2020)

brododragon said:


> That looks cool! You have way more perseverance then I have lol. Are your gonna add color picking?


Thanks lol, wdym by color picking?


----------



## brododragon (Apr 11, 2020)

Etotheipi said:


> Thanks lol, wdym by color picking?


Having a palette of colors and being able to select one and then actually physically change the cube's color.


----------



## Dylan Swarts (Jun 4, 2020)

Very cool project you have going on, good job Etotheipi!


----------



## Etotheipi (Jun 4, 2020)

Dylan Swarts said:


> Very cool project you have going on, good job Etotheipi!


It s been quite a while since I've done anything with it, I've been working on a game in Java. But maybe i'll try recreating this in java with bwtter graphics, idk.


----------



## Wish Lin (Jun 4, 2020)

Very cool project!
Sorry the language I am familiar with is C++ so I can’t help here.......still, very nice to see these software cube projects anyway!


----------



## Etotheipi (Jun 4, 2020)

Wish Lin said:


> Very cool project!
> Sorry the language I am familiar with is C++ so I can’t help here.......still, very nice to see these software cube projects anyway!


The project isn't even active anyway, this thread got bumped almost two months. =P


----------



## Wish Lin (Jun 4, 2020)

Etotheipi said:


> The project isn't even active anyway, this thread got bumped almost two months. =P


Not a problem at all! My smart cube project is stuck as well......


----------



## Etotheipi (Jun 4, 2020)

Wish Lin said:


> Not a problem at all! My smart cube project is stuck as well......


Mine didn't really get stuck, I just made the cube and never did any alg genning or anything like that.


----------



## Wish Lin (Jun 4, 2020)

Etotheipi said:


> Mine didn't really get stuck, I just made the cube and never did any alg genning or anything like that.


Still a progress!


----------



## Chinmay47 (Jun 4, 2020)

Would you like to collaborate with me on this project. I am too into some software engineering a bit. And I might help you a bit in designing graphics and precise execution of the algorithms in the final project. If the project will also feature an optimal solver algorithm, I am ready to take down all the cases and break them to mere 20 step VGA processes.

I can also help you a lot with the timer in the simulator. I can either export the cstimer format to your prject or make an entirely new one.

Would you like to collab?


----------



## Etotheipi (Jun 4, 2020)

Chinmay47 said:


> Would you like to collaborate with me on this project. I am too into some software engineering a bit. And I might help you a bit in designing graphics and precise execution of the algorithms in the final project. If the project will also feature an optimal solver algorithm, I am ready to take down all the cases and break them to mere 20 step VGA processes.
> 
> I can also help you a lot with the timer in the simulator. I can either export the cstimer format to your prject or make an entirely new one.
> 
> Would you like to collab?


A collab would be fun, but as I have said to the other people who have been posting, I am no longer working on this, and stopped like 2 months ago. We could revive it but I kinda want to work on other things.


----------



## Chinmay47 (Jun 4, 2020)

Etotheipi said:


> A collab would be fun, but as I have said to the other people who have been posting, I am no longer working on this, and stopped like 2 months ago. We could revive it but I kinda want to work on other things.


Sure! You can! If you need some help with the other things too I am always available!


----------



## pi³ (Jun 14, 2020)

I'm not going to be much of a good help since I use Javascript... But nice efforts!


----------



## Etotheipi (Jun 14, 2020)

pi³ said:


> I'm not going to be much of a good help since I use Javascript... But nice efforts!


*facepalm* Thanks for the comment, but you are the third person who posted here regarding help, despite this project being inactive for over a month and me saying that each time. Remember to check if there are more pages in a thread and the date, because, correct me if I'm wrong, I'm guessing you read the first page of discussion, saw that I needed help at the time, and then posted, even though there was 5 more pages where I resolved my bugs and stopped working on the project. Sorry for kinda jumping on you, but it happening three times gets annoying. Though for other programming things I'd love to talk, this specific project is inactive though.


----------

