Task: | Arpakuutiot |
Sender: | antti_p |
Submission time: | 2020-10-09 10:58:32 +0300 |
Language: | Rust |
Status: | READY |
Result: | 100 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 35 |
#2 | ACCEPTED | 65 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.01 s | 1, 2 | details |
#2 | ACCEPTED | 0.01 s | 1, 2 | details |
#3 | ACCEPTED | 0.01 s | 1, 2 | details |
#4 | ACCEPTED | 0.01 s | 1, 2 | details |
#5 | ACCEPTED | 0.01 s | 1, 2 | details |
#6 | ACCEPTED | 0.01 s | 1, 2 | details |
#7 | ACCEPTED | 0.01 s | 1, 2 | details |
#8 | ACCEPTED | 0.01 s | 1, 2 | details |
#9 | ACCEPTED | 0.01 s | 1, 2 | details |
#10 | ACCEPTED | 0.01 s | 1, 2 | details |
#11 | ACCEPTED | 0.01 s | 2 | details |
#12 | ACCEPTED | 0.01 s | 2 | details |
#13 | ACCEPTED | 0.01 s | 2 | details |
#14 | ACCEPTED | 0.01 s | 2 | details |
#15 | ACCEPTED | 0.01 s | 2 | details |
#16 | ACCEPTED | 0.01 s | 2 | details |
#17 | ACCEPTED | 0.01 s | 2 | details |
#18 | ACCEPTED | 0.01 s | 2 | details |
#19 | ACCEPTED | 0.01 s | 2 | details |
#20 | ACCEPTED | 0.01 s | 2 | details |
#21 | ACCEPTED | 0.01 s | 2 | details |
#22 | ACCEPTED | 0.01 s | 2 | details |
#23 | ACCEPTED | 0.01 s | 2 | details |
#24 | ACCEPTED | 0.01 s | 2 | details |
#25 | ACCEPTED | 0.01 s | 2 | details |
#26 | ACCEPTED | 0.01 s | 2 | details |
#27 | ACCEPTED | 0.01 s | 2 | details |
#28 | ACCEPTED | 0.01 s | 2 | details |
#29 | ACCEPTED | 0.01 s | 2 | details |
#30 | ACCEPTED | 0.01 s | 2 | details |
#31 | ACCEPTED | 0.01 s | 1, 2 | details |
Compiler report
warning: unused variable: `f` --> input/code.rs:102:33 | 102 | fn arrow_left(o: Orientation3D, f: Orientation3D) -> Orientation3D { | ^ help: consider prefixing with an underscore: `_f` | = note: `#[warn(unused_variables)]` on by default warning: unused variable: `f` --> input/code.rs:106:34 | 106 | fn arrow_right(o: Orientation3D, f: Orientation3D) -> Orientation3D { | ^ help: consider prefixing with an underscore: `_f`
Code
use std::io; use std::io::prelude::*; // Arpakuutioiden luoktus: // 1. Mikä sivu 1:stä vastapäätä // 2. Mikä seuraavista permutaatioista // 1234 // 1324 // 2134 // 2314 // 3124 // 3214 #[derive(Debug, Clone, Copy)] enum Orientation3D { PX, NX, PY, NY, PZ, NZ, } // On flat surface always points left #[derive(Debug, Clone, Copy)] enum Orientation2D { Left, Right, Top, Bottom, } // Cube faces: // +X = 0 // -X = 1 // +Y = 2 // -Y = 3 // +Z = 4 // -Z = 5 fn rotate(face: Orientation3D, rot: Orientation3D) -> Orientation3D { use Orientation3D::*; match (rot, face) { (PX, PX) => PX, (PX, NX) => NX, (PX, PY) => PZ, (PX, NY) => NZ, (PX, PZ) => NY, (PX, NZ) => PY, (NX, PX) => PX, (NX, NX) => NX, (NX, PY) => NZ, (NX, NY) => PZ, (NX, PZ) => PY, (NX, NZ) => NY, (PY, PX) => NZ, (PY, NX) => PZ, (PY, PY) => PY, (PY, NY) => NY, (PY, PZ) => PX, (PY, NZ) => NX, (NY, PX) => PZ, (NY, NX) => NZ, (NY, PY) => PY, (NY, NY) => NY, (NY, PZ) => NX, (NY, NZ) => PX, (PZ, PX) => PY, (PZ, NX) => NY, (PZ, PY) => NX, (PZ, NY) => PX, (PZ, PZ) => PZ, (PZ, NZ) => NZ, (NZ, PX) => NY, (NZ, NX) => PY, (NZ, PY) => PX, (NZ, NY) => NX, (NZ, PZ) => PZ, (NZ, NZ) => NZ, } } fn negate(o: Orientation3D) -> Orientation3D { use Orientation3D::*; match o { PX => NX, NX => PX, PY => NY, NY => PY, PZ => NZ, NZ => PZ, } } fn arrow_left(o: Orientation3D, f: Orientation3D) -> Orientation3D { o } fn arrow_right(o: Orientation3D, f: Orientation3D) -> Orientation3D { negate(o) } fn arrow_top(o: Orientation3D, f: Orientation3D) -> Orientation3D { negate(arrow_bottom(o, f)) } fn arrow_bottom(o: Orientation3D, f: Orientation3D) -> Orientation3D { rotate(o, f) } // Return first orientation then position fn apply_orientation(o: Orientation3D, f: Orientation3D, d: Orientation2D) -> (Orientation3D, Orientation3D) { use Orientation2D::*; match d { Left => (rotate(o, arrow_bottom(o, f)), rotate(f, arrow_bottom(o, f))), Right => (rotate(o, arrow_top(o, f)), rotate(f, arrow_top(o, f))), Top => (o, rotate(f, arrow_left(o, f))), Bottom => (o, rotate(f, arrow_right(o, f))), } } fn cp(f: Orientation3D) -> usize { use Orientation3D::*; match f { PX => 0, NX => 1, PY => 2, NY => 3, PZ => 4, NZ => 5, } } fn pc(u: usize) -> Orientation3D { use Orientation3D::*; match u { 0 => PX, 1 => NX, 2 => PY, 3 => NY, 4 => PZ, 5 => NZ, _ => panic!(), } } fn read_and_classify(data: &mut [Option<u32>]) -> u32 { let mut cube = [u32::MAX; 6]; for y in 0..5 { for x in 0..5 { if data[y*5 + x].is_some() { read_cube(&mut cube, data, x, y, Orientation3D::PY, Orientation3D::PX); break; } } } classify_cube(&mut cube) } fn read_cube(cube: &mut [u32], data: &mut [Option<u32>], x: usize, y: usize, o: Orientation3D, f: Orientation3D) { //println!("Called read_cube with x: {}, y: {}, o: {:?}, f: {:?}", x, y, o, f); use Orientation2D::*; if cube[cp(f)] != u32::MAX { //println!("Returning read_cube (early)"); return } if let Some(n) = data[y*5 + x] { //println!("read_cube: is_some"); cube[cp(f)] = n; if y > 0 { let (no, nf) = apply_orientation(o, f, Top); read_cube(cube, data, x, y - 1, no, nf); } if y < 5 { let (no, nf) = apply_orientation(o, f, Bottom); read_cube(cube, data, x, y + 1, no, nf); } if x > 0 { let (no, nf) = apply_orientation(o, f, Left); read_cube(cube, data, x - 1, y, no, nf); } if x < 5 { let (no, nf) = apply_orientation(o, f, Right); read_cube(cube, data, x + 1, y, no, nf); } } //println!("Returning read_cube (end)"); } fn classify_cube(cube: &[u32]) -> u32 { //println!("Called classify_cube with cube: {:?}", cube); use Orientation3D::*; let mut j = 6; for i in 0..6 { if cube[i] == 1 { j = i; break } } let one = pc(j); let oppi = cp(negate(one)); let opp = cube[oppi]; let mut round = match one { PX | NX => { [cube[cp(PY)], cube[cp(PZ)], cube[cp(NY)], cube[cp(NZ)]] } PY | NY => { [cube[cp(PZ)], cube[cp(PX)], cube[cp(NZ)], cube[cp(NX)]] } PZ | NZ => { [cube[cp(PX)], cube[cp(PY)], cube[cp(NX)], cube[cp(NY)]] } }; match one { NX | NY | NZ => { round.reverse() } _ => {} }; (opp - 1)*6 + classify_cyclic_permutation(&round) } // 1234 // 1324 // 2134 // 2314 // 3124 // 3214 fn classify_cyclic_permutation(round: &[u32]) -> u32 { let mi = round.iter().enumerate().max_by_key(|(_, vx)| *vx).unwrap().0; let v : Vec<_> = round.iter().cycle().skip(mi + 1).take(3).collect(); match (v[0] < v[1], v[1] < v[2]) { (true, true) => 0, (true, false) => if v[0] < v[2] {1} else {3}, (false, true) => if v[0] < v[2] {2} else {4} (false, false) => 5 } } fn main() { let stdin = io::stdin(); let mut lines = stdin.lock().lines(); let num = lines.next().unwrap().unwrap().parse::<usize>().unwrap(); let mut cubes = Vec::new(); for k in 0..num { if k != 0 { lines.next(); } let mut dat = Vec::new(); for _ in 0..5 { for c in lines.next().unwrap().unwrap().chars() { dat.push(c.to_string().parse::<u32>().ok()); } } //println!("Dat: {:?}", dat); cubes.push(read_and_classify(&mut dat)); } //println!("Cubes: {:?}", cubes); //println!(); //println!(); for i in 0..cubes.len() { let mut some = false; for j in 0..cubes.len() { if i == j { continue } if cubes[i] == cubes[j] { print!("{} ", j + 1); some = true; } } if !some { print!("-"); } println!(); } }
Test details
Test 1
Group: 1, 2
Verdict: ACCEPTED
input |
---|
3 165.. .4... .3... .2... ... |
correct output |
---|
3 - 1 |
user output |
---|
3 - 1 |
Test 2
Group: 1, 2
Verdict: ACCEPTED
input |
---|
5 264.. .5... .3... .1... ... |
correct output |
---|
3 4 5 1 2 5 2 4 |
user output |
---|
3 4 5 1 2 5 2 4 |
Test 3
Group: 1, 2
Verdict: ACCEPTED
input |
---|
5 152.. .4... .3... .6... ... |
correct output |
---|
3 5 4 1 5 2 1 3 |
user output |
---|
3 5 4 1 5 2 1 3 |
Test 4
Group: 1, 2
Verdict: ACCEPTED
input |
---|
5 142.. .6... .3... .5... ... |
correct output |
---|
4 5 3 2 1 5 1 4 |
user output |
---|
4 5 3 2 1 5 1 4 |
Test 5
Group: 1, 2
Verdict: ACCEPTED
input |
---|
5 123.. .4... .6... .5... ... |
correct output |
---|
3 4 5 1 2 5 2 4 |
user output |
---|
3 4 5 1 2 5 2 4 |
Test 6
Group: 1, 2
Verdict: ACCEPTED
input |
---|
5 213.. .6... .4... .5... ... |
correct output |
---|
4 5 3 2 1 5 1 4 |
user output |
---|
4 5 3 2 1 5 1 4 |
Test 7
Group: 1, 2
Verdict: ACCEPTED
input |
---|
5 314.. .5... .2... .6... ... |
correct output |
---|
3 4 5 1 2 5 2 4 |
user output |
---|
3 4 5 1 2 5 2 4 |
Test 8
Group: 1, 2
Verdict: ACCEPTED
input |
---|
5 163.. .2... .5... .4... ... |
correct output |
---|
4 5 3 2 1 5 1 4 |
user output |
---|
4 5 3 2 1 5 1 4 |
Test 9
Group: 1, 2
Verdict: ACCEPTED
input |
---|
5 264.. .1... .3... .5... ... |
correct output |
---|
2 3 1 3 1 2 5 4 |
user output |
---|
2 3 1 3 1 2 5 4 |
Test 10
Group: 1, 2
Verdict: ACCEPTED
input |
---|
5 214.. .3... .5... .6... ... |
correct output |
---|
5 3 4 2 4 2 3 1 |
user output |
---|
5 3 4 2 4 2 3 1 |
Test 11
Group: 2
Verdict: ACCEPTED
input |
---|
10 .41.. .5... .2... 36... ... |
correct output |
---|
9 4 6 8 7 10 2 6 8 - ... |
user output |
---|
9 4 6 8 7 10 2 6 8 - ... |
Test 12
Group: 2
Verdict: ACCEPTED
input |
---|
10 5.... 1436. .2... ..... ... |
correct output |
---|
5 8 6 10 4 7 9 3 7 9 1 8 ... |
user output |
---|
5 8 6 10 4 7 9 3 7 9 1 8 ... |
Test 13
Group: 2
Verdict: ACCEPTED
input |
---|
10 2.... 41... .63.. .5... ... |
correct output |
---|
4 9 10 5 6 7 8 - 1 9 10 2 6 7 8 ... |
user output |
---|
4 9 10 5 6 7 8 - 1 9 10 2 6 7 8 ... |
Test 14
Group: 2
Verdict: ACCEPTED
input |
---|
10 1.... 634.. ..52. ..... ... |
correct output |
---|
2 3 4 5 6 9 10 1 3 4 5 6 9 10 1 2 4 5 6 9 10 1 2 3 5 6 9 10 1 2 3 4 6 9 10 ... |
user output |
---|
2 3 4 5 6 9 10 1 3 4 5 6 9 10 1 2 4 5 6 9 10 1 2 3 5 6 9 10 1 2 3 4 6 9 10 ... Truncated |
Test 15
Group: 2
Verdict: ACCEPTED
input |
---|
10 .2... 4516. 3.... ..... ... |
correct output |
---|
5 7 9 10 8 4 6 3 6 1 7 9 10 ... |
user output |
---|
5 7 9 10 8 4 6 3 6 1 7 9 10 ... |
Test 16
Group: 2
Verdict: ACCEPTED
input |
---|
10 .56.. .2... .4... 31... ... |
correct output |
---|
4 9 3 5 10 2 5 10 1 9 2 3 10 ... |
user output |
---|
4 9 3 5 10 2 5 10 1 9 2 3 10 ... |
Test 17
Group: 2
Verdict: ACCEPTED
input |
---|
10 ..62. .31.. 45... ..... ... |
correct output |
---|
2 3 4 8 1 3 4 8 1 2 4 8 1 2 3 8 6 7 9 10 ... |
user output |
---|
2 3 4 8 1 3 4 8 1 2 4 8 1 2 3 8 6 7 9 10 ... Truncated |
Test 18
Group: 2
Verdict: ACCEPTED
input |
---|
10 532.. .4... .1... .6... ... |
correct output |
---|
3 8 9 5 6 1 8 9 7 10 2 6 ... |
user output |
---|
3 8 9 5 6 1 8 9 7 10 2 6 ... |
Test 19
Group: 2
Verdict: ACCEPTED
input |
---|
10 .64.. .1... .3... 52... ... |
correct output |
---|
2 5 6 7 8 9 1 5 6 7 8 9 4 10 3 10 1 2 6 7 8 9 ... |
user output |
---|
2 5 6 7 8 9 1 5 6 7 8 9 4 10 3 10 1 2 6 7 8 9 ... Truncated |
Test 20
Group: 2
Verdict: ACCEPTED
input |
---|
10 .4... 326.. .1... .5... ... |
correct output |
---|
4 7 8 6 9 10 5 1 7 8 3 ... |
user output |
---|
4 7 8 6 9 10 5 1 7 8 3 ... |
Test 21
Group: 2
Verdict: ACCEPTED
input |
---|
20 .6... .4... 31... .25.. ... |
correct output |
---|
3 7 11 16 6 1 7 11 16 5 19 4 19 ... |
user output |
---|
3 7 11 16 6 1 7 11 16 5 19 4 19 ... Truncated |
Test 22
Group: 2
Verdict: ACCEPTED
input |
---|
20 3.... 5614. ..2.. ..... ... |
correct output |
---|
7 10 11 17 20 12 4 9 13 15 18 3 9 13 15 18 8 14 16 ... |
user output |
---|
7 10 11 17 20 12 4 9 13 15 18 3 9 13 15 18 8 14 16 ... Truncated |
Test 23
Group: 2
Verdict: ACCEPTED
input |
---|
20 42... .316. .5... ..... ... |
correct output |
---|
5 12 13 15 18 16 20 6 8 14 9 19 1 12 13 15 18 ... |
user output |
---|
5 12 13 15 18 16 20 6 8 14 9 19 1 12 13 15 18 ... Truncated |
Test 24
Group: 2
Verdict: ACCEPTED
input |
---|
20 ..5.. .623. 41... ..... ... |
correct output |
---|
2 6 11 12 13 1 6 11 12 13 5 16 18 7 14 3 16 18 ... |
user output |
---|
2 6 11 12 13 1 6 11 12 13 5 16 18 7 14 3 16 18 ... Truncated |
Test 25
Group: 2
Verdict: ACCEPTED
input |
---|
20 .46.. 53... .1... .2... ... |
correct output |
---|
2 3 5 7 15 17 19 1 3 5 7 15 17 19 1 2 5 7 15 17 19 8 10 11 14 1 2 3 7 15 17 19 ... |
user output |
---|
2 3 5 7 15 17 19 1 3 5 7 15 17 19 1 2 5 7 15 17 19 8 10 11 14 1 2 3 7 15 17 19 ... Truncated |
Test 26
Group: 2
Verdict: ACCEPTED
input |
---|
20 .61.. .4... 35... .2... ... |
correct output |
---|
8 10 20 3 17 18 19 2 17 18 19 14 15 6 7 9 13 ... |
user output |
---|
8 10 20 3 17 18 19 2 17 18 19 14 15 6 7 9 13 ... Truncated |
Test 27
Group: 2
Verdict: ACCEPTED
input |
---|
20 ..2.. 1463. .5... ..... ... |
correct output |
---|
2 3 5 6 9 20 1 3 5 6 9 20 1 2 5 6 9 20 11 19 1 2 3 6 9 20 ... |
user output |
---|
2 3 5 6 9 20 1 3 5 6 9 20 1 2 5 6 9 20 11 19 1 2 3 6 9 20 ... Truncated |
Test 28
Group: 2
Verdict: ACCEPTED
input |
---|
20 ...4. 5132. 6.... ..... ... |
correct output |
---|
2 8 10 12 13 19 1 8 10 12 13 19 4 5 15 16 17 3 5 15 16 17 3 4 15 16 17 ... |
user output |
---|
2 8 10 12 13 19 1 8 10 12 13 19 4 5 15 16 17 3 5 15 16 17 3 4 15 16 17 ... Truncated |
Test 29
Group: 2
Verdict: ACCEPTED
input |
---|
20 .2... .31.. 45... 6.... ... |
correct output |
---|
5 8 9 14 17 3 10 16 2 10 16 13 15 19 1 8 9 14 17 ... |
user output |
---|
5 8 9 14 17 3 10 16 2 10 16 13 15 19 1 8 9 14 17 ... Truncated |
Test 30
Group: 2
Verdict: ACCEPTED
input |
---|
20 3.... 452.. .1... .6... ... |
correct output |
---|
3 7 8 9 14 15 16 19 4 12 13 17 1 7 8 9 14 15 16 19 2 12 13 17 11 20 ... |
user output |
---|
3 7 8 9 14 15 16 19 4 12 13 17 1 7 8 9 14 15 16 19 2 12 13 17 11 20 ... Truncated |
Test 31
Group: 1, 2
Verdict: ACCEPTED
input |
---|
2 546.. .3... .2... .1... ... |
correct output |
---|
- - |
user output |
---|
- - |