summary refs log tree commit diff stats
path: root/rust/format/src/format_layer/mod.rs
blob: 1b93c97fbfe14b4bf6e54fe8c9806a82c826200f (plain) (blame)
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
201
202
203
204
205
206
207
208
209
use std::fmt::{Display, Write};

include!("output_def.fs");

macro_rules! check {
    ($c1:expr, $cf:expr, $ind:expr, $ma:expr) => {
        if ($cf[$ind] >= $ma) {
            $c1[$ind] = $cf[$ind];
        } else {
            // eprintln!("Changed {} from {} -> {}", stringify!($cf), $cf[$ind], $ma);
            $c1[$ind] = $ma;
            $cf[$ind] = $ma;
        }
    };
}

macro_rules! get {
    ($val:expr, $column:tt, $key:tt) => {
        [
            $val.row1.$key.$column.to_string(),
            $val.row2.$key.$column.to_string(),
            $val.row3.$key.$column.to_string(),
            $val.row4.$key.$column.to_string(),
            $val.row5.$key.$column.to_string(),
            $val.row6.$key.$column.to_string(),
        ]
        .iter()
        .map(|val| val.chars().count())
        .max()
        .expect("Works")
    };
}

impl Output {
    fn format(&self, c_column_max: &mut [usize; 14]) -> String {
        let mut columns_max = [0; 14];

        check!(columns_max, c_column_max, 0, get! {self, 0, 0});
        check!(columns_max, c_column_max, 1, get! {self, 1, 0});
        check!(columns_max, c_column_max, 2, get! {self, 2, 0});
        check!(columns_max, c_column_max, 3, get! {self, 3, 0});
        check!(columns_max, c_column_max, 4, get! {self, 4, 0});
        check!(columns_max, c_column_max, 5, get! {self, 5, 0});
        check!(columns_max, c_column_max, 6, get! {self, 6, 0});
        check!(columns_max, c_column_max, 7, get! {self, 0, 0});
        check!(columns_max, c_column_max, 8, get! {self, 1, 1});
        check!(columns_max, c_column_max, 9, get! {self, 2, 1});
        check!(columns_max, c_column_max, 10, get! {self, 3, 1});
        check!(columns_max, c_column_max, 11, get! {self, 4, 1});
        check!(columns_max, c_column_max, 12, get! {self, 5, 1});
        check!(columns_max, c_column_max, 13, get! {self, 6, 1});

        let mut f = String::new();
        write!(
            f,
            include_str!("prints.txt"),
            // row 1
            self.row1.0 .0,
            self.row1.0 .1,
            self.row1.0 .2,
            self.row1.0 .3,
            self.row1.0 .4,
            self.row1.0 .5,
            self.row1.0 .6,
            self.row1.1 .0,
            self.row1.1 .1,
            self.row1.1 .2,
            self.row1.1 .3,
            self.row1.1 .4,
            self.row1.1 .5,
            self.row1.1 .6,
            // row 2
            self.row2.0 .0,
            self.row2.0 .1,
            self.row2.0 .2,
            self.row2.0 .3,
            self.row2.0 .4,
            self.row2.0 .5,
            self.row2.0 .6,
            self.row2.1 .0,
            self.row2.1 .1,
            self.row2.1 .2,
            self.row2.1 .3,
            self.row2.1 .4,
            self.row2.1 .5,
            self.row2.1 .6,
            // row 3
            self.row3.0 .0,
            self.row3.0 .1,
            self.row3.0 .2,
            self.row3.0 .3,
            self.row3.0 .4,
            self.row3.0 .5,
            self.row3.0 .6,
            self.row3.1 .0,
            self.row3.1 .1,
            self.row3.1 .2,
            self.row3.1 .3,
            self.row3.1 .4,
            self.row3.1 .5,
            self.row3.1 .6,
            // row 4
            self.row4.0 .0.to_string(),
            self.row4.0 .1.to_string(),
            self.row4.0 .2.to_string(),
            self.row4.0 .3.to_string(),
            self.row4.0 .4.to_string(),
            self.row4.0 .5.to_string(),
            self.row4.0 .6.to_string(),
            self.row4.1 .0.to_string(),
            self.row4.1 .1.to_string(),
            self.row4.1 .2.to_string(),
            self.row4.1 .3.to_string(),
            self.row4.1 .4.to_string(),
            self.row4.1 .5.to_string(),
            self.row4.1 .6.to_string(),
            // row 5
            self.row5.0 .0.to_string(),
            self.row5.0 .1.to_string(),
            self.row5.0 .2.to_string(),
            self.row5.0 .3.to_string(),
            self.row5.0 .4.to_string(),
            self.row5.0 .5.to_string(),
            self.row5.0 .6.to_string(),
            self.row5.1 .0.to_string(),
            self.row5.1 .1.to_string(),
            self.row5.1 .2.to_string(),
            self.row5.1 .3.to_string(),
            self.row5.1 .4.to_string(),
            self.row5.1 .5.to_string(),
            self.row4.1 .6.to_string(),
            // thumbs
            self.row6.0 .0.to_string(),
            self.row6.0 .1.to_string(),
            self.row6.0 .2.to_string(),
            self.row6.0 .3.to_string(),
            self.row6.0 .4.to_string(),
            self.row6.0 .5.to_string(),
            self.row6.0 .6.to_string(),
            self.row6.1 .0.to_string(),
            self.row6.1 .1.to_string(),
            self.row6.1 .2.to_string(),
            self.row6.1 .3.to_string(),
            self.row6.1 .4.to_string(),
            self.row6.1 .5.to_string(),
            self.row6.1 .6.to_string(),
            col0 = columns_max[0],
            col1 = columns_max[1],
            col2 = columns_max[2],
            col3 = columns_max[3],
            col4 = columns_max[4],
            col5 = columns_max[5],
            col6 = columns_max[6],
            col7 = columns_max[7],
            col8 = columns_max[8],
            col9 = columns_max[9],
            col10 = columns_max[10],
            col11 = columns_max[11],
            col12 = columns_max[12],
            col13 = columns_max[13],
        )
        .expect("Works");
        f
    }
}

#[must_use]
pub fn format_layer(input: String, c_column_max: &mut [usize; 14]) -> String {
    let mut a = input
        .lines()
        .map(|val| val.to_owned())
        .collect::<Vec<String>>()
        .join(" ")
        .split_whitespace()
        .map(|val| val.to_owned())
        .rev()
        .collect::<Vec<String>>();
    let mut n = || a.pop().expect("This should exist");
    let e = || Emt();

    let out = Output {
        row1: (
            (n(), n(), n(), n(), n(), n(), n()),
            (n(), n(), n(), n(), n(), n(), n()),
        ),
        row2: (
            (n(), n(), n(), n(), n(), n(), n()),
            (n(), n(), n(), n(), n(), n(), n()),
        ),
        row3: (
            (n(), n(), n(), n(), n(), n(), n()),
            (n(), n(), n(), n(), n(), n(), n()),
        ),
        row4: (
            (n(), n(), n(), n(), n(), n(), e()),
            (e(), n(), n(), n(), n(), n(), n()),
        ),
        row5: (
            (n(), n(), n(), n(), n(), n(), e()),
            (e(), n(), n(), n(), n(), n(), n()),
        ),
        row6: (
            (e(), e(), e(), n(), n(), n(), e()),
            (e(), n(), n(), n(), e(), e(), e()),
        ),
    };

    out.format(c_column_max)
}