追記

tueda's diary


2019-07-22 tueda's diary

_ 新聞社としての資質を問う

京アニの事件は本当に痛ましく、加害者の行いを強く憎むとともに、被害者の皆さんの無念、恐怖、苦痛には想像を絶するものがあることを思い、言葉が見つかりません。

さて、毎日新聞の社説ですが。

https://mainichi.jp/articles/20190719/ddm/005/070/090000c?fbclid=IwAR2ao7v1kxb0YRveJN_KYjzIlK64rLNFXlKjYaK2Oq3JLhsrlC-mcfG_pM0

一方で、たとえガソリンによる放火でも、あっという間にビル全体が
炎と猛煙に包まれてしまったのは不可解だ。2001年に発生した
東京・歌舞伎町の雑居ビル火災では44人が亡くなったが、防火扉が
固定されていた不備が明らかになった。

今回の火災で、防火扉の設置や作動状況はどうだったのか。消火設備は
備わっていたかなど、詳しい検証が待たれる。多くの人が出入りする
場所では、不測の事態にも備えるべく防火策の再点検を進めたい。

いわゆる専門家の先生方の意見として、

  • 防火上、今回の放火のような事は想定できない

という談話を多数みています。件の毎日新聞社の記事でも。それでもなお、

一方で、たとえガソリンによる放火でも、あっという間にビル全体が
炎と猛煙に包まれてしまったのは不可解

なのですね。まあそこは100歩譲ってよしとしましょう。私も専門家ではないし、バケツ一杯のガソリンに火をつけたことは無いですからね。しかしそれに続けて

今回の火災で、防火扉の設置や作動状況はどうだったのか。消火設備は
備わっていたかなど、詳しい検証が待たれる。

いやちょっとまって。なんでそんなに人ごとなの。それをちゃんと取材して、内容の検証をした上で報道するのがあなた方の仕事なのでは。当局の検証結果を聞いて、自分たちの思い込みを付け加えて垂れ流すだけなら素人でもできますよ?

しかも、今回まったく関係の無い

2001年に発生した東京・歌舞伎町の雑居ビル火災では44人が
亡くなった

ことを引き合いに出して、最終的に言いたいことは

不測の事態にも備えるべく防火策の再点検を進めたい。

なのですね。これつまり、最後の一言を言いたいために、検証もせずに「バケツいっぱいのガソリンをぶちまけて火をつけて一気に燃え広がったのが不可解」と言ってるだけのようにしか読めないんですが。もしも学生がこんなレポートを出してきたら大減点しますよ。

いやしくも社説であって、一記者や担当デスクが独断で書いた記事ではないのですよ。さすがにこれは、毎日新聞社は新聞社としての資質を疑う、と申し上げるしかありません。

本日のツッコミ(全2件) [ツッコミを入れる]

_ あんこ [全く同感。]

_ 新開 規生 [毎日新聞を読んでないので偉そうなことは言えませんが、事実であれば、どうしたんでしょうと思いますよね。ネットを読んだだ..]


2019-06-14 tueda's diary

_ blanco Framework を Maven repository 化

blanco Framework は、igapyonさんを中心に開発・保守が続けられている、ソースコード自動生成フレームワークです。

blanco は、納品物として通用するレベルのExcelシートに定義書を記述すると、各種言語のソースコードを出力します。

  • 納品する定義書から直接ソースコードを生成するので定義書とソースコードの乖離がない
  • 自動生成なのでソースコードの品質が揃う
  • 生成されたソースコードを動かすための専用ランタイムは不要
  • しかも吐き出せる言語の種類が多い(Java, C#, PHP, Delphi, Phython, ruby, Javascript, vb ... 言語の追加も割と簡単)

というのが特徴(と書いてウリと読む)です。

残念ながらプログラマ業界ではExcelシートを悪弊と考えるひとが多いので、発表するたびに苦笑されたり眉をひそめられたりしますが、実は某大手SIerでも長らく使われているような、普通に使うことだけを考えれば、ちょっと、いや結構良い感じのツールなのです。

blanco 自身をビルドするのが大変

しかし実はこの blanco Framework には、少し困ったクセがあります。

それは、blanco Framework の各ツールをビルドするために、そのツールの過去のバージョンが必要なこと。blanco Framework を構成するツール自身が Excel シートから生成されたソースコードを使っているため、blanco Framework に手を入れるためには、ツール間とツールのバージョン間の依存関係が非常に煩雑になるのです。ほとんど自家中毒な感じ。

まあ、ソースコードを自動生成するというのはつまり、ある意味コンパイラを作るのと共通する要素があるわけで。コンパイラとか作るような人なら

「古いバージョンで新しいバージョンを作るなんてあたりまえじゃん」

という事になるのですが…業務系ツールで、ツール自身に手を入れたいときにこの煩雑さはちと厳しいなあ、といのが正直なところ(苦笑)

Maven repository

Java 界隈ではビルドツールはもう ant どころか、gradle が標準となりつつあるのですが、blanco は実は、anttask ドリブンですw 各ツールは anttask として実装されていて、ant から起動されて Excel シートを読み込みます。(ちなみにこの anttask も Excel シートで定義されて Java コードが自動生成される)

で、3年程前に、igapyon さんが何を思い立ったのか、突然 blanco の Maven repository 化を始めました。最初は

「中途半端にディレクトリ構造変えたら、メンテがさらにめんどくさくなるやん〜」

とか思ってたのですが(ゴメン)、最近また blanco に手を入れる必要が出てきまして。手をいれるなら、同じく3年程前に実施した xlsx 拡張子の Excel への対応を全 blanco に入れたいな〜と思いました。(実はまだ xls 拡張子の Excel ブックしか読めない子がいた)

で、うちのforkとigapyonさんち(本家)の状況を見てて、このライブラリ間の相互依存、バージョン依存関係に絶望感がハンパなく…

「そうだ、Maven にしよう!」

Maven Repository にすれば

  • ソースコード生成に必要なjarファイルを Maven Repository で一括管理できる
  • 自分自身の過去のバージョンも、Maven Repository で管理されてるので深く考えずに次のバージョンが作れる

じゃないか!

ということで、つくりました。

igapyonさんが作ってくれてたのを fork して、

  • xlsx 対応
  • maven で clean 〜 package, deploy まで一気通貫ビルド(一部)

できるようにしました。ここのを使ってくれれば、いままでみたいに lib ディレクトリにどの jar を入れれば良いんだ?とか悩まずに、xlsx に対応できます。Maven Repository なので、gradle からも使えます、たぶん。もしかしたら、sbt からでも使えるかも。知らんけど

なお、ドキュメントを書いてる時間はありません。興味がある方は、既に Maven で一気通貫ビルドに対応している、以下のリポジトリを見て下さい。

残りもなるはやで、一気通貫ビルド化する予定です。

「これどうやって本家にmergeするんや」

というのが近い将来の悩みになりそうですが、今は何も考えない事にします(;´Д`)


2019-01-27 tueda's diary

_ 宇宙のシミ

プロローグ

我々は時間を感知することはできるけれども、時間軸に沿って移動することはできない。そして我々は、生まれれば必ず死ぬ。「死」とは、我々にとっては不可逆なものであり、避けがたいが故に、我々はそれを避ける事を熱望するのである。

これは種族としての人類においても同じことであろう。人類はいつか滅びる。この滅びの瞬間を少しでも先に延ばそうと、我々は努力を続けているのである。

さて、ここに時間と空間を区別無く認識する存在があったとしよう。この存在にとって「死」と言うものは、単に領域の境界に過ぎない。我々にとって、皮膚という境界の向こう側には自分自身は存在しないのと同じく、生まれ、そして死ぬという時間の境界の外側には自分自身は存在しないだけである。

この存在からみれば人類は、時空の特定領域に存在する「シミ」のようなものであろう。

人類の危機

誕生から数十万年が過ぎ、いよいよ人類の滅亡が近づいてきたかのうように見える昨今の世界情勢である。合衆国大統領は「アメリカファースト」を声高に叫び、強面のロシア大統領は周辺諸国への締め付けを強化しつつあり、そして大国となった中国では国家主席に権力を集中させ、国内では独裁を、国外に対しては「力による現状の変更」を強行しようとしている。

終末時計はついに、2分前にまで進められた。世界を破滅させるに足る兵器をもつこの3カ国の状況から、誰もが人類はもう破滅すると確信していたのである、否、むしろ、 本当はそこで破滅するはずであったのだ

西暦20xx年。代替わりした3カ国首脳が一堂に会し、3カ国が連合してひとつの共同体を形作ることに合意した。なんと、破滅するはずであった人類が、破滅の淵できわどく踏みとどまり、人類の叡智を結集し、さらに将来へ向けて大きく前進することになったのであった…

とある存在の家族の会話

母「あら、いややわー、顔のシミが大きくなってるやん!」

父「わ、ほんまやなー。まあお母ちゃんもトシやし、しゃーないんちゃうか?(笑)」

母「何へらへら笑てんの。誰がトシやって?(怒)」

父「え、え、いや、なんもいうてへんで。なあ、坊?」

坊「あのな、お母ちゃん。となりのおばちゃん、なんやええシミ取りクリーム知ってるらしいで。それ塗ってねたら、シミくらい一晩で消えるって。」

母「まあ、坊はええこと聞いてきたな。ろくでなしのお父ちゃんとえらい違いや。ほな早速となりでクリーム借りてくるわ…」

ーーー 翌日

母「いやー、ほんまにシミ消えたわ!すごいなー、このクリーム!」

エピローグ

誕生したという痕跡すら残さずに、人類は消え去った。


2019-01-01 tueda's diary

_ あけましておめでとうございます

画像の説明

あけましておめでとうございます。例年は年を越す前にFOP実績のスナップショットを取っているのですが、ボーッとしてたら年を越してました(ていうか、年を越す少し前に寝てました)。

2017年はFOPが126,015で101回乗ってたらしいので、2018年は回数がだいぶ減りました。2倍キャンペーンを効率良く使えたので、1回あたりのFOPは微増した感じですが。

そういえば、昨年は初期に300回を越えたので、星がひとつつきました。来年の春までにあと89回乗れれば、ふたつめの星がもらえます。まあ、今年はさらに回数が減りそうなので、どうなることやら…

とりあえず、ことしも楽しみながら飛行機に乗りつつ、お仕事も頑張らせて頂こうと思います。どうぞよろしくお願い申し上げます。


2018-12-08 tueda's diary

_ 予言: 改正入管法について

 改正入管法が可決されたようなので、予言しておく。

 特定第1号の在留上限5年は、2年後くらいに10年に伸ばす議論が始まり、4年後の期限ギリギリでまた強行採決されるだろう。これは5年後の政権が自民党であろうと、今後台頭してくるかもしれない保守系野党であろうと変わらないだろう。

 そもそも5年という上限値になんらかの根拠があるのかどうかが怪しい。「3年は短い、10年は長すぎる。じゃあ5年で良いんじゃね?」くらいの理由だと睨んでる。日本人は奇数が好きだ。

 だが現実問題として5年なんてあっという間である。恐らくこれから現場で「単純労働」でこき使われるひとが、たった5年で特定2号の試験に合格できるほど日本語や応用的な技能(そして日本社会の特質)を習得できる余裕があるとは思えない。とはいえ、5年もやればその分野の技能にはそれなりに習熟できる。それを手放してまたイチからやり直すのはもったい無い。

 きっとそんな話になるだろう。4年後には

二十歳で来日して、5年後は25歳。あと5年くらい日本で稼いで、30歳で母国で結婚しなよ。

 などというお為ごかしな会話がまかり通っていると予想するのである。


2018-12-03 Coworking Space Advent Calendar 2018

_ コワーキングスペースと勉強会とわたし

コワーキングスペースとわたし

 2017年12月より、大阪・天満にコワーキングスペース天満を正式オープンさせて頂きました。おかげさまでなんとかかんとか、1年運営することができました。応援下さった皆様には、感謝の気持ちでいっぱいです。


 そもそも私がコワーキングスペースというものを知ったのは2013年〜2014頃、今年がちょうど10周年になるSurvive SNSというグループの勉強会を、東京・茅場町のコワーキングスペース茅場町Co-Edoさんで開かせて頂いたことがきっかけでした。その後、仕事で週の半分を東京で過ごすようになり、空いた時間をCo-Edoさんで過ごさせて頂くようになりました。


 それまでは東京で空き時間ができると、電源の使えるカフェを探して徘徊した挙げ句、徘徊だけで空き時間が潰れるという事も多々ある「なにやってんだか」な状況でした。しかしコワーキングスペースを知ってからは、「ここから茅場町まで何分かかるか?」という事さえ把握していれば時間を非常に効率的につかえ、かなり生産性が上がりました。

勉強会とわたし

 そうこうしているうちにCo-Edoさんで毎月個人的な勉強会を開かせて頂くようになり、私にとって東京での生活・仕事にはCo-Edoさんはじめコワーキングスペースがなくてはならないものとなったのでした。


 勉強会…そう、勉強会といえば。20年くらい前に全国各地でオープンソースなコミュニティが盛んになったことがあって、大阪でもLinuxや*BSDなコミュニティが立ち上がり、盛んに活動していました(もちろん今でも多くのコミュニティ・グループが活動しています)。私もk*bugの設立に関わらせて頂いたり、関西オープンフォーラムというイベントの運営の末席を汚させて頂いたりしたご縁で、各種勉強会に参加させて頂き、また運営を担当させて頂くこともありました。


 当時、勉強会を開催するとなると一番困ったのが会場の問題です。貸し会議室を借りると費用がかかります。一定の参加者が見込める場合は参加者で頭割り、あるいは最初から参加費を設定しての開催も可能です。k*bugやk-ofの様な、ある種の「公共性」があるコミュニティやイベントの場合、メンバーに大学の先生やある程度の規模の企業の経営者がいたりして、会場を格安あるいは無償でご提供頂ける事もあるわけですが。個人が個人の趣味や想いを形にするようなイベント・勉強会ではそうもいきません。当時は勉強会を開催する敷居がとても高かったと思います。(そういう勉強会を各コミュニティでサポートしていこう、という機運もまた高かったのではありますが)

コワーキングスペースと勉強会

 その後、私自身は仕事に忙しく、なかなかコミュニティ活動にも参加できない時期がありました。そんな私をおいてけぼりにするかの如く、Survive SNSを通じてギークハウス的なプロジェクトがわき起こるのを横目で見、オフィスを飛び出したノマド族がカフェでMacを開き、さらにコワーキングスペースなるものが台頭してくる世の変遷を刮目もし瞠目もしていたのでした。


 そんな中、Co-Edoさんではドロップイン利用の形態で勉強会の開催ができる、そして参加者数にかかわらずひとりあたり1000円、しかも集金も会場でして頂ける!20年前、勉強会の会場確保と運営に四苦八苦していた(大袈裟)事を考えると正に隔世の感でした。

この福音を大阪にも!
オレは大阪でコワーキングスペースを運営するぞ!

と、まあ根っから楽天主義かついくつになっても若気の至りな私は思ったわけです。


 しかし皆さんご存じの通り、実は大阪にも老舗のコワーキングスペースさんが数多くありまして、各スペースの運営者の皆様のご尽力で、既に関西でも勉強会開催の敷居は非常に低くなっております。現に20年前にオープンソース界隈で一緒に活動していた某氏が主催する勉強会も、またここ数年ゲーム方面で活発に活動している某コミュニティの勉強会も、それぞれに拠点となるコワーキングスペースがあって活動をされているわけです。

じゃあもう、オレがやんなくても良いんじゃね?

と一瞬思ったのも事実です。それでもやっぱり。

  • 弊社オフィスのある天満・南森町地区は都心にしては人が多く住み
  • 若い人たちが自分たちの力でオシャレなカフェや小物店など
  • ただビジネスとしてだけではなく文化を感じさせる店を営んでます

 そんな地域のひとたちに、「コワーキング」という新しい働き方のカタチ、いやむしろ「コワーキング」という文化をお伝えできればなと思い、

敢えて2, 3週遅れで走り始めようじゃないの

と、小さいながらもスペースを開設させて頂きました。

コワーキングスペース天満

 弊スペースは本当にこぢんまりとしていて、勉強会利用で最大15-20人まで、ドロップインでゆったりご利用頂くには10人が限界かなという大きさです。幸い?、天満橋・南森町のちょうど中間地点という、交通の便が良いんだか悪いんだかという立地のおかげでたいてい空いてます(涙目)。


 ちょうどこのAdvent Calendarが成就するクリスマスまでは、土、日、祝はご予約なしのドロップイン利用は終日500円キャンペーンもやってます(たぶん、お正月が明けたら再開します)。少人数のお仲間で勉強会がしたいときなど、土日祝日に各々500円玉1枚を握りしめて集まって頂けば、プロジェクタ・スクリーンを使ったプチ勉強会も可能です。(ご予約で事前にお席の確保をいただく場合、本キャンペーンは対象外です。他の勉強会とバッティングしないかどうかはWebページのカレンダーをご参照ください。)


 私がコワーキングスペースの運営を始めた理由は、とにもかくにも、誰でも気軽に勉強会が開ける場所を提供したかった。それが、オープンソース界隈やコミュニティ活動から私が受けたご恩に感謝を示し、そしてこれまで受け取ったものを、次の世代にお渡しする事にも繋がると思ったから。


 最後にもう一度。大昔からコミュニティ活動を続けてきた皆さん、そして個人の力が最大限に発揮できる世の中にするためにご尽力頂いた皆さん、さらにはこれからもこの世界を支えて下さる皆さんに感謝を込めて。微力ながら私も頑張ります。


2018年12月3日
コワーキングスペース天満 https://temma.co
上田達也


※ この日記は、コワーキングスペース運営者限定アドベントカレンダー Advent Calendar 2018の3日目の記事として書きました。


2018-11-29 tueda's diary

_ 更新テスト

またもや久しく触ってなかったので、設定エラーが(;´Д`) ということで設定変更して更新のテストです。


2018-08-15 tueda's diary

_ 私がサマータイムを好きなたったひとつの理由

  • 夜更かししてても叱られない。

これに尽きる。

普通は暗くなってなお遊んでいると叱れるわけだが(これは子供だけではない。世の大多数のお父さんだって、夜遊びするとお母さんに叱られるのだ。でしょ?でしょ?)、日本の北海道あたりより高緯度な地方でサマータイムを実施すると、なんと、夜の10時頃でも明るかったりするのだ。

こんな時間まで明るいと、

  • 17時に退社
  • 18時から自宅で晩ご飯
  • 20時から近くの教会でコンサート鑑賞(あるいは出演)
  • 22時過ぎ、やっと暗くなったので村のパブに飲みに出かける

という、植木等もビックリなスーダラ生活ができるのだ!

こんな素敵なサマータイムを否定する意味が分からない。さあ、みんなでレッツサマータイム!

日本でサマータイム?は?残念!

とはいえ…

  • 緯度が低いとそもそも日没が早いので多少ずらしても楽しくない

ヨーロッパでもイタリアあたりまで下がると、実はあまり楽しくない。南ドイツもイマイチ。やっぱり北ドイツ以北でないと、サマータイム・スーダリズムの恩恵にはあまりあずかれない。

イタリアの場合、ローマ辺りでやっと東北くらいなんだよなあ…

日本でやって楽しいかどうか、推して知るべし。残念(ーー;)

2020年?は?地デジカ君に謝れ!

いや無理でしょ。地デジカ君は6年頑張ったんだよ!まだ推進キャラクタもいないのに1年や2年でできるわけ無いじゃん。バカじゃ無い?いやむしろ地デジカ君に謝れ!ヽ(`Д´#)ノ

真面目なひとはスーダラできないらしい、ごめんなさい

私や植木先生のようなスーダリストには地上の楽園・サマータイムゾーンなわけですが、真面目なひとには生活のリズムが崩れることで健康に不調を来すこともあるらしいです。

うーん、じぶんたちが楽しいから、という理由でひとさまを不幸にするのは本意ではないしなあ…どうせ我々は外が明るかろうが暗かろうが、スーダラしてるし、たまに真面目にしてても、ついうっかりいつものクセでお母さんには叱られるしなあ(ぁ)

結論

ということで日本でサマータイムは要らないんじゃないですかね。やっても良いけど、2020年とか2時間とか、ほかの皆さんに迷惑をかけるようなことは止めましょう。バカじゃ無い?って言われちゃうので。

我々はスーダラしているだけで、決してバカでは無いのです(ーー;)


2018-02-12 tueda's diary

_ DocDiff for OS X later Marvericks

ちょっと必要に駆られて日本語文章のdiffを単語や文字単位で取れるコマンドラインツールを探していたら,DocDiffというものを見つけた.非常に良く出来ているのだが,残念ながら開発が止まっている様だ.通常版は ruby 1.9 以前でないと動かないらしい.

OS X Marvericks 以降ではデフォルトの ruby が 2.0 になっているので,このままでは動かない.が,githubには ruby 2.x に対応したものが上がっているそうなので,そちらの記事を参考になんとか動かす事ができたので備忘録として記しておく.

  • master ブランチを zip で落とす
  • 落としたものから lib の下を自分の好きな場所におく (以下では${docdiff}/libとする)
  • 実行ファイルは bin/docdiff である.これも好きな場所に置く(同様に${docdiff}/bin/docdiffとする)

libはruby2.0のライブラリディレクトリの下に置いたら良いよとか,実行ファイルは /usr/local/bin の下にコピれば良いよとかあるのだが,Sierra 以降だとセキュリティ制約が厳しくなって,自分のホーム以外には(sudoしても)ファイルを置いたりパーミション変えたりが出来なくなっている.

なので,もういっそライブラリも実行ファイルも自分の好きな場所に配置して,

ruby -I ${docdifflib} ${docdiff}/bin/docdiff ファイル1 ファイル2

とかして実行した方がよっぽど楽である(し,ちゃんと動く).

なお,Yoseite 以降あたりの時期から gem でインストールもできるようになっているという事であるが,今回は試していない.DocDiff に少し手を入れる必要があったので,単純にソースコードを配置する方式の方が便利であった.

今回,大量のファイルをクロスチェックをする必要があったので,DocDiff には以下の感じで手を入れた.

  • 単語単位での一致率が一定の割合を超えた場合のみ差分を表示(正常終了)
  • それ以外は差分は表示せずに 1 を返す(敢えて異常終了)
  • Shell Script で戻り値をチェックして,差分表示があった場合のみファイルに落とす

ようにした.

余談

ruby をよく知らないのでとりあえず「一致率の閾値」をコマンドライン引数で渡すのではなくハードコーディングしてるとか,どういう基準で一致率を判定してるとかを公にしたくないとかの事情があって,今回はコードを公開しません(恥ずかしさ半分,大人の事情半分で).もう少し ruby が書けるようになったら整理して公開しても良いとは思うのですが.(DocDiff は BSD ライセンスらしいのでご勘弁).

もしかしたらmoodleで大量のドキュメントを収集する必要があるとか,集めたドキュメントの類似率を検証する必要があるとかいう方々には多少の役に立つかもしれませんので,ご興味を持たれましたら個人的にご連絡くださればと思います _o_


2018-01-16 tueda's diary

_ 連続する整数の和で表される整数

前回の【大阪・さんすう勉強会】 終了後に,参加者さんから質問を頂きました.とあるコースウェアでプログラミングの勉強をされているようで,そのお題についてでした.ざっくりこんな問いです(ちょっと変えてます).

  • 整数には,連続する整数の和で表すことができるものがある
    • 5 = [2 + 3], 18 = [3 + 4 + 5 + 6]
  • なかには複数の連続する整数の組み合わせが存在するものもある
    • 18 = [3 + 4 + 5 + 6], [5 + 6 + 7]

このように複数の組み合わせが存在するもののうち,ふたつ以上の組みが連続して現れるもの,たとえば

  • 3 = [1 + 2], [3]
  • 15 = [4 + 5 + 6], [7 + 8]
  • 27 = [2 + 3 + 4 + 5 + 6 + 7], [8 + 9 + 10] [13 + 14]

のようなものもある.このような正の整数を小さいものから順に表示するプログラムを作成せよ.

最初に聞いた時は「こんなの総当たりするしかないんじゃないの?」と思ってたんですが,なんと,ご質問者さんと勉強会参加者の方々が色々調べてくださって,実はこんな性質があることが分かりました.

  • 連続する整数の和で表される整数は,1以外の奇数の約数を持つ
  • この奇数の約数の個数だけ,和の組みが存在する
  • 具体的な組み合わせは以下の手順で求められる
    • 元の数を奇数の約数で割った商を中心に,割った奇数と同じ個数の連続した数を足すと元の数になる(0やマイナスもとりあえず並べる)
    • 小さい方がマイナスになる場合は,正の側と相殺する

参考: http://www.eikoh-seminar.com/echtas/blog/2015/10/post-224.html

ここまで分かれば,プログラムを書くのは簡単です.

戦略

以下の手順でプログラムを書くことにしましょう.

  • 与えられた数の,奇数の約数のリストを作る関数を作成する(総当たり)
  • そのリストで割った商を中心に,最小値と最大値だけを保持した配列を作る
    • 対象がその数自体の場合は単純にふたつに分ける
  • 配列が全部できたら,とりあえずまた総当たりで (最大値+1=最小値) となっているものを探す
  • 見つけたらそこで終了

実は質問者さんも最初,この戦略の事を仰ってたのですが,私が上記の性質を知らなかったのでちゃんと対応できなかったのでした.ゴメンなさい><;

コード(Java)

とりあえず私の手元ですぐに書けるのが Java だったので,Java で書いて見ました.戦略さえ立ててしまえば,コーディングには30分もかかりませんでした!(IntelliJ にだいぶ助けてもらってるからですけど(;´Д`))

いやー,算数の知識って重要ですね(ぁ)

import java.util.ArrayList;
import java.util.List;

/*
 * 解説
 * 連続する整数の和で表す事のできる整数は,1以外の奇数の約数をも ち,
 * そのような約数の個数分,和がその整数と同じ値になる連続ブロックを
 * もつ(らしい).
 * この時,奇数の約数(v)で元の整数(n)を割った値(c)を中心にし て
 * v 個の連続する数の和が n と等しくなる(ようだ).
 *
 * この性質は整数(負の数を含む)の範囲で有効であるが,今回は自然数
 * の範囲で連続性を見ることが条件なので,負の部分は正の部分と相殺す る.
 *
 */

public class Renzoku {

    public static void main(String [] args) {

        Renzoku r = new Renzoku();

        int count = 1;
        for (int n = 3; count <= 80; n++) {
            if (r.process(n, count)) {
                count++;
            }
        }

    }

    public boolean process(int n, int count) {
        boolean ret = false;
        ArrayList<MinMax> minmaxAll = new ArrayList<>();

        /*
         * 奇数の約数を求める(ほぼ総当たりだけど,loop は n の
         * 平方根までに押さえて,同じ loop の回数の中で反対側の
         * 計算もしている)
         */
        List<Integer> div = divisor(n);
        for (int v : div) {
            /*
             * 約数で割った数を中心に,最大値と最小値を求める
             */
            int c = n / v;
            int min = c - v / 2;
            int max = c + v / 2;

            /*
             * 元の数は単純にふたつに分ける
             */
            if (v == n) {
                min = n / 2;
                max = n /2 + 1;
            }
            /*
             * 最小値が負の数になる場合は正の側を相殺する
             */
            if (min <= 0) {
                min = min * -1 + 1;
            }

            /*
             * 区間の最小値と最大値だけを覚えておく
             */
            minmaxAll.add(new MinMax(min, max));
       }

        boolean isGot = false;
        for (MinMax minmax : minmaxAll) {
            for (MinMax minmax2 : minmaxAll) {
                if (minmax == minmax2) {
                    continue;
                }
                if (minmax.min == minmax2.max + 1) {
                    isGot = true;
                    break;
                }
            }
        }
        if (isGot) {
            System.out.println("Got!: " + count + ": " + n);
            ret = true;
        }
        return ret;
    }

    /**
     * 約数のリストを作る(奇数のみ)
     */
    public static final List<Integer> divisor(final int n) {
        final List<Integer> list = new ArrayList<>();

        for (int i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                /*
                 * 平方根までしか見ないので,偶数であっても割った結果が
                 * 奇数になるものを掬う必要がある.
                 */
                if (i % 2 != 0) {
                    list.add(i);
                }
                int j = n / i;
                if (i != j && j % 2 != 0) {
                    list.add(n / i); // 逆向き
                }
            }
        }
        return list;
    }

    class MinMax {
        public int min;
        public int max;

        public MinMax(int min, int max) {
            this.min = min;
            this.max = max;
        }
    }
}

やっつけなので効率の悪いところや美しくないところは多々ありますが,そこは目をつぶるか,できたら綺麗に書き直してください(ぉ)

本日のツッコミ(全2件) [ツッコミを入れる]

_ いけばた [勉強会で質問させてもらった張本人ですw 解説ありがとうございます!解いてしばらくしたら、内容絶対忘れるので、解説し..]

_ うえお [ご参加ありがとうございました! 最近は日記ならぬ年記になっていたので,良いお題を頂いて良かったですw 来月もまた..]


総訪問者数: 本日の訪問者数: 昨日の訪問者数: