メインメニュー
PR
facebook
別フォーラムへ

こんな問題はいかがでしょう


投稿ツリー


前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 | 投稿日時 2014/9/12 17:06 | 最終変更
東 遥  スタッフ   投稿数: 3262

図形問題が続いたので気分を変えてこんな問題をどうぞ。これは実際の入試で出題されたものですが、詳細はCMの後で(違)。

九九が出来れば、あとはちょっとした数字・数式の性質や知識や条件等を勘案すると解ける筈ですので、小学生に与えても文科省から叱られない筈。

では、お楽しみください。
投票数:3 平均点:10.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/12 21:46 | 最終変更
LuckyHill  一人前   投稿数: 1182
DCBAの答えは、かつて国民機と呼ばれたマシーンの型番ですね。その数字に至った過程は次の通り。

(1)「ABCD」も「DCBA」も4桁。「ABCD」は、「DCBA」の取り得る最大値9999を9で割った1111以下。A≠0なので、A=1。

(2)9倍したら「DCB1」と1の位が1になることから、1BCDのDは、D=9。

(3)9の倍数なら各桁の数字の和も9の倍数になる。よって「9CB1」において、B+C=8か17。

(4)「1BC9」は1111以下なので、B=0か1。もしB=1とすると(3)からC=7となって、「1BC9」= 1179 > 1111 で不可。ということでB=0。そしてC=8。

(5)検算 : 「DCBA」= 9801 = 9 × 1089 =「ABCD」×9

以上。

※上の(3)は、たしか中学になってから習うと思うので、小学生ルールだと違反かな?
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/12 22:07
YMN  常連   投稿数: 634
 BASIC で答えを求めてみました。
答えがひとつとは限らないとして、答えが出ても停止せず最後まで検索を行います。

FOR A=0 TO 9
FOR B=0 TO 9
FOR C=0 TO 9
FOR D=0 TO 9
IF (A*1000+B*100+C*10+D)*9=D*1000+C*100+B*10+A THEN PRINT A;B;C;D
NEXT D
NEXT C
NEXT B
NEXT A

 フリーウェアの Tiny Basic for Windows だと瞬時に終わってしまいます。
ポケットコンピュータ PC-G850VS(ついに生産終了になりポケコンの時代が終わってしまいました)だと最初の0,0,0,0に続いて答えは比較的すぐに出ましたが(Aが小さい数なので)、終了まで数分かかりました。
(昔の人の目には)やたらと速い Tiny Basic は「コンパイラなのでは?」と確認したら、インタプリタでした。
投票数:1 平均点:10.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/12 23:04 | 最終変更
東 遥  スタッフ   投稿数: 3262
ぉぉ、成程、まず元の数字の範囲を限定し、また、桁の合計が9の倍数というところで探しましたか。解き方は色々御座いますねぇ。

序に「国民機」にもお気づきになられて流石。

因みに東がご用意申し上げた回答例はこちら。

各桁の和を用いていないので小学生でも大丈夫でしょう(笑)。

- - - -

この問題は、東京都立科学技術大学が4年制に移行した1986年度か翌年の1987年度の入試における数学の問題の最初の方の出題です。当時の共通一次のAグループでもBグループでもない、Cグループでしたっけ? それで随分と応募者が殺到して倍率は15倍だかなんだかだったという事です。実際に受験した関係者によれば受験者数が凄かったので会場が足りず当人は体育館に机とパイプ椅子を並べて急遽拵えた会場に割り当てられ石油ストーブが並べられたものの物足りなくて寒くて震えて悴む手でこの問題を解き回答がPC-9801だったものでこれは何かの間違いかと検算してやはり間違いないので一体どんな意味が込められているやら暫し茫然としたのだという事です。出題者恐るべし。

因みにその関係者、15倍の難関を突破し見事合格したそうな。つーか、併願が見え見えなので大学側も定員の4倍くらい合格を出してたらしいんですが、結局定数を充足できなかったそうです。はい、その当人も「....日野市は....遠い....遠すぎる....」通えないので諦めて他の大学にしたそうですが....なら最初から受けるなよ、と。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/13 2:09 | 最終変更
東 遥  スタッフ   投稿数: 3262
なるほど、力技ですねぇ(笑)。

- - - -

最内ループは10000回実行、IF行の内訳を見ますと、1ループあたり、条件が成立しないとして

 ・乗算 7回
 ・加減算・比較演算 7回
 ・条件分岐 1回
 ・分岐(ループ) 1回

最近のCPUのオブジェクトコードレベルで実装するなら、全てのコード・データが1次キャッシュにのり分岐予測を除外してスーパースカラなしで1GHzのCPUですと

 ・乗算 2クロック×7=14クロック
 ・加減算・比較演算 1クロック×7=7クロック
 ・条件分岐 20クロック
 ・分岐(ループ) 20クロック
 #メモリ・レジスタ間転送は命令パイプラインの中で隠蔽される、とします。

1ループ実行に61クロック、1クロックが1nsですので61ns、これが1万回なので610,000ns = 610μs、1msにも満たずに終了する。
これがインタプリタだと一声30倍の時間がかかるので18300μs=18ms、人間にしてみれば一瞬で御座いましょう。

一方でポケコンですと、

SHARP学校向けポケコン

こちらに紹介されているところではCPUはZ80の8MHzだそうで御座います。これでみると、先ず

・1回の加減算のために、
 LD  HL,(ADRVA)  ; 16クロック
 LD  DE,(ADRVB)  ; 20クロック
 ADD HL,DE       ; 11クロック
 LD  (ADRVC),HL  ; 16クロック
;             計 63クロック
・1回の乗算のために、
;
; 概算の為の仮コードですので間違い等はご容赦を
;
   LD   BC,0800H    ; 10クロック
   LD   DE,(ADRVA)  ; 20クロック
    LD   HL,(ADRVB)  ; 16クロック
    LD   A,L         ;  4クロック
    LD   L,C         ;  4クロック
    LD   C,H         ;  4クロック
    LD   H,L         ;  4クロック
;                 小計 62クロック
;
 L1:RRA              ;  4クロック
    JP   NC,P1       ; 10クロック
    ADD  HL,DE       ; 11クロック
 P1:RR   H           ;  8クロック
    RR   L           ;  8クロック
    DJNZ L1          ; 13クロック(ループ時) 
                    ;  8クロック(ループしない)
;                 小計 54クロック(ループ時)
;                      49クロック(ループしない)
;          ループ全体 427クロック(7回反復、8回目スルー)           
;
    RRA              ;  4クロック
    LD   (ADRVC),A   ; 13クロック
    LD   A,C         ;  4クロック
    LD   BC,0800H    ; 10クロック
;                 小計 31クロック
;
 L2:RRA              ;  4クロック
    JP   NC,P2       ; 10クロック
    ADD  HL,DE       ; 11クロック
 P2:RR   H           ;  8クロック
    RR   L           ;  8クロック
    DJNZ L2          ; 13クロック(ループ時) 
                    ;  8クロック(ループしない)
;                 小計 54クロック(ループ時)
;                      49クロック(ループしない)
;          ループ全体 427クロック(7回反復、8回目スルー)           
;
    RRA              ;  4クロック
    LD   (ADRVC+1),A ; 13クロック
;                 小計 17クロック
;
;                  計 964クロック
ぉぉ、1000クロック近くもかかるのか。んで、この値でさっきと同様に計算すると


 ・乗算 964クロック×7=6748クロック
 ・加減算・比較演算 63クロック×7=441クロック
 ・条件分岐 10クロック
 ・分岐(ループ) 13クロック

1ループ実行に7212クロック、1クロックが125nsですので901500ns = 901.5μs ( cf さっきは61ns )、これが1万回なので9,015,000μs = 約9秒、行き成り人間の感覚で感知するところになる。
これがインタプリタだと一声30倍の時間がかかるので270秒=4分半。オーダーとしてはまあまあそんなものでしょうか。

- - - -

乗算で比較すると、実行クロック数で500倍、クロックサイクルの周期長で125倍、おまけにスーパースカラがからんでくると更に2倍以上の性能向上があり、Z80(8MHz)と現代的パソコン用CPU(1GHz)の間では125,000倍の性能のひらきがある。最先端の4GHzになると500,000、50万倍、か。

逆に言えば昔はささやかでつつましいCPUで色々と熟したものだなぁと感慨深い次第。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2014/9/13 12:18
LuckyHill  一人前   投稿数: 1182
 ヴァリエーションとして、4倍で成り立つものがありました。お時間のある方はこちらもどうぞ。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/13 16:18
YMN  常連   投稿数: 634
> LD HL,(ADRVA) ; 16クロック
> LD DE,(ADRVB) ; 20クロック

 松田聖子がまだ若かった頃のような遠い昔・・・、どこかで見た面影と思ったら、Z80 アッセンブラでした。
それにしても今となってはクロック数の多さが目につきます。

>これがインタプリタだと一声30倍の時間がかかるので270秒=4分半。

 4分弱ですので、いい線行っていることになります。
もっとも(良くも悪くもの)BASIC だと変数宣言が無いので整数に型が定まらず実数扱いになり、実質実行時間はもっと長く、「一声30倍」より倍率がかなり小さいことも考えられます。

 下のように行頭に"'"を付けてコメントにしてしまい、空ループの時間で計測してみたら18秒程度でした。

'IF (A*1000+B*100+C*10+D)*9=D*1000+C*100+B*10+A THEN PRINT A;B;C;D

 PC-G850VS はセミコンパイラのC言語もサポートしています(Z80 アッセンブラもありますが使ったことはありません)。
セミコンパイラなるものが何者なのか、詳しい説明は無くて良く分かりませんが、BASIC よりはかなり速く、下のプログラムで29秒でした。

main()
{
int a,b,c,d;

for(a=0;a<10;a++)
for(b=0;b<10;b++)
for(c=0;c<10;c++)
for(d=0;d<10;d++)
if((a*1000+b*100+c*10+d)*9==d*1000+c*100+b*10+a)printf("%d%d%d%d\n",a,b,c,d);
}
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/13 16:20
YMN  常連   投稿数: 634
> ヴァリエーションとして、4倍で成り立つものがありました。

FOR X=2 TO 9
FOR A=0 TO 9
FOR B=0 TO 9
FOR C=0 TO 9
FOR D=0 TO 9
IF (A*1000+B*100+C*10+D)*X=D*1000+C*100+B*10+A THEN PRINT X;":";A;B;C;D
NEXT D
NEXT C
NEXT B
NEXT A
NEXT X

 これでXを2から9まで調べたら(X=1は外しました)、4と9以外はありませんでした。
AからEの5桁でも調べたら、やはり4と9でした。

 「4と9しかない法則でもあるのか?」ということでAからFの6桁で調べたら(さすがにパソコンでも少々時間がかかりました)、それぞれ2個ずつで4と9しかありませんでした。
ただし、2個といってもこのプログラムでは021780*4=087120のように最上位の数に0があって実質桁が小さい数になるものが表示されたまでで、それを除外するとひとつづつになります。
これでは法則とは呼べませんが、「4と9予想」といったあたりになります。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - | 投稿日時 2014/9/13 17:12
東 遥  スタッフ   投稿数: 3262
大凡、×9 の時と同じパターンですね。

 ・被乗数(上)において当該桁の取り得る範囲を決める
 ・乗算結果(下)において当該桁に当てはまるものを選ぶ
   ・その桁の乗算結果、桁上がりを組み入れた結果に合致するか
   ・奇数・偶数で判別して合致するか

4桁の方は、A→D→B→Cはちょっと試行錯誤

5桁の方も、A→E→B→D→Cはちょっと試行錯誤

というところでしょうか。確定させていく順番を見定めて根気よく間違いなく一つ一つ決めていけば正解にたどり着くのでしょう。

因みに結果の数字に意味は見出せませんでした(笑)。

- - - -

YMNさんのプログラムでパラメータを変えながら回したらもっと他のパターンも見つかるかも知れませんね。ポケコンだと5桁は厳しいかも知れませんが。

と申しましょうか、昔だったらこうゆうパターンを見つけるのは時間単位でかかったものが今のPCだとあっという間、という事なので御座いましょう。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/13 17:17 | 最終変更
東 遥  スタッフ   投稿数: 3262
もう試されていたのですね、行き違いでした。失礼いたしました。

へぇ、4と9のみですか。無理やり法則を考えるなら、

 N×5 - 1

という事....かなぁ。他の基数では果たしてどうなることやら。このあたりを調べるのもまた楽しからずや。

ぬぅ、今、UNIX・Linux環境が手近にない。おうちサーバーが落ちている(ToT)
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/13 20:00 | 最終変更
LuckyHill  一人前   投稿数: 1182
YMN さんも、東 遥 さんも、ただ単に与えられた問題を解くだけじゃなく、何倍でも成り立つのだろうか?というところまで踏み込んでいくあたり、なかなか素晴らしいです。願わくば、今の小学生・中学生も皆、このような姿勢であれば、日本の未来は明るい!...かな(笑)。

解き方についてはすでに書かれている通りですので、一応、解答だけ。
 4桁のほうは、2178 × 4 = 8712
 5桁のほうは、21978 × 4 = 87912
となります。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 | 投稿日時 2014/9/13 20:09 | 最終変更
LuckyHill  一人前   投稿数: 1182
>4桁のほうは、2178 × 4 = 8712
>5桁のほうは、21978 × 4 = 87912

コメントを送信し終えて、ふと気付いたので(一種のパターン認識というヤツです)電卓を叩いて確認してみたら備後、じゃなくてビンゴ!

 6桁の時 219978 × 4 = 879912
 7桁の時 2199978 × 4 = 8799912
 8桁の時 21999978 × 4 = 87999912
 9桁の時 219999978 × 4 = 879999912
 10桁の時 2199999978 × 4 = 8799999912

11桁以上は、私の所有する電卓では確認できませんでした(汗)
投票数:1 平均点:10.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/13 20:24
LuckyHill  一人前   投稿数: 1182
>11桁以上は、私の所有する電卓では確認できませんでした

労を惜しんではいけませんね(汗)。自分の手を使って筆算したら、すぐにパターンが飲み込めました。11桁以上でも真ん中の9が増えていくだけで、延々と成り立ちます。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/13 22:18
東 遥  スタッフ   投稿数: 3262
おぉっ!!!

その証明を記述するにはバッテリーが少な過ぎる(違)
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/13 23:25
YMN  常連   投稿数: 634
 パソコンのCコンパイラで8桁まで調べました。
やはり4と9しかありません。
×9の方も9の連続が挟まる法則性が見られます。

6桁
219978*4=879912
109989*9=989901

7桁
2199978*4= 8799912
1099989*9= 9899901

8桁
21782178*4=87128712
21999978*4=87999912
10891089*9=98019801
10999989*9=98999901

4桁の2178*4=8712と1089*9=9801は桁上がり無しで4桁内で完結していて、8桁でこれが2つセットになっています。
12,16と4桁づつでこのパターンが現れることになります。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/14 0:10 | 最終変更
東 遥  スタッフ   投稿数: 3262
凄い!

9が間に幾らでも継ぎ足せるというのは、下からの桁上がりと上への桁上げの関係から分かりやすいですが、成程、4桁単位で継ぎ足せるというのもアリですね!

では調子に乗って東もちと予言(?)を。

×4の時、被乗数が

2178219999782178 (4+8+4=16桁)
2199997821999978 (8+8=16桁)

21999978217821999978 (8+4+8=20桁)
21782199999999782178 (4+12+4=20桁)

というのもアリなのでしょう....

....つーか....

....あれですね「左右対称」なら、

2197821978 (5+5=10桁)
219978219978 (6+6=12桁)
21999782199978 (7+7=14桁)

とか、

2178219782178 (4+5+4=13桁)

とか言うのもアリなのでしょう。むぅ? なんか凄いぞ。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/14 18:56
YMN  常連   投稿数: 634
>もっとも(良くも悪くもの)BASIC だと変数宣言が無いので整数に型が定まらず実数扱いになり、

 実数演算は整数演算よりズーッと遅いというのが、昔のパソコンの常識だったのですが、どうやら今のパソコンではプロセッサがサポートしていて、大きな差は無いようです。

 「インタプリタはすごく遅い」もいつの間にか昔の人の発想になっていたのでした。
「コメントは入れない」とか遅いBASICを(いくばくか)高速化するテクニックなどもありましたが、今となっては殆ど意味をなさなくなってしまいました。

> (Z80 アッセンブラもありますが使ったことはありません)。

 軽い気持ちで「少しは使ってみるか」という気になったのですが、アセンブラでプログラムするには、機械語の領域宣言とかダンプとか機械語モニターの使い方にも一応目を通す必要があり、少々面倒なものがありました。
大昔、仕事でもZ80アセンブラは使ったことがあるのですが、(自転車の乗り方などとは違って)殆ど使えなくなっていました。
自分でプログラムするのは諦めて、ポケコンの説明書にあった以下の簡単なサンプルプログラムを打ち込んでみました。

ORG 0100H
START: LD A,20H
LD HL,0400H
LBL: LD (HL),A
INC A
INC HL
CP 0A0H
JP NZ,LBL
RET
END

 実行させて「20Hからひとつづつ増えて最後にA0Hがあるんだよね(^^)」というつもりでダンプリストを見ていったら、A0Hは無いのでした。

 「アッセンブラ」をグーグルで検索したら「もしかして:アセンブラ」と表示が出てきてしました。
assemblerなので「ッ」を付けたくなりますが、英語の発音でも「ッ」は無いようです。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/14 19:09
YMN  常連   投稿数: 634
ORG 0100H
START: LD A,20H
LD HL,0400H

 行頭のTABが消えてしまい(コピペすると残っていたりします)、スペース8個にしてみました。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/14 19:12
YMN  常連   投稿数: 634
>、スペース8個にしてみました。

 これもダメでした。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 | 投稿日時 2014/9/14 20:43
LuckyHill  一人前   投稿数: 1182
 またちょっと変わったヴァリエーションを見つけてきました(悪ノリし過ぎかな?)

 数字の1~9(0はありません)をそれぞれ1回ずつ使って、次の式を完成させてください。
 
 右側は、掛け算の結果に足し算を続けて行う、というものです。左側のものは、該当する答えが2通りあります。
投票数:18 平均点:10.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/14 21:28 | 最終変更
東 遥  スタッフ   投稿数: 3262
[code][/code]で囲みましょう。

[code]
     ORG 0100H
START: LD A,20H
     LD HL,0400H
[/code]

とすると(以上は説明のためにスクエア・ブラケットを全角にしてありますが、実際には半角です)、下記の様になります。

    ORG 0100H
START: LD A,20H
    LD HL,0400H
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/14 22:57
YMN  常連   投稿数: 634
>[code][/code]で囲みましょう。

 ありがとうございます。
では試してみます。

main()
{
 char b;
	while(1)
	{
		b=miniget();
		printf("hen%d\n",b);
	}
}
投票数:1 平均点:10.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/15 1:36
LuckyHill  一人前   投稿数: 1182
>では試してみます。

 知っていると役に立つワザとして、他の人のコメントでちょっと真似してみたいなと思う書き方がある時には、そのコメントに「返信する」で入ってから、コメント文を書くテキストボックス下の「引用」ボタンを押すと、どういうタグを使っているのか見ることが出来ます(それをコピペも出来ます)。

 下の画像は、この会議室の「数式の表示」トピックの発言をのぞき見したところ。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - | 投稿日時 2014/9/15 16:39
LuckyHill  一人前   投稿数: 1182
 難しいと思いますので(私は解けなかった!)1つヒントを出しておきます。奇しくもと言いますか、この問題でも掛ける数字のところ(左右とも筆算の2行目)には「4」が入ります。
投票数:0 平均点:0.00
返信する
YMN

なし Re: プログラム・リストの表示

msg# 1.2.1.1.1.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/15 19:14
YMN  常連   投稿数: 634
> 知っていると役に立つワザとして、

 「上級者の秘密のテクニック」に見えたものが、舞台裏公開ですね。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/15 19:29
YMN  常連   投稿数: 634
 左側の問題をBASICで解いてみました。
何も考えず「そのまんま」という形で何とも芸のないプログラムです。
パソコンで何10分もかかり、答えは2つあり、比較的最初のうちに答えが出揃ってしまって演出的には今いちでした。

FOR A=1 TO 9
PRINT A
FOR B=1 TO 9
FOR C=1 TO 9
FOR D=1 TO 9
FOR E=1 TO 9
FOR F=1 TO 9
FOR G=1 TO 9
FOR H=1 TO 9
FOR I=1 TO 9

IF (A*1000+B*100+C*10+D)*E<>F*1000+G*100+H*10+I THEN GOTO *LB1
IF A=B OR A=C OR A=D OR A=E OR A=F OR A=G OR A=H OR A=I THEN GOTO *LB1
IF B=C OR B=D OR B=E OR B=F OR B=G OR B=H OR B=I THEN GOTO *LB1
IF C=D OR C=E OR C=F OR C=G OR C=H OR C=I THEN GOTO *LB1
IF D=E OR D=F OR D=G OR D=H OR D=I THEN GOTO *LB1
IF E=F OR E=G OR E=H OR E=I THEN GOTO *LB1
IF F=G OR F=H OR F=I THEN GOTO *LB1
IF G=H OR G=I THEN GOTO *LB1
IF H=I THEN GOTO *LB1
PRINT A;B;C;D
PRINT E
PRINT F;G;H;I
*LB1
NEXT I
NEXT H
NEXT G
NEXT F
NEXT E
NEXT D
NEXT C
NEXT B
NEXT A
END
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/16 1:01 | 最終変更
東 遥  スタッフ   投稿数: 3262
LuckyHillさん、恨んで良いですか(笑)。

こんなのを作ってしまった(爆)

実際、駄目なケースを除外しながら手書き(?)して行った次第。4枚あり、









説明の為1枚目の左上の如く記号をつけましたが、E→A→D→C→Bの順にループを回しつつ当てはまらないケース

 ・次に当てはめるべき数字が既に出ている
 ・計算結果が0になる
 ・計算結果の数字が既に出ている
 ・計算結果が5桁になると明らか

となったところで当該ループを打ち切りましたが、さて、漏れは無いでしょうか。

とは言え、楽になったのは×1,×2,×5,×8,×9,の時くらいですけどね。

てな訳で確かに回答は2つ。んでもって、法則性は見つからず。ぬぅ、困った。これ、艶やか爽やかな解法あるんでしょうか?
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2014/9/16 20:18
LuckyHill  一人前   投稿数: 1182
>LuckyHillさん、恨んで良いですか(笑)。

 いやー、変な問題を出してしまい申し訳ありません。でも、お疲れさまでした。私のところだけかも知れませんが、掲示板の画面ではせっかくの東 遥 さんの力作4枚の解答用紙が重なってしまって上手く見えないので、正解が載っている1枚はこちらですね。
 http://fsci.4rm.jp/modules/xelfinder/index.php/view/230/Q14914A2S.jpg


>これ、艶やか爽やかな解法あるんでしょうか?

 別トピで、zima さんが書かれたように、「エレガントな解法」は無くて「エレファントな解法」つまり腕力で総当たりするしかない問題なのかもしれません。実は、このクイズをみつけてきたページでも、YMN さんと同様、コンピュータでプログラムを組んで解答を出したとありました。「人力で解ける問題じゃない」とも(汗)。

 このようなクイズは、貴重な日本の知的労働力の無駄遣いになりかねませんね(笑)
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/19 20:06
LuckyHill  一人前   投稿数: 1182
 msg# 1.4の右側の筆算の答えは

です。
投票数:1 平均点:10.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/19 21:40
東 遥  スタッフ   投稿数: 3262
ぇぇ、疲れました(笑)。図の各要素の並び具合がヘロヘロな所に疲労の痕を見て取って頂けるかと存じます(爆)。

私の所では Firefox-32.x.x です。つーか、ここの所最新のを自動で使ってまして、これで見ると重ならず一応縦に並んで見えております。これでは如何でしょう。

或いは、拡大表示、WEBブラウザでCTRLを押しながらマウスのホイールを回すのではどうでしょうか。拡大すると広がってそれなりには見えるかなと。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/20 1:09
伊豆倉 正敏  スタッフ   投稿数: 675
皆さん今晩は
>219978 × 4 = 879912

 21(9がn個続く)78 
     ×4
-------------
+          32=8×4
+         28 =7×4
+         36  =9×4
+       36   =9×4 (がn回)
(中略)
+  36        =9×4 (がn回)
+  4         =1×4
+8           =2×4
-------------------
よって 
1の桁は32の2
10の桁は「 1の桁から繰り上がった3 」+(28の8)=11 で
10の桁の回答は1で、100の桁に1を取り上げ。

100の桁は、「 繰り上がった1 」+2+6=9 で回答に9が入り繰り上げ無し。

9が続く桁は4倍すると36なので、「 繰り上げの3 」+6で9が続き、
繰り上がりの3は次の9×4=36の6を9にし続ける。

初めの21からはじまる桁は9が続く桁からの3を繰り上げとして
3+21×4=3+84=87

でいいでしょうか?

9×4=36で、「1つの下の位の繰り上がり3」+6=9
を骨格に9より下の桁は(繰り上がりも混みで)4倍した時に、回答となる位が3となる数を付けると3+6=9のループに繋げれる。
4倍する前の9より前の数値は回答に「 繰り上がりの3 」が入るだけなので何でも良い。

9に対して1桁のかけ算では1の位と10の位を足したら9になる法則があるのでもっと一般化できるかも。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/20 11:31 | 最終変更
LuckyHill  一人前   投稿数: 1182
 私はIE8で見ているのですが、SXGA(1280x1024)のディスプレイで最大に広げた時でも次のようになってしまいます(サムネイルが重なり合ってしまって、うまく4枚を区別してクリックできませんでした;汗)。



 1年ほど前、現在のFSCIがスタートした頃に適宜書いていた『備忘録 / 4rm会議室の歩き方』(at 居酒屋部屋)というトピックにも書いたことがあるのですが、発言に画像を貼る時には、IMAGE MANAGERの中で貼り付けたい画像をダブルクリックすると次のような画面になって、その中から画像の配置の仕方を選ぶことができます。



 6つのアイコンのうち、上段3つはサムネイル貼り付け、下段3つはそのままのサイズでの貼り付けを意味しています。それぞれ

  左: 画像の右側に文章が回り込み(画像は左寄せ)
  中: 文章の回り込み禁止(画像は左寄せ)
  右: 画像の左側に文章が回り込み(画像は右寄せ)

が選べます(上の画像はサムネイル&回り込み禁止で貼っています)。

 出来れば、↑の説明の「中」:文章回り込み禁止で貼っていただければ、見る側の解像度によって書き手のイメージしたレイアウトが大きく崩れてしまうことは防げるかと思います(東 遥 さんのは画像右寄せで貼ってありました)。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/20 20:34 | 最終変更
LuckyHill  一人前   投稿数: 1182
 追伸です。このトピの上の方の発言に対しては、私の環境でも添付図のように問題なく文字が画像に対し回り込んでいますので、レイアウトの乱れが起こるのは複数の画像を貼った場合だけかと思われます。


※ この発言では私も「サムネイル & 画像右寄せ」で貼り付けてみました。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/21 9:33
東 遥  スタッフ   投稿数: 3262
LuckyHillさん、色々と御教授賜り有難う御座います。試してみます。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014/9/21 10:28
東 遥  スタッフ   投稿数: 3262
では私の方はC言語で。

//
// ROLLER1.c ( Ver 1.6.2 )
// Numerical Puzzle
// by ADUMA Haruka
//
// % gcc -o ROLLER1 ROLLER1.c
// % ./ROLLER1
//
// if ( m1 ) result = ( ABCD * E == FGHI ) ;
// if ( m2 ) result = ( ( ( AB * C == DE ) && ( DE + FG == HI ) ) ) ;
//
// 2.650s @ Core i5-4200 ( 2.2GHz )
//

#include <stdio.h>
#include <stdlib.h>

#define MAXCARDINALS 20L

int main ( int ARGC , char **ARGV , char ENVV ) {

 unsigned long A , B , C , D , E , F , G , H , I ;
 unsigned long L , M , R , L1 , L2 , R1 , R2 ;
 unsigned long c = 10L ;
 unsigned long S4 = 1L , SX = 1L ;
 int i ;
 char f[MAXCARDINALS] ;

 int m1 = 1 , m2 = 0 ;
 int result = 0 ;

 if ( m1 == 0 ) m2 = 1 ;

 for ( i = 0 ; i < MAXCARDINALS ; i++ ) f[i] = 1 ;

 for ( c = 10L ; c <= 10L ; c++ ) {
  for ( A = S4 ; A < c ; A++ ) {
   for ( B = SX ; B < c ; B++ ) {
    for ( C = SX ; C < c ; C++ ) {
     for ( D = SX ; D < c ; D++ ) {
      for ( E = SX ; E < c ; E++ ) {
       for ( F = SX ; F < c ; F++ ) {
        for ( G = SX ; G < c ; G++ ) {
         for ( H = SX ; H < c ; H++ ) {
          for ( I = SX ; I < c ; I++ ) {
           result = 0 ;
           if ( m1 ) {
            M = E ;
            L = ( ( ( ( A * c ) + B ) * c + C ) * c + D ) * M ;
            R =   ( ( ( F * c ) + G ) * c + H ) * c + I       ;
            result = ( L == R ) ;
           }
           if ( m2 ) {
            L1 = ( ( A * c ) + c ) * C ;
            R1 =   ( D * c ) + E ;
            L2 = R1 + ( ( F * c ) + G ) ;
            R2 =        ( H * c ) + I ;
            result = ( ( L1 == R1 ) && ( L2 == R2 ) ) ;
           }
           if ( result ) {
            if ((A!=B)&&(A!=C)&&(A!=D)&&(A!=E)&&(A!=F)&&(A!=G)&&(A!=H)&&(A!=I)
                      &&(B!=C)&&(B!=D)&&(B!=E)&&(B!=F)&&(B!=G)&&(B!=H)&&(B!=I)
                              &&(C!=D)&&(C!=E)&&(C!=F)&&(C!=G)&&(C!=H)&&(C!=I)
                                      &&(D!=E)&&(D!=F)&&(D!=G)&&(D!=H)&&(D!=I)
                                              &&(E!=F)&&(E!=G)&&(E!=H)&&(E!=I)
                                                      &&(F!=G)&&(F!=H)&&(F!=I)
                                                              &&(G!=H)&&(G!=I)
                                                                      &&(H!=I)){
             printf ( "c=%3ld : %2ld,%2ld,%2ld,%2ld,%2ld,%2ld,%2ld,%2ld,%2ld\n"
              ,c,A,B,C,D,E,F,G,H,I
             ) ;
 }}}}}}}}}}}}
 return 0 ;
}

ループとしては、1000000000回....ぇーと、一、十、百....億、十億回、になるのか。それを2.65秒でこなすのですから気の遠くなる様な速さという事でしょう。

逆に言えば1ループ平均実行時間は2.65nsという事で、IPC=1と思うと1ループを平均5.83命令でこなすということになる。実際にはIPCはもう少し大きいでしょう。

....計算合ってますよね?
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014/9/21 10:50 | 最終変更
東 遥  スタッフ   投稿数: 3262
それだけでは芸が無いのでこうゆう工夫をしてみる。

//
// ROLLER2.c ( Ver 2.2.7 )
// Numerical Puzzle
// by ADUMA Haruka
//
// % gcc -o ROLLER2 ROLLER2.c
// % ./ROLLER2
//
// if ( m1 ) result = ( ABCD * E == FGHI ) ;
// if ( m2 ) result = ( ( ( AB * C == DE ) && ( DE + FG == HI ) ) ) ;
//
// 0.050s @ Core i5-4200 ( 2.2GHz )
//

#include <stdio.h>
#include <stdlib.h>

#define MAXCARDINALS 20L

int main ( int ARGC , char **ARGV , char ENVV ) {

  unsigned long A , B , C , D , E , F , G , H , I ;
  unsigned long L , M , R , L1 , L2 , R1 , R2 ;
  unsigned long c = 10L ;
  unsigned long S4 = 1L , SX = 1L ;
  int i ;
  char f[MAXCARDINALS] ;

  int m1 = 1 , m2 = 0 ;
  int result = 0 ;

  if ( m1 == 0 ) m2 = 1 ;

  for ( i = 0 ; i < MAXCARDINALS ; i++ ) f[i] = 1 ;

  for ( c = 10L ; c <= 10L ; c++ ) {
    for ( A = S4 ; A < c ; A++ ) if ( f[A] ) { f[A] = 0 ;
      for ( B = SX ; B < c ; B++ ) if ( f[B] ) { f[B] = 0 ;
        for ( C = SX ; C < c ; C++ ) if ( f[C] ) { f[C] = 0 ;
          for ( D = SX ; D < c ; D++ ) if ( f[D] ) { f[D] = 0 ;
            for ( E = SX ; E < c ; E++ ) if ( f[E] ) { f[E] = 0 ;
              for ( F = SX ; F < c ; F++ ) if ( f[F] ) { f[F] = 0 ;
                for ( G = SX ; G < c ; G++ ) if ( f[G] ) { f[G] = 0 ;
                  for ( H = SX ; H < c ; H++ ) if ( f[H] ) { f[H] = 0 ;
                    for ( I = SX ; I < c ; I++ ) if ( f[I] ) { f[I] = 0 ;
                      result = 0 ;
                      if ( m1 ) {
                        M = E ;
                        L = ( ( ( ( A * c ) + B ) * c + C ) * c + D ) * M ;
                        R =   ( ( ( F * c ) + G ) * c + H ) * c + I       ;
                        result = ( L == R ) ;
                      }
                      if ( m2 ) {
                        L1 = ( ( A * c ) + B ) * C ;
                        R1 =   ( D * c ) + E ;
                        L2 = R1 + ( ( F * c ) + G ) ;
                        R2 =        ( H * c ) + I ;
                        result = ( ( L1 == R1 ) && ( L2 == R2 ) ) ;
                      }
                      if ( result ) {
                        printf (
                          "c=%3ld : %2ld,%2ld,%2ld,%2ld,%2ld,%2ld,%2ld,%2ld,%2ld\n"
                          ,c,A,B,C,D,E,F,G,H,I
                        ) ;
                      } ; f[I] = 1 ;
                    } ; f[H] = 1 ;
                  } ; f[G] = 1 ;
                } ; f[F] = 1 ;
              } ; f[E] = 1 ;
            } ; f[D] = 1 ;
          } ; f[C] = 1 ;
        } ; f[B] = 1 ;
      } ; f[A] = 1 ;
    } /* for A = ... */
  } /* c : cardinalnumber */
  return 0 ;
}

と言う訳でフラグを設置し、誘導変数を使うたびに重複していないかをチェックして、不必要なループ実行を省略していきます。これで50μsとなり、フルに実行するよりも約50分の1に短縮される。

これに加えて最適化するなら、ループを内側に進める都度、その時点で定まる演算を行ってしまい、また、その時点で出来るだけフラグを下すというところでしょうか。まぁ、そこまでやる気力がもうないのでここまでにしておきます。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017/3/11 20:07
ゲスト 
答えを教えてください!
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017/3/18 1:22 | 最終変更
FarSeer08  常連   投稿数: 196
すでにお気付きかもしれませんが、

▶︎左の問題の解答(枠で囲まれているもの)

▶︎右の問題の解答

をご覧ください。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017/3/18 4:59 | 最終変更
FarSeer08  常連   投稿数: 196
YMNさんの投稿を拝見して、BASICとは懐かしいなーとか思って検索してみたら、「(仮称)十進BASIC」Version 0.6.6.0 というのがこの2月にリリースされていたので Mac mini で使ってみました。

引用:
JIS Full BASIC中核機能単位,図形機能単位,および,附属書(参考)に規定されるモジュール及び単文字入力の機能をほぼ完全に実現しています。
だそうです。本格的です。

連休だし〜と、とりあえず、ループを余分には回さないようにだけして……

LET ts = TIME
FOR A=1 TO 9
   FOR B=1 TO 9
      IF NOT B=A THEN
         FOR C=1 TO 9
            IF NOT C=A AND NOT C=B THEN
               FOR D=1 TO 9
                  IF NOT D=A AND NOT D=B AND NOT D=C THEN
                     FOR E=1 TO 9
                        IF NOT E=A AND NOT E=B AND NOT E=C AND NOT E=D THEN
                           FOR F=1 TO 9
                              IF NOT F=A AND NOT F=B AND NOT F=C AND NOT F=D AND NOT F=E THEN
                                 FOR G=1 TO 9
                                    IF NOT G=A AND NOT G=B AND NOT G=C AND NOT G=D AND NOT G=E AND NOT G=F THEN
                                       FOR H=1 TO 9
                                          IF NOT H=A AND NOT H=B AND NOT H=C AND NOT H=D AND NOT H=E AND NOT H=F AND NOT H=G THEN
                                               FOR I=1 TO 9
                                                IF NOT I=A AND NOT I=B AND NOT I=C AND NOT I=D AND NOT I=E AND NOT I=F AND NOT I=G AND NOT I=H THEN
                                                   IF (A*1000+B*100+C*10+D)*E = F*1000+G*100+H*10+I THEN
                                                      PRINT
                                                      PRINT " "; A; B; C; D
                                                      PRINT "X         "; E
                                                      PRINT "-------------"
                                                      PRINT " "; F; G; H; I
                                                   END IF
                                                END IF
                                             NEXT I
                                          END IF
                                       NEXT H
                                    END IF
                                 NEXT G
                              END IF
                           NEXT F
                        END IF
                     NEXT E
                  END IF
               NEXT D
            END IF
         NEXT C
      END IF
   NEXT B
NEXT A
LET te = TIME
PRINT CHR$(13)&CHR$(10)&"ELAPSED TIME: "; te - ts; "sec"
END

"EXIT FOR" とか "EXIT DO" はあるのに C系の "continue" っぽいのがないようで、恐怖の "IF" 〜 "END IF" 地獄になってしまいました(はっ、BASIC だからそこはラベルをつけて "GO TO" を使うのか)



投票数:1 平均点:10.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017/3/19 19:30
YMN  常連   投稿数: 634
>「(仮称)十進BASIC」

http://www.koshigaya.bunkyo.ac.jp/shiraish/basic/basic01/basic01.htm
----引用
このBASICは十進数を正確に扱うので,step値に0.1を選んでも不具合を生じません。
----引用終了

 わざわざ「十進」を売りにしているのは、このあたりに関係しているのでしょう。

 少数では10進数と2進数の変換で誤差が出るということかと思います。
そんなことは意識することもなく使っていましたが(そもそも整数だの実数だの意識しないで済むのがBASIC流と言えるでしょう)、stepを少数にするのは怪しげな匂いがして、避けていたようでもあります。

 試しに以下のプログラムをTiny Basicで走らせてみました。

s=0
for n=0 to 100 step 0.1
s=s+n
next n
print s

結果は50049.9999999999997となりました。
投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2017/3/23 22:37
YMN  常連   投稿数: 634
>結果は50049.9999999999997となりました。

これだけでは「step を少数にしたから誤差が出たのだ」と主張するには少々根拠が薄弱で、以下のようにstepをデフォルトの1にしてループ回数は同じにしてみました。

s=0
for n=0 to 1000
s=s+n
next n
print s

結果は500500となり誤差は出ませんでした。
「整数だから誤差は出ないのだ」とこれで言えるかというと、そもそもBASICにとって整数という概念があるのかというと無いようでもあります。

 おそらく昔の8ビットパソコンでは実用にならない時間がかかるような重いBASICなのだと思います。
昔の能力が低いパソコンとBASICインタプリタの組み合わせはひとつの適切な選択であり、そしてマイクロフトはそこから始まり今に至るのでした。
投票数:0 平均点:0.00
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文
  条件検索へ


ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録
PR
twitter
Created by: twitter website widget