【C#】【ピクロス】【ALTSEED】解析パターン5と6の修正

前回までの状況はこちら。

最新ソースはこちら。(gitHub)

https://github.com/takishita2nd/Picross

あれからがっつり修正しました。

具体的には、解析パターン5と6。

一度にたくさん処理していたのを、

一番最初のもの、一番最後のものの2パターンに分け、1回の処理では1つだけしか処理しない、という風にしました。

最初のループでは処理できない箇所でも次以降のループで処理できるでしょ、という考え。

詳しくはgitHubのソースコードを見て欲しい。

最終的には、こんな感じになりました。

解析完了までもう少しだが、まだ解析手法はあるはず。

これから考えます。

【C#】【ピクロス】【ALTSEED】解析パターンその7

前回までの状況はこちら。

最新ソースはこちら。(gitHub)

https://github.com/takishita2nd/Picross

今回はここを狙います。

ここは、数値が一つなのに対して、塗るで確定しているマスが二つありますので、この間が塗れることが分かります。

これを実装します。

        // 解析パターンその7
        // 数字が1個で2マス塗られている場合はその間を塗る
        private void pattern7()
        {
            // Row
            pattern7Row();
            // Col
            pattern7Col();
        }

        private void pattern7Row()
        {
            int row = 0;
            foreach (var rowlist in rowNumbers)
            {
                if (rowlist.IsAnalyzed())
                {
                    row++;
                    continue;
                }

                if(rowlist.AnalyzeDatas.Count == 1)
                {
                    int value = rowlist.AnalyzeDatas[0].Value;
                    int startCol = 0;
                    int endCol = 0;
                    for (int col = 0; col < colNumbers.Count; col++)
                    {
                        if(_bitmapData[row, col].IsPainted() && startCol == 0)
                        {
                            startCol = col;
                        }
                        else if(_bitmapData[row, col].IsMasked() && startCol != 0)
                        {
                            break;
                        }
                        else if(_bitmapData[row, col].IsPainted() && startCol != 0)
                        {
                            endCol = col;
                        }
                    }

                    if(startCol== 0 || endCol == 0)
                    {
                        row++;
                        continue;
                    }

                    for(int col = startCol; col < endCol; col++)
                    {
                        _bitmapData[row, col].Paint();
                    }
                }
                row++;
            }
        }

        private void pattern7Col()
        {
            int col = 0;
            foreach (var collist in colNumbers)
            {
                if (collist.IsAnalyzed())
                {
                    col++;
                    continue;
                }

                if (collist.AnalyzeDatas.Count == 1)
                {
                    int value = collist.AnalyzeDatas[0].Value;
                    int startRow = 0;
                    int endRow = 0;
                    for (int row = 0; row < rowNumbers.Count; row++)
                    {
                        if (_bitmapData[row, col].IsPainted() && startRow == 0)
                        {
                            startRow = row;
                        }
                        else if (_bitmapData[row, col].IsMasked() && startRow != 0)
                        {
                            break;
                        }
                        else if (_bitmapData[row, col].IsPainted() && startRow != 0)
                        {
                            endRow = row;
                        }
                    }

                    if (startRow == 0 || endRow == 0)
                    {
                        col++;
                        continue;
                    }

                    for (int row = startRow; row < endRow; row++)
                    {
                        _bitmapData[row, col].Paint();
                    }
                }
                col++;
            }
        }

やっていることは簡単で、最初に塗られているマスと後に塗られているマスを探し、その間を塗る、というロジックです。

まずは1周実行してみます。

想定通りに塗られていますね。

では2周目

3周目

おや?

ここをマスクされると、縦11の数字の処理に矛盾が発生しますので、この動きはおかしいですね。

いろいろ調査してみましたが、解析パターン5でマスクを行っている用です。

なので、今の解析パターン5に問題があるようです。

なので、次回なおしましょうか。(今なおしたらハマりそう)

ダイエットを支援するサイトを立ち上げようと思う。

そんなサイトを作成して自分の実績として残したい。

まずは、体重とかを記録するだけの機能。

その後機能追加して、食事を記録したり、運動を記録したりする機能も備えたい。

需要はあるかどうか分からないが、少なくとも俺は使いたいっていうものにしたい。

とりあえず環境は整えました。

Hyper-VにセットアップしておいたUbuntuにLaravelの環境を構築。

gitリポジトリも作成しました。

詳細はこれから考える。

【C#】【ピクロス】【Altseed】新しい問題に取り組む

次はこの問題を解いてみようと思います。

これまで作成したアルゴリズムを適用してみました。

まぁ、そうだろうねぇ。

でもこれならまだ頭の中に解法はある。

次回からそれを実装していきましょう。

あ、ロード処理を少し修正しました。

最新ソースはこちら。(gitHub)

https://github.com/takishita2nd/Picross

雇用保険の追加給付に関するお知らせとお願い、と言う物が届いた

びっくりしたわ。

こういうのが届いたら、正しい物なのか調べるクセを付けておいた方がいいで。

厚生労働省のサイトを調べるとこれが見つかりました。

https://www.mhlw.go.jp/stf/newpage_03463.html

ざっくり説明すると、

過去に受け取った雇用保険料の算出方法に不正が見つかりました。

これを受け取った人は、誤って支払われた可能性があるので、内容を確認、必要事項を記入して返信してください。

少なく支払われていた場合は、その差額が口座に振り込まれます。

と、いうことなので、これは必ず返信しなければならないヤツです

(お金がもらえる可能性があります。)

対象期間がかなりむかしなのですが、まぁ、被保険者番号が分かれば問題無いかと思います。

被保険者番号は雇用保険受給者証に記載されていますが、持っていなくても、現在所属している会社に問い合わせれば分かるみたいです。

明日投函します。

【ラズパイ】LCDディスプレイを購入してみた。

新しい遊び道具を購入しました。

LCDディスプレイです。

実際に使用するときはバックライトが白く光り、ドット単位で黒くする事ができる、らしいです。

これをラズパイで使って遊ぼうか、と。

なので、ラズパイのHATを取り外す。

そして、これとLCDディスプレイをつなぐためのケーブルを用意する。

あかんやん、オスーオスやん。

なので、これを使用する。

よく見るブレッドボードにヘッダーを取り付けました。

これを使うと、どのGPIOのピンがどこと対応しているかがすぐに分かります。

そして、本体とつなぐにはこれ。

接続。

そして、LCDディスプレイもオスが刺さるようにメスのヘッダを取り付ける。

あれ?これって、はんだづけが必要???

仕方が無い。ポチるか。

【きららファンタジア】お姉ちゃんズ11 極クエストを攻略する

結構苦戦したので、攻略メモを残しておく。

※期間限定なので、こういうネタは寿命が短いのよね。

※そもそも、こういうネタはどれだけ需要があるか分からないし。

こちらのwikiに的の特徴が書かれていますが、

https://wikiwiki.jp/img-kirafan/極クエスト-お姉ちゃんズ11

左の赤いイノシシは魔法攻撃に弱いので、強い水のまほうつかいで簡単に倒せると思う。

問題は右の紫のイノシシで、

こちらは魔法に強いので、せんしで攻撃する必要がありますが、それでもなかなかしぶといので、アルケミストのデバフを利用するのが良いと思います。

オススメはステラの魔法の藤川歌夜(アルケミスト・水)で、

防御ダウンと行動速度低下のスキルを持っています。

あと、ナイトをパーティに含めていると、特殊攻撃を仕掛けてくるので、ナイトはパーティに含めてはならない。

デバフの後、陽属性のせんしでタコ殴りにしてスタンさせられれば勝てる。

スタンは無理でも、少ないコンテニューで勝てると思う。

ちなみにオイラは1回コンテニューで勝ちました。

攻略の参考にしてください。

【C#】【ピクロス】【ALTSEED】解析パターンその6

前回までの状況はこちら。

最新ソースはこちら。(gitHub)

https://github.com/takishita2nd/Picross

前回の続き。

前回は前から塗れるところをチェックしていきましたが、今回は後ろから塗れるところをチェックしていきます。

この時きちんと考えなくちゃいけないのは、データの順序。

今回、ここがぐっちゃになって一番ハマった。

前回のソースにも関連するのですが、

            foreach (var rowlist in rowNumbers)
            {
                if (rowlist.IsAnalyzed())
                {
                    row++;
                    continue;
                }

このrowlistをReverse()すると、元々の解析データ(rowNumbers)が壊れてしまうので、

            foreach (var rowlist in rowNumbers)
            {
                if (rowlist.IsAnalyzed())
                {
                    row++;
                    continue;
                }
                var tempRowList = rowlist.Clone();
                tempRowList.AnalyzeDatas.Reverse();

こんな感じでクローンを作成してReverse()しなくちゃいけない。

なので、クローンメソッドを追加。

    class AnalyzeData
    {
        public AnalyzeData Clone()
        {
            var clone = new AnalyzeData(Value);
            if (_analyzed)
            {
                clone.Analyzed();
            }
            return clone;
        }
    }
    class AnalyzeListData
    {
        public AnalyzeListData Clone()
        {
            var clone = new AnalyzeListData();
            clone.AnalyzeDatas = new List<AnalyzeData>();
            foreach (var data in AnalyzeDatas)
            {
                clone.AnalyzeDatas.Add(data.Clone());
            }
            if (_analyzed)
            {
                clone.Analyzed();
            }
            return clone;
        }
    }

そしてパターン6の実装。

データの順番に気をつけて。

        // 解析パターンその6
        // 端っこ(後ろ)が塗られていたら塗る。
        private void pattern6()
        {
            // Row
            pattern6Row();
            // Col
            pattern6Col();
        }

        private void pattern6Row()
        {
            int row = 0;
            foreach (var rowlist in rowNumbers)
            {
                if (rowlist.IsAnalyzed())
                {
                    row++;
                    continue;
                }
                var tempRowList = rowlist.Clone();
                tempRowList.AnalyzeDatas.Reverse();

                // 塗った場所が端っこならそこを塗る
                // マスクされていない部分をリスト化して取得する
                List<List<BitmapData>> data = new List<List<BitmapData>>();
                {
                    List<BitmapData> dataList = new List<BitmapData>();
                    for (int col = 0; col < colNumbers.Count; col++)
                    {
                        if (_bitmapData[row, col].IsMasked() == false)
                        {
                            dataList.Add(_bitmapData[row, col]);
                        }
                        else
                        {
                            if (dataList.Count != 0)
                            {
                                data.Add(dataList);
                                dataList = new List<BitmapData>();
                            }
                        }
                    }
                    if (dataList.Count != 0)
                    {
                        data.Add(dataList);
                    }

                    if (data.Count == 0)
                    {
                        row++;
                        continue;
                    }
                }

                int rowNumberIndex = 0;
                foreach (var dataList in data)
                {
                    // 端っこが塗られているか?
                    dataList.Reverse();
                    if (dataList[0].IsPainted())
                    {
                        // すでに処理済みか?
                        if (tempRowList.AnalyzeDatas[rowNumberIndex].IsAnalyzed())
                        {
                            rowNumberIndex++;
                            if (rowNumberIndex >= tempRowList.AnalyzeDatas.Count)
                            {
                                break;
                            }
                            continue;
                        }

                        // 数字に従ってマスを塗る
                        int count = 0;
                        foreach (var s in dataList)
                        {
                            if (count < tempRowList.AnalyzeDatas[rowNumberIndex].Value)
                            {
                                s.Paint();
                                count++;
                            }
                            else
                            {
                                if (s.IsMasked() == false)
                                {
                                    s.Mask();
                                }
                                tempRowList.AnalyzeDatas[rowNumberIndex].Analyzed();
                                tempRowList.CheckAnalyze();
                                break;
                            }
                        }
                    }
                    rowNumberIndex++;
                    if (rowNumberIndex >= tempRowList.AnalyzeDatas.Count)
                    {
                        break;
                    }
                }
                row++;
            }
        }

        private void pattern6Col()
        {
            int col = 0;
            foreach (var collist in colNumbers)
            {
                if (collist.IsAnalyzed())
                {
                    col++;
                    continue;
                }

                // 塗った場所が端っこならそこを塗る
                // マスクされていない部分をリスト化して取得する
                List<List<BitmapData>> data = new List<List<BitmapData>>();
                {
                    List<BitmapData> dataList = new List<BitmapData>();
                    for (int row = 0; row < rowNumbers.Count; row++)
                    {
                        if (_bitmapData[row, col].IsMasked() == false)
                        {
                            dataList.Add(_bitmapData[row, col]);
                        }
                        else
                        {
                            if (dataList.Count != 0)
                            {
                                data.Add(dataList);
                                dataList = new List<BitmapData>();
                            }
                        }
                    }
                    if (dataList.Count != 0)
                    {
                        data.Add(dataList);
                    }

                    if (data.Count == 0)
                    {
                        col++;
                        continue;
                    }
                }

                int colNumberIndex = 0;
                data.Reverse();
                foreach (var dataList in data)
                {
                    // 端っこが塗られているか?
                    dataList.Reverse();
                    if (dataList[0].IsPainted())
                    {
                        // すでに処理済みか?
                        if (collist.AnalyzeDatas[colNumberIndex].IsAnalyzed())
                        {
                            colNumberIndex++;
                            if (colNumberIndex >= collist.AnalyzeDatas.Count)
                            {
                                break;
                            }
                            continue;
                        }

                        // 数字に従ってマスを塗る
                        int count = 0;
                        foreach (var s in dataList)
                        {
                            if (count < collist.AnalyzeDatas[colNumberIndex].Value)
                            {
                                s.Paint();
                                count++;
                            }
                            else
                            {
                                if (s.IsMasked() == false)
                                {
                                    s.Mask();
                                }
                                collist.AnalyzeDatas[colNumberIndex].Analyzed();
                                collist.CheckAnalyze();
                                break;
                            }
                        }
                    }
                    colNumberIndex++;
                    if(colNumberIndex >= collist.AnalyzeDatas.Count)
                    {
                        break;
                    }
                }
                col++;
            }
        }

とりあえず、1回このロジックを当てはめてみる。

狙い通りに動いているみたいです。

なので、最後まで処理させてみる。

お、解けた。

多分、まだ完璧では無いですが、これで一歩前進です。

【テイクアウト】コクドウカレーのカレーパン

ルーカレーのカレー屋さんなのですが、カレーパンも売られているので、

テイクアウトしました。

1個250円なのですが、3個で700円、5個で1200円です。

写真には写ってませんが、中にじゃがいもが入ってますね。

今回買ったのはカレーパンですが、カレールーもテイクアウトできます。

タッパーを持参すればさらに50円引きになるみたいです。

今度ルーカレーも買ってみよう。

残ったカレーパンは明日の朝ご飯にします。

首の筋肉をマッサージした結果。

以前、紹介した、このマッサージ器。

これを使いまくった結果、ある事に気がついたんですよ。

オイラは以前から、あくびが止まらない、と言うことをスゴイ気にしていました。

夜になると、ホントにあくびが止まらなくて、顎が痛くなるぐらい。

しかし、そのあくびが出なくなった。

ここである事に気がついたんですよ。

首が凝る

頭に巡る血流が悪くなる

脳に酸素が行かなくなる

脳は酸素を欲しがって、あくびをするようになる

このメカニズムが成り立つんじゃないかと。

そう考えたら、

首の凝りが解消される

頭に血液が流れるようになる

脳に酸素が渡るようになる

あくびが止まる

いやいや、脳に酸素が行かなくなった時点でヤバイから。

でも、このマッサージ器で血流が良くなったら1万円の投資なんて安い物よ。

整体1回行ったらウン千円取られるのよ。

どちらがより経費がかからないか、なんて一目瞭然。

でも調子悪いときは一度見てもらった方が良いかもしれないけど。

いや、でもここまで激変するとは思わんかった。

これはマジで、買って良かった物ですわ。

自分、ぼっちですが何か?