Spaces:
Sleeping
Sleeping
import gradio as gr | |
import numpy as np | |
import matplotlib.pyplot as plt | |
class RubiksCube2x2Solver: | |
def __init__(self): | |
self.size = 2 | |
self.cube = np.zeros((6, 2, 2), dtype=int) | |
# Configurar o estado inicial específico | |
self.cube[0] = np.array([[1, 3], [4, 2]]) # Face 1 | |
self.cube[1] = np.array([[1, 5], [0, 5]]) # Face 2 | |
self.cube[2] = np.array([[2, 2], [3, 4]]) # Face 3 | |
self.cube[3] = np.array([[1, 5], [3, 3]]) # Face 4 | |
self.cube[4] = np.array([[4, 0], [0, 1]]) # Face 5 | |
self.cube[5] = np.array([[2, 4], [1, 0]]) # Face 6 | |
self.color_names = { | |
0: "Branco", | |
1: "Amarelo", | |
2: "Verde", | |
3: "Azul", | |
4: "Vermelho", | |
5: "Laranja" | |
} | |
def get_solution(self): | |
"""Retorna os passos para resolver o cubo""" | |
solution = [] | |
# Análise inicial | |
solution.append("ANÁLISE INICIAL:") | |
solution.append("1. Face Superior (Face 1):") | |
solution.append(" - Amarelo, Azul, Vermelho, Verde") | |
solution.append("2. Face Frontal (Face 2):") | |
solution.append(" - Amarelo, Laranja, Branco, Laranja") | |
solution.append("3. Face Direita (Face 3):") | |
solution.append(" - Verde, Verde, Azul, Vermelho") | |
solution.append("4. Face Esquerda (Face 4):") | |
solution.append(" - Amarelo, Laranja, Azul, Azul") | |
solution.append("5. Face Inferior (Face 5):") | |
solution.append(" - Vermelho, Branco, Branco, Amarelo") | |
solution.append("6. Face Traseira (Face 6):") | |
solution.append(" - Verde, Vermelho, Amarelo, Branco") | |
solution.append("") | |
# Estratégia de solução | |
solution.append("ESTRATÉGIA DE SOLUÇÃO:") | |
solution.append("1. Resolver Face Branca:") | |
solution.append(" a. Reunir peças brancas (atualmente nas faces 2, 5 e 6)") | |
solution.append(" b. Posicionar na face inferior") | |
solution.append(" c. Orientar corretamente") | |
solution.append("") | |
solution.append("2. Resolver Segunda Camada:") | |
solution.append(" a. Alinhar arestas verdes e vermelhas") | |
solution.append(" b. Alinhar arestas azuis e laranjas") | |
solution.append("") | |
solution.append("3. Resolver Face Amarela:") | |
solution.append(" a. Posicionar peças amarelas (atualmente espalhadas)") | |
solution.append(" b. Orientar cantos amarelos") | |
solution.append(" c. Permutar cantos se necessário") | |
solution.append("") | |
solution.append("SEQUÊNCIA DE MOVIMENTOS:") | |
solution.append("1. R U R' U' (reunir peças brancas)") | |
solution.append("2. U2 R U2 R' (posicionar brancas)") | |
solution.append("3. R U R' U R U2 R' (orientar cantos)") | |
solution.append("4. U' R U R' U' R U R' (segunda camada)") | |
solution.append("5. U R U' R' (face amarela)") | |
solution.append("6. R U R' U R U2 R' (orientação final)") | |
solution.append("") | |
solution.append("OBSERVAÇÕES:") | |
solution.append("- Use U para giros da face superior") | |
solution.append("- Use R para giros da face direita") | |
solution.append("- O apóstrofo (') indica giro anti-horário") | |
solution.append("- U2 significa girar duas vezes") | |
return solution | |
def create_visualization(cube_state): | |
fig, ax = plt.subplots(3, 4, figsize=(12, 9)) | |
plt.subplots_adjust(hspace=0.4, wspace=0.4) | |
colors = { | |
0: "#FFFFFF", # Branco | |
1: "#FFFF00", # Amarelo | |
2: "#00FF00", # Verde | |
3: "#0000FF", # Azul | |
4: "#FF0000", # Vermelho | |
5: "#FFA500" # Laranja | |
} | |
face_positions = [ | |
(0, 1), # Face Superior | |
(1, 1), # Face Frontal | |
(1, 2), # Face Direita | |
(1, 0), # Face Esquerda | |
(2, 1), # Face Inferior | |
(1, 3), # Face Traseira | |
] | |
face_names = ["Superior", "Frontal", "Direita", "Esquerda", "Inferior", "Traseira"] | |
for face_idx, (row, col) in enumerate(face_positions): | |
face = cube_state[face_idx] | |
for i in range(2): | |
for j in range(2): | |
color = colors[face[i, j]] | |
ax[row, col].add_patch(plt.Rectangle( | |
(j/2, (1-i)/2), 1/2, 1/2, | |
facecolor=color, | |
edgecolor='black' | |
)) | |
ax[row, col].set_xlim(0, 1) | |
ax[row, col].set_ylim(0, 1) | |
ax[row, col].set_xticks([]) | |
ax[row, col].set_yticks([]) | |
ax[row, col].set_title(f'Face {face_names[face_idx]}') | |
for i in range(3): | |
for j in range(4): | |
if (i, j) not in face_positions: | |
fig.delaxes(ax[i, j]) | |
return fig | |
def show_solution(): | |
cube = RubiksCube2x2Solver() | |
fig = create_visualization(cube.cube) | |
solution = "\n".join(cube.get_solution()) | |
return fig, solution | |
# Criar interface Gradio | |
with gr.Blocks(title="Resolvedor de Cubo 2x2") as demo: | |
gr.Markdown("# Resolvedor de Cubo 2x2") | |
gr.Markdown("### Estado atual do cubo e solução proposta") | |
with gr.Row(): | |
cube_vis = gr.Plot(label="Estado do Cubo") | |
solution_text = gr.Textbox(label="Passos para Solução", lines=30) | |
demo.load(fn=show_solution, outputs=[cube_vis, solution_text]) | |
# Iniciar aplicação | |
demo.launch() |