Continuando con el post de retos de RNA, en C++, quiero hacer este, para que los que quieran resolverlo en otros lenguajes puedan hacerlo.
Reglas:
- Toda respuesta tiene que tener código
- Si tienen dudas SOBRE LA DESCRIPCIÓN del reto, pueden entrar al IRC o enviarme un MP.
- No se pueden utilizar liberías para hacer los calculos, todo debe ser hecho a mano.
Ahora si, vamos:
La aplicación debe permitir al usuario ingresar dos coordenadas de dos cubos, es decir, X, Y y Z, además de la dimensiones de cada uno, obviamente una sola, ya que es un cubo :D. El resultado será el volumen de la intersección en caso de que sea afirmativa, y sino decir que no hay intersección alguna.
Pondré los resultados acá, habrá un ganador por cada lenguaje :)
RESULTADOS
C++: ghastlyX
Ahora si
using System;
namespace InterCubos
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Cubo al cubo!" + System.Environment.NewLine);
Cubo cubo1 = new Cubo();
Cubo cubo2 = new Cubo();
int temp;
Console.WriteLine("Ingrese datos del primer cubo: ");
Console.Write("X:");
while (!int.TryParse(Console.ReadLine(), out temp))
{
Console.WriteLine("ERROR: ingrese un valor numerico entero");
Console.Write("X:");
}
cubo1.ubicacion.x = temp;
Console.Write("Y:");
while (!int.TryParse(Console.ReadLine(), out temp))
{
Console.WriteLine("ERROR: ingrese un valor numerico entero");
Console.Write("Y:");
}
cubo1.ubicacion.y = temp;
Console.Write("Z:");
while (!int.TryParse(Console.ReadLine(), out temp))
{
Console.WriteLine("ERROR: ingrese un valor numerico entero");
Console.Write("Z:");
}
cubo1.ubicacion.z = temp;
Console.Write("Tamaño:");
while (!int.TryParse(Console.ReadLine(), out temp))
{
Console.WriteLine("ERROR: ingrese un valor numerico entero");
Console.Write("Tamaño:");
}
cubo1.tamaño = temp;
Console.WriteLine("Ingrese datos del segundo cubo: ");
Console.Write("X:");
while (!int.TryParse(Console.ReadLine(), out temp))
{
Console.WriteLine("ERROR: ingrese un valor numerico entero");
Console.Write("X:");
}
cubo2.ubicacion.x = temp;
Console.Write("Y:");
while (!int.TryParse(Console.ReadLine(), out temp))
{
Console.WriteLine("ERROR: ingrese un valor numerico entero");
Console.Write("Y:");
}
cubo2.ubicacion.y = temp;
Console.Write("Z:");
while (!int.TryParse(Console.ReadLine(), out temp))
{
Console.WriteLine("ERROR: ingrese un valor numerico entero");
Console.Write("Z:");
}
cubo2.ubicacion.z = temp;
Console.Write("Tamaño:");
while (!int.TryParse(Console.ReadLine(), out temp))
{
Console.WriteLine("ERROR: ingrese un valor numerico entero");
Console.Write("Tamaño:");
}
cubo2.tamaño = temp;
if (cubo1.isCollisioning(cubo2))
Console.WriteLine("Los cubos estan chocando!");
else
Console.WriteLine("Los cubos no estan ni cerca ¬¬");
Console.ReadLine();
}
}
class Cubo
{
public Punto ubicacion { get; set; }
public int tamaño { get; set; }
public Cubo()
{
ubicacion = new Punto();
tamaño = 0;
}
public bool isCollisioning(Cubo elCubo)
{
if (entre(elCubo.ubicacion.x, this.ubicacion.x, this.ubicacion.x + this.tamaño, elCubo.ubicacion.x + elCubo.tamaño)) return true;
if (entre(elCubo.ubicacion.y, this.ubicacion.y, this.ubicacion.y + this.tamaño, elCubo.ubicacion.y + elCubo.tamaño)) return true;
if (entre(elCubo.ubicacion.z, this.ubicacion.z, this.ubicacion.z + this.tamaño, elCubo.ubicacion.z + elCubo.tamaño)) return true;
return false;
}
private bool entre(int i, int valor, int d) {
return entre(i, valor, valor, d);
}
private bool entre(int i, int valorMin, int valorMax, int d)
{
// Cambiar por esta linea si se quiere saber si esta un cubo dentro de otro
// return (valorMin >= i) && (valorMax <= d);
return (valorMin >= i) || (valorMax <= d);
}
}
class Punto
{
public int x { get; set; }
public int y { get; set; }
public int z { get; set; }
public Punto() {
x = y = z = 0;
}
}
}
Fixed :P
No se que proponer como reto :P :xD
Raul, no estás mostrando el VOLUMEN resultante de la intersección!
Pongo la mía, en C++. El formato de entrada es la longitud del lado del cubo y a continuación las coordenadas del vértice con coordenadas más pequeñas. Por ejemplo, si se quiere la intersección del cubo de lado 4 con vértice de menores coordenadas en (0,0,0) con el cubo de lado 3 con vértice de menores coordenadas en (-1,-1,-1), la entrada sería así:
Citar4
0 0 0
3
-1 -1 -1
Y la salida devuelve el volumen de la intersección (devuelve 0 si la intersección es vacía).
#include <iostream>
#include <vector>
using namespace std;
void lee(vector<int>& v) {
int len;
cin >> len;
for (int i = 0; i < 3; ++i) {
cin >> v[i];
v[i + 3] = v[i] + len;
}
}
int main() {
vector<int> A(6), B(6);
int res = 1;
lee(A); lee(B);
for (int i = 0; i < 3; ++i) A[i] = max(A[i], B[i]);
for (int i = 3; i < 6; ++i) A[i] = min(A[i], B[i]);
for (int i = 0; i < 3; ++i) res *= max(0, A[3 + i] - A[i]);
cout << res << endl;
}
Muy bien, ya tenemos el de C++, y C# está encaminado, esperamos por los demás!