人材獲得作戦2011 「ぷよぷよ」

C#。某国立高校の男子高校生。45分?


お久しぶりです。今年もこの季節がやって参りました。
人材募集企画 2011年版: 人生を書き換える者すらいた。
少しは成長した…かな?してないですねはい…
締切りが過ぎたので、公開します。

反省会会場
  • 下のようなコードを書いてはいけない理由を述べよ。
        static void Kill(int x, int y, ref char[,] field, bool[,] visit, int count, Stack<int[]> stack, ref bool flag)
        {
            var color = field[x, y];
            visit[x, y] = true;
            stack.Push(new int[] { x, y });

            for (int i = -1; i <= 1; i++)
            {
                for (int j = -1; j <= 1; j++)
                {
                    int xi = x + i, yj = y + j;
                    if (Math.Abs(i) == Math.Abs(j) || xi < 0 || field.Length / 6 <= xi || yj < 0 || 6 <= yj || visit[xi, yj]) continue;

                    if (field[xi, yj] == color)
                    {
                        Kill(xi, yj, ref field, visit, count + 1, stack, ref flag);
                    }
                }
            }

            if (count >= 4)
            {
                foreach (var s in stack)
                    field[s[0], s[1]] = ' ';
                flag = true;
            }

            return;
        }
  • それは、下のようなケースの●を想定していないからですよあばばばばば。
    • コードも美しくないしね。
    • これがなければ、もっと早く組みあがってたよね…。うける。
●●●
○●○
  • 入力が13行未満だった場合への無駄な気遣い。
    • まぁ、重要ですよね。
    • 13*6が最大はググった。SlideあたりでもズサーとSlideしてるので、いい感じに動くはず。
    • for文をトリッキーに使おうとしてみた図。そうでもなかった。
            using (var sr = new StreamReader("input.txt"))
            {
                string s;
                for (int c = 0; (s = sr.ReadLine()) != null; c++)
                    for (int i = 0; i < 6; i++)
                        input[c, i] = s[i];
            }
  • Killの途中の部分。Math.Abs(i)==Math.Abs(j)とかあれなので、こう書いたらどうかな。
    • こっちもきもいか。何回も使うんなら、publicでとっか置いといてもいいかもですね。
                foreach (var d in new int[][] { new int[] { 1, 0 }, new int[] { -1, 0 }, new int[] { 0, 1 }, new int[] { 0, -1 } })
                {
                    //hogehoge
                }
  • ぷよぷよとかテトリスとか麻雀とか苦手です…
  • 頭悪い説。
  • はてなさん、"var"も色つけして下さい。。。
  • 真のC#erかと問われると???だが、所々染まってるようなコード。
  • 就職への道はとおい。。。

Source Code @C#

using System;
using System.Collections.Generic;
using System.IO;

namespace Puyopuyo
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = new char[13, 6];
            
            using (var sr = new StreamReader("input.txt"))
            {
                string s;
                for (int c = 0; (s = sr.ReadLine()) != null; c++)
                    for (int i = 0; i < 6; i++)
                        input[c, i] = s[i];
            }

            int chain = 0;
            bool flag = true;
            while (flag)
            {
                flag = false;
                for (int i = 0; i < input.Length / 6; i++)
                    for (int j = 0; j < 6; j++)
                        if (input[i, j] != ' ')
                            flag |= Kill(i, j, ref input);

                Slide(ref input);
                if (flag)
                    Output(input, ++chain);
            }

            return;
        }

        static bool Kill(int x, int y, ref char[,] field)
        {
            var color = field[x, y];
            var visit = new bool[13, 6];
            var queue = new Queue<int[]>();

            visit[x, y] = true;
            queue.Enqueue(new int[] { x, y });

            while (queue.Count > 0)
            {
                var p = queue.Dequeue();
                for (int i = -1; i <= 1; i++)
                    for (int j = -1; j <= 1; j++)
                    {
                        int xi = p[0] + i, yj = p[1] + j;
                        if (Math.Abs(i) == Math.Abs(j) || xi < 0 || field.Length / 6 <= xi || yj < 0 || 6 <= yj || visit[xi, yj])
                            continue;

                        if (field[xi, yj] == color)
                        {
                            visit[xi, yj] = true;
                            queue.Enqueue(new int[] { xi, yj });
                        }
                    }
            }
                       
            for (int i = 0; i < field.Length / 6; i++)
                for (int j = 0; j < 6; j++)
                    if (visit[i, j])
                        queue.Enqueue(new int[] { i, j });
            
            if (queue.Count >= 4)
            {
                foreach (var q in queue)
                    field[q[0], q[1]] = ' ';
                return true;
            }

            return false;
        }

        static void Slide(ref char[,] field)
        {
            for (int i = field.Length / 6 - 1; i >= 0; i--)
                for (int j = 0; j < 6; j++)
                    for (int d = 1; d < field.Length / 6 - i; d++)
                    {
                        int id = i + d;
                        if (field[id, j] == ' ')
                        {
                            field[id, j] = field[id - 1, j];
                            field[id - 1, j] = ' ';
                        }
                        else break;
                    }
        }

        static void Output(char[,] field, int chain)
        {
            Console.WriteLine("{0}-th chain", chain);
            Console.WriteLine("********");
            for (int i = 0; i < field.Length / 6; i++)
            {
                Console.Write("*");
                for (int j = 0; j < 6; j++)
                    Console.Write(field[i, j]);
                Console.WriteLine("*");
            }
            Console.WriteLine("********");
            Console.WriteLine();
        }
    }
}

Output

1-th chain
********
*   YRR*
*R GGYG*
*G GYRR*
*R GYRG*
*YGYRYG*
*GYRYRG*
*YGYRYR*
*YGYRYR*
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

2-th chain
********
*    RR*
*R  YYG*
*G  YRR*
*R  YRG*
*YGYRYG*
*GYRYRG*
*YGYRYR*
*YGYRYR*
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

3-th chain
********
*     R*
*R   RG*
*G   RR*
*R   RG*
*YGYRYG*
*GYRYRG*
*YGYRYR*
*YGYRYR*
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

4-th chain
********
*      *
*R    R*
*G    G*
*R    G*
*YGYRYG*
*GYRYRG*
*YGYRYR*
*YGYRYR*
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

5-th chain
********
*      *
*R     *
*G     *
*R     *
*YGYRY *
*GYRYRR*
*YGYRYR*
*YGYRYR*
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

6-th chain
********
*      *
*R     *
*G     *
*R     *
*YGYR  *
*GYRYY *
*YGYRY *
*YGYRY *
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

7-th chain
********
*      *
*R     *
*G     *
*R     *
*YGY   *
*GYRR  *
*YGYR  *
*YGYR  *
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

8-th chain
********
*      *
*R     *
*G     *
*R     *
*YG    *
*GYY   *
*YGY   *
*YGY   *
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

9-th chain
********
*      *
*R     *
*G     *
*R     *
*Y     *
*GG    *
*YG    *
*YG    *
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

10-th chain
********
*      *
*      *
*R     *
*G     *
*R     *
*Y     *
*Y     *
*Y     *
*YRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

11-th chain
********
*      *
*      *
*      *
*      *
*      *
*      *
*R     *
*G     *
*RRRGRG*
*RYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

12-th chain
********
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*R  GRG*
*GYGYGG*
*GRYGYR*
*GRYGYR*
*GRYGYR*
********

13-th chain
********
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*   GRG*
* YGYGG*
* RYGYR*
* RYGYR*
*RRYGYR*
********

14-th chain
********
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*   GRG*
*  GYGG*
*  YGYR*
*  YGYR*
* YYGYR*
********

15-th chain
********
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*   GRG*
*   YGG*
*   GYR*
*   GYR*
*  GGYR*
********

16-th chain
********
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*    RG*
*    GG*
*    YR*
*   GYR*
*   YYR*
********

17-th chain
********
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*     G*
*     G*
*     R*
*    RR*
*   GGR*
********

18-th chain
********
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*     G*
*   GGG*
********

19-th chain
********
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
*      *
********