Código de Java - Piezas de cubos de Rubik

sin imagen de perfil

Piezas de cubos de Rubikgráfica de visualizaciones


Java

Actualizado el 18 de Diciembre del 2016 por Roque (Publicado el 9 de Diciembre del 2016)
15.988 visualizaciones desde el 9 de Diciembre del 2016
Este código sirve para proporcionar información sobre las piezas del cubo de Rubik que se indique.

Para entender el código o el resultado del código es necesario entender algunos conceptos básicos sobre los cubos de Rubik:
Pieza: Bloque indivisible por los giros permitidos que a través de dichos movimientos puede cambiar su posición respecto al núcleo del puzle.
Tipo de pieza: Son piezas del mismo tipo aquellas que pueden cambiar posiciones entre sí (a través de los giros permitidos). Sin importar la orientación con que puedan quedar y sin importar si son o no dependientes entre sí. Las más comunes y las que están el cubo clásico (3x3x3) son esquinas, aristas y centros.

De la versión 3.0 en adelante se necesita la siguiente información para completar el programa correctamente en algunos casos de los cuboides (véase mejor explicado en la descripción de la versión o en el propio programa):


*
Al ser un cubo cuyas una o varias dimensiones son igual a 1, es difícil interpretar qué tipo de pieza es cada una.
Se puede llevar a cabo la clasificación siguiendo dos criterios diferentes: comparándolo físicamente con un 3x3x3 (que al ser el cubo clásico es el que se toma como referencia)(1) o comparando el comportamiento de las piezas (si la pieza es el eje de la capa en que se encuentra, el número de orientaciones de la pieza, etcétera) con el comportamiento de las de un 3x3x3(2).

1
Esquina: es realmente el vértice o el extremo del puzle.
Arista: es tangente al menos a dos piezas (de forma que no es un extremo) y no está en el núcleo físico del puzle.
Centro: está en el núcleo físico del puzle.

2
Esquina: Según este criterio, este tipo de cuboides no tienen esquinas en ningún caso.
Arista: Tiene dos orientaciones** y colocado el puzle horizontalmente, aun sin tener en cuenta arriba y abajo, no roza piezas por todos los lados
Centro: supone el eje de una capa (la capa gira alrededor de él por lo que al finalizar el giro su posición respecto al núcleo no varía). Tiene 4 orientaciones.
Núcleo***: es el núcleo físico del cubo por lo que siempre permanecerá inmóvil. Si son varios depende de las dimensiones del puzle: si es lineal se consideran centros; si es plano son aquellos que puesto el puzle horizontalmente, están yuxtapuestos a piezas por todos lados, (excepto por arriba y por abajo). Tienen 2 o 4 orientaciones, dependiendo de si son lineales o planos, respectivamente.

**: Cuando se habla de orientaciones no implica que tenga ese número de pegatinas.
***: Hablamos de núcleo porque en algunos de estos cuboides hay piezas a la vista que se comportan como el núcleo de un 3x3x3. Véase: 3x3x1.

Requerimientos

Es un código bastante simple de Java; no creo que se necesite una versión muy alta para su correcta ejecución.
Por curiosidad aunque no es ningún requerimiento añadir que fue diseñado en Eclipse Luna.

1.0

Actualizado el 29 de Diciembre del 2016 (Publicado el 9 de Diciembre del 2016)gráfica de visualizaciones de la versión: 1.0
613 visualizaciones desde el 9 de Diciembre del 2016

2.0

Actualizado el 5 de Enero del 2017 (Publicado el 15 de Diciembre del 2016)gráfica de visualizaciones de la versión: 2.0
463 visualizaciones desde el 15 de Diciembre del 2016

2.1

Actualizado el 9 de Enero del 2017 (Publicado el 15 de Diciembre del 2016)gráfica de visualizaciones de la versión: 2.1
675 visualizaciones desde el 15 de Diciembre del 2016

3.0
estrellaestrellaestrellaestrellaestrella(1)

Actualizado el 20 de Enero del 2017 (Publicado el 18 de Diciembre del 2016)gráfica de visualizaciones de la versión: 3.0
14.238 visualizaciones desde el 18 de Diciembre del 2016
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

En esta versión se ha agregado muchísima información sobre los cuboides.
Solo falta por añadir lo siguiente para completar la información de los cuboides:
-Número de piezas de cada tipo en los cuboides tridimensionales (menos las esquinas que siempre serán 8)
-Número de tipos de piezas en los cuboides.

En ciertos casos es difícil (ambiguo, mejor dicho) clasificar las piezas de los cuboides. Así que cuando el programa te lo indique (*) lee esto (a partir de esta versión estará en la descripción del programa):

*
Al ser un cubo cuyas una o varias dimensiones son igual a 1, es difícil interpretar qué tipo de pieza es cada una.
Se puede llevar a cabo la clasificación siguiendo dos criterios diferentes: comparándolo físicamente con un 3x3x3 (que al ser el cubo clásico es el que se toma como referencia)(1) o comparando el comportamiento de las piezas (si la pieza es el eje de la capa en que se encuentra, el número de orientaciones de la pieza, etcétera) con el comportamiento de las de un 3x3x3(2).

1
Esquina: es realmente el vértice o el extremo del puzle.
Arista: es tangente al menos a dos piezas (de forma que no es un extremo) y no está en el núcleo físico del puzle.
Centro: está en el núcleo físico del puzle.

2
Esquina: Según este criterio, este tipo de cuboides no tienen esquinas en ningún caso.
Arista: Tiene dos orientaciones** y colocado el puzle horizontalmente, aun sin tener en cuenta arriba y abajo, no roza piezas por todos los lados
Centro: supone el eje de una capa (la capa gira alrededor de él por lo que al finalizar el giro su posición respecto al núcleo no varía). Tiene 4 orientaciones.
Núcleo***: es el núcleo físico del cubo por lo que siempre permanecerá inmóvil. Si son varios depende de las dimensiones del puzle: si es lineal se consideran centros; si es plano son aquellos que puesto el puzle horizontalmente, están yuxtapuestos a piezas por todos lados, (excepto por arriba y por abajo). Tienen 2 o 4 orientaciones, dependiendo de si son lineales o planos, respectivamente.

**: Cuando se habla de orientaciones no implica que tenga ese número de pegatinas.
***: Hablamos de núcleo porque en algunos de estos cuboides hay piezas a la vista que se comportan como el núcleo de un 3x3x3. Véase: 3x3x1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
import java.util.Scanner;
 
public class InfoCubo {
	public static void main (String[] args) {
 
		Scanner escáner = new Scanner(System.in);
 
		System.out.println("Bienvenido a InfoCubo, aquí te proporcionaremos informcaión sobre las piezas del puzle que usted quiera.\n");
		System.out.println("¿Su puzle es un cubo o un cuboide?\nSi es un cubo escriba \"cubo\" y si es un cuboide \"cuboide\".");
		boolean again, again1; char seguir;
 
		do {
			again1 = false;
			String c = escáner.next();
 
			if (c.equals("cubo")){
 
				System.out.println("\nIntroduzca el número de piezas por fila que tiene su cubo.");
				int p = escáner.nextInt();
 
				do {
					again = false;
					if (p > 1) {
 
						System.out.println("Cubo: " + p + "x" + p + "x" + p + "\n\nPIEZAS\nNúmero de piezas en total: " + (p*p*p - (p-2)*(p-2)*(p-2)) );
						System.out.println("Número de esquinas: 8");
						System.out.println("Número de aristas: " + 12*(p-2));
						System.out.println("Número de centros: " + 6*(p-2)*(p-2));
 
						int total = 0;
						int centros = 0;
 
						for (int i = 1; i <= (p+1)/2; i++) {
							total = total + i;
						}
 
						for (int i = 1; i <= (p-1)/2; i++) {
							centros = centros + i;
						}
 
						System.out.println("\nTIPOS DE PIEZAS\nNúmero de tipos de piezas en total: " + total);
						System.out.println("Número de tipos de esquinas: 1");
						System.out.println("Número de tipos de aristas: " + (((p+1)/2)-1));
						System.out.println("Número de tipos de centros: " + centros);
 
					} else{
						if (p == 1) {
							System.out.println("Un 1x1x1 solo tiene una pieza, que al carecer de forma de esquina, centro o arista, se podría calificar como núcleo.");
						} else{
							System.out.println("Número carente de sentido en este contexto, prueba de nuevo");
							p = escáner.nextInt();
							again = true;
						}
					}
 
					boolean inválido = false;
                                        System.out.println("\n\n¿Quieres probar con otro puzle? (Podrás elegir el tipo)\nSi la respuesta es afirmativa escriba 's' o 'S'; si es negativa 'n' o 'N'");
					do {
						seguir = escáner.next().charAt(0);
						if (seguir == 's' || seguir == 'S'){
							again1 = true;
							System.out.println("\n\n¿Su puzle es un cubo o un cuboide?\nSi es un cubo escriba \"cubo\" y si es un cuboide \"cuboide\".");
						} else if (!(seguir == 'n' || seguir == 'N')){
							System.out.println("Comando inválido,  prueba de nuevo.");
							inválido = true;
						}
					} while(inválido);
 
				}while(again);
 
			} else if (c.equals("cuboide")){
 
				System.out.println("\nEscriba las tres dimensiones del cuboide separando cada una con un intro. Cuando haya escrito las tres, dé otro intro.");
				int[] ps = new int[3];
				for (int i = 0; i < 3; i++){
					ps[i] = escáner.nextInt();
				}
				System.out.println("Cuboide: " + ps[0] + "x" + ps[1] + "x" + ps[2]);
 
				boolean np = false;
				for (int i = 0; i < 3; i++){
					if (ps[i]==1) {
						np = true;
					}
				}
 
				System.out.print("\nPIEZAS\nNúmero total de piezas: ");
				if (np==false){
					System.out.println((ps[0]*ps[1]*ps[2]-(ps[0]-2)*(ps[1]-2)*(ps[2]-2)) );
					System.out.println("Número de esquinas: 8");
				} else{
					System.out.println(ps[0]*ps[1]*ps[2]);
 
					int núcleo = 0;
					int centros1 = 0;
					int centros2 = 0;
					int aristas1 = 0;
					int aristas2 = 0;
					int esquinas = 0;
					int nd = 0;
					for (int i = 0; i < 3; i++) {
						if (ps[i] == 1){
							nd++;
						}
					}
					switch (nd){
 
					case 1:
						núcleo = -((ps[0]-2)*(ps[1]-2)*(ps[2]-2));
						aristas2 = 4;
						centros2 = 2*(ps[0]+ps[1]+ps[2]-5);
 
						esquinas = 4;
						aristas1 = centros2;
						centros1 = núcleo;
						break;
 
					case 2:
						núcleo = (ps[0]-2)*(ps[1]-2)*(ps[2]-2);
						centros2 = 2;
						aristas2 = 0;
 
						esquinas = 2;
						for (int i = 0; i < 3; i++){
							if (ps[i]/2*2==ps[i]){
								centros1 = 0;
								break;
							} else{
								centros1 = 1;
							}
						}
						aristas1 = (ps[0]*ps[1]*ps[2]-2)/2*2;
						break;
 
					default://1x1x1
						núcleo = 1;
						aristas2 = 0;
						centros2 = 0;
 
						centros1 = 1;
						aristas1 = 0;
						esquinas = 0;
						break;
					}
 
					System.out.println("Los criterios de calificación de piezas son ambiguos en este tipo de cuboides."
							+ "\nLea la información que le corresponde a este tema en la descripción del programa marcada con un asterisco (*) para responder a la siguiente pregunta.");
					System.out.println("¿Seguirá el primer criterio (marque 1), el segundo (marque 2), o quiere que se muestren ambos (marque 3)?");
					int criterio = escáner.nextInt();
					switch (criterio){
					case 1:
						System.out.println("Número de esquinas: " + esquinas);
						System.out.println("Número de aristas: " + aristas1);
						System.out.println("Número de centros: " + centros1);
						break;
 
					case 2:
						System.out.println("Número de esquinas: 0");
						System.out.println("Número de aristas: " + aristas2);
						System.out.println("Número de centros: " + centros2);
						System.out.println("Número de núcleos: " + núcleo);
						break;
 
					case 3:
						System.out.println("Criterio 1 (físico):");
						System.out.println("Número de esquinas: " + esquinas);
						System.out.println("Número de aristas: " + aristas1);
						System.out.println("Número de centros: " + centros1);
 
						System.out.println("\nCriterio 2 (comportamiento):");
						System.out.println("Número de esquinas: 0");
						System.out.println("Número de aristas: " + aristas2);
						System.out.println("Número de centros: " + centros2);
						System.out.println("Número de núcleos: " + núcleo);
						break;
 
					}
				}
 
				System.out.println("\n\n¿Quieres probar con otro puzle? (Podrás elegir el tipo)\nSi la respuesta es afirmativa escriba 's' o 'S'; si es negativa 'n' o 'N'");
				seguir = escáner.next().charAt(0);
				if (seguir == 's' || seguir == 'S'){
					again1 = true;
					System.out.println("\n\n¿Su puzle es un cubo o un cuboide?\nSi es un cubo escriba \"cubo\" y si es un cuboide \"cuboide\".");
				} else if (!(seguir == 'n' || seguir == 'N')){
					System.out.println("Comando inválido,  prueba de nuevo.");
				}
 
			} else{
				again1 = true;
				System.out.println("Comando inválido, prueba de nuevo.");
			}
 
 
		}while(again1);
 
		System.out.println("\nFin del programa.");
		escáner.close();
	}
}



Comentarios sobre la versión: 3.0 (1)

maria
29 de Julio del 2017
estrellaestrellaestrellaestrellaestrella
hola, hace poco decidí estudiar ing en sistemas y la verdad me parece muy interesante cada día me motivo más.
Como llevo muy poco tiempo en esto quiero saber que es lo que hace exactamente tu código.
Responder

Comentar la versión: 3.0

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s3802