1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

オフラインリアルタイムどう書く E27「とあるカードゲーム」を力業だけで解いた

Posted at

問題: http://nabetani.sakura.ne.jp/hena/orde27cardgame/

みんなの解答: https://qiita.com/Nabetani/items/cdc102d186faaf542574

orde27.cpp
# include <iostream>
# include <algorithm>
# include <string>

bool story(const int* begin, const int* end) {
    for (const int* p = begin; p < end - 1; ++p) {
        if ((p[0] >> 8) != (p[1] >> 8)) {
            return false;
        }
        if ((p[0] & 255) != (p[1] & 255) + 1) {
            return false;
        }
    }
    return true;
}

bool kind(const int* begin, const int* end) {
    for (const int* p = begin; p < end - 1; ++p) {
        if ((p[0] & 255) != (p[1] & 255)) {
            return false;
        }
        if ((p[0] >> 8) != (p[1] >> 8) + 1) {
            return false;
        }
    }
    return true;
}

bool story_or_kind(const int* begin, const int* end) {
    return story(begin, end) || kind(begin, end);
}

bool score49(const int cards[8]) {
    return story_or_kind(cards, cards + 8);
}

bool score26(const int cards[8]) {
    return story_or_kind(cards, cards + 6) &&
           story_or_kind(cards + 6, cards + 8);
}

bool score20(const int cards[8]) {
    return story_or_kind(cards, cards + 5) &&
           story_or_kind(cards + 5, cards + 8);
}

bool score18(const int cards[8]) {
    return story_or_kind(cards, cards + 4) &&
           story_or_kind(cards + 4, cards + 8);
}

bool score11(const int cards[8]) {
    return story_or_kind(cards, cards + 4) &&
           story_or_kind(cards + 4, cards + 6) &&
           story_or_kind(cards + 6, cards + 8);
}

bool score9(const int cards[8]) {
    return story_or_kind(cards, cards + 3) &&
           story_or_kind(cards + 3, cards + 6) &&
           story_or_kind(cards + 6, cards + 8);
}

bool score4(const int cards[8]) {
    return story_or_kind(cards, cards + 2) &&
           story_or_kind(cards + 2, cards + 4) &&
           story_or_kind(cards + 4, cards + 6) &&
           story_or_kind(cards + 6, cards + 8);
}

std::string solve(const std::string& input) {
    int cards[8];
    for (int i = 0; i < 8; ++i) {
        cards[i] = input[i * 3] << 8 | input[i * 3 + 1];
    }

    std::sort(cards, cards + 8);

    do { if (score49(cards)) { return "49"; } } while (std::next_permutation(cards, cards + 8));
    do { if (score26(cards)) { return "26"; } } while (std::next_permutation(cards, cards + 8));
    do { if (score20(cards)) { return "20"; } } while (std::next_permutation(cards, cards + 8));
    do { if (score18(cards)) { return "18"; } } while (std::next_permutation(cards, cards + 8));
    do { if (score11(cards)) { return "11"; } } while (std::next_permutation(cards, cards + 8));
    do { if (score9(cards))  { return  "9"; } } while (std::next_permutation(cards, cards + 8));
    do { if (score4(cards))  { return  "4"; } } while (std::next_permutation(cards, cards + 8));

    return "-";
}

void test(const std::string& input, const std::string& expected) {
    std::cout << input << " ";
    std::string actual = solve(input);
    if (expected == actual) {
        std::cout << "passed";
    } else {
        std::cout << "failed  expected: " << expected << ", actual: " << actual;
    }
    std::cout << std::endl;
}

int main(int, char* []) {
    /*0*/ test( "A1,A2,A3,A4,B3,C3,D5,E5", "11" );
    /*1*/ test( "A1,B2,C3,D4,E5,F6,G7,A8", "-" );
    /*2*/ test( "A3,A5,A4,A6,A7,A1,A2,A8", "49" );
    /*3*/ test( "G2,G1,A1,F1,C1,E1,B1,D1", "26" );
    /*4*/ test( "E3,G3,D4,F3,D3,C3,B3,A3", "9" );
    /*5*/ test( "A1,C1,C2,E3,B1,B2,A2,D3", "9" );
    /*6*/ test( "D2,E2,C1,B2,C2,B1,A2,A1", "20" );
    /*7*/ test( "C2,B3,B4,A1,A2,B2,B1,C1", "11" );
    /*8*/ test( "D1,B1,D3,C3,D2,B2,C1,B3", "4" );
    /*9*/ test( "C1,F5,F6,B2,C2,D2,F4,C3", "-" );
    /*10*/ test( "D2,A2,C2,E2,F2,B2,C3,C1", "9" );
    /*11*/ test( "D6,E7,D8,F7,C7,G7,D7,D5", "-" );
    /*12*/ test( "B2,B3,B4,D5,D2,D4,D3,C3", "-" );
    /*13*/ test( "C3,D3,B2,B1,E4,E5,D4,C2", "4" );
    /*14*/ test( "D3,E4,E2,C1,F4,D2,E3,C2", "4" );
    /*15*/ test( "B4,C3,D5,C4,A4,C5,B5,B6", "4" );
    /*16*/ test( "E9,D8,D9,D7,F8,F9,E8,E7", "9" );
    /*17*/ test( "F9,C9,D7,D9,D8,E7,E9,F8", "-" );
    /*18*/ test( "D4,C5,B5,B6,D3,D2,D5,B7", "11" );
    /*19*/ test( "B8,D8,D7,A7,A8,D9,C8,A9", "9" );
    /*20*/ test( "F3,E3,F7,E5,E6,E4,E7,F6", "11" );
    /*21*/ test( "A9,G9,B8,A7,G7,C8,A8,G8", "9" );
    /*22*/ test( "G8,G2,G3,G9,G6,G4,G5,G7", "49" );
    /*23*/ test( "E9,E1,B9,D1,C9,G9,D9,F9", "26" );
    /*24*/ test( "B9,B7,G3,A7,G4,B1,B8,B2", "4" );
    /*25*/ test( "A1,B4,B3,A4,A2,B5,A3,A5", "20" );
    /*26*/ test( "B3,D3,F3,G2,C3,A3,E3,G3", "26" );
    /*27*/ test( "E8,D8,E7,D7,G8,G7,F7,F8", "18" );
    /*28*/ test( "D4,B3,E4,A3,C4,E3,D3,C3", "20" );
    /*29*/ test( "B7,B5,E4,B6,D4,A4,B4,C4", "20" );
    /*30*/ test( "B2,B1,B7,C8,F2,B9,B8,F1", "-" );
    /*31*/ test( "C4,C3,C5,E3,E1,E2,E4,C2", "18" );
    /*32*/ test( "G1,E1,D1,A1,F1,A2,B1,C1", "26" );
    /*33*/ test( "E4,C5,C4,B4,D4,D5,E5,F5", "18" );
    /*34*/ test( "D4,G4,A4,F4,C4,A3,E4,B4", "26" );
    /*35*/ test( "B3,A9,G4,F4,A8,B4,G8,A3", "-" );
    /*36*/ test( "B4,E3,F4,E4,G3,A4,G4,F3", "9" );
    /*37*/ test( "E4,B3,E3,C3,A3,G3,F3,A2", "4" );
    /*38*/ test( "C5,C4,C6,C8,C1,C2,C7,C3", "49" );
    /*39*/ test( "C4,D4,E4,F3,E3,F4,D3,G4", "20" );
    /*40*/ test( "F2,F6,F9,F7,F5,F3,F8,F4", "49" );
    /*41*/ test( "A9,A3,A8,A2,B9,B8,A7,A1", "9" );
    /*42*/ test( "G9,A8,G8,A6,A9,G6,G7,A7", "18" );
    /*43*/ test( "B8,C4,D5,D4,C8,D8,E8,B4", "11" );
    /*44*/ test( "B1,B2,F6,E4,C1,C2,F4,F5", "4" );
    /*45*/ test( "B4,B3,B5,B1,B7,B8,B6,B2", "49" );
    /*46*/ test( "G8,A8,G7,A7,F7,G6,A6,F8", "9" );
    /*47*/ test( "B7,E7,D7,G7,C7,A7,F7,E8", "11" );
    /*48*/ test( "F3,D7,B7,D3,C3,G3,E3,D9", "-" );
    /*49*/ test( "B3,A6,C5,A3,A4,A2,B5,A5", "-" );
    /*50*/ test( "A8,D6,B8,C8,D7,C7,D8,E8", "4" );
    /*51*/ test( "B4,D9,C4,E9,E2,G9,F9,D2", "11" );
    /*52*/ test( "B3,G9,A9,G1,A1,F1,F9,A3", "-" );
    /*53*/ test( "G1,B1,A2,G2,B2,A1,A4,A3", "11" );
    /*54*/ test( "A7,A6,C7,B7,B5,G5,A5,F5", "4" );
    /*55*/ test( "D1,D9,D4,E4,E8,B4,F8,F4", "-" );
    /*56*/ test( "B4,A8,C8,G8,B7,A3,B3,C7", "-" );
    /*57*/ test( "D3,G3,D7,F3,D9,B7,E3,C3", "-" );
    /*58*/ test( "B9,B1,F2,B7,B2,C8,F1,B8", "-" );
    /*59*/ test( "F6,E4,F4,F5,B1,B2,C1,C2", "4" );
    /*60*/ test( "A5,G5,B5,B4,G6,C4,G7,A6", "-" );
    /*61*/ test( "C4,G3,F4,B7,A1,G4,D4,D5", "-" );
    /*62*/ test( "D7,G2,A4,A3,A7,A5,A6,F7", "-" );
    /*63*/ test( "F7,E5,E4,E3,E7,F3,F6,E6", "11" );
    /*64*/ test( "C1,E9,D4,G5,A5,C5,C6,B5", "-" );
    /*65*/ test( "E4,B6,A4,B4,B7,B5,C4,D4", "20" );
    /*66*/ test( "G9,B4,D9,D2,E2,C4,F9,E9", "11" );
    /*67*/ test( "B9,B2,B7,B1,G3,A7,B8,G4", "4" );
    /*68*/ test( "B2,C1,E7,E6,A2,D2,C2,A1", "-" );
    /*69*/ test( "A4,B4,F4,G4,E3,G3,E4,F3", "9" );
    /*70*/ test( "A8,D8,D6,D7,C8,B8,E8,C7", "4" );

    return 0;
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?