2018年11月23日

C#でパズルを解こう!の記事をすべてQiitaに移行しました。

姉妹サイトである「Gushwell's C# Programming Page」の「C#でパズルを解こう!」で公開していた記事全27本をすべて、加筆修正し、Qiitaに移行しました。

Gushwell's C# Programming Page」では、多くのプログラムをC#+Silverlightで書いていましたが、C#+.NET Core(コンソールアプリ)に書き換えています。


記事の一覧を以下に示します。


協力最短詰めオセロ二人で協力しどちらかが完全勝利する最短手を見つける。 
ハノイの塔を再帰で解くハノイの塔を再帰で解くための考え方も解説してます。 
迷路を波状探索で解く迷路を波状探索(勝手に命名)で解いています。
迷路を幅優先探索で解く迷路を幅優先探索で解いています。
迷路を深さ優先探索で解く迷路を深さ優先探索で解いています。
MagicStarを解くMagicStar(星陣)を深さ優先探索で解く
8クィーンパズルN-Queenに対応しています。
ハイパークィーン問題8クィーンと似たパズル 
碁石拾い日本古来の碁石を使ったパズルを再帰で解く 
ナイト(騎士)巡回問題バックトラックでナイト巡回問題を解く
ナイト(騎士)の最適配置チェス盤に騎士を配置し効き筋で埋めます 
ステインハウスの三角形 整数のビットパターンで組合せを求める
Triangle15パズル順列が問題を解くカギ
コイン1510円玉と5円玉をつかったパズルを深さ優先探索で解く
覆銭問題Eventを発行し途中経過を知らせる 
割り切れる4桁の逆転数逆転した数で割り切れる4桁の数を得る
巡回数n倍すると巡回する自然数を求める
小町算 1-9の数字と+−で100にする:LINQで組合せを求める 
2乗した値が1-9で構成2乗した値と求めた値が1-9で構成される3桁の数を得る
小町数となる単位分数約分して1/nとなる数の分母と分子が小町数
3つの式が等しくなる小町数○○-○=○○/○=○+○*○が小町数
素因数分解小町素因数分解した結果の値が1-9で構成される数を求める
小町リング円の中の数の合計が等しくる小町数
センチュリーパズルK + N / D = 100 のK,N,Dが小町数
リングナンバーの最大公約数16個の数字の最大公約数を求める
二乗して回文となる非回文数例えば264は、264*264=69696 で結果が回文となる
Less Than Tree規則に沿って2色の石を置いてゆく。 IObserver / IObservableを利用。
   

Posted by gushwell at 17:45Comments(0)

2014年11月09日

C#で倍数になる13進数を求める

どう書く?orgに感謝を込めて」シリーズ その47

■問題 (出題者:にしお さん)
ここにある正の整数xがあります。xは2桁以上です。この数字の並びが13進法表記であるとみなすと、10進法表記であると見なした場合の倍数になります。この条件を満たす最も小さいxを求めるプログラムを書いてください。
例えばxが567の時、これを13進法表記と見なすと5 * 13 * 13 + 6 * 13 + 7 で 930 になります。930は567の倍数ではないので、567は条件を満たしません。 条件を満たす数を見つけ出すプログラムを書いてください。「条件を満たす数を出力するプログラム」ではありません。(print 567などは禁止ということ。)

実用的な問題じゃなくて、整数パズル問題ですね。
intを 13進数表記とみなして、10進数に変換する ToDecimalNumber メソッドを定義していますが、 これは、13進数表記以外にも対応しています。
なので、11進数とか、15進数なんかでも、答えが見つかります。
このToDecimalNumber さえ作ってしまえば、あとは簡単ですね。

最初は、標準のConvertクラスが使えるんじゃないかと思ったのですが、13をベース値にすることができませんでした
。 まあ、13進数なんてのは実際のアプリ開発では使われないので、サポートされていなくも仕方ないですね。

using System;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            var n = GetAnswer();
            Console.WriteLine(n);
            Console.WriteLine("{0}が{1}進数表記だとすると10進数で{2}、ちょうど2倍になります",
                n, BaseNum, ToDecimalNumber(n, BaseNum));
            Console.ReadLine();
        }

        private const int BaseNum = 13;

        static int GetAnswer() {
            for (int i = 10; i < int.MaxValue; i++) {
                if (IsOK(i)) {
                    return i;
                }
            }
            return -1;
        }

        static bool IsOK(int n) {
            return ToDecimalNumber(n, BaseNum) == n * 2;
        }

        // 13進数以外でもOK
        private static int ToDecimalNumber(int num, int basenum) {
            int ans = 0;
            int i = 1;
            while (num > 0) {
                int remainder = num % 10;
                ans += i * remainder;
                num /= 10;
                i *= basenum;
            }
            return ans;
        }
    }
}

  
Posted by gushwell at 21:00Comments(0)TrackBack(0)