読者です 読者をやめる 読者になる 読者になる

語句の真相とあやまち

なにもないことにまつわるあれこれとか関係のないこととか

問題32-36

問題32 二段階の組み合わせの問題だと思った

JuliaでVectorを拡張していくことができなくてずいぶん悩んだ。

deepcopy()を使ったので、遅くなっているのだと思う。

7.818219 seconds (154.22 M allocations: 10.936 GB, 24.28% gc time)

 

月曜と今日の一日弱の時間で解決したとはいえ、push!, append!では元のデータが変わってしまい、そのため10!個の組み合わせを作ることがなかなかできなかった。

 

問題33

問題がわかりません。

If the product of these four fractions is given in its lowest common terms, find the value of the denominator.

調べる。

一日たって、

 四つの分数はみつけたが、最後のこの文の意味が不明で答があわない。

分母の最小公倍数ではだめなのか???

 

これ以前の部分もなんかよく分からないことがかかれていて、trivialの意味も明確ではないし、4つしかないという条件で絞り込んだけど、実際にはたくさんあった。

どういう条件を仮定しているのかわからない。

この問題はやめた。

 

問題34

数字とベクトルの間の変換関数を共通ファイルにまとめた。

これからも使いそうなので。Moduleにするかどうか・・・

Juliaの関数として既存ではないのだろうか。探したがみつからずる

 

factorialはJuliaにある。

この問題は力づくで解いた

0.042996 seconds (502.06 k allocations: 36.408 MB, 23.43% gc time)

 

問題35

一見、力づくで解けばすぐにできそう。

できた。

isprimeはusingPrimesにある。

 0.698078 seconds (10.36 M allocations: 756.132 MB, 10.82% gc time)

 

 問題36

これも力づく。

前に、parindromicの問題があったなあ。同じ方法で判定しているかどうかは忘れた。

 

  0.181568 seconds (4.01 M allocations: 214.097 MB, 26.15% gc time)

 

計算のこと

ブログラム

クラスにもとづくオブジェクト指向は、計算というか関数を整理するための仕組みだと思う。前にも書いたかもしれない。

 

同じアルゴリズムオブジェクト指向で書いたり、Cで書いたりして、それを同じアルゴリズムだと区別できるのだから、そういうことだろう。

 

COMMON LISPのgeneric functionやその他、型ベースでメソッドをディスパッチするタイプのオブジェクト指向(というよりただの型か)の方式もそう見られる。

 

計算の方式自体が違うとしても、時系列上で実行される処理が同じなのだから、それは計算の表現の違いと考えるべきで、結局、こまぎれにしたメソッドをどう管理するかという問題だと見られる。

 

Apple Dylanの開発環境では、メソッドをデータベースで管理していたけれど、まさにそういうことではないのだろうか。

 

 

問題29-31

Julia Euler

問題29

この問題の問題は、100^100が標準では表現できないということだな。

BigIntで解く

  0.047865 seconds (105.86 k allocations: 3.073 MB, 75.59% gc time)

 

他の解法も考えてみたのだけれど、面倒。

 

問題30

 どこまで計算すればいいのかを決めるのが謎

  0.260236 seconds (2.00 M allocations: 243.836 MB, 12.19% gc time)

 

問題31

 そんなに難しい問題ではないのに、解決するのに時間がかかった。

 

0.001980 seconds (137 allocations: 7.969 KB)

 

一般的な解法の手順(私の場合)

1) 問題を手で解いてみる

2) その計算過程を抽象化し手順の表現を作る

3) プログラムが想定した計算過程と同じ計算をしているかを確認する

 

補足

1) 問題を手で解いてみる

 とはいっても、その前に問題を理解し、どのように計算するかをみつけなくてはならない。

 同じ計算をしていても、頭の中でどう理解しているのかが、違う場合がある。

 ある程度の量の計算をして、特別な場合を尽くすこともひつよう。

 この段階で、問題の理解が十分でなければ、より煩雑な計算になってしまう。

2) その計算過程を抽象化し手順の表現を作る

 関数をひとつ作るということは、その計算をどのように表現するかということなので、重要だし面白い。

 

3) プログラムが想定した計算過程と同じ計算をしているかを確認する

  デバッグのことを言い換えて見ただけ

 

問題31は、最初、ポンドの話だったので、英国固有の話ならとばそうかと思ったけれど、ちゃんと読むと一般的な話だったので、とりかかることにした。一週間くらいまえ。

 

最初は200ポンドのケースを考えていて、あやまった仮説をいろいろたててしまい、うまくいかなかった。1ポンドから順番に考え直すと、計算がみえてきた。水曜くらい。

土曜の朝に、いろいろ考えていたけれど、とても単純にできると確信したのだけれど、数時間後、それが勘違いだということがわかり、元の計算方法にもどる。

しかし、単純にできる計算を考えたとき、ややこしい計算が整理されたようで、元の計算を見直し、整理し直したのが日曜。

なぜかうまくいかなかったけれど、今日、作成した10個のテストをクリアして正解を得た。

 

10個のテストのうち3個はテスト自体が間違っていたり・・・

「なぜかうまくいかなかった」理由がよくわからない。

 

総じて、プログラミング能力が低下している。

 

 

問題26-28

Julia Euler

問題26は難航中。

 かれこれ一週間。

難易度5%なので、これは何か勘違いをしているのだろう。

[一週間ののち]

 循環小数の勉強をして、時間ができたのでコードを書き、ようやく正解にたどりつく。

0.088795 seconds (19.28 k allocations: 12.422 MB

 

2週間かかりました。

 

それにしても、コード書く能力が低下しているなあ。

 

問題27

問題の意味がわからん。

 そのまま解いた。

 

0.982154 seconds (12.72 M allocations: 255.358 MB, 6.27% gc time)

 

25問正解

 

問題28

数列の問題。ちょっと煩雑なだけ。

0.000009 seconds (7 allocations: 400 bytes)

 

自分が何をしているのかを観察

何を関数にするかというところを気にしている。

プログラムの言葉ではインターフェースともいえるが、

それは問題をどう解釈しているか、どう理解しているかということだ。

 

今日までforumは見ていなかったけど、そこを見ればいいのだな。

 

 

問題21-24

Julia Euler

問題21は友愛数の問題

プログラム自体に難しいところはないが、定義をちゃんと理解していなくて、一度間違える

 

問題22 

問題の意図は、ソートなのかな??

いまさらソートを作りたくはないので、名前のスコア計算だけ実装する。

 

問題23

素直に実装したところ、すぐには終わらない様子。

とりあえずabundant(x)の計算を、二度目はやらないようにしてみた。

次に、2つのabundantの和とできるかどうかの計算で二度目はやらないようにした。

さっきよりはまし。

正解だった。

実行時間は 

759.380158 seconds

12分30秒

 

問題24

いろいろ考えたけれど、答えにたどりつけず、問題をそのまま書いたら、それほど時間がかからないで終わった。

とくに工夫なし

 

 

 

問題16-20

Julia Euler

問題16

これは、無限長の整数を実装しろといっているのだろうか。

ここまでは迂回したりJulia頼みでやってきたけれど、もうそれは無理なのか。

少し間があいたけれど、解は思ったよりも単純だった。コードを書く時間がなかった。

 

問題17は、英語の話なので、ちょっとやめておく

 

問題18は少し考える。

アイディアはすぐに浮かんだ。実装も30分もかからない。

まだまだ易しい問題。

 

問題19は、常識問題のような気がするが違うのだろうか。

詩のような問題文が意味不明。

あらためてみてみると、

the monthの最初の週といわれても、定義が不明だ。

日曜はじまりか月曜はじまりか、それとも1日からの一週間なのか・・・

この問題はスキップ

 

問題20

2のベキ乗の問題は、単純だったが、階乗はすこしややこしい。

面倒臭いのでBigIntを使って見たけれど、答えが合わない・・・

 

すべての桁を合計する関数を間違えていた。

10の余りを計算し、10で割り続ける・・・どこで間違えたのだろう。

小さい数では間違いはなかった。floorとかceilとかの使い方か・・・

文字列から計算すると正解になった。

 

 

問題15

Julia Euler

格子状の道を数え上げる問題。

そのままコードにする方法がややこしくて分からず、別の問題に変換して解くことにする。

組合せの問題であることには変わらず、結果が出るまで待てなかった。

もう一度見直して、組合せをしない関数に変換して実行してみたが、やはり遅い。

 

そこで、Dictを使い、計算結果を使い回すようにしたら、瞬間0.012秒程度で終わってしまった。

問題14も終わらなかったものが、Dictを使って0.83秒で終わっている。

Dictを使ってもいいけれど、記述のレイヤーをちゃんとわけなくてはいけないと思いながらそんなことはしていない。