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);
}
やっつけ仕事で作ったから、あんまり洗練されてないなぁ。
自力で計算して解くなんて頭が悪くて無理ぽ~だったので、
そこはそれ、機械にやらせようかと。
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);
}
やっつけ仕事で作ったから、あんまり洗練されてないなぁ。
ひさびさにプログラミング More ログイン