#include <iostream>
#include <limits>
#include <map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <memory>
using namespace std;
const int max_hour = std::numeric_limits<int>::max() / 2;
int solve(const string& s,
char height = 0,
double a = 0,
double b = 0,
double a_base = 1000.0,
double b_base = 1.0,
shared_ptr< map<double, int> > searched = make_shared< map<double, int> >());
int solve_sub(const string& s, char height,
double a, double b,
double a_base, double b_base,
shared_ptr< map<double, int> > searched) {
if (height == ':')
return 0;
int hour = max_hour;
int l = s.length() - 1;
if (a + b > l)
return max_hour;
int fwd_a = floor(a + 1.0);
int back_a = ceil(a - 1.0);
vector<int> a_pos = { fwd_a, back_a };
// move A to left and right peak or bottom
for (int a : a_pos) {
if (a < 0 || a > l)
continue;
char h = s[a];
int took_hour = abs(height - h);
int fwd_b = floor(b + 1.0);
if (fwd_b < l) {
// can B move to left peak/bottom?
if (s[l - fwd_b] == h) {
// move B to left peak/bottom
if (h == ':')
return took_hour;
hour = min(hour, took_hour + solve(s, h, a, fwd_b, a_base, b_base, searched));
}
// can B move to left slope?
char high = max(s[l - fwd_b], s[l - (fwd_b - 1)]);
char low = min(s[l - fwd_b], s[l - (fwd_b - 1)]);
if (low < h && h < high) {
// move A to right, B to left slope
hour = min(hour, took_hour + solve(s, h, a, fwd_b - 0.5, a_base, b_base, searched));
}
}
// can B move to right peak/bottom?
int back_b = ceil(b - 1.0);
if (back_b >= 0) {
// can B move to right peak/bottom?
if (s[l - back_b] == h) {
// move B to left peak/bottom
if (h == ':')
return took_hour;
hour = min(hour, took_hour + solve(s, h, a, back_b, a_base, b_base, searched));
}
// can B move to right slope?
char high = max(s[l - back_b], s[l - (back_b + 1)]);
char low = min(s[l - back_b], s[l - (back_b + 1)]);
if (low < h && h < high) {
// move A to right, B to left slope
hour = min(hour, took_hour + solve(s, h, a, back_b + 0.5, a_base, b_base, searched));
}
}
}
return hour;
}
int solve(const string& s, char height,
double a, double b,
double a_base, double b_base,
shared_ptr< map<double, int> > searched) {
double key = a*a_base + b*b_base;
auto p = searched->insert(make_pair(key, max_hour));
if (!p.second) {
// have result or loop
return p.first->second;
}
if (!height)
height = s[0];
string rev(s.rbegin(), s.rend());
int hour = solve_sub(s, height, a, b, a_base, b_base, searched);
int hour_rev = solve_sub(rev, height, b, a, b_base, a_base, searched);
int result = min(hour, hour_rev);
(*searched)[key] = result;
return result;
}
int main() {
string s;
while (cin >> s) {
cout << "\"" << s << "\" => " << solve(s) << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxtZW1vcnk+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IG1heF9ob3VyID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSAvIDI7CgppbnQgc29sdmUoY29uc3Qgc3RyaW5nJiBzLAogICAgY2hhciBoZWlnaHQgPSAwLAogICAgZG91YmxlIGEgPSAwLAogICAgZG91YmxlIGIgPSAwLAogICAgZG91YmxlIGFfYmFzZSA9IDEwMDAuMCwKICAgIGRvdWJsZSBiX2Jhc2UgPSAxLjAsCiAgICBzaGFyZWRfcHRyPCBtYXA8ZG91YmxlLCBpbnQ+ID4gc2VhcmNoZWQgPSBtYWtlX3NoYXJlZDwgbWFwPGRvdWJsZSwgaW50PiA+KCkpOwoKaW50IHNvbHZlX3N1Yihjb25zdCBzdHJpbmcmIHMsIGNoYXIgaGVpZ2h0LAogICAgZG91YmxlIGEsIGRvdWJsZSBiLAogICAgZG91YmxlIGFfYmFzZSwgZG91YmxlIGJfYmFzZSwKICAgIHNoYXJlZF9wdHI8IG1hcDxkb3VibGUsIGludD4gPiBzZWFyY2hlZCkgewoKICAgIGlmIChoZWlnaHQgPT0gJzonKQogICAgICAgIHJldHVybiAwOwoKICAgIGludCBob3VyID0gbWF4X2hvdXI7CiAgICBpbnQgbCA9IHMubGVuZ3RoKCkgLSAxOwoKICAgIGlmIChhICsgYiA+IGwpCiAgICAgICAgcmV0dXJuIG1heF9ob3VyOwoKICAgIGludCBmd2RfYSA9IGZsb29yKGEgKyAxLjApOwogICAgaW50IGJhY2tfYSA9IGNlaWwoYSAtIDEuMCk7CgoKICAgIHZlY3RvcjxpbnQ+IGFfcG9zID0geyBmd2RfYSwgYmFja19hIH07CgogICAgLy8gbW92ZSBBIHRvIGxlZnQgYW5kIHJpZ2h0IHBlYWsgb3IgYm90dG9tCiAgICBmb3IgKGludCBhIDogYV9wb3MpIHsKICAgICAgICBpZiAoYSA8IDAgfHwgYSA+IGwpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBjaGFyIGggPSBzW2FdOwogICAgICAgIGludCB0b29rX2hvdXIgPSBhYnMoaGVpZ2h0IC0gaCk7CgogICAgICAgIGludCBmd2RfYiA9IGZsb29yKGIgKyAxLjApOwogICAgICAgIGlmIChmd2RfYiA8IGwpIHsKICAgICAgICAgICAgLy8gY2FuIEIgbW92ZSB0byBsZWZ0IHBlYWsvYm90dG9tPwogICAgICAgICAgICBpZiAoc1tsIC0gZndkX2JdID09IGgpIHsKICAgICAgICAgICAgICAgIC8vIG1vdmUgQiB0byBsZWZ0IHBlYWsvYm90dG9tCiAgICAgICAgICAgICAgICBpZiAoaCA9PSAnOicpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvb2tfaG91cjsKICAgICAgICAgICAgICAgIGhvdXIgPSBtaW4oaG91ciwgdG9va19ob3VyICsgc29sdmUocywgaCwgYSwgZndkX2IsIGFfYmFzZSwgYl9iYXNlLCBzZWFyY2hlZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGNhbiBCIG1vdmUgdG8gbGVmdCBzbG9wZT8KICAgICAgICAgICAgY2hhciBoaWdoID0gbWF4KHNbbCAtIGZ3ZF9iXSwgc1tsIC0gKGZ3ZF9iIC0gMSldKTsKICAgICAgICAgICAgY2hhciBsb3cgPSBtaW4oc1tsIC0gZndkX2JdLCBzW2wgLSAoZndkX2IgLSAxKV0pOwogICAgICAgICAgICBpZiAobG93IDwgaCAmJiBoIDwgaGlnaCkgewogICAgICAgICAgICAgICAgLy8gbW92ZSBBIHRvIHJpZ2h0LCBCIHRvIGxlZnQgc2xvcGUKICAgICAgICAgICAgICAgIGhvdXIgPSBtaW4oaG91ciwgdG9va19ob3VyICsgc29sdmUocywgaCwgYSwgZndkX2IgLSAwLjUsIGFfYmFzZSwgYl9iYXNlLCBzZWFyY2hlZCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBjYW4gQiBtb3ZlIHRvIHJpZ2h0IHBlYWsvYm90dG9tPwogICAgICAgIGludCBiYWNrX2IgPSBjZWlsKGIgLSAxLjApOwogICAgICAgIGlmIChiYWNrX2IgPj0gMCkgewogICAgICAgICAgICAvLyBjYW4gQiBtb3ZlIHRvIHJpZ2h0IHBlYWsvYm90dG9tPwogICAgICAgICAgICBpZiAoc1tsIC0gYmFja19iXSA9PSBoKSB7CiAgICAgICAgICAgICAgICAvLyBtb3ZlIEIgdG8gbGVmdCBwZWFrL2JvdHRvbQogICAgICAgICAgICAgICAgaWYgKGggPT0gJzonKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b29rX2hvdXI7CiAgICAgICAgICAgICAgICBob3VyID0gbWluKGhvdXIsIHRvb2tfaG91ciArIHNvbHZlKHMsIGgsIGEsIGJhY2tfYiwgYV9iYXNlLCBiX2Jhc2UsIHNlYXJjaGVkKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY2FuIEIgbW92ZSB0byByaWdodCBzbG9wZT8KICAgICAgICAgICAgY2hhciBoaWdoID0gbWF4KHNbbCAtIGJhY2tfYl0sIHNbbCAtIChiYWNrX2IgKyAxKV0pOwogICAgICAgICAgICBjaGFyIGxvdyA9IG1pbihzW2wgLSBiYWNrX2JdLCBzW2wgLSAoYmFja19iICsgMSldKTsKICAgICAgICAgICAgaWYgKGxvdyA8IGggJiYgaCA8IGhpZ2gpIHsKICAgICAgICAgICAgICAgIC8vIG1vdmUgQSB0byByaWdodCwgQiB0byBsZWZ0IHNsb3BlCiAgICAgICAgICAgICAgICBob3VyID0gbWluKGhvdXIsIHRvb2tfaG91ciArIHNvbHZlKHMsIGgsIGEsIGJhY2tfYiArIDAuNSwgYV9iYXNlLCBiX2Jhc2UsIHNlYXJjaGVkKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGhvdXI7Cn0KCmludCBzb2x2ZShjb25zdCBzdHJpbmcmIHMsIGNoYXIgaGVpZ2h0LAogICAgZG91YmxlIGEsIGRvdWJsZSBiLAogICAgZG91YmxlIGFfYmFzZSwgZG91YmxlIGJfYmFzZSwKICAgIHNoYXJlZF9wdHI8IG1hcDxkb3VibGUsIGludD4gPiBzZWFyY2hlZCkgewoKICAgIGRvdWJsZSBrZXkgPSBhKmFfYmFzZSArIGIqYl9iYXNlOwogICAgYXV0byBwID0gc2VhcmNoZWQtPmluc2VydChtYWtlX3BhaXIoa2V5LCBtYXhfaG91cikpOwogICAgaWYgKCFwLnNlY29uZCkgewogICAgICAgIC8vIGhhdmUgcmVzdWx0IG9yIGxvb3AKICAgICAgICByZXR1cm4gcC5maXJzdC0+c2Vjb25kOwogICAgfQoKICAgIGlmICghaGVpZ2h0KQogICAgICAgIGhlaWdodCA9IHNbMF07CgogICAgc3RyaW5nIHJldihzLnJiZWdpbigpLCBzLnJlbmQoKSk7CiAgICBpbnQgaG91ciA9IHNvbHZlX3N1YihzLCBoZWlnaHQsIGEsIGIsIGFfYmFzZSwgYl9iYXNlLCBzZWFyY2hlZCk7CiAgICBpbnQgaG91cl9yZXYgPSBzb2x2ZV9zdWIocmV2LCBoZWlnaHQsIGIsIGEsIGJfYmFzZSwgYV9iYXNlLCBzZWFyY2hlZCk7CiAgICBpbnQgcmVzdWx0ID0gbWluKGhvdXIsIGhvdXJfcmV2KTsKICAgICgqc2VhcmNoZWQpW2tleV0gPSByZXN1bHQ7CiAgICByZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKCXN0cmluZyBzOwoJd2hpbGUgKGNpbiA+PiBzKSB7CgkJY291dCA8PCAiXCIiIDw8IHMgPDwgIlwiID0+ICIgPDwgc29sdmUocykgPDwgZW5kbDsKCX0KCXJldHVybiAwOwp9