トップページに戻る    次の増井さんの書籍の問題へ    前の増井さんの書籍の問題へ

Q33 百人一首の達人


C#のソース

using System;
using System.Linq;

class Program
{
    static string[] CSVLineDataArr = new string[]
    {"あきのたのかりほのいほのとまをあらみ,わかころもてはつゆにぬれつつ",
     "はるすきてなつきにけらししろたへの,ころもほすてふあまのかくやま",
     "あしひきのやまとりのをのしたりをの,なかなかしよをひとりかもねむ",
     "たこのうらにうちいててみれはしろたへの,ふしのたかねにゆきはふりつつ",
     "おくやまにもみちふみわけなくしかの,こゑきくときそあきはかなしき",
     "かささきのわたせるはしにおくしもの,しろきをみれはよそふけにける",
     "あまのはらふりさけみれはかすかなる,みかさのやまにいてしつきかも",
     "わかいほはみやこのたつみしかそすむ,よをうちやまとひとはいふなり",
     "はなのいろはうつりにけりないたつらに,わかみよにふるなかめせしまに",
     "これやこのゆくもかへるもわかれては,しるもしらぬもあふさかのせき",
     "わたのはらやそしまかけてこきいてぬと,ひとにはつけよあまのつりふね",
     "あまつかせくものかよひちふきとちよ,をとめのすかたしはしととめむ",
     "つくはねのみねよりおつるみなのかわ,こひそつもりてふちとなりぬる",
     "みちのくのしのふもちすりたれゆゑに,みたれそめにしわれならなくに",
     "きみかためはるののにいててわかなつむ,わかころもてにゆきはふりつつ",
     "たちわかれいなはのやまのみねにおふる,まつとしきかはいまかへりこむ",
     "ちはやふるかみよもきかすたつたかは,からくれなゐにみつくくるとは",
     "すみのえのきしによるなみよるさへや,ゆめのかよひちひとめよくらむ",
     "なにはかたみしかきあしのふしのまも,あはてこのよをすくしてよとや",
     "わひぬれはいまはたおなしなにはなる,みをつくしてもあはむとそおもふ",
     "いまこむといひしはかりになかつきの,ありあけのつきをまちいてつるかな",
     "ふくからにあきのくさきのしをるれは,むへやまかせをあらしといふらむ",
     "つきみれはちちにものこそかなしけれ,わかみひとつのあきにはあらねと",
     "このたひはぬさもとりあへすたむけやま,もみちのにしきかみのまにまに",
     "なにしおははあふさかやまのさねかつら,ひとにしられてくるよしもかな",
     "をくらやまみねのもみちはこころあらは,いまひとたひのみゆきまたなむ",
     "みかのはらわきてなかるるいつみかは,いつみきとてかこひしかるらむ",
     "やまさとはふゆそさびしさまさりける,ひとめもくさもかれぬとおもへは",
     "こころあてにおらはやおらむはつしもの,おきまとはせるしらきくのはな",
     "ありあけのつれなくみえしわかれより,あかつきはかりうきものはなし",
     "あさほらけありあけのつきとみるまてに,よしののさとにふれるしらゆき",
     "やまかはにかせのかけたるしからみは,なかれもあへぬもみちなりけり",
     "ひさかたのひかりのとけきはるのひに,しつこころなくはなのちるらむ",
     "たれをかもしるひとにせむたかさこの,まつもむかしのともならなくに",
     "ひとはいさこころもしらすふるさとは,はなそむかしのかににほひける",
     "なつのよはまたよひなからあけぬるを,くものいつこにつきやとるらむ",
     "しらつゆにかせのふきしくあきののは,つらぬきとめぬたまそちりける",
     "わすらるるみをはおもはすちかひてし,ひとのいのちのをしくもあるかな",
     "あさちふのをののしのはらしのふれと,あまりてなとかひとのこひしき",
     "しのふれといろにいてにけりわかこひは,ものやおもふとひとのとふまて",
     "こひすてふわかなはまたきたちにけり,ひとしれすこそおもひそめしか",
     "ちきりきなかたみにそてをしほりつつ,すゑのまつやまなみこさしとは",
     "あひみてののちのこころにくらふれは,むかしはものをおもはさりけり",
     "あふことのたえてしなくはなかなかに,ひとをもみをもうらみさらまし",
     "あはれともいふへきひとはおもほえて,みのいたつらになりぬへきかな",
     "ゆらのとをわたるふなひとかちをたえ,ゆくへもしらぬこひのみちかな",
     "やへむくらしけれるやとのさひしきに,ひとこそみえねあきはきにけり",
     "かせをいたみいはうつなみのおのれのみ,くたけてものをおもふころかな",
     "みかきもりゑしのたくひのよるはもえ,ひるはきえつつものをこそおもへ",
     "きみかためおしからさりしいのちさへ,なかくもかなとおもひけるかな",
     "かくとたにえやはいふきのさしもくさ,さしもしらしなもゆるおもひを",
     "あけぬれはくるるものとはしりなから,なほうらめしきあさほらけかな",
     "なけきつつひとりぬるよのあくるまは,いかにひさしきものとかはしる",
     "わすれしのゆくすゑまてはかたけれは,けふをかきりのいのちともかな",
     "たきのおとはたえてひさしくなりぬれと,なこそなかれてなほきこえけれ",
     "あらさらむこのよのほかのおもひてに,いまひとたひのあふこともかな",
     "めくりあひてみしやそれともわかぬまに,くもかくれにしよはのつきかけ",
     "ありまやまゐなのささはらかせふけは,いてそよひとをわすれやはする",
     "やすらはてねなましものをさよふけて,かたふくまてのつきをみしかな",
     "おほえやまいくののみちのとほけれは,またふみもみすあまのはしたて",
     "いにしへのならのみやこのやへさくら,けふここのへににほひぬるかな",
     "よをこめてとりのそらねははかるとも,よにあふさかのせきはゆるさし",
     "いまはたたおもひたえなむとはかりを,ひとつてならていふよしもかな",
     "あさほらけうちのかはきりたえたえに,あらはれわたるせせのあしろき",
     "うらみわひほさぬそてたにあるものを,こひにくちなむなこそをしけれ",
     "もろともにあはれとおもへやまさくら,はなよりほかにしるひともなし",
     "はるのよのゆめはかりなるたまくらに,かひなくたたむなこそをしけれ",
     "こころにもあらてうきよになからへは,こひしかるへきよはのつきかな",
     "あらしふくみむろのやまのもみちはは,たつたのかはのにしきなりけり",
     "さひしさにやとをたちいててなかむれは,いつくもおなしあきのゆふくれ",
     "ゆうされはかとたのいなはおとつれて,あしのまろやにあきかせそふく",
     "おとにきくたかしのはまのあたなみは,かけしやそてのぬれもこそすれ",
     "たかさこのをのへのさくらさきにけり,とやまのかすみたたすもあらなむ",
     "うかりけるひとをはつせのやまおろしよ,はけしかれとはいのらぬものを",
     "ちきりおきしさせもかつゆをいのちにて,あはれことしのあきもいぬめり",
     "わたのはらこきいててみれはひさかたの,くもゐにまかふおきつしらなみ",
     "せをはやみいわにせかるるたきかはの,われてもすゑにあはむとそおもふ",
     "あはちしまかよふちとりのなくこゑに,いくよねさめぬすまのせきもり",
     "あきかせにたなひくくものたえまより,もれいつるつきのかけのさやけさ",
     "なかからむこころもしらすくろかみの,みたれてけさはものをこそおもへ",
     "ほとときすなきつるかたをなかむれは,たたありあけのつきそのこれる",
     "おもひわひさてもいのちはあるものを,うきにたへぬはなみたなりけり",
     "よのなかよみちこそなけれおもひいる,やまのおくにもしかそなくなる",
     "なからへはまたこのころやしのはれむ,うしとみしよそいまはこひしき",
     "よもすからものおもふころはあけやらぬ,ねやのひまさへつれなかりけり",
     "なけけとてつきやはものをおもはする,かこちかほなるわかなみたかな",
     "むらさめのつゆもまたひぬまきのはに,きりたちのほるあきのゆふくれ",
     "なにはえのあしのかりねのひとよゆゑ,みをつくしてやこひわたるへき",
     "たまのをよたえなはたえねなからへは,しのふることのよはりもそする",
     "みせはやなをしまのあまのそてたにも,ぬれにそぬれしいろはかはらす",
     "きりきりすなくやしもよのさむしろに,ころもかたしきひとりかもねむ",
     "わかそてはしほひにみえぬおきのいしの,ひとこそしらねかわくまもなし",
     "よのなかはつねにもかもななきさこく,あまのおふねのつなてかなしも",
     "みよしののやまのあきかせさよふけて,ふるさとさむくころもうつなり",
     "おほけなくうきよのたみにおほふかな,わかたつそまにすみそめのそて",
     "はなさそふあらしのにはのゆきならて,ふりゆくものはわかみなりけり",
     "こぬひとをまつほのうらのゆふなきに,やくやもしほのみもこかれつつ",
     "かせそよくならのをかはのゆふくれは,みそきそなつのしるしなりける",
     "ひともをしひともうらめしあちきなく,よをおもふゆゑにものおもふみは",
     "ももしきやふるきのきはのしのふにも,なほあまりあるむかしなりけり",
    };

    static void Main()
    {
        //上の句の合計
        string[] KaminokuArr = CSVLineDataArr.Select(X => X.Split(',')[0]).ToArray();
        int KaminokuSum = DeriveUniqMojiLengthSum(KaminokuArr);

        //下の句の合計
        string[] SimonokuArr = CSVLineDataArr.Select(X => X.Split(',')[1]).ToArray();
        int SimonokuSum = DeriveUniqMojiLengthSum(SimonokuArr);

        Console.WriteLine(KaminokuSum + SimonokuSum);
    }

    //一意になるのに必要な文字数の合計を返す
    static int DeriveUniqMojiLengthSum(string[] pTargetArr)
    {
        int WillReturn = 0;
        int UB = pTargetArr.GetUpperBound(0);

        for (int I = 0; I <= UB; I++) {
            string CurrStr = pTargetArr[I];
            for (int J = 0; J <= CurrStr.Length - 1; J++) {
                bool IsUniq = true;
                string CurrPart = CurrStr.Substring(0, J + 1);

                for (int K = 0; K <= UB; K++) {
                    if (K == I) continue;
                    if (pTargetArr[K].StartsWith(CurrPart)) {
                        IsUniq = false;
                        break;
                    }
                }
                if (IsUniq) {
                    WillReturn += J + 1;
                    break;
                }
            }
        }
        return WillReturn;
    }
}


実行結果

546


解説

ナイーブに調べてます。