トップ «前の日記(2018-09-30(Sun)) 最新 次の日記(2018-10-02(Tue))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2018-10-01(Mon) 晴れやかな青空

例えばBOM

Win10のメモ帳で書いて、"UTF-8"で保存。

$ cat bom_python3_hello.py 
#!/usr/bin/env python3
 
print("世界にこんにちは。")$ #ファイル末尾に改行なし
$ file bom_python3_hello.py 
bom_python3_hello.py: Python script, UTF-8 Unicode (with BOM) 
text executable, with CRLF line terminators

python3自体は何も文句を言わない。

$ python3 bom_python3_hello.py 
世界にこんにちは。

が、shellは拒否。

$ ./bom_python3_hello.py 
./bom_python3_hello.py: 行 1: #!/usr/bin/env: そのようなファイルやディレクトリはありません
./bom_python3_hello.py: 行 2: $'\r': コマンドが見つかりません
./bom_python3_hello.py: 行 3: 予期しないトークン `"世界にこんにちは。"' 周辺に構文エラーがあります
./bom_python3_hello.py: 行 3: `print("世界にこんにちは。")'
 
$ ls env
/usr/bin/env

nkf -w8 -d とかでCRを抜いて(BOM維持)も、エラーメッセージ('\r')がひとつ 減っただけ。
zsh環境で実行しても、基本的に変らない。

頭と紙で、どうしても解けなかった

覆面算の古典問題。といっても試したのは中学生の頃だったはず。
python3に解かせてみた。例によって長大なループになった。
違う文字が違う数字になる(同じ数字にならない)ようにする、 手っ取り早い方法が浮かばなかったので、集合型に放り込んで数を 数えることにする。
当初のバージョンはかなり遅かった。Core 2 Duo 2GHz の Stretchで

$ time python3 send_more_money.py
9 5 6 7 + 1 0 8 5 = 1 0 6 5 2
s e n d + m o r e = m o n e y
 
real    1m56.945s
user    1m56.812s
sys     0m0.064s

かかった(python2だと1分17秒ほど)。
しかも、解が出力された後、探索が終わるまで しばらくかかる。

もう少し速くする。繰り上がり最高位が1であることは分かっていたので、それが 先頭になるように書き換え、ひとつ解けると終了するように書き換える。
すると、

$ time python3 send_more_money.py
9 5 6 7 + 1 0 8 5 = 1 0 6 5 2
s e n d + m o r e = m o n e y
 
real    0m7.710s
user    0m7.692s
sys     0m0.004s

リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。