鍋あり谷あり

テーマを決めずに適当に書いています。

いままで出した問題

増井さんが 100問出していてすごいなぁと思って、自分でも数えてみた。

今まで出した問題はだいたいこんな感じ:

  • へなちょこに、参考問題で 19問。
  • へなちょこに、本番用の問題で33問。
  • CodeIQ に 40問ぐらい。(自信ない)
  • 神奈川Ruby会議で1問。

というわけで、合計 93問。
100問まではあと 7問か。

私も結構すごいじゃん。

Yokohama.rb #70

Yokohama.rb #70 に参加した。

レシピブック読書会

Etc.passwd

Etc.group

の動作が気持ち悪すぎてびっくりした。

どう書く

出題者をやった。

問題をちゃんと作る余裕はなかったので、過去問のリメイク。

  • 時間が少ないので簡単なものを。
  • とっつきやすい感じで
  • ruby のあつまりなので、ダジャレでタイトルに Rails が入ってるものを

という辺りで選んだ。

40分足らずの時間で3割ほどの方が解けていた。

たぶん競技プログラミング方面の方なら 10分前後で解ける内容だと思う。

ちなみに問題は

で、実装例やリンクなどは

にある。

反省など

先日の記事( d:id:Nabetani:20160701:p1 )の、PHP の記載について。
あまりよく知らない言語について調べずになにか書くべきではないという反省をした。

すいませんでした。

とはいえ、

  • 正確な記述をしている記事ではないことがわかるように書いている。
  • 事実としては唯一の言語ではなかったもののの、唯一の言語だと考えられていて時期があったのは本当だと思う。

ということで、それほど問題はないと考えている。

一方。

「雑な理解」というのは正確な表現で、hnw さんの、rubypython も間違えるよ、という記事は読んでいたものの、すっかり忘れていた。ここも反省している。

PHP およびそれ以外の言語の 四捨五入関数の現状については
http://d.hatena.ne.jp/hnw/20160702
を読むのが良いと思う。
この素晴らしい記事が生まれるきっかけになったことを(申し訳なく思いつつも)喜ばしく思う。

主要なプログラミング言語8種をぐったり解説

主要なプログラミング言語8種をぐったり解説するよ。

C言語

「はじめてのC」( https://www.amazon.co.jp/dp/4774133345 )という本で有名になった*1この言語は、「_Generic」という魔術が使えるためか、常人には理解不能なプログラムを書きたい人に、perl の次に愛されています。
C言語で書かれたプログラムは、大抵メモリリークしています。

C++

C言語と異なり、「C++言語」と呼ばれることは稀です。
テンプレートという魔界の扉を開いてしまったために人類には早過ぎる言語とも言われていますが、愛嬌のある文法とキュートでコンパクトなバイナリで、多くの人に愛されています。
C言語と違って、ちゃんと書けばメモリリークはかなり回避できますが、ちゃんと書ける人は稀だと言われています。

Java

Java Tea ストレート よりやや遅れてリリースされたこの言語は、Java Tea とも Java島 ともあまり関係がありません。読み方は「ジャワ」ではなく「ジャヴァ」です。
実行時最適化という必殺技でスピード狂の C/C++ 愛好家を唸らせています。
GCがあるのでメモリリークしないと信じている人がいますが、そんなことはないことに気付かされるのにそれほど長い時間は必要ありません。

J++ / J#

嘘です。C#です。

JavaScript

ブラウザ戦争という戦果の中で内部的には異常とも言える進化を遂げた言語ですが、表面的にはどうかと思う文法で、多くの人々を悲しませ続けています。
ちなみに、ケツカンマは英語で「hip-comma」ではありません。

Ruby

文字列型が文字コードを自分で持つという珍しい選択をした言語です。
「ブロック」の中で return するとブロックではなくメソッドから return するという珍しい選択をした言語です。
有理数リテラル多倍長整数虚数リテラルなどがそろっているため、ライトな数値計算好きユーザーに愛されているかもしれません。

PHP

四捨五入の計算を間違える*2唯一の言語として畏れられていましたが、そのバグは治っているかもしれません(治ってないかもしれません)*3

Python

C/Java/Ruby などを見慣れた人がPython を見ると、ズボンを履きなれた人がスカートを履いた時のような気分になるかもしれません。
for 文に else がある、世界で唯一(鍋谷の脳内調べ)の言語です。

その他の言語

TIOBE ランキングを見ると、ruby を外して perlVB.NET を入れるべきかもしれません。

余談

以前、某春日部系の人材紹介会社の人が「すごいエンジニア紹介しますよ。20代です。」
というので、どんなふうにすごいのか聞いてみると

「今日紹介する10人は、APL 使いなんですよ」
「それはすごい」
「全員 APL キーボード持ってます」
「」

...という話は嘘です。すいません。

最後に

この記事は http://d.hatena.ne.jp/shi3z/20160701/1467330446 にインスパイアされて書きました。

用もないのに原ノ町駅近辺に行ってきた

常磐線の果てに行ってみたかった。
切符を買ってから気づいたんだけど、私が行きたかった場所はどちらかと言うと 竜田駅 の方で、原ノ町駅は反対側だった。そんな日もある。

気にせず原ノ町駅 https://goo.gl/maps/Qmxyfd4fvMn

へ。新幹線で福島→バス。

何かがあることを期待していたわけでもなく、そこで人が普通に暮らしていることを自分の目で見たかったという感じ。

案の定、そこは普通の田舎町だった。

震災から5年もたっているので当たり前かもしれないけど、まだ普通の田舎町になっていない地域もあるので実は当たり前ではない。

海に向かって歩いた。

バスで行きたかったんだけど、バスはなかった。

途中までは普通の田舎町なんだけど、ある地点を超えると様子が変わった。

右は田んぼなのかもしれないけど、左は整地中という感じ。

海まであと一歩のところまで歩いたけど、堤防工事中とのことで、

海までは辿りつけなかった。残念。

駅に戻る途中、tonbo というケーキ屋さんでレアチーズケーキを頂いた。おいしかった。

通りすがりの雀。

マイルの話

ふとマイルという長さについて知ろうと思い、 wikipedia( http://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%A4%E3%83%AB ) を見てみた。
すると。

イタリアマイル(ミリオ miglio)
古代は2.226キロメートル、伝統的には1.489キロメートル、現在は1キロメートル。

という驚くべき記載が。
潔い。
アメリカ・イギリスもこれぐらいの荒療治をしてくれたらいいのにと思ったり。

じゃあその、1マイル=1キロメートル の世界での ヤード フィート インチ はどうなってるんだろうと思い、イタリア語版の wikipedia( http://it.wikipedia.org/wiki/Miglio_(unit%C3%A0_di_misura) )を見てみた。

ら。

現在のイタリアマイルについての記載は一切ない。
代わりに

Miglio nuovo nederlandese = 1 000 m

拙訳「新オランダマイル = 1000メートル」

という記載がある。
なんだこれ。と思い、オランダ語wikipedia( http://nl.wikipedia.org/wiki/Mijl )に行ってみると、1000m であるマイルについての記載は一切ない。

どうなってんだこれ。

英語・スペイン語・フランス語 の wikipedia も見てみたけど、情報はなかった。

なんだろうなぁ。

遅いソート

http://bugrammer.hateblo.jp/entry/2014/08/16/014212 ( バブルソートよりも非効率なソートアルゴリズムを探して ―― ストゥージソートとスローソート ) を読んで。

ちゃんと終わるけどもっと遅いソートがあるので書いてみた。

たぶん名前がついていると思うんだけど、調べてないので名称不明。
こういう奴。

def try_all_sort(s)
  s.permutation(s.size){ |x|
    return x if x.each_cons(2).all?{ |a,b| a<=b }
  }
end

typical case では bogo sort と同じオーダー。
bogo sort と違って、worst case は有限。O((N+1)!)だと思う。

で。ベンチマーク
100要素を1000回なんて宇宙が消滅するまでに終わらないので、試したのはシャッフル済み10要素を10回。

手元で測って、30秒ぐらい。
一方、slowsort だと速すぎて測定不能
bogo sort だと 54秒だった。まあ運次第だけど。

10要素で30秒なので、15要素なら4ヶ月、20要素なら60万年ぐらいかかる。
コンピュータがやる計算なのに、人間が紙に書いてソートするよりずっと遅い。

■ 8/17 追記

メモリ消費は、上記のソースでは O(N)。だと思う。
100要素1000回に要する時間は、普通の人がパッと読んで分かるような表現ができないぐらい長い。
10の148乗年ぐらい。
概ね、千無量大数倍高速化すると、千無量大数年かかるぐらい。百万倍ぐらいサバ読んでるけどいいでしょ?
メモリ消費は、数キロバイト〜数十キロバイト だと思う。

無量大数倍高速化というと無理難題のように思うかもしれないけど、普通の sort に書き換えれば、それ以上の高速化を実現できる。