魔方加密
The Magic Cube Encryption
我正在尝试解决一个非常好的问题,我找到了解决方案,但这更像是静态解决方案。
问题。
立方体有 8 个角,每个角包含一个字符。例如,字符串
“ABCDEFGH”将在立方体上表示,如下图所示:
立方体可以上下左右旋转
这次向右旋转将初始字符串“ABCDEFGH”转换为
“BFGCAEHD”。
我想知道有什么算法或者公式可以找出角的变化吗?我确实通过记下角落的所有变化来解决它。例如,如果 A 在位置 1,那么如果您向右移动,它总是会用位置 5 的 E 替换它的位置。所以这是一个非常静态的解决方案。该解决方案之所以有效,是因为立方体旋转也是静态的并且从不改变位置。但是,想知道这是否可以用特定的算法来解决。谢谢:)
不确定我是否理解正确,但我认为您只需要写下每种情况的排列即可?比如,如果你考虑三种可能的 axes of rotation,顺时针和逆时针旋转方向,你就有六种可能的方式来旋转立方体。例如,在 Python 中,您可以这样做:
def permute(s, perm):
return ''.join(s[i] for i in perm)
def rotate_frontback_cw(cube):
return permute(cube, [1, 5, 6, 2, 0, 4, 7, 3])
def rotate_frontback_ccw(cube):
return permute(cube, [4, 0, 3, 7, 5, 1, 2, 6])
def rotate_leftright_cw(cube):
return permute(cube, [4, 5, 1, 0, 7, 6, 2, 3])
def rotate_leftright_ccw(cube):
return permute(cube, [3, 2, 6, 7, 0, 1, 5, 4])
def rotate_updown_cw(cube):
return permute(cube, [1, 2, 3, 0, 5, 6, 7, 4])
def rotate_updown_ccw(cube):
return permute(cube, [3, 0, 1, 2, 7, 4, 5, 6])
def cube2str(cube):
a, b, c, d, e, f, g, h = cube
return (f' {h}--------{g}\n'
' /| /|\n'
' / | / |\n'
f'{e}--------{f} |\n'
f'| {d}-----|--{c}\n'
f'| / | /\n'
f'|/ |/\n'
f'{a}--------{b}')
cube = 'ABCDEFGH'
print('cube')
print(cube2str(cube))
print('rotate_frontback_cw')
print(cube2str(rotate_frontback_cw(cube)))
print('rotate_frontback_ccw')
print(cube2str(rotate_frontback_ccw(cube)))
print('rotate_leftright_cw')
print(cube2str(rotate_leftright_cw(cube)))
print('rotate_leftright_ccw')
print(cube2str(rotate_leftright_ccw(cube)))
print('rotate_updown_cw')
print(cube2str(rotate_updown_cw(cube)))
print('rotate_updown_ccw')
print(cube2str(rotate_updown_ccw(cube)))
这将打印:
cube
H--------G
/| /|
/ | / |
E--------F |
| D-----|--C
| / | /
|/ |/
A--------B
rotate_frontback_cw
D--------H
/| /|
/ | / |
A--------E |
| C-----|--G
| / | /
|/ |/
B--------F
rotate_frontback_ccw
G--------C
/| /|
/ | / |
F--------B |
| H-----|--D
| / | /
|/ |/
E--------A
rotate_leftright_cw
D--------C
/| /|
/ | / |
H--------G |
| A-----|--B
| / | /
|/ |/
E--------F
rotate_leftright_ccw
E--------F
/| /|
/ | / |
A--------B |
| H-----|--G
| / | /
|/ |/
D--------C
rotate_updown_cw
E--------H
/| /|
/ | / |
F--------G |
| A-----|--D
| / | /
|/ |/
B--------C
rotate_updown_ccw
G--------F
/| /|
/ | / |
H--------E |
| C-----|--B
| / | /
|/ |/
D--------A
我正在尝试解决一个非常好的问题,我找到了解决方案,但这更像是静态解决方案。
问题。
立方体有 8 个角,每个角包含一个字符。例如,字符串 “ABCDEFGH”将在立方体上表示,如下图所示:
立方体可以上下左右旋转
这次向右旋转将初始字符串“ABCDEFGH”转换为 “BFGCAEHD”。
我想知道有什么算法或者公式可以找出角的变化吗?我确实通过记下角落的所有变化来解决它。例如,如果 A 在位置 1,那么如果您向右移动,它总是会用位置 5 的 E 替换它的位置。所以这是一个非常静态的解决方案。该解决方案之所以有效,是因为立方体旋转也是静态的并且从不改变位置。但是,想知道这是否可以用特定的算法来解决。谢谢:)
不确定我是否理解正确,但我认为您只需要写下每种情况的排列即可?比如,如果你考虑三种可能的 axes of rotation,顺时针和逆时针旋转方向,你就有六种可能的方式来旋转立方体。例如,在 Python 中,您可以这样做:
def permute(s, perm):
return ''.join(s[i] for i in perm)
def rotate_frontback_cw(cube):
return permute(cube, [1, 5, 6, 2, 0, 4, 7, 3])
def rotate_frontback_ccw(cube):
return permute(cube, [4, 0, 3, 7, 5, 1, 2, 6])
def rotate_leftright_cw(cube):
return permute(cube, [4, 5, 1, 0, 7, 6, 2, 3])
def rotate_leftright_ccw(cube):
return permute(cube, [3, 2, 6, 7, 0, 1, 5, 4])
def rotate_updown_cw(cube):
return permute(cube, [1, 2, 3, 0, 5, 6, 7, 4])
def rotate_updown_ccw(cube):
return permute(cube, [3, 0, 1, 2, 7, 4, 5, 6])
def cube2str(cube):
a, b, c, d, e, f, g, h = cube
return (f' {h}--------{g}\n'
' /| /|\n'
' / | / |\n'
f'{e}--------{f} |\n'
f'| {d}-----|--{c}\n'
f'| / | /\n'
f'|/ |/\n'
f'{a}--------{b}')
cube = 'ABCDEFGH'
print('cube')
print(cube2str(cube))
print('rotate_frontback_cw')
print(cube2str(rotate_frontback_cw(cube)))
print('rotate_frontback_ccw')
print(cube2str(rotate_frontback_ccw(cube)))
print('rotate_leftright_cw')
print(cube2str(rotate_leftright_cw(cube)))
print('rotate_leftright_ccw')
print(cube2str(rotate_leftright_ccw(cube)))
print('rotate_updown_cw')
print(cube2str(rotate_updown_cw(cube)))
print('rotate_updown_ccw')
print(cube2str(rotate_updown_ccw(cube)))
这将打印:
cube
H--------G
/| /|
/ | / |
E--------F |
| D-----|--C
| / | /
|/ |/
A--------B
rotate_frontback_cw
D--------H
/| /|
/ | / |
A--------E |
| C-----|--G
| / | /
|/ |/
B--------F
rotate_frontback_ccw
G--------C
/| /|
/ | / |
F--------B |
| H-----|--D
| / | /
|/ |/
E--------A
rotate_leftright_cw
D--------C
/| /|
/ | / |
H--------G |
| A-----|--B
| / | /
|/ |/
E--------F
rotate_leftright_ccw
E--------F
/| /|
/ | / |
A--------B |
| H-----|--G
| / | /
|/ |/
D--------C
rotate_updown_cw
E--------H
/| /|
/ | / |
F--------G |
| A-----|--D
| / | /
|/ |/
B--------C
rotate_updown_ccw
G--------F
/| /|
/ | / |
H--------E |
| C-----|--B
| / | /
|/ |/
D--------A