taki のすべての投稿

【C#】【数独】仮置きロジックを簡略化する。

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

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

https://github.com/takishita2nd/sudoku

前回、仮置きロジックを完成させたのですが、

このコード、結構無駄な処理をやっていることに気がついたんですよ。

        private Square doKarioki(Square[,] squares)
        {
            Square ret = null;
            List<Square> kariokiList = searchKariokiSquare(squares);
            foreach (var s in kariokiList)
            {
                bool roop = true;
                int kariValue = GetUnconfirmedValue(s.GetCandidate());
                if (kariValue == 0)
                {
                    return null;
                }
                Square[,] copySquare = makeClone(squares);
                copySquare[s.Row, s.Col].SetValue(kariValue);
                int now_count = 0;
                int prev_coount = 0;
                while (roop)
                {
                    for (int row = 0; row < 9; row++)
                    {
                        for (int col = 0; col < 9; col++)
                        {
                            if (copySquare[row, col].isConfirmed() == false)
                            {
                                Candidate candidate = new Candidate();
                                searchRowLine(copySquare, row, candidate);
                                searchColLine(copySquare, col, candidate);
                                search9Area(copySquare, row, col, candidate);
                                copySquare[row, col].checkCandidate(candidate);
                            }
                        }
                    }
                    searchNumber(copySquare);

                    if (checkContradict(copySquare))
                    {
                        break;
                    }

                    prev_coount = now_count;
                    now_count = countInputedNumber(copySquare);

                    if (prev_coount == now_count)
                    {
                        Console.WriteLine("仮置きロジック");
                        Square s2 = doKarioki(copySquare);
                        if (s2 == null)
                        {
                            Console.WriteLine("失敗しました");
                            return null;
                        }
                        else
                        {
                            copySquare[s2.Row, s2.Col].SetValue(s2.GetValue());
                        }
                    }

                    if (checkEnd(copySquare) == true)
                    {
             ★
                        roop = false;
                        s.SetValue(kariValue);
                        Console.WriteLine("[{0},{1}] = {2}", s.Row, s.Col, s.GetValue());
                        ret = s;
                    }
                    FileAccess.Output(copySquare);
                }
                if(ret != null)
                {
                    break;
                }
            }
            return ret;
        }

今までは★に入ったタイミングで仮置きした値が確定して、という処理を行っていたんですが、

実はここに入った時点で解析結果が判明しているんですよね。

なので、この時点で解析結果を出力して終了、という処理にすれば、大幅に処理が短くなるはずです。

詳細はgitHubのソースコードを参照して頂ければ。

ついでに関数ヘッダにコメント入れました。

0

【C#】【数独】矛盾チェック処理と仮置きロジック再帰処理の実装

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

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

いやーロジック考えるのに時間かかりました。

まず、仮置きロジックを完成させるには、仮置きした結果、矛盾が発生した、ということを検出できる用にしなければならなくて。

これが、以外と難しい。

実際のコードは短くなっても、そこにたどり着くのが難しいのです。

オイラはこのように書きました。

        private bool checkContradict(Square[,] squares)
        {
            for (int row = 0; row < 9; row++)
            {
                for (int col = 0; col < 9; col++)
                {
                    if(squares[row,col].isConfirmed() == false)
                    {
                        Candidate candidate = new Candidate();
                        searchRowLine(_square, row, candidate);
                        searchColLine(_square, col, candidate);
                        search9Area(_square, row, col, candidate);
                        if(candidate.Count() == 9)
                        {
                            return true;
                        }
                    }
                }
            }
            return false;
        }

値は確定していない、しかし、縦、横、9マスを調べた結果、置ける数字が無い場合、という風に考えました。

これを使って仮置きロジックを作成します。

        private Square doKarioki(Square[,] squares)
        {
            Square ret = null;
            List<Square> kariokiList = searchKariokiSquare(squares);
            foreach (var s in kariokiList)
            {
                bool roop = true;
                int kariValue = GetUnconfirmedValue(s.GetCandidate());
                if (kariValue == 0)
                {
                    return null;
                }
                Square[,] copySquare = makeClone(squares);
                copySquare[s.Row, s.Col].SetValue(kariValue);
                int now_count = 0;
                int prev_coount = 0;
                while (roop)
                {
                    for (int row = 0; row < 9; row++)
                    {
                        for (int col = 0; col < 9; col++)
                        {
                            if (copySquare[row, col].isConfirmed() == false)
                            {
                                Candidate candidate = new Candidate();
                                searchRowLine(copySquare, row, candidate);
                                searchColLine(copySquare, col, candidate);
                                search9Area(copySquare, row, col, candidate);
                                copySquare[row, col].checkCandidate(candidate);
                            }
                        }
                    }
                    searchNumber(copySquare);

                    if (checkContradict(copySquare))
                    {
                        break;
                    }

                    prev_coount = now_count;
                    now_count = countInputedNumber(copySquare);

                    if (prev_coount == now_count)
                    {
                        Console.WriteLine("仮置きロジック");
                        Square s2 = doKarioki(copySquare);
                        if (s2 == null)
                        {
                            Console.WriteLine("失敗しました");
                            return null;
                        }
                        else
                        {
                            copySquare[s2.Row, s2.Col].SetValue(s2.GetValue());
                        }
                    }

                    if (checkEnd(copySquare) == true)
                    {
                        roop = false;
                        s.SetValue(kariValue);
                        Console.WriteLine("[{0},{1}] = {2}", s.Row, s.Col, s.GetValue());
                        ret = s;
                    }
                    FileAccess.Output(copySquare);
                }
                if(ret != null)
                {
                    break;
                }
            }
            return ret;
        }

難しかったのが、仮置きロジックの計算中に再び仮置きロジックが必要になった場合。

そう、このロジックを再帰的に実行する処理が必要なのです。

これを実装するために、これ以外の所もかなりの広範囲で書き換えています。

しかし、これでようやく解を得ることができました。

138964275
624715398
957283614
285637941
796841523
341529786
512476839
479358162
863192457

このロジックでいろいろな問題を解いてみようと思います。

0

飲食店や生産者たちを救いたい

新型コロナウイルスの影響で、北海道に非常事態宣言が出され、道民が外に出なくなった影響で、飲食店が悲鳴を上げています。

この悲鳴は、飲食店だけで無く、そこに食材を納品する生産者達にも影響が出てきているのです。

なんとかして、この人達を救うことができないか。

店内で食事するのは抵抗あるけど、おうちで食べる用にテイクアウトできたらいいよね、ということで、期間限定でテイクアウトを始めた飲食店が増えてきました。

こちらのサイトでまとめられています。

登録件数もどんどん増えているようです。

https://110.fukuts.com

または「がんばれ飲食店」で検索してください。

オイラはと言うと、餃子の王将のテイクアウトを頂きました。

チェーン店かよ!

いやいや、これでも立派な消費活動です。

みなさんもこういう仕組みをどんどん利用して欲しいと思います。

おまけ。

アニメイトにモルフォニカおったよ。

(こっちが本来の目的だったりする)

0

【モラタメ】マルコメおみそ汁の具

先週末、外出自粛中に貴重な食料が届きました。

ちょうどお味噌汁を切らしていたときで、また買ってこないといけないなーと思っていたときなので、めっちゃ嬉しい。

お味噌汁の具が3袋、液体お味噌が2ボトル、お味噌が2パックです。

これでお試し価格950円です。

作ってみた。

作り方は簡単で、具材を少量入れ、(今回はのり味噌汁の具を使いました。)

液体お味噌を大さじ一杯。

ボトル型になっているので、必要な分だけ、簡単に出すことができます。

そこにお湯を注げば完成。

ああ、美味い。

海苔の磯の味が出ているのもあるけど、魚介のアラの味もしっかりお味噌汁にでていて、とても美味しいです。

あぁ、この味ならリピート買いもありかも。

液体お味噌を別の料理に利用することもできますね。

この商品はモラタメというサイトを通じて、お試し価格で購入いたしました。

0

【マインクラフト】ガーディアントラップ開発への道

たぶん、これを完成させるのに1週間以上かけたと思う。

海底神殿にコンジットを設置した状態。

何よりヤバイのがガーディアンの沸きです。

Java版は統合版より沸きがエグい。

海底神殿の周りをガラスで仕切り、

さらに砂ピストンで3×5に仕切ります。

この形の方がスポンジで水抜きしやすい。

さらに神殿内部の水も抜いて解体。

完全に水を抜けばガーディアンは沸かなくなります。

ガラスとフェンスゲートで沸き層を作ります。

沸き層に水を入れる前に床を抜いて

岩盤まで露天掘り。

沸き層がY=40のところにあるので、そこから最低34マス下に掘ればガーディアンは落下死します。

水入れ。

蓋をして暗くします。

これでガーディアンが沸くようになります。

回収機構も設置。

チェストがすぐにパンパンになるぐらい沸きます。

次はウィザースケルトンかな~

0

【バンドリ】【ガルパ】3/1のハロハピ放送局で公開された情報まとめ(3周年アップデート)

いやー、今回は3周年直前ということで特に情報がてんこもりでしたね。

ガルパに関連した情報をまとめました。

モバイルWi-Fi環境下なので、スクショの画質悪くてすまぬ。

追加カバー曲

Mrs. GREEN APPLEが2019年7月にリリースされた曲で、アニメ「炎炎ノ消防隊」のOPでした。

Afterglowのカバーで実装されます。

予想レベル25。

以下、3周年アップデート情報です。

追加バンド

3月16日から、新バンド「Morfonica(モルフォニカ)」が追加されます。

略称は「モニカ」

ボーカルは2シーズンのメインストーリーで登場したましろちゃんですね。かわいい。

バンド追加と同時に、バンドストーリーとオリジナル楽曲、MV、カバー曲、各星のメンバーが追加されます。

アニメBanG Dream! 3rd season終了後の時期に「RAISE A SUILEN」が実装されます。

アニメ終了が4月末になると思うので、実装は5月~6月ぐらいになると思われます。

ライブにLive2Dモードが追加

ライブのオプションが追加され、ライブ中にLive2Dのキャラが登場して掛け合いが行われるようになります。

ライブに集中できないヤツ。

放送中に開発中をプレイしている映像があるのですが、ライブ演出もかなりパワーアップしていました。

カメラワークがライブ中に動くのが、なかなか良いです。

リハーサルモード追加

ライブブーストを消費しないでライブの練習ができるようになります。

このモードでのリザルトは反映されませんが、ライフが0になっても最後までプレイできるのは良い。

さらに、でもプレイモードがあって、お手本プレイも見ることができます。

これはかなり大きいです。

正解のタップ音が聞こえてくるのですから、それを頭にたたき込めばライブの精度もあがります。

その他の改善

ガチャ情報

ドリフェスは、まぁ、確率が4%に上がってても、ほぼ当てにならない数字だったので、オイラは完全スルーしていましたが、限定メンバーが一周したので、3/16から2周目に突入します。

最初に登場するのは蘭と花音。

特訓前のイラストは動画を見てください。

無料で30人排出されるガチャができます。

全員星2だったらどうしよう。

1日1回無料ガチャが引けます。

3周年記念のカバー楽曲

年末年始の時と同じように、今回も付箋が貼られています。

うん、わからん。

ログインキャンペーン

3/16日の初回ログイン時に星がもらえます。

1回10連ガチャ引けます。

さらに15日間のログイン時にも星がもらえます。

これでもう1回10連ガチャ引けます。

3周年特番

3周年直前の3月15日にも特番が放送されます。

この時間帯はガルパメンテナンスを行いますので、みんなで見よう。

16日の特番には5バンドのボーカルが出演します。

あやねる見るの、久しぶりや・・・。

いやー濃かった。

このほかにもガルパアプリ外の情報もてんこ盛りなので、気になる人は、上のアーカイブ見てね。

0

食糧確保に焦った週末

先週金曜日の夕方、鈴木北海道知事が新型コロナウイルスに対する緊急事態宣言を行い、週末の外出を控えるように呼びかけられました。

この時、オイラが思ったのは、

やばい、食料確保してない!

その時の我が家の食料備蓄は、

お米、発芽玄米パック、乾麺、パスタソース、水、コカコーラゼロ、魚の缶詰、レトルトカレー、パスタソース。

うん、ほぼ炭水化物。

暮らしていけなくは無いけど、確実に食事に飽きるので、あわててネットスーパーにアクセスしました。

もう夕方だったし、いまからスーパーに行く気力はありません。

オイラが札幌で利用しているネットスーパーはイオンとイトーヨーカドーの二つ。

イオンはすでに週末配達分の受付が終了されている状態。

イトーヨーカドーはまだ土曜日の午後の便が空いていました。

とりあえず、簡単に調理できる商品やお惣菜を選択していったのですが、

めちゃくちゃ遅い。

サーバが混雑しているのでしょうか。

1時間ぐらいかけて決済して、無事、食料は届きました。

ありがとうございます。イトーヨーカドーさん。

なんとか月曜日までは食料持ちそうです。

月曜日以降は・・・そのとき考える。

結構飲食店も休業に入るみたいです。

外に食べに行くのも大変そうですね。

まぁ、自宅で本でも読みながらマッタリしています。

早くマスク無しで外を出歩けるようになって欲しい。

0

ガスレンジ周りの設備を整える

ガスレンジ周りをどのようにしたら良いのか、悩みますよね。

オイラも、引越し前の部屋でこんな事がありました。

ガスレンジの下に敷いていたシートが油汚れでベトベト。台に張り付いてしまって剥がすのが大変だった。

レンジパネルを使用していなかったので、汚れを拭き取るのに大変だった。

これをどうにかできないか。

Amazonを検索してみたら、こんなものが合ったので、購入してみました。

このシートを選択したのは、ガス台に張り付かないというところ。

ちょっとサイズが大きいか。

後でサイズを合わせよう。

それでも敷きっぱなしはよろしくないようで、定期的に油汚れを落とすお掃除は必要ですね。

レンジパネルも同様で、油物を調理した後はきれいに掃除した方が良いかも。

後々後悔しないためにも、レンジ周りもきちんと掃除した方が良いですね。

0

【ぼっち】新装開店ロイン亭

先日28日、札幌市白石区のアサヒビール園に併設されている焼き肉バイキング「ロイン亭」が新装開店オープンして、LINEクーポンで20%オフということで、行ってきました。

店員さんがオイラの顔を覚えててくれていました。

テーブルも一新されていました。きれいな感じです。

コースも若干変更されていて、食べ放題のみが無くなり、食べ放題+ソフトドリンク、アルコール付き食べ放題の二つになりました。

お料理の配置も一新されていました。

ライブキッチンなども設置されています。

あれ?ご飯はどこ行った?

あと、お座敷エリアが縮小され、テーブルエリアが増えました。

少人数でも気軽に入れるお店です。

実際、この日もオイラより先に3人ぐらいお一人様がいたと思います。

お会計の時、平日ランチ限定300円オフクーポンも貰いました。

また、焼き肉が食べたくなったらお世話になります!

0

今日はバンドリの日

2月28日はバンドリの日。

この日から5年前にバンドリプロジェクトがスタートした日ということです。

バンドリと言えば、アニメ第一期が始まったのが3年前なので、自分がバンドリを知ったのはもう少し前になります。

たぶん、違法にアップロードされた動画かもしれませんが、そこで「STAR BEAT! ~ホシノコドウ~」を聞いたのが最初だと思います。

当時は、こんな良い曲があるのになんで盛り上がらないのか、と思いましたが、今では、まさかこんなに盛り上がるとは思ってもいませんでした。

ターニングポイントはやっぱりガルパの影響が強かったと思います。

あのアプリゲームがリリースされてからSNSなどの二次創作の世界でも利用されるようになりましたからね。

去年、札幌でファンミを開催してくれたときは本当に嬉しかった。

勿論、オイラも参加してきました。

生歌はいいね。

いつかライブにも現地参加したい。

札幌でライブしてくれないかなぁ。(切実

0