Решение на (Floating) Points and Vectors от Александър Дойков
Към профила на Александър Дойков
Резултати
- 11 точки от тестове
- 1 бонус точка
- 12 точки общо
- 8 успешни тест(а)
- 7 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20190123-22631-375pn6/solution)
warning: function is never used: `main`
--> src/lib.rs:208:1
|
208 | fn main() {
| ^^^^^^^^^
|
= note: #[warn(dead_code)] on by default
Finished dev [unoptimized + debuginfo] target(s) in 5.31s
Running target/debug/deps/solution-2e785d603b538f71
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-29808948fb50ed3a
running 15 tests
test solution_test::test_equailty_symmetry ... FAILED
test solution_test::test_equality_basic ... ok
test solution_test::test_equality_floating ... FAILED
test solution_test::test_line_constructors ... ok
test solution_test::test_line_equality_by_points ... FAILED
test solution_test::test_line_equality_by_points_and_vectors ... FAILED
test solution_test::test_line_equality_by_vectors ... FAILED
test solution_test::test_line_validity ... ok
test solution_test::test_number_by_vector ... ok
test solution_test::test_number_vector_multiplication_with_precision ... FAILED
test solution_test::test_point_distance ... FAILED
test solution_test::test_points_minus_points ... ok
test solution_test::test_points_plus_vectors ... ok
test solution_test::test_vector_by_vector ... ok
test solution_test::test_vector_by_vector_cross ... ok
failures:
---- solution_test::test_equailty_symmetry stdout ----
thread 'solution_test::test_equailty_symmetry' panicked at 'assertion failed: `(left == right)`
left: `Point { x: 0.0, y: 0.0, z: 0.0 }`,
right: `Point { x: 0.0000000000000000002220446049250313, y: 0.0, z: 0.0 }`', tests/solution_test.rs:63:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.
---- solution_test::test_equality_floating stdout ----
thread 'solution_test::test_equality_floating' panicked at 'assertion failed: `(left == right)`
left: `Point { x: 0.0000000000000000002220446049250313, y: 0.0, z: 0.0 }`,
right: `Point { x: 0.0, y: 0.0, z: 0.0 }`', tests/solution_test.rs:42:5
---- solution_test::test_line_equality_by_points stdout ----
Vector { x: 0.1, y: 0.1, z: 0.0 }
thread 'solution_test::test_line_equality_by_points' panicked at 'assertion failed: `(left == right)`
left: `Some(Line { vector: Vector { x: 0.1, y: 0.1, z: 0.0 }, point: Point { x: 0.0, y: 0.0, z: 0.0 } })`,
right: `Some(Line { vector: Vector { x: -0.1, y: -0.1, z: 0.0 }, point: Point { x: 0.1, y: 0.1, z: 0.1 } })`', tests/solution_test.rs:206:5
---- solution_test::test_line_equality_by_points_and_vectors stdout ----
Vector { x: 0.3, y: -0.1, z: 0.0 }
thread 'solution_test::test_line_equality_by_points_and_vectors' panicked at 'assertion failed: `(left == right)`
left: `Some(Line { vector: Vector { x: 0.3, y: -0.1, z: 0.0 }, point: Point { x: 0.0, y: 0.0, z: 0.0 } })`,
right: `Some(Line { vector: Vector { x: 0.3, y: -0.1, z: 0.25 }, point: Point { x: 0.0, y: 0.0, z: 0.0 } })`', tests/solution_test.rs:243:5
---- solution_test::test_line_equality_by_vectors stdout ----
Vector { x: 0.1, y: -0.2, z: 0.5 }
thread 'solution_test::test_line_equality_by_vectors' panicked at 'assertion failed: `(left == right)`
left: `Some(Line { vector: Vector { x: 0.1, y: -0.2, z: 0.5 }, point: Point { x: 0.0, y: 0.4, z: 0.0 } })`,
right: `Some(Line { vector: Vector { x: 0.1, y: -0.2, z: 0.5 }, point: Point { x: 0.0000000000000000002220446049250313, y: 0.4, z: 0.0000000000000000002220446049250313 } })`', tests/solution_test.rs:230:5
---- solution_test::test_number_vector_multiplication_with_precision stdout ----
thread 'solution_test::test_number_vector_multiplication_with_precision' panicked at 'assertion failed: `(left == right)`
left: `Vector { x: 0.0000000000000000002220446049250313, y: 0.0000000000000000002220446049250313, z: 0.0000000000000000002220446049250313 }`,
right: `Vector { x: 0.0, y: 0.0, z: 0.0 }`', tests/solution_test.rs:145:5
---- solution_test::test_point_distance stdout ----
Vector { x: -1.0, y: 1.0, z: 0.0 }
thread 'solution_test::test_point_distance' panicked at 'assertion failed: (line.distance(p1) - 2.0f64.sqrt() / 2.0).abs() < EPS * 1000.0', tests/solution_test.rs:183:5
failures:
solution_test::test_equailty_symmetry
solution_test::test_equality_floating
solution_test::test_line_equality_by_points
solution_test::test_line_equality_by_points_and_vectors
solution_test::test_line_equality_by_vectors
solution_test::test_number_vector_multiplication_with_precision
solution_test::test_point_distance
test result: FAILED. 8 passed; 7 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--test solution_test'
История (2 версии и 6 коментара)
Александър качи решение на 25.11.2018 19:16 (преди почти 7 години)
Ще ти дам бонус точка, задето си се опитал да имплементираш относително сравнение, но това не сработва съвсем. С останалите поправки, премахването на * f64::MIN_POSITIVE от втория клон минава тестовете. Реално, умножението на две числа по-малки от 1 намалява абсолютната стойност на числата, така че тази проверка е доста по-стриктна от просто сравнение с EPSILON.
Забавното е, че diff < f64::MIN_POSITIVE не мисля че би върнало истина, освен ако diff не е точно 0. Иначе как ще имаш float, който е по-малък от минималното положително число, което се репрезентира в f64? :)
Още един малшанс, p2.z - p2.z вероятно е трябвало да бъде p2.z - p1.z :). Още по-жалко е, че просто можеше да напишеш p2 - p1, понеже имаш имплементирано вадене на точки (затова го имаше в условието).
Израза cross_product.len() / cross_product.len() винаги ще върне 1 или NaN :). Подозирам, че си искал да напишеш cross_product.len() / self.vector.len(). Малшанс.
Първото условие има някакъв смисъл, но е доста специфично -- Двете точки не е нужно да бъдат една и съща, така че рядко би се случило то да върне истина.
Второто условие е малко странно. Разстоянието на self до other.point и това на other до self.point може да са равни на 0, но това да е просто защото point е едно и също. Тук има и проблема, че сравняваш директно с 0, вместо да използваш nearly_equal. Ей това би ти свършило работа:
fn eq(&self, other: &Line) -> bool {
nearly_equal(self.distance(other.point), 0.0) && nearly_equal(self.distance(other.point + other.vector), 0.0)
}
Доста е специфично, но мисля, че гърмеше с разстоянието щото се опитвам после да деля на 0.

Ще ти дам бонус точка, задето си се опитал да имплементираш относително сравнение, но това не сработва съвсем. С останалите поправки, премахването на
* f64::MIN_POSITIVEот втория клон минава тестовете. Реално, умножението на две числа по-малки от 1 намалява абсолютната стойност на числата, така че тази проверка е доста по-стриктна от просто сравнение сEPSILON.Забавното е, че
diff < f64::MIN_POSITIVEне мисля че би върнало истина, освен ако diff не е точно 0. Иначе как ще имаш float, който е по-малък от минималното положително число, което се репрезентира в f64? :)Още един малшанс,
p2.z - p2.zвероятно е трябвало да бъдеp2.z - p1.z:). Още по-жалко е, че просто можеше да напишешp2 - p1, понеже имаш имплементирано вадене на точки (затова го имаше в условието).Метода
distanceне е дефиниран правилно, и затова не се компилира. Виж как сме го дефинирали в условието:Израза
cross_product.len() / cross_product.len()винаги ще върне 1 илиNaN:). Подозирам, че си искал да напишешcross_product.len() / self.vector.len(). Малшанс.Първото условие има някакъв смисъл, но е доста специфично -- Двете точки не е нужно да бъдат една и съща, така че рядко би се случило то да върне истина.
Второто условие е малко странно. Разстоянието на
selfдоother.pointи това наotherдоself.pointможе да са равни на 0, но това да е просто защотоpointе едно и също. Тук има и проблема, че сравняваш директно с 0, вместо да използвашnearly_equal. Ей това би ти свършило работа:Доста е специфично, но мисля, че гърмеше с разстоянието щото се опитвам после да деля на 0.