パスワードを忘れた? アカウント作成
404723 journal
Linux

cyber205の日記: ひさびさにプログラミング

日記 by cyber205
線形代数で行列式に関して習った時に教授が出した問題。
自力で計算して解くなんて頭が悪くて無理ぽ~だったので、
そこはそれ、機械にやらせようかと。

52枚のカードをちょうど2つに区切ってシャッフルして、
何回同じ処理を行なえば、元の組合せに戻るかを見るプログラム。
分割は必ず26枚目と27枚目の境目で行ない、合わせる時には
必ず双方のデッキから1枚ずつ取り出して重ねていくものとする。

perlとかrubyが使えれば楽勝なんだろうけど、私は使い方を知らん。
というわけで、とりあえずC言語で組んでみた。
各所に入っているprintfはデバッグに苦闘した痕跡。

実行させて調べてみると、2つに区切ったカードデッキのうち、
どちらを新しいデッキの1枚目にもってくるかで、
元のカード配列に戻るまでの回数が変化する。

52枚のカードの場合、早い場合はたったの8ラウンドで元の配列に戻ってしまうことがわかった。

/* shuffle.c */
#include<stdio.h>
#define NUMBER_OF_CARDS 52
#define SHUFFLEFLAG 0

int diffcheck(int trump1[],int trump2[])
{
    int cnt;
    printf("Checking ");
    for(cnt=0;cnt<NUMBER_OF_CARDS;cnt++){
        if(trump1[cnt]!=trump2[cnt]){
            printf("\n");
            return(0);
        }
        printf(".");
    }
    printf("\n");
    return(1);
}
int shuffle(int *trump)
{
    int trump_w[NUMBER_OF_CARDS];
    int cnt;
    /* Shuffle */
    for(cnt=0;cnt<NUMBER_OF_CARDS/2;cnt++){
        if(SHUFFLEFLAG){
            trump_w[cnt*2]=*(trump+(NUMBER_OF_CARDS/2)+cnt);
            trump_w[cnt*2+1]=*(trump+cnt);
        }
        else{
            trump_w[cnt*2]=*(trump+cnt);
            trump_w[cnt*2+1]=*(trump+(NUMBER_OF_CARDS/2)+cnt);
        }
    }
    /* Write Back */
    for(cnt=0;cnt<NUMBER_OF_CARDS;cnt++){
        *(trump+cnt)=trump_w[cnt];
    }
}
int print_deck(int *trump)
{
    int cnt;
    for(cnt=0;cnt<NUMBER_OF_CARDS;cnt++){
        printf("(%d,%d)",cnt,*(trump+cnt));
    }
    printf("\n");
}
int main()
{
    int trump1[NUMBER_OF_CARDS];
    int trump2[NUMBER_OF_CARDS];
    int cnt;
    printf("Calc..\n");
    for(cnt=0;cnt<NUMBER_OF_CARDS;cnt++){
        trump1[cnt]=cnt;
        trump2[cnt]=cnt;
    }
    cnt=1;
    printf("Shuffle Round %d Start\n",cnt);
    shuffle(trump1);
    print_deck(trump1);
    while(!diffcheck(trump1,trump2)){
        printf("Round %d \n",cnt);
        shuffle(trump1);
        print_deck(trump1);
        cnt+=1;
    }
    printf("\nResult %d Rounds\n ",cnt);
}

やっつけ仕事で作ったから、あんまり洗練されてないなぁ。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

アレゲは一日にしてならず -- アレゲ見習い

読み込み中...