| 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 |
|---|
| - - |
