忍者ブログ
萌え指向プログラミング言語「萌香」のBlog
[1] [2]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

萌香で京大の入試問題を力技の巻

おまえにハートブレイク☆オーバードライブ - 小粋な数学入試問題 より

......って引用しようと思ったけど数式が画像とか引用がめんどくさいので元記事読んでください。

んでこれの設問の2。これが萌香があれば解けちゃうんです。ソースはこちら

「レンジ を 「(開始 終点)
      「もし (開始 終点 >)
              '()
             「開始 「(開始 1.0 +) 終点 の レンジ」 の コンス」」
           の 仕事」 と 定義」


「階乗 を 「(a b)
        「もし (b 0.1 <=)   ;; たぶん無いけど丸め誤差とかがあったときのため
              1.0
             「(a (b 1.0 -) の 階乗) a *」」
       の 仕事」 と 定義」


「f を 「(n)
     「n の 7 の 剰余」
    の 仕事」 と 定義」


「g を 「(n)
        (3 に
           ((+
             0
             (「(num) 「num の n の 階乗」 の 仕事」 に
              「1 7 の レンジ」 を マップ)
          の 右畳み込み) の f)
           を かける)  仕事」 と 定義」



「「(n) 「n と 表示」
        「":" と 表示」
        「(n の g) と 表示」
        「改行」              の 仕事」 に
  「1 15 の レンジ」 を マップ」

 

これを実行すると6と12のところで18点ゲット。 fの性質よりmaxの点が18なので答案用紙に6と書けば、この問題はパーヘクツですよあなた !!

なんで中途半端な15までなのかって ?..........

萌香は数値をすべてRubyのFloatで保持しているため Cのdouble型の精度となります。そうすると仮数部が53 bitなため2^53を超えるところ 10^16のところで正確な計算ができなくなってしまい、 20のところで7^20が出て、これが10^16を超えるので正確な計算ができなくなりおかしな数字が出てしまう結果となります。これは ここ(遥か彼方の彼方から - 小粋な数学入試問題をcodepadで組んでみた) のプログラムもおんなじ原因じゃないかと思ってたらすでに指摘があった.....

ちなみにRuby版が

#!/usr/local/bin/ruby


def pow(x, y)
  result = 1
  (1..y).each do |dummy|
    result = result * x
  end

  return result
end


def f(n)
  return n % 7
end


def g(n)
  return 3 * (f((1..7).map{|num| pow(num, n)}.inject(0){|sum, num| sum + num}))
end



(1..100).each do |num|
  puts "#{num}:#{g(num)}"
end
Scheme(Gauche)版が
#!/usr/local/bin/gosh

(use srfi-1)

(define pow
  (lambda (x y)
    (if (= 1 y)
	x
	(* x (pow x (- y 1))))))

(define f
  (lambda (n)
    (modulo n 7)))

(define g
  (lambda (n)
    (* 3 
       (f (fold + 0 (map (lambda (num) (pow num n))
			 (iota 7 1)))))))


(map (lambda (num)
       (format #t "~a: ~a\n" num (g num)))
     (iota 100 1))
となります。

 

どちらも100程度まではなんの問題もなく動きます。 Bignumなんかいらね、とか思ってたのですが、この程度でも必要になってくるのですね。

Bitmap#(set|get)Pixelは遅い

.Net Frameworkで画像ファイルにフィルタなどの処理で たくさんのピクセルの値を変更したい場合(set|get)Pixelメソッドを 使用するとめちゃくちゃ遅いです。これはBitmapオブジェクトが 単なる画像のコンテナじゃなくて他のいろんなものとの調停とか があるからかな ?

とりあえず遅いです

そこで.Net Framework的にはBitmapデータの 画像データをロックして自由にいじっても大丈夫なようにし、 いじってアンロックするというのが作法みたいです。

手順

  1. Bitmap#LockBitsメソッドを使いBitmapDataオブジェクトを獲得する。
  2. 得られたBitmapDataオブジェクトから画像データをコピー。 具体的には
    System.Runtime.InteropServices.Marshal.copy(bitmapdata.Scan0, (Byte[] buffer, (int)開始点, (int)長さ)
    
  3. (Byte[])bufferを適当にいじる
  4. いじった画像データを元のBitmapDataオブジェクトにコピー。 具体的には
    System.Runtime.InteropServices.Marshal.copy(Byte[] buffer, (int)開始点, bitmapData.Scan0, (int)長さ)
    
  5. bitmapImage.UnlockBits(bitmapData) とかやって元のbitmap imageに変更を適用

See MemoNyanDum - Bitmap の内部色データにアクセスする

Microsoft Excelで使用するためのCSV形式のファイルを作成しようとしたらはまりました。

現象

改行を含んだデータを1セルに入れるため、 ダブルクォーテーションで囲んだのですが、 中に入っている改行コードがCSV行末の改行と認識されてしまい 列がめちゃくちゃになってしまいました。

ダブルクォーテーションに関わるExcelの挙動

何が原因だったかと言うと、 自分はいつもCSVファイルを書く時カンマの後ろにスペースを入れるのですが、 (そのため以下のように文字列前後のスペースを取り除く) Excel的にはそういうのはだめでスペースから始まる文字列と みなされてしまいました。

で、おまけにExcelは先頭にないダブルクォーテーションは制御記号ではなく ただの文字として扱ってしまい、結局ダブルクォーテーションで囲まれた改行は CSV的にエスケープされることなく行の終端記号として扱われてしまいました。

普段書いてたプログラム(in Ruby)

row = line.split(',').map {|elm| elm.strip}

ExcelのCSVファイル中の改行

Excelはセル内の改行にはLFを行の終端にはCR + LFを使っていました。 これは、さすがにExcelがよきに計らってくれるかな。 とりあえず動くので検証はめんどい。 エディタでちょいちょいといかないかしら。

行終端がCR + LFなのは RFC4180的に妥当なのですが、 なんでセル内の改行はLFだけなんだろう。 同じように出力しようとするとちょっとめんどい

まとめ

とりあえず、Excelで使うためのCSVファイルを作成する上での注意点を Excelとは直接関係ない(RFCで定められたCSVファイル一般のことも含めて) まとめると。

  1. カンマの前後にスペースを入れてはいけない。
  2. 漢字コードはShift JIS
  3. 改行コードはCR + LF。ただし、セル内の改行はLF

ちなみに使ったExcelはExcel2000 for Windows。 最新のExcelならUTF-8は使えるかな ?

リンク

雑感

今日初めてCSVファイルフォーマットのRFCを読みました。 いろいろ、細かい点が知らなくてためになりました。

でもですよ、カンマの後ろにスペースは付けたいし、 人間に見やすいようにカンマの位置というか文字列の開始位置を そろえたいじゃないですか。 まぁ、そんな理由でmustでなくshould not be ignoredなのだと思います。

だからといって、自分一人で使うからいいやと自由な形式で プログラムを書いたりするとあとではまることになるんだな。きっと。

smtp認証

プロバイダのメールアドレスがsmtp認証になったんです。

で、そのための設定をしなければならなかったのですが まったく設定の必要はなかったです。 (popサーバのアドレスの変更とかは必要だった)

すごいですねMew



忍者ブログ [PR]
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
フリーエリア
最新CM
[11/30 Lehar9296 ]
[11/19 Bihler7840 ]
[04/09 pavelvolinkins]
最新TB
プロフィール
HN:
No Name Ninja
性別:
非公開
バーコード
ブログ内検索
アクセス解析