• ベストアンサー

私にはわからない関数のお礼

先週私にはわからない関数で、投稿させていただきました。 おかげさまで何とかお力をかりて、解決することができました。 syouzi08様、178tall様、paperchicken様、Mr.Holland様、本当にありがとうございました。再度お礼を申し上げたくて投稿いたしました。 アルゴリズムを考えるのは本当に難しいですね。数学の力がないと難しいアルゴリズムを考えるのは不可能みたいです。現在49以下で以下のようになるアルゴリズムを考えております。 9→5,4 10→5,5 11→6,5 12→6,6 13→7,6 14→7,7 15→8,7 16→8,8 17→6,6,5 18→6,6,6 19→7,6,6 20→7,7,6 21→7,7,7 22→8,7,7 23→8,8,7 24→8,8,8 25→7,6,6 26→7,7,6,6 27→7,7,7,6 28→7,7,7,7 29→8,7,7,7 30→8,8,7,7 31→8,8,8,7 32→8,8,8,8 33→7,7,7,6,6 34→7,7,7,7,6 35→7,7,7,7,7 36→8,7,7,7,7 37→8,8,7,7,7 38→8,8,8,7,7 39→8,8,8,8,7 40→8,8,8,8,8 41→7,7,7,7,7,6 42→7,7,7,7,7,7 43→8,7,7,7,7,7 44→8,8,7,7,7,7 45→8,8,8,7,7,7 46→8,8,8,8,7,7 47→8,8,8,8,8,7 48→8,8,8,8,8,8 49→7,7,7,7,7,7,7 49までの数字を8,7,6に上の規則で分けていったときの8、7、6の個数を求めるものです。18以下になると5も入ってくるので18以下では規則が崩れてしまって、無理なような気がしますが。 49以上の数字では、ご指導いただいたとおり、以下の式で求まられました。 A=(n-49)/8の商の整数部分 B=n/8のあまり 8の個数=A+B-1 7個の数=8-B 6が混ざってくるとどうなるか、お分かりになる方よろしくお願いいたします。

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

  • ベストアンサー
  • Mr_Holland
  • ベストアンサー率56% (890/1576)
回答No.8

 #6です。  お礼をありがとうございます。  前回のn≧49のケースで検証してみました。 http://oshiete1.goo.ne.jp/qa3113291.html  n≧74のケースでは具体的な数字が掲載されていませんでしたので、前回の#8さん(syouji_08さん)のアルゴリズムでn~1000ぐらいまで作って比較してみたところ、すべて一致していました。(理屈は・・・、もう頭がついていっていないので、説明不能ですが。)  n~1000程度まででよろしければ、#6の式をそのまま拡張して使ってください。  頭が沸騰するぅ

ityounomi
質問者

お礼

ありがとうございます。一週間前まではselect case の分でcase 5,case 6,case 7・・・・case 100と延々とcaseを使って振り分けていました。終いには、VBAさんからお叱りをうけました。「プログラムが大きすぎます!」と。途中から受け付けなくなって、書き足すことができなくなりました。本当に笑い話です。あとは何とか自力でがんばります。VBA立ち上げながら、インターネット見るとPC壊れるんでしょうかね。今日、いきなりハードディスクが壊れてしまいました。初めてです。今までかかって、もう一台のパソコンで書き直ししておりました。あと2時間がんばります。おやすみなさい。お世話になりました。

その他の回答 (8)

noname#47975
noname#47975
回答No.9

#6です。 #8さんへ…。 わざわざ、私のアルゴリズムと比較検証をして頂いて感謝しています。 この結果、#8さんと私の観点は一致している証拠であり、ともにその推測が正しければ、両手法とも有効ですね..。n≧74以降もこの規則に従うのであれば..。 ただ、私のアルゴリズムでは、8の倍数には対応出来ないので、 プログラムの条件分岐を使う必要があります。 ですが、厳密に関数式で表現する場合は、#8さんは全範囲でカバーしているので、私の方の負けです..。w どちらも試してみては如何でしょうか? 質問者さんへ 興味本意でお聞きします。 お答えして頂ければ幸いです。なぜ、このようなアルゴリズムを必要と しているのでしょうか? プライベートに係わるのであれば、お答えはしなくて結構です..。

ityounomi
質問者

お礼

ご教授ありがとうございます。このアルゴリズムについてですが、今行っている仕事でどうしてもクリアーしなくてはならない壁なんです。もちろん私はプログラマーではありませんので、プログラマーの方々にはたぶん簡単なアルゴリズムだとは思うのですが。私は死ぬ思い出試行錯誤。そのあげく、、、今日の4時にいきなりパソコンのハードディスクが壊れてしまいました。私の脳みそと同じ!いきなりです!VBA立ち上げながら、こちらのコーナーを見ていてもう一度VBAの画面にしたら、ん?ん?・・・パソコンの中からいやな音が!カラカラ、カラカラと!そのまま、あとは何もできず。デルのサポートに電話して、F12を3回押してといわれ、結局、「ハードディスクが壊れてます!」との回答。先週苦労して作ったものが、おじゃんになりました。幸いPC2台あったので、もう一度最初から。今までかかってなんとか先週のアルゴリズムの部分を書き直しました。もうかれこれ15時間格闘しております。脳みそもPCも限界です。ありがとうございました。でも、買って2年になるPCなのですが、HD保障してくれるそうです。2ヶ月前にはディスプレイの中がショートしてそれも、新しいのに交換してくれました。良いのやら悪いのやら。すみません。お礼でなく、おしゃべりしてしまいました。ありがとうございました。

noname#47975
noname#47975
回答No.7

#3です。 いい忘れましたが、先日ご質問されたn > 49のケースでも#3のアルゴリズム は、8の倍数以外で適用可能である事は確認済みです。

  • Mr_Holland
  • ベストアンサー率56% (890/1576)
回答No.6

 与えられた文字列は、次の規則に従っているものと思われます。 0a)文字列の文字数は、[(n+7)/8] 個。  (ただし、[x]はガウスの記号で、xより小さい整数を表す。) 0b)同じ文字数の群は、8個。 0c)群内の識別用として mod(-n,8) を使う。 1)文字列は8から4への降順。 2)8が並ぶ個数 N(8) は負でなければ次の値。負になる場合はN(8)=0   N(8)=[(n+7)/8]-mod(-n,8) 3)7が並ぶ個数 N(7) は負でなければ次の値。負になる場合はN(7)=0   N(7)=[(n+7)/8]-|[(n+7)/8]-mod(-n,8)|  (ただし、|x|は絶対値記号。) 4)6が並ぶ個数 N(6) は負でなければ次の値。負になる場合はN(6)=0   N(6)=[(n+7)/8]-|2*[(n+7)/8]-mod(-n,8)-N(8)| 5)5が並ぶ個数 N(5) は負でなければ次の値。負になる場合はN(5)=0   N(5)=[(n+7)/8]-|3*[(n+7)/8]-mod(-n,8)-N(8)-N(7)| 6)4が並ぶ個数 N(4) は負でなければ次の値。負になる場合はN(4)=0   N(4)=[(n+7)/8]-|4*[(n+7)/8]-mod(-n,8)-N(8)-N(7)-N(6)|  もっと詳しい規則もあったはずですが、この暑さで頭で意識が朦朧としていますのでご容赦下さい。(一応、エクセルで上記の規則が正しいことは確認しました。)  それと、うまく拡張すれば、n>49でも使えるかもしれませんが、それも今のところはご容赦下さい。(アツイ!)  念のため、エクセルで作った式を添えておきますので、良ければ参考にしてください。 (nの数) セルA2: (nの入力用) [(n+7)/8] セルB2: =INT((A2+7)/8) mod(-n,8) セルC2: =MOD(-A2,8)  N(8)  セルD2: =IF(B2-C2<0,0,B2-C2)  N(7)  セルE2: =IF(B2-ABS(B2-C2)<0,0,B2-ABS(B2-C2))  N(6)  セルF2: =IF(B2-ABS(2*B2-C2-D2)<0,0,B2-ABS(2*B2-C2-D2))  N(5)  セルG2: =IF(B2-ABS(3*B2-C2-D2-E2)<0,0,B2-ABS(3*B2-C2-D2-E2))  N(4)  セルH2: =IF(B2-ABS(4*B2-C2-D2-E2-F2)<0,0,B2-ABS(4*B2-C2-D2-E2-F2)) (文字列)セルI2: =REPT("8",D2)&REPT("7",E2)&REPT("6",F2)&REPT("5",G2)&REPT("4",H2)

ityounomi
質問者

お礼

ありがとうございます!!!もしかして大学の先生でいらっしゃいますか?普通の人では絶対できないですよね!暑い中本当にありがとうございます。私も上半身裸でやっておりました。 ありがとうございました!!!

noname#47975
noname#47975
回答No.5

何度もご丁寧にお礼を頂きまして大変嬉しく思います。 先ほどのアルゴリズムについて、プログラミングをして検証して 見た結果、8の倍数以外は、#3のアルゴリズムは有効である事を 確認致しました。 8の倍数以外は、8で割った商の数の分だけ8が並ぶという事で 宜しいのではないでしょうか。 また、#3の数列の規則についての箇条書きに若干不備があったので、 ご訂正します。 (3)数字の並びは、2値以下である × (3)数字の並びは、1値もしくは2値であり、 2値になるときはそれらの数字の差は1である。〇

ityounomi
質問者

お礼

ありがとうございます。これだけでも、十分対応できる感じです。 VBAで使っていますので、if で条件分岐していくことができると思います。先週から皆さん方に助けていただいてばっかりです。本当にありがとうございました。

noname#47975
noname#47975
回答No.4

#3です。すみません、Nが8の倍数の時は#3のアルゴリズムが当てはまらない ようですね..。 Nが8の倍数のときは、Nを8で割った商だけ8の数が並ぶ。 それ以外は、#3のアルゴリズムが適用できるかと思いますが、もうすこし 確認してみます。

ityounomi
質問者

お礼

ありがとうございます。一場面の式で無理な場合は、2つの場面に分けて式が2つになってどうにか対処できますので式が2つになってもかまいません。 式1・・・Aの場合 式2・・・Bの場合 私現在2つの場面で考えておりますが、それでもできません。

noname#47975
noname#47975
回答No.3

数列を見る限り、以下のような性質があるようです。 (1)並べた数の和はインデックスの和に等しい (2)先頭に並んでいる数字はできる限り大きく、かつ8よりも大きくならない (3)数字の並びは、2値以下である 以上により、アルゴリズムは以下のとおりになると予想されます。 (1)(N+8)を8で割った商をAとする。 (2){8A-N}をAで割った商をB、余りをCとする。 (3)前に(8-B)を(A-C)個だけ連続させて並べる (4)(3)で並べた後ろに、(7-B)をC個だけ連続させて並べる。

回答No.2

>49までの数字を8,7,6に上の規則で 上の規則ってのがどういうことかわからない。 つまりあらゆる数字を8、7、6の和であらわすってこと? 24だと 6,6,6,6 8,8,8 があるけど、こういうものは両方、書き出すの?それとも8(大きい数)が優先されるの?

ityounomi
質問者

お礼

ありがとうございます。24であれば8,8,8となります。 それから、25が7,6,6となっておりますが7,6,6,6の間違いでした。

  • Mr_Holland
  • ベストアンサー率56% (890/1576)
回答No.1

 わざわざのお礼をありがとうございます。 >25→7,6,6  これは、次の誤記ではありませんか?  25→7,6,6,6  だとしたら、9まで含めて規則性がありそうです。  49から遡っていくと考えやすそう。

ityounomi
質問者

お礼

ありがとうございます。ご指摘のとおり25→7,6,6,6の間違いです。 先週の式を参考にずっと考えておりますが・・・。頭の中が混乱しております。

関連するQ&A