• ベストアンサー

A,B,C3種類の文字で無限列を作る

将棋の千日手について考えていたところ、次のような問題を思いつきました。 A,B,C3種類の文字を一列に並べる方法を考えます。同じ文字は何度も使ってよいですが、同一パターンが続けて並ばないようにします。たとえば簡単な例でいうと、AAとかBBとかCCなどという文字の列は認めないし、ABAB、ABCABCのようにもなってはダメということです。 ABACABCABACABAC… のような配列を考えるわけです。このような無限列は存在するか?という問題を考えています。たとえば、[ABAC]、[ABC]、[BAC]などいくつかの文字の塊を考えて、それを新たにひとつの文字と思いつなげて行く方法などを考えて見ましたが、この塊というのが曲者で、塊の途中から同じパターンが繰り替えされたりすることもあるので一筋縄ではいきません。 3種の文字で無限列を作ることは可能でしょうか?あるいは不可能なら、文字を増やせば可能でしょうか? ちなみに将棋の千日手というのは、かつては同一手順を3回繰り返したら引き分けにする、というルールでした。しかしそれでは無限に続く手が存在するということから、現在は同一局面が4回出現したら引き分けにする、というルールに変っています。このルールにより将棋は必ず有限回で終了するゲームということになっています。ここで同一手順2回でも無限に続く可能性があるのか?ということを考えたくなって上の問題に行き着きました。下は千日手に関する記述のあるwebページです。 http://www.webspace-jp.com/~mozu/mozuiro/moromoro/senkou.html

  • adinat
  • お礼率78% (245/312)

質問者が選んだベストアンサー

  • ベストアンサー
  • corpus
  • ベストアンサー率12% (25/200)
回答No.10

#9です。 #9は間違っていました。 ABCACでは次にABCBACが来るとABCACABCBACでCACAが作られてしまいます。 そこで次のように改良しました。 初期値を適当に決める。 例えばabcab (1) a→A b→B c→C このように大文字に変換する。 (2) A→abacb B→abcbac C→abcacbc このように大文字をなくし小文字のみにする。 (3)この(1)(2)を繰り返す。 以上

adinat
質問者

お礼

お礼大変遅くなりました。たびたび貴重なご回答を提供していただきとても感謝しています。ありがとうございました。補題2(あるいは同じことですが補題1)に相当することがどうして正しいのか少し不安になっていたのですが、正しく証明できるのですね。

その他の回答 (9)

  • corpus
  • ベストアンサー率12% (25/200)
回答No.9

#8です。 ABCACBをABCACにすればひょっとしたらよいかもしれません。

  • corpus
  • ベストアンサー率12% (25/200)
回答No.8

#2です。 今回は#6のeatern27さんのを参考にして3文字の場合を考えました。 規則は次のとおりです。 (A_1,B_1,C_1)=(a,b,c) (A_(n+1) , B_(n+1) , C_(n+1)) =(A_nB_nA_nC_nB_nC_n , A_nB_nC_nA_nC_nB_n , A_nB_nC_nB_nA_nC_n) です。 例えば、 (A_2,B_2,C_2)=(abacbc,abcacb,abcbac) (A_3,B_3,C_3)=(abacbc|abcacb|abacbc|abcbac|abcacb|abcbac, abacbc|abcacb|abcbac|abacbc|abcbac|abcacb, abacbc|abcacb|abcbac|abcacb|abacbc|abcbac)です。 なお"|"とか","は見やすさのために便宜的に置いたものです。 このようにしていくと無限に行くと思います。 なぜABACBCとABCACBとABCBACにしたかというと、 Aからはじめるということ。 それ自身に繰り返しを含まないこと。(例えばABCABCは繰り返しています。) それぞれの文字列の終わりとそれぞれの文字列の始まりが一致しないこと。(例えばABCACBとACBCBAはACBが前者の後半部と後者の前半部にある。) 書いている途中で気づきましたが、これはやっぱりダメです、。ABCACBとABACBCはABCACBABACBCという文字列を作ってしまいます。これはBABAというものが接続部に作られてしまいました。ショック!!この戦略ではダメなのでしょうか?あるいはBAを取り除いていくなど多少の処理をすれば済むのでしょうか?

回答No.7

圧縮方式はいろいろありますが、そのうちのLZ77圧縮方式の原理と大いに関連しそうな話ですね。 この方式では、前に出てきた文字列と同じものを符号化します。詳細は参考サイトを見てください。

参考URL:
http://star.endless.ne.jp/users/graph/part3/3no2.htm
adinat
質問者

お礼

お礼大変遅くなりました。ありがとうございます。

  • eatern27
  • ベストアンサー率55% (635/1135)
回答No.6

3文字の場合は分かりませんが、4文字(以上)の場合なら,おそらく無限列を作れます。(勘違いの可能性が高いので、どなたか、間違いを見つけたら、ご指摘をお願いします) ※adinatさんは、大文字のA,B,Cを並べていますが、説明の都合上、小文字のa,b,c,dを並べます。 a,b,c,dの4つの文字から以下のルールで、4つの文字列の組(A_n,B_n,C_n,D_n)を作ります。 (A_1,B_1,C_1,D_1)=(a,b,c,d) (A_(n+1),・・・,D_(n+1))=(A_nB_n , A_nC_n , A_nD_nB_nD_n , A_nD_nC_nD_n) (n≧1) 例えば、(A_2,B_2,C_2,D_2)=(ab,ac,adbd,adcd)です。 このような文字列はいくらでも長く作ることができ、 そして、これらの文字列には、同一パターンは連続して並んでいません。(・・・と思います) この後が、その証明(というより説明の概略?)です。 (A,B,C,D)=(A_2,B_2,C_2,D_2)=(ab,ac,adbd,adcd)とし, 「a,b,c,dを並べた文字列」のことを「小文字列」。「A,B,C,Dを並べた文字列」の事を「大文字列」と呼びます。 また、N(X)を大文字列Xの文字数、n(x)を小文字列xの文字数とします。 -------------------------------------------------- 補題1 大文字列X_1,X_2を小文字列に直したもの(例:AC→abadbd,ABD→abacadcd)をx_1,x_2とします。(n(x_1)≦n(x_2)とする) x_2の最初のn(x_1)文字からなる文字列をxとして、 x_1=xならば、X_2の最初のN(X_1)文字はX_1に一致する。 (回りくどい表現になってますが、「小文字列が一致すれば、元になっている大文字列も一致する」というイメージです。) x_1,xの最初の文字はいずれもaです。 x_1,xの2番目の文字がbならX_1,X_2の最初の文字はAと決まります。 同様に2番目の文字がcならX_1,X_2の最初の文字はBと決まり、2番目の文字がdなら3文字目を見ることで、X_1,X_2の最初の文字が決まります。 これを繰り返せば、補題1が正しいと分かります。(厳密には帰納法?) -------------------------------------------------- 補題2 ある大文字列Xを小文字列xに直します。 もし、xの途中で同一パターンが並んでいれば、Xの途中でも同一パターンが並んでいる。 1)その同一パターンの最初の文字がaの場合。 (I)・・・(a???)(a???)・・・ 後者の(a???)のaはA,B,C,Dのいずれかに由来します。 1-i)Aに由来する場合 (I)は、・・・(ab ???)(ab ???)・・・ のようになります。 abの並びはAにしか存在しなので、前者の(a???)のaもAに由来することになります。 したがって、もとの大文字列は ・・・A X_1 A X_2 のようになっている事になります。補題1からX_2の最初のN(X_1)文字はX_1に一致する事がわかるので、 従って、・・・A X_1 A X_1 ・・・ と表せることになり、A X_1というパターンが繰り返されます。 aがB,C,Dに由来する場合や、 同一パターンがb,c,dから始まる場合も同様に、大文字列のパターンが繰り返される事が分かります。(多分。必要なら補足を) 従って、補題2が成り立ちます。(成り立つはずです) 補題2の対偶は 「同一パターンがでないように大文字列を並べれば、小文字列にも同一パターンがない」のようになり、これと、A_n等の構成の仕方から、 A_n,B_n,C_n,D_nをa,b,c,dについての文字列に直したときに、同一パターンが存在しない事が分かります。(おそらく) a,b,cの3文字から、同じように(A_n,B_n,C_n)という組の列が作れればよいのですが... 長文&乱文ですいません。(日本語が下手なので、お許しをm(_ _)m) 分かりにくい表現があれば、補足を。。。 A,B,Cの3文字で、同じように(A_n,B_n,C_n)という組の列が作れればよいのですがねぇ...

adinat
質問者

お礼

お礼大変遅くなって本当に申し訳ございません。また大変貴重なご回答とても嬉しく思います。ありがとうございます。4文字はこの証明で大丈夫なようですね。

noname#178429
noname#178429
回答No.5

提示された条件で曖昧な点が一つあります.しかし結果は同じです. 作られた文字列の中に一度出た部分文字列が2度と発生しない. という意味ですが,どこで区切るかということが問題になります.仮に,任意に区切ってということであれば,次のようになるものと考えられます.これが主旨にに近いのではないかと思います. 例えば,  ABACBCという文字列が最初にあったとすれば,2個の文字列(2個列)ではAB,BA,AC,CB,BC,3個列では,ABA,BAC,ACB, CBCが存在することになり,これ以降はこれらの2個あるいは3個の文字列は出てはならないことになります. したがって,2個列について考えるとあと残っている文字列は,CA,これらを使って並べてもせいぜいあと1個(実際は隣り合わせの制約があるのでこれ以下)並べられる程度でたくさん並べられません.有限です. もう一つの考え方は,2個文字列を考える場合は,最初から区切り,2個,3個文字列を考える. 例えば  ABACBC 2個列の時  AB,AC,BC,... 3個列の時  ABA,CBC,. この場合でも2個列で使える2個文字列はせいぜいあと9個ですからすぐ並べられなくなってしまいます.則ち有限です. このほかに別の考え方があれば別の話になるかも知れませんが,もし上のいずれかの文字列の定義に従えば,有限ということになります. 文字を増やしても有限であることには,変わりありません. 余談になりますが,本題の条件をゆるめて,循環小数のような繰り返しを認めないというのであれば,無限にすることは可能になります.

adinat
質問者

お礼

ありがとうございます。もう少し数学的に厳密に言うと、文字列からどの連続する2n個の有限部分列を取り出しても、それらが同じn個の部分列の合併になっていない、という意味です。同じ文字の配列が続けて現れなければよいだけで、何回でも現れてもよいことにしています。もちろんおっしゃるように有限個の文字を並べているのだから、同じ配列は無限回出現しますね。

noname#30727
noname#30727
回答No.4

簡単なプログラムを書いて試してみました。41桁でAから始まるものだけで21万個以上ありました。 数学的な証明は出来ませんが、おそらく無限に続くのではないかと思います。 ABACABCACBABCABACABCACBAC(下に続く) ABACBABCABACABCACBABCABAC(下に続く) BABCACBACABACBABCABACABCA(下に続く) CBABCBACABACBABCABACABCAC

adinat
質問者

お礼

プログラムまで書いて試してくださってありがとうございます。僕もいろいろ紙に書いて試してみたのですが、とても必ず有限列になるようには思えないんですよね。うまく証明できたらよいと思っています。

  • corpus
  • ベストアンサー率12% (25/200)
回答No.3

#2です。さっきのは全部だめでした。 >ABACABCABACABACABCABACBABCAB… BACAが繰り返されていました。

adinat
質問者

お礼

どうもありがとうございます。なかなか手作業だと難しいですよね。てきとうに並べるとほぼ確実にどこかに繰り返しが出現してしまうんです。その意味では結構微妙な問題のような気もします。

  • corpus
  • ベストアンサー率12% (25/200)
回答No.2

ABCABACABCABA ←この後にABCのいずれが来てもダメ ABACABA ←この後にABCのいずれが来てもダメ ABACABCABACABACABCABACA ←この後にABCのいずれが来てもダメ ABACABCABACABACABCABACBABCAB… ←これはわからない。

  • sire
  • ベストアンサー率62% (22/35)
回答No.1

とても面白い問題だと思います。 ご質問とはずれるのですが、 ABACABCABACABAC…に同一パターンがないということを確かめることは、簡単にできるのでしょうか。 ポストの対応問題や分割問題などはそう簡単にはできないようです(NPであってPではないよう)。 でも、今回はもっと簡単な問題ですから無限列は作れそうな、そうでないような。。 後続の方にバトンタッチ。

参考URL:
http://www.aist-nara.ac.jp/~yasumoto/lecture/tm/tm2005-7.pdf#search='ポストの対応問題'
adinat
質問者

お礼

同一パターンがないことを確かめるのは、僕にはしらみつぶしをするしか方法を思いつきません。そういう意味では、もし無限に続くのであれば今のところ証明をする方法がないということになります。何か別のアイデアがあればよいのですが。

関連するQ&A

  • 将棋の千日手に関して

    将棋の千日手のルールは10数年前に、同じ手順を3回連続して繰り返すと成立するという条件から、同一局面が4回出現したら成立すると変更されました。こうなったのは、同じ局面に戻る手順が2通りあるときに、この2つを繰り返すと無限に千日手にならない手順を続けられるということだったと思います。この方法と証明を御教え願えないでしょうか? 話を単純にするため、aとbの2つの文字で、文字列のどの部分を見ても同じ文字列の3回連続することのない無限に長い列を生成する手続きを教えてください。 私は、a(n)、b(n)があったとき、a(n+1)=a(n)+a(n)+b(n)、b(n+1)=a(n)+b(n)+b(n),というやりかたで出来るように思ったのですが、証明が思いつきませんでした。

  • A,B,C3種類の文字で無限列を作るゲーム

    下記のURLはadinatさんが過去に質問してくれた問題です。 http://oshiete1.goo.ne.jp/qa1715716.html 結論としてはある指定された任意の有限列を作ることができると言うことだったと思います。無限に長く作ることができると言ってもいいと思います。 私はこれを先手後手のようなゲームでやって勝負がつくかどうかを考えました。 文字の種類はやはり3文字A,B,Cで、 先手が1文字、後手も1文字のときは先手が必勝する。 例 A B A C A B A 先手が2文字、後手が1文字のときは先手が必勝する。 例1 AB A CA B CB A CA B CB 例2 AB C AC B AB C AC というところまではわかりましたが、 先手が1文字、後手が2文字のときはどちらが勝つかわかりません。 可能性としては、先手が必勝するか後手が必勝するか勝負がつかないか三つのうちのどれかだと思うのですが、私には見当がつきません。勝負がつかないとしたら、その証明はとても難しくなることだけは感じています。

  • 【エクセル】一列中にある文字列の種類をカウントする関数

    お世話になります。 ちょっと、解決に時間がかかっている問題なのですが、 「一列の中で、何種類の文字列パターンがあるか」、 を数える関数(同じ言葉は、一回しか数えないで、列中に何種類あるかを数えたいのです】がないか、ずっと探しています。 count関数でもうまくいかないですし・・・ ピボットだったらできるんですけど、 レイアウト上、関数でできれば、とても助かります。 お手数かけますが、ご指導よろしくお願い致します。

  • 条件付組合せ - ある文字列は何番目に出るか?

    [ABC]の3文字を組み合わせて出来る文字列を順番に並べると、 1. A 2. B 3. AA 4. AB 5. BA 6. BB 7. AAA ... という風になります。 このとき、「Aの次にはBのみが出る」、「Bの次にはAのみが出る」という規則を適用すると、この順番は 1. A 2. B 3. AB 4. BA ... という風になります。 このような規則を適用したとき、「ある文字列が何番目に現れるか」を求めるには、どのように考えればよいのでしょうか? たとえば上記の例でいくと、「ABAB」という文字列が現れるのは一体何番目になるかという問題を、計算で求めるにはどのようにすれば良いのでしょうか。 つまり、 任意の文字を組み合わせて出来る文字列を順番に並べたパターンに対して、「ある文字の次には特定の文字しか出ない」というような規則をいくつか適用したとき、ある文字列が何番目に該当するかを求めるにはどうすれば良いか、 という問題です。 曖昧な部分がありましたら申し訳ありません。 補足させて頂きます。 ご回答よろしくお願い致します。

  • int型の文字列について

    文字列を扱う場合はchar型をつかいますが、int型がchar型より大きいメモリ領域を確保しているとすると、int型で文字列を扱っても問題はないのではと思いました。 実際にやってみると、処理系によって問題なく作動するものとそうでないものが有りますが、基本的な考え方として文字列をint型で扱うことは問題があるのでしょうか? ご存知の方よろしくお願いいたします。 <補足> 要は、255以下の数字を扱うときに、char型でないといけないという制約はなく当然int型を使えるように、文字列においてint型を使うことは、基本的な考え方として問題なのかをお聞きしたい。 当然、処理系において、ルール的に禁じている場合は使えないということは理解できますが。

  • 文字列の置換

    お世話になります。 このような文字列置換可能でしょうか '&nbsp;&nbsp;|&nbsp;&nbsp;<a href=・・・>(・・・' ・・・は、任意の文字列 を '&nbsp;&nbsp;<a href=・・・>(・・・' と、いうようにです。 つまり、文字列の中に'|&nbsp;&nbsp;'と、'('が有ったら、 '|&nbsp;&nbsp;'のみを取り除いた文字列を作成する と、いうことです。 そして、文字列中に同様なパターンが複数回有れば、同時に全てを同様に処理したいのですが。 よろしくお願いいたします。

  • ある法則に従った文字列を抜き出す方法

    以前、ある法則に従った文字列を抜き出す処理をゴリゴリ頑張って作ったのですが、 正規表現で1発で対象文字列を抜き出す事は出来ないのか?と思いました。 しかし、正規表現をそのパターンの時どう記述すると実現出来るのか分からず断念しました。 例えば 1.あいうえお((abc:えー|びー))かきくけこ 2.あいうえお((abc:えー))かきくけこ 3.あいうえお((abc:えー|びー|しー))かきくけこ 4.あいうえお((abc:えー|びー|しー))かきくけこ((abc:でぃー)) こんなのがあった時、パターンとして「((abc:」から「))」の間の文字列を 取得したいです。 1.の時は「えー|びー」、2.の時は「えー」、3.の時は「えー|びー|しー」、 4.の時は「えー|びー|しー」と「でぃー」を、その正規表現にマッチする文字列だとしたいのです。 「((abc:」、「))」の間の文字列長は可変です。 どなたか上記を実現する正規表現をご教示下さい。 正規表現でマッチさせるからには「((abc:」、「))」という文字列もマッチした文字列として 取得するでしょうが、それは後処理で削る事になるので何の問題もありません。

    • ベストアンサー
    • PHP
  • 文字列の切り取り

    任意の文字列String型からある条件を満たした一部分のみ切り出したい .jspの拡張子がついたファイル名のみ取り出す ディレクトリが書いてある場合と、コメントが書いてある場合の2パターン存在する 例外としてファイル名のみ記載されている部分がある(当然ここは問題なし。) 条件 .jspは文字列のどこにあるかは不明 一つの文字列に.jspは複数存在しない ファイル名は統一されていない(パターンなど統一性はない) ファイル名の前は・,/,",日本語がついている場合がある .jspの後は;,);,日本語がついている場合がある これをクリアして xxxxxx.jspを抽出したいのですが、 どんなやりかたがあるのでしょうか? 抽象的ですいませんが宜しくお願いします。

  • 千日手はどうして4回になったの?

    以前千日手とは同じ局面が3回現れた時と覚えていたのですが、最近ネットでそれだと問題が発見されたので、4回に変更になったことを知りました。その問題とはどういうことなのか、私は将棋にあまり詳しくないので、できましたら私にも理解できるよう、簡単な具体例をあげて、説明していただけたら、すごく幸いです。将棋に詳しい方、ぜひ教えてください。どうか、よろしくお願いいたします。

  • 文字列検索で・・・

    Instr関数で文字列の存在チェックを行っています。 この場合、変数indexに1が入った場合 Instr("aaa1_a.sql","index") <----- この場合問題はないのですが、 Instr("aaa12_a.sql","index") <-----となる場合も値がとれてしまうので どうしたものかと困っています。 うまく検索させる方法はないでしょうか? ちなみに検索する文字列には aaa数字.sql aaa数字_a.sql aaa数字_b.sql というパターンがあります。 どなたかよきアドバイスをいただけませんでしょうか? よろしくお願い致します。