解決:「恋するハッカソン」の「「制服」ゲットチャレンジ!」がクリアできない


今日の午前中に投稿した
「「恋するハッカソン」の「「制服」ゲットチャレンジ!」がクリアできない」
の続き。

テストは通った。原因は分からずじまい。

とりあえず、
最初に配られるカードを
五枚にした単純なケースのコードを思い付きで書いてみて、
ひたすらシンプルに問題を見ようとした。
この試みは成功して無事にテストを通過できた。よかった。

また、後程、追記などで原因を特定したら書き込んでおこうと思う。
とりあえず、
五枚にした単純なケースのコードと、
テストを通過した本番コードをここに置いておく。

uniform_test.cs

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        string[] inputCardOrder = new string[5] { "5", "3", "1", "2", "4" };
        foreach (var inp in inputCardOrder)
        {
            Console.Write(inp);
        }
        Console.WriteLine();

        //-I/Oとして用いる二つのリストを作る
        List<int> cardOrder = new List<int>(5);
        foreach (string ic in inputCardOrder)
        {
            cardOrder.Add(int.Parse(ic));
        }
        List<int> playerRanking = cardOrder.ToList();

        //-プレイヤーの順位を計算する
        int fieldCard = -1;
        int fieldCardOwner = new int();
        int playerRank = 1;
        for (int i = 0; i < 5; i++)
        {
            //--1.通常の勝利判定
            if (fieldCard < cardOrder[i])
            {
                fieldCard = cardOrder[i];
                fieldCardOwner = i;
                cardOrder[i] = -1;
                playerRanking[i] = playerRank;
                playerRank++;
            }
            //--2.一周回ってしまった場合
            else if (fieldCardOwner == i)
            {
                fieldCard = -1;//次のカードが確実に場に出されるようにする
            }
            else { }
            if (i == 4) { i = -1; }
            else { }
            if (playerRank == 6) break;
            else { }
        }

        foreach (int pr in playerRanking)
        {
            Console.WriteLine(pr);
        }

        Console.ReadLine();
    }
}
uniform.cs
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    public static void Main()
    {
        string[] inputCardOrder = Console.ReadLine().Split(' ');//最初に入力されるカードの並び順
        List<int> cardOrder = new List<int>(52);//残りカードリスト
        //-最初に入力されたカードの並び順でカードリストを作るついでに、J,Q,K,A,2のカードの強さを正しい整数値に変換しながら、カードリスト化する 3<4<5...<10<J<Q<K<A<2
        foreach (string ic in inputCardOrder)
        {
            if (ic == "A") { cardOrder.Add(14); }
            else if (ic == "2") { cardOrder.Add(15); }
            else if (ic == "J") { cardOrder.Add(11); }
            else if (ic == "Q") { cardOrder.Add(12); }
            else if (ic == "K") { cardOrder.Add(13); }
            else
            {
                cardOrder.Add(int.Parse(ic));
            }
        }
        List<int> playerRanking = cardOrder.ToList();

        //-プレイヤーの順位を計算する
        int fieldCard = -1;//場に出ているカード(-1で初期化しているのは最初のプレイヤーのカードが必ず勝利判定を通過させるために)
        int fieldCardOwner = -1;
        int countOfPlayerRank = 1;
        for (int i = 0; i < 52; i++)
        {
            int currentPlayerCard = cardOrder[i];
            if (fieldCard < currentPlayerCard)//--1.場に出ているカードに現在のプレイヤーの持ちカードが勝利する場合
            {
                fieldCard = currentPlayerCard;
                fieldCardOwner = i;
                playerRanking[i] = countOfPlayerRank;
                countOfPlayerRank++;
                cardOrder[i] = -1;
            }
            else if (fieldCardOwner == i)//--2.フィールドに出されたカードのオーナーの手番が一周回ってきてしまったとき
            {
                fieldCard = -1;
            }
            else { }
            if (countOfPlayerRank == 53) { break; }//52位まで決まったらメインループを抜け出す
            else { }
            if (i==51) { i = -1; }
            else { }
        }

        //-回答を出力する
        foreach (var rank in playerRanking)
        {
            Console.WriteLine(rank);
        }
        Console.ReadLine();
    }
}

問題を単純化することの大切さを改めて知った気がする。