tag:crieit.net,2005:https://crieit.net/users/aocory/feed
aocoryの投稿 - Crieit
Crieitでユーザーaocoryによる最近の投稿
2020-04-27T18:53:30+09:00
https://crieit.net/users/aocory/feed
tag:crieit.net,2005:PublicArticle/15873
2020-04-27T18:53:30+09:00
2020-04-27T18:53:30+09:00
https://crieit.net/posts/54fd8b1da34480e3b628c645f266d157
2日でオンライン診療まとめサイトを作った
<p>ご無沙汰しております。<br />
@aocoryです。<br />
今回、<br />
<a target="_blank" rel="nofollow noopener" href="https://online-medical.net/">https://online-medical.net/</a><br />
という厚生労働省が4月25日に公開したオンライン診療に対応した医療機関リストを元に都道府県別の絞り込み機能付きのリストを作りました。</p>
<h2 id="Who?"><a href="#Who%3F">Who?</a></h2>
<p>コリといいます。趣味は個人開発で、実家をついで開業医を今年の4月からしています。<br />
保活広場というサービスを作ったりしていました。<br />
そんな中、コロナ対策でオンライン診療じゃー。というお上の司令に沿って準備をして時を待っていました。<br />
その話は<br />
個人開発者がコロナの中病院を継承した物語<br />
<a href="https://crieit.net/posts/0a53e19f6d1307a006bb9dc83bac5369">https://crieit.net/posts/0a53e19f6d1307a006bb9dc83bac5369</a><br />
で書きましたので今回はその続きになります。</p>
<h2 id="なぜ作ったか?"><a href="#%E3%81%AA%E3%81%9C%E4%BD%9C%E3%81%A3%E3%81%9F%E3%81%8B%EF%BC%9F">なぜ作ったか?</a></h2>
<p>データとしてはすごく貴重。でもこれ一般の人使えないよね?</p>
<p>そう思ったからです。例えば、東京都でオンライン診療を行っている病院は約1000あります。そこからあなたのベストな病院をこのPDFをプリントして探してください。と言われて探せますか?ほとんどの人は探せないと思います。</p>
<p>つまり、めちゃくちゃ頑張ったオンライン診療の準備がすべて水の泡になる?可能性が出てきました。</p>
<p>コレは悲しい。</p>
<p>きっと、誰かがコレを綺麗にまとめてユーザーに届けてくれる。</p>
<p>そう思うことが出来ませんでした。</p>
<p>待てませんでした。</p>
<p>気がついたらGoogleドメインでドメインを取ってドメイン駆動開発をしていました。</p>
<p>世間は今日からGW。ただでさえ医療難民が発生するこの時期にコロナウイルスによる医療崩壊が起きてしまうと考えると総合病院のHPがどんどん削られていくのは目に見えています。オンライン診療なら僕らがオンラインで相談に乗れば少しだけ、前線の彼らのHPがすり減るのを減らす可能性を秘めているのです。</p>
<p>時間はない。作ろう。</p>
<p>そう思いました。</p>
<p>幸い、都道府県のデータは一見は一様に列は整っていそうな体裁でした。</p>
<p>コレに市町村と診療科で絞り込み機能なら実装できそう。</p>
<p>診療科のところの入力規則がぐちゃぐちゃだけど、リストでなくStringでTrueかを判定すれば雑な絞り込みはできそうだ。<br />
地図機能どうしよう?APIで行けるけど複数のピンを立てるのは住所じゃなくて逆ジオコーディングが必要だ。オンラインだし、距離は関係ないし、要らない。</p>
<p>診察医いる?<br />
初対面の人を名前で判断しないし、要らない。</p>
<p>バックアップ病院は?<br />
とりあえず、ややこしくなるから要らない。</p>
<p>正式なやつはきっとどっかのできるエンジニアがなんとかしてくれるはず。<br />
それまでのつなぎで僕はいい。ただ早く届ければ。</p>
<p>そう思って開発を始めました。</p>
<h2 id="技術選定"><a href="#%E6%8A%80%E8%A1%93%E9%81%B8%E5%AE%9A">技術選定</a></h2>
<p>技術としてはVueのCDNと生jsonファイルを作って読み込ませる方法を取りました。<br />
この方法ならデータベースのお金もかからないし、Netlifyに乗せるだけで動く。<br />
開発も保活広場で同じことをしたので知見もある。</p>
<p>本当はNuxtとかモダンなやつを選定したかったが、実装時間考えると無理でした。</p>
<p>都道府県のPDFはオンラインでエクセルに変換そしてCSVにしてJsonに変換する手作業を行いました。</p>
<h2 id="作ってみて"><a href="#%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%A6">作ってみて</a></h2>
<p>なんとか月曜日に間に合いました。</p>
<p>見た目とかブルマまんまだし、絞り込みも甘いけど取りあえず動くの作れて少しはTwitterで公開したらありがとうをいただけたので満足しています。</p>
<p>少しでもコレで皆さんの在宅受診がはかどれば幸いです。</p>
<h2 id="オンラインをする意味と知っていてほしいこと"><a href="#%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%92%E3%81%99%E3%82%8B%E6%84%8F%E5%91%B3%E3%81%A8%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%84%E3%81%A6%E3%81%BB%E3%81%97%E3%81%84%E3%81%93%E3%81%A8">オンラインをする意味と知っていてほしいこと</a></h2>
<p>最後にオンラインの診療の意味などを少し病院側から<br />
オンラインはメリットも多いです。<br />
+ 診察の待ち時間の緩和<br />
+ 待合室のいわゆる三密の回避<br />
+ 子供が小さいなどの理由で来院しにくい患者さんのセーフティネット<br />
などこの時期であれば力を発揮するものだと思います。</p>
<p>ひたすらオンラインをもてはやす風潮がありますが、診療はやはり会って直接お話をするほうが情報の解像度が高く、ベストを尽くせることは間違いないです。オンラインはあくまでもサブです。そこは知っておいてほしいです。</p>
aocory
tag:crieit.net,2005:PublicArticle/15866
2020-04-24T18:48:21+09:00
2020-04-24T18:48:21+09:00
https://crieit.net/posts/0a53e19f6d1307a006bb9dc83bac5369
個人開発者がコロナの中病院を継承した物語
<p>4月1日に14年間務めた大学病院を辞めて家業の小さなのクリニックを継承した。</p>
<p>息子が幼稚園に行き、その空いた時間で妻とおいしいランチや映画を見ながら第二の人生を満喫する予定だった。本当に。経費で学会いって、個人開発者の仲間と飲んだりするのを凄く楽しみにしていた。<br />
そして、空いた時間にジムに行って筋トレをしたいな。ぼんやり、ヌルい夢を見ていた。<br />
しかし、思い描いていた世界と現実は大きく異なった。</p>
<p>そう、コロナである。</p>
<p>救命の先生とか呼吸器内科の先生、看護スタッフは大学病院でコロナと戦っていると思うと後ろ髪を引かれる思いがあったが、コロナが流行る昨年末には辞表を書いていたし、親父が87歳になるまで頑張ってくれたのでなんとか自分の中で区切りがつくまで医局で勤め上げることが出来た。これ以上、「親父頑張れ!」は無理だった。逆にコロナの中、親父が町医者として診療をする事を選択させなくて良かった。<br />
運悪くかかれば80歳は死ぬだろう。</p>
<p>4月1日、初日の仕事は、医師会に申請の書類を書きに来た。<br />
厚生労働省の通達とか意味不明だったので見せて貰った。昨日まで勤務医だったので、その手のニュースは全く事務の仕事なので興味は無かった。世間では厚生労働省がコロナ対策でオンライン診療を緩和するというNHKニュースをしていた。これで、診療の世界は、変わる。</p>
<p>HelloWorld。</p>
<p>そう思い。オンライン診療に取り組まれている先生がいるかを伺った。<br />
先人のスキームが欲しかった。何を使い、何をしているのか?<br />
全く、今まで勤務医をしていたのでわからない。<br />
ただ、一つ言えることは<strong>グーグル検索で上位表示されているオンライン診療システムはボッタクリ</strong>だろう。それだけだ。</p>
<p>情報通信機器を用いた診療としか厚生省には書かれていない。</p>
<p>仕様書がクソだ。</p>
<p>高額なオンライン診療システムしか駄目なのかと思えば、スカイプでやっているところも東京にはあった。うちとしては、<strong>資金力がないのでお金をかけたくない。</strong><br />
担当者に聞いてみた。<br />
役所の担当者の反応は冷ややかだった。</p>
<p><strong>「コレについて聞いたの先生が初ですよ。」</strong></p>
<p>意味がわからなかった。<br />
このコロナウイルス騒動が、GW開けまでに終わるとでも思っているのだろうか?<br />
僕は、当時は秋くらいまではかかるだろうと考えていたので、このまま外出自粛などが続けば患者さんは半減し、継承したての病院が潰れるかもしれない。<br />
そういう危機感が強かった。</p>
<p>やることは決まった<strong>今月中にオンライン診療を行える</strong>ようにする。</p>
<p>考えたモデルは</p>
<p>診療→お薬を郵送→代引きで決済</p>
<p>というシンプルなモデルだ。<br />
うちは、古いオヤジのせいで処方箋→薬局というムーブが生じない院内調剤というレガシーなスタイルのクリニックだったのが活きそうだ。着払いさえクリアできたらそれでできる。</p>
<p>その足で、運輸会社に行った。</p>
<p>運輸会社に薬をお願いして配送してもらう。診察代金もコミコミで代引きしてもらう。<br />
コレがクリアできたら、ぼくがかんがえたさいきょうのオンライン診療が開始できる。</p>
<p>ちなみにここでもプランを話したら</p>
<p>「<strong>このお問い合わせ大阪府で初めてです。</strong>」</p>
<p>と担当さんから言われた。通達は本社からあったようだが、動いたのは誰もいない。</p>
<p>遅いよ。アフィリエイトなら、もう全部クエリ食われてるよ。</p>
<p><strong>マジで、大丈夫か医療?</strong></p>
<p>ただ、運送屋さんは書類さえ整えば受けてくれそうなので良かった。</p>
<h2 id="システムは何に?"><a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AF%E4%BD%95%E3%81%AB%EF%BC%9F">システムは何に?</a></h2>
<p>システムを何にするか?<br />
会計などは運送屋さんにお願いすればいい。<br />
問題は診察システムだ。</p>
<p>結果、<strong>電話</strong>を採用した。</p>
<p><strong>オンラインとは?できませんでした!いかがでしたか?</strong></p>
<p>そう心で叫んだが。うちの患者さんは50歳から80歳だ。<br />
ちなみに事務員さんも平均50代の熟女ばかりだ。</p>
<p>ZOOM、スマホにアプリを入れてくださいを説明するのは諦めた。<br />
モダンでイケイケなFireBASEみたいな感じでオンライン診療やるなんて夢だった。<br />
3時間で50人来るおじいちゃん、おばあちゃんにZOOMを教えていたら<strong>密必至</strong>だ。</p>
<p>80歳にZOOMの使い方を1分で完璧教えれる人がいれば事務員さんとして雇いたいので是非声をかけてほしい。</p>
<h1 id="ホームページ"><a href="#%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8">ホームページ</a></h1>
<p>よく考えたらホームページ、ご予約はどうするか?<br />
まだうちにはホームページがなかった。SEOなにそれ?美味しいの?<br />
とりあえず、おしゃれな写真やUIは無視してBLUMAでベタ打ちのHTMLで1ページ。<br />
予約はGoogleFrom。</p>
<p>LaravelもDjangoもFireBaseもない。</p>
<p>時間がかかりすぎる。作っててコレが俺の作りたいものかと思うと少しだけ悔しかった。</p>
<p>イケてるモダン開発環境はなにもない。<br />
ただ、ネットにあるものを組み合わせて上げただけ。<br />
勉強したプログラミングは、こんな便利なサービスが有るという知見でしか役に立っていないのが悔しい。</p>
<p>ただ、スピードが必要で早く届けたい。それしか考えていなかった。</p>
<h2 id="デプロイ"><a href="#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4">デプロイ</a></h2>
<p>とりあえず、書類が通って1日でサービスを立てた。<br />
掘っ立て小屋のようなホームページのリンクはグーグルマイビジネスからのみ。<br />
反響などないと思っていたが、ありがたいことに1日1件ほどお問い合せを頂いている。</p>
<p>コロナが落ち着いたら少しモダンに改修したいな。</p>
<p>それを思いながら、大阪でぼちぼちキャパ超えならない程度に電話診療をやってます。</p>
<p>最後にHappyCoding</p>
aocory
tag:crieit.net,2005:PublicArticle/15597
2019-12-11T08:46:27+09:00
2019-12-11T08:46:51+09:00
https://crieit.net/posts/crieit-5df02e539388b
crieitにアウトプットを集中した結果ww
<p>この記事はなんでも Advent Calendar 2019の記事です。<br />
今年は、ほぼ何もしていないので例年通りポエムを書きます。</p>
<h1 id="crieitにアウトプットを集中した結果ww"><a href="#crieit%E3%81%AB%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E3%82%92%E9%9B%86%E4%B8%AD%E3%81%97%E3%81%9F%E7%B5%90%E6%9E%9C%EF%BD%97%EF%BD%97">crieitにアウトプットを集中した結果ww</a></h1>
<p>どうも、<strong>crieit年間1位</strong>のコリです。といってもたいしたことではなくインターネットのゴミ以下の記事しか作ってない自負があります。</p>
<ul>
<li>なぜこのプラットフォームを選んだか?</li>
<li>書いた記事のボリューム</li>
<li>実は投稿しすぎたことによってうまれたcrieitの機能</li>
<li>書いて良かったなと思ったこと</li>
</ul>
<h1 id="なぜこのプラットフォームを選んだか?"><a href="#%E3%81%AA%E3%81%9C%E3%81%93%E3%81%AE%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E9%81%B8%E3%82%93%E3%81%A0%E3%81%8B%EF%BC%9F">なぜこのプラットフォームを選んだか?</a></h1>
<p>なぜ、このプラットフォームを選んだか?というと</p>
<ul>
<li>運営者が知り合い(但し、会ったことはない)</li>
<li>必ず一人は読んでくれる。</li>
<li>SEOがそれなりにあり検索でもヒットしやすい。</li>
<li>クロス投稿できる</li>
</ul>
<p>以上のような理由があります。<br />
運営者の@dala00さんは、個人開発ギルドという僕の所属しているコミュニティの先輩であり、やりとりのある人です。以前は、僕自身もブログはやっていたのですが、諸事情<del>(炎上)</del>などにより稼働していないような状況でした。プログラミングの勉強をしたことは、読んで実装して、ドキュメントに残してやっと身についたと実感できる位飲み込みは悪い方。何度も、同じ間違いをしてググる。そういうタイプの人間です。それなら記事とかメモとかを残しておきたい。<strong>自分用に</strong>。と思っていましたが、<strong>緑色の大手サービスは警察がいて怖い。</strong> そんなときに、自分でブログを1から立てて育てるの面倒くさいから、知り合い?が技術記事投稿サービスを開いているCrieitに投稿してみよう。というのがきっかけです。</p>
<h1 id="書いた記事のボリューム"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E8%A8%98%E4%BA%8B%E3%81%AE%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0">書いた記事のボリューム</a></h1>
<p>書いた記事のボリュームは、全て1000文字以下で書いています。<br />
個人的には1記事1検索目的1機能という記事デザインにしてユーザーが記事内で探すという事をする必要が無い記事を意識して書いていました。まとめ記事って便利ですけど、そこは連載機能とか関連リンクでつないでなんとかすれば良いんじゃないか?って個人的には考えていました。</p>
<h1 id="実は投稿しすぎたことによってうまれたcrieitの機能"><a href="#%E5%AE%9F%E3%81%AF%E6%8A%95%E7%A8%BF%E3%81%97%E3%81%99%E3%81%8E%E3%81%9F%E3%81%93%E3%81%A8%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%81%86%E3%81%BE%E3%82%8C%E3%81%9Fcrieit%E3%81%AE%E6%A9%9F%E8%83%BD">実は投稿しすぎたことによってうまれたcrieitの機能</a></h1>
<p>Crieitで追加された機能のウチ、実は投稿しすぎたことによってうまれた機能があります。<br />
個人的に、連載で多投稿することを意識して、個人的に<strong>トップページ全部俺</strong>作戦を実行していた時がありました。おそらくそのせいで投稿者毎表示になってしまったと思いますwdalaさんごめんw</p>
<h1 id="書いて良かったなと思ったこと"><a href="#%E6%9B%B8%E3%81%84%E3%81%A6%E8%89%AF%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AA%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">書いて良かったなと思ったこと</a></h1>
<p>どんなクソ記事でも一人は読んでくれる。このコミュニティに投稿した記事は、オーナーのdalaさんがほぼ1記事読んでくれて感想をTweetしてくれます。(投稿時間による)これが、個人的には投稿を続けることができた安心感でもありました。一人でも、読んでくれて反応してくれる。これが個人ブログでのAdSense収入を捨ててまで書き続けた理由です。</p>
<p>また、連先で体系的にまとめて書く事ができるので、この連載読んだよ!とdalaさん経由で教えていただいたことは凄く励みになりました。僕自身は、エンジニアではないですし、エンジニアコミュニティにもほとんど属しておりませんので、知り合いというのは個人開発している人だけです。一方、dalaさんは色々なコミュニティに参加されているようで、そこでGatsbyの記事良かったと言われたと聞いたときは凄く嬉しかったのを覚えています。</p>
<h1 id="最後に"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB">最後に</a></h1>
<p>1年間お世話になりました。来年もプログラムはしていると思いますので、皆様面白いことがあればお声がけいただければ幸いです。少し早いですが、良いお年を。</p>
aocory
tag:crieit.net,2005:PublicArticle/15452
2019-10-05T00:09:39+09:00
2019-10-05T00:09:39+09:00
https://crieit.net/posts/Python-5d9760b3519ae
Pythonで静的サイトを作った話
<h1 id="Pythonで静的サイトを作った話"><a href="#Python%E3%81%A7%E9%9D%99%E7%9A%84%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F%E8%A9%B1">Pythonで静的サイトを作った話</a></h1>
<p>ここ1ヶ月ずっと、Pythonで静的サイトを作ることに苦心していた。<br />
Webアプリ作るのも楽しいけど、双方向性が必要なければ生HTMLを吐き出すサイトを作った方がサーバー維持費的にも優しい。</p>
<h1 id="作ったモノ"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%83%A2%E3%83%8E">作ったモノ</a></h1>
<p><a target="_blank" rel="nofollow noopener" href="https://kabu-guide.com">カブガイド</a></p>
<h1 id="使用した技術"><a href="#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%8A%80%E8%A1%93">使用した技術</a></h1>
<ul>
<li>Python3系</li>
<li>Vue.js(CDN)</li>
<li>Bootstrap</li>
</ul>
<h1 id="作ろうとしたきっかけ"><a href="#%E4%BD%9C%E3%82%8D%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91">作ろうとしたきっかけ</a></h1>
<p>2月くらいからPythonで色々書いていた。主にスクレイピングだったり、競技プログラミングのコードだったり、ラジバンダリ。<br />
そろそろ、サイト作ってみてーな、Pythonで!的な感じで始めた。</p>
<h1 id="技術選定"><a href="#%E6%8A%80%E8%A1%93%E9%81%B8%E5%AE%9A">技術選定</a></h1>
<p>初期</p>
<ul>
<li><p>Free<br />
お金は、ドメイン代金以外は払いたくないマンなのでSQL無しにこだわった。ちなみにドメインは取るとテンションが上がって開発したくなる。僕は、エンジニア用語が分からないがきっとドメイン駆動開発っていうモノなんだろう。</p></li>
<li><p>python<br />
何でもできる凄い奴。プログラミング初心者の僕でもチョットできる位の気分にさせてくれる。好き。</p></li>
<li><p>jinja2<br />
Pythonのテンプレートエンジン。以外と柔軟に使えて便利。</p></li>
<li><p>CSV<br />
技術でも何でも無いが、SQLいじってて思ったのはただの便利なCSVファイル(個人の感想です)だったのでCSVで作ってみようと思った。</p></li>
</ul>
<h1 id="株をテーマにした理由"><a href="#%E6%A0%AA%E3%82%92%E3%83%86%E3%83%BC%E3%83%9E%E3%81%AB%E3%81%97%E3%81%9F%E7%90%86%E7%94%B1">株をテーマにした理由</a></h1>
<p>日本は、人口減少などがあり再浮上はなかなか難しい。日本株に投資してもいいがアメリカ株が日本で変えることを知り、投資してみようと思った。そのための勉強としてサイトを作ってみようと思った。6000位だろ?余裕余裕。最初はそう思っていた。</p>
<h1 id="FlaskやDjangoは?"><a href="#Flask%E3%82%84Django%E3%81%AF%EF%BC%9F">FlaskやDjangoは?</a></h1>
<p>サーバかかるから却下した。</p>
<h1 id="Gatsbyは?"><a href="#Gatsby%E3%81%AF%EF%BC%9F">Gatsbyは?</a></h1>
<p>Gatsbyは素晴らしい。だけど、Js難しい。imageの取り回しが面倒(エラー出る)。Scriptタグ(AdSenseなど)がJSベースだとどうしても特殊な処理が必要になってしまい色々面倒。もう少しストレスなく創作したい。そう思っているうちに自作静的サイトジェネレーターを作り出していた。</p>
<h1 id="作ってみて困ったところ、思ったところ"><a href="#%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%A6%E5%9B%B0%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D%E3%80%81%E6%80%9D%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D">作ってみて困ったところ、思ったところ</a></h1>
<h2 id="情報鮮度をどう扱うか"><a href="#%E6%83%85%E5%A0%B1%E9%AE%AE%E5%BA%A6%E3%82%92%E3%81%A9%E3%81%86%E6%89%B1%E3%81%86%E3%81%8B">情報鮮度をどう扱うか</a></h2>
<p>株って生モノで情報の賞味期限が短い。数秒で値段が変わる。つまり、腐ってしまう。初期バージョンでは直接CSVからAPI叩いて保存して、株銘柄のページをビルドするという手法を使っていたのだがあまりにも非効率だったのでやめた。そのため、APIからリアルタイムに数値を取得する必要があった。そこで、CDN版のVueを用いてAxiosでAPIを叩く方式を採用した。使いたいページだけ読み込むちょい足しレシピ的な使い方はかなり便利。</p>
<h2 id="SQLは偉大"><a href="#SQL%E3%81%AF%E5%81%89%E5%A4%A7">SQLは偉大</a></h2>
<p>やってて、やっぱりSQLは、ビルドまたなくていいし便利だよな。とは思った。ビルド短くするために色々ゴニョニョやった処理はSQLの高速化にも使えそう。今度やってみよう。</p>
<h1 id="次の目標"><a href="#%E6%AC%A1%E3%81%AE%E7%9B%AE%E6%A8%99">次の目標</a></h1>
<p>サイトはできた。あとはどうやって効率化していくかのノウハウを蓄積できたらいいな。</p>
aocory
tag:crieit.net,2005:PublicArticle/15309
2019-08-09T07:55:44+09:00
2019-08-09T07:55:44+09:00
https://crieit.net/posts/Python-5d4ca870d8e48
テンプレート機能を実装 Pythonで作る俺俺静的サイトジェネレーター
<p>ページを作るときはやっぱりlayouts.viewなどのように部分を切り出したいですよね?(Laravel脳)</p>
<h2 id="CSV読み込む"><a href="#CSV%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80">CSV読み込む</a></h2>
<pre><code class="python">import csv
csv_file = open(config.csv_path, "r",
encoding="utf_8", errors="", newline="")
f = csv.DictReader(csv_file, delimiter=",", doublequote=True,
lineterminator="\r\n", quotechar='"', skipinitialspace=True)
</code></pre>
<p>CSVを辞書型で読み込めます。</p>
<h2 id="テンプレートはjinja2を採用"><a href="#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AFjinja2%E3%82%92%E6%8E%A1%E7%94%A8">テンプレートはjinja2を採用</a></h2>
<p>jinjya2(神社)というテンプレートがあったのでそちらを流用<br />
falskなど有名フレームワークでも採用されている。<br />
今更ながらFlaskで実装してもという後悔の念がありますが、車輪の再開発にも学びがあるはず。</p>
<p>layout.html</p>
<pre><code><!DOCTYPE html>
<html lang="ja">
<head>
<!-- 共通ヘッダ -->
{% block head %}
<link rel="stylesheet" href="style.css" />
<title>{% block title %}{% endblock %} - My Webpage</title>
{% endblock %}
</head>
<body>
<!-- コンテンツ部分 -->
<div id="content">
{% block content %}
{% endblock %}
</div>
<!-- 共通フッター -->
<div id="footer">
{% block footer %}
© Copyright 2008 by <a href="http://domain.invalid/">you</a>.
{% endblock %}
</div>
</body>
</html>
</code></pre>
<p>page.html</p>
<pre><code class="python">{# childe.tpl 子テンプレート #}
{% extends "/template/layouts.html" %} {# 親テンプレートを指定 #}
{% block title %}Index{% endblock %}
{% block head %}
<span>{</span><span>{</span> super() <span>}</span><span>}</span>
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}
{% set text='aaaa' %}
<h1><span>{</span><span>{</span> title <span>}</span><span>}</span></h1>
<p class="important">
Welcome to my awesome homepage.
</p>
{% endblock %}
</code></pre>
<p>page.htmlを読み込むとlayouts.htmlも読み込める</p>
<pre><code class="python">from jinja2 import Template, Environment, FileSystemLoader
for row in f:
template_path = "/template/page.html"
env = Environment(loader=FileSystemLoader('.'), trim_blocks=False)
template = env.get_template(template_path)
disp_text = template.render(row)
</code></pre>
<p>うん。これは便利</p>
<p>個別ページはこんな感じになった。</p>
<pre><code class="python">for row in f:
template_path = "/template/page.html"
env = Environment(loader=FileSystemLoader('.'), trim_blocks=False)
template = env.get_template(template_path)
disp_text = template.render(row)
dir_path=os.path.join('build',row['cat_lv01_slug'],row['cat_lv02_slug'])
filename=""+row['slug']+'.html'
#書き込み関数
write_page(dir_path, filename, disp_text)
</code></pre>
<p>次はカテゴリーページを実装してみる</p>
aocory
tag:crieit.net,2005:PublicArticle/15307
2019-08-08T08:22:23+09:00
2019-08-08T08:22:23+09:00
https://crieit.net/posts/Python-5d4b5d2f1e691
Pythonで作る俺俺静的サイトジェネレーター
<p>サイト作りたいけどmarkdown? ビジュアルエディタ?は使いたくない。<br />
できれば<strong>生CSVで作りたい。</strong><br />
そういう<strong>変態居ませんか?</strong><br />
居ませんね。<br />
なので、良いものがありません。<br />
pythonならflaskとか色々あるやん。。って思われがちですが<strong>SQLはお金がかかるし使いたくない。</strong><br />
ユーザーコミュニティ作るならまだしも、情報メインのAdSenseサイトを作るのにワードプレスはランニングコスト高すぎって思うんです。</p>
<p>どうせ、<strong>アクセスないし。ワードプレスなんてお金も無駄</strong></p>
<p>というわけで自分で作るしかないです。</p>
<p>折角なのでCrieitでネタにします。</p>
<h2 id="作りたいモノ"><a href="#%E4%BD%9C%E3%82%8A%E3%81%9F%E3%81%84%E3%83%A2%E3%83%8E">作りたいモノ</a></h2>
<p>csvファイル→htmlファイル</p>
<p>要件定義は非常に大切ですが、<strong>実際作ってみないと要件は分からない</strong><br />
ということで、炎上プロジェクトにありがちな要件定義無しでの開発をしていきたいと思います。</p>
<h2 id="ビルド周りを作る"><a href="#%E3%83%93%E3%83%AB%E3%83%89%E5%91%A8%E3%82%8A%E3%82%92%E4%BD%9C%E3%82%8B">ビルド周りを作る</a></h2>
<p>いきなりですが、とりあえず、ファイルを作るビルド周りから行っていきます。</p>
<pre><code class="python">import os
new_dir_path = "build"
new_filename = "index.html"
new_file_content = "hello world"
def build(dir_path, filename, content):
os.makedirs(dir_path, exist_ok=True)
with open(os.path.join(dir_path, filename), "w") as f:
f.write(content)
</code></pre>
<p>osを読み込んでbuildにindex.htmlを入れる要に設定しています。</p>
<h2 id="次は何しよう?"><a href="#%E6%AC%A1%E3%81%AF%E4%BD%95%E3%81%97%E3%82%88%E3%81%86%EF%BC%9F">次は何しよう?</a></h2>
<p>テンプレート実装してみよう</p>
<p>まだまだ続く</p>
aocory
tag:crieit.net,2005:PublicArticle/15208
2019-07-05T23:11:14+09:00
2019-07-05T23:11:14+09:00
https://crieit.net/posts/Flask-5d1f5a82636fa
Flaskで掲示板を作る
<h1 id="Flaskで掲示板を作る"><a href="#Flask%E3%81%A7%E6%8E%B2%E7%A4%BA%E6%9D%BF%E3%82%92%E4%BD%9C%E3%82%8B">Flaskで掲示板を作る</a></h1>
<h2 id="フォルダ構成"><a href="#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90">フォルダ構成</a></h2>
<p>フォルダ構成は以下のようになります。</p>
<pre><code class="python"><br />/flask/templates/index.html
layout.html
bbs_result.html
/test.py
</code></pre>
<h2 id="ライブラリ"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA">ライブラリ</a></h2>
<p>Flask==1.0.2<br />
Flask-SQLAlchemy==2.3.2<br />
Jinja2==2.10<br />
SQLAlchemy==1.2.15<br />
sqlite3</p>
<h3 id="SQLAlchemy"><a href="#SQLAlchemy">SQLAlchemy</a></h3>
<p>pythonのORMモジュールです。<br />
ORMはSQLをクラスとして扱えるようにしたものです<br />
使用する理由は、<br />
+ SQLインジェクション対策がサポートされる。<br />
+ クラスなので、SQLをオブジェクト指向で書ける。<br />
+ 引数に変数を入れるため、文字列の結合などが必要ないので短く書ける。</p>
<p>導入の注意点は、<br />
+ ちょっとしたSQLを実行する場合は、ORMを使わない方がコード量が短い。<br />
+ 英語の文献が多いので学習コストが必要。<br />
+ 慣れないうちはブラックボックスのコード。</p>
<p>SQLを操作しやすくする便利な奴くらいで覚えておきましょう。</p>
<h2 id="データベース構造"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0">データベース構造</a></h2>
<p>簡単にこれだけのデータを持たせることにします。</p>
<div class="table-responsive"><table>
<thead>
<tr>
<th>id</th>
<th>日付</th>
<th>名前</th>
<th>文章</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>date1</td>
<td>name1</td>
<td>text1</td>
</tr>
<tr>
<td>2</td>
<td>date2</td>
<td>name2</td>
<td>text2</td>
</tr>
</tbody>
</table></div>
<h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2>
<h3 id="test.py"><a href="#test.py">test.py</a></h3>
<pre><code class="python">from flask import Flask, request, render_template
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db_uri = 'sqlite:///test.db'
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
db = SQLAlchemy(app)
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
pub_date = db.Column(db.DateTime, nullable=False,
default=datetime.utcnow)
name = db.Column(db.Text())
article = db.Column(db.Text())
@app.route("/")
def bbs():
text = Article.query.all()
return render_template("index.html", lines=text)
@app.route("/result", methods=["POST"])
def result():
date = datetime.now()
article = request.form["article"]
name = request.form["name"]
admin = Article(pub_date=date, name=name, article=article)
db.session.add(admin)
db.session.commit()
return render_template("bbs_result.html", article=article, name=name, now=date)
if __name__ == "__main__":
app.run(debug=True)
</code></pre>
<h3 id="layout.html"><a href="#layout.html">layout.html</a></h3>
<pre><code class="html"><!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>BBS</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css">
<script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
</code></pre>
<h3 id="index.html"><a href="#index.html">index.html</a></h3>
<pre><code class="html">{% extends "layout.html" %}
{% block content %}
<section class="hero is-primary">
<div class="hero-body">
<div class="container">
<h1 class="title"> 掲示板</h1>
</div>
</div>
</section>
<div class="container">
<form action="/result" method="post">
<div class="field">
<label class="label">Name</label>
<div class="control">
<input class="input" type="text" placeholder="Text input" name="name">
</div>
</div>
<div class="field">
<label class="label">Message</label>
<div class="control">
<textarea class="textarea" name="article"></textarea>
</div>
</div>
<button class="button" type="submit">作る</button>
</form>
</div>
<div class="container">
<h2>投稿一覧</h2>
<ul>
{% for line in lines: %}
<li><span>{</span><span>{</span>line.name<span>}</span><span>}</span>
<span>{</span><span>{</span>line.article<span>}</span><span>}</span></li>
{% endfor %}
</ul>
{% endblock %}
</div>
</code></pre>
<h3 id="bbs_result.html"><a href="#bbs_result.html">bbs_result.html</a></h3>
<pre><code class="html">{% extends "layout.html" %}
{% block content %}
<h1>書き込みました</h1>
<br>
<p><span>{</span><span>{</span> now <span>}</span><span>}</span> <span>{</span><span>{</span> name <span>}</span><span>}</span> <span>{</span><span>{</span> article <span>}</span><span>}</span></p>
<form action="/" method="get">
<button type="submit">戻る</button>
</form>
{% endblock %}
</code></pre>
<p>この辺りはテンプレートの定義ですので<a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/flask/flask_template.html">Flaskでテンプレートを使うを参照</a></p>
<h2 id="データベースを作成"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90">データベースを作成</a></h2>
<pre><code class="python">class Article(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
pub_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
name = db.Column(db.Text())
article = db.Column(db.Text())
</code></pre>
<p>ここでデータを定義します。<br />
<code>db.Integer</code>、<code>db.Text()</code>など受け取るデータの型を定義しています。</p>
<pre><code class="python">db_uri = 'sqlite:///test.db'
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
db = SQLAlchemy(app)
</code></pre>
aocory
tag:crieit.net,2005:PublicArticle/15200
2019-07-04T08:45:36+09:00
2019-07-04T08:45:36+09:00
https://crieit.net/posts/Flask
Flaskでテンプレートを読み込む
<h1 id="Flaskでテンプレートを読み込む"><a href="#Flask%E3%81%A7%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80">Flaskでテンプレートを読み込む</a></h1>
<p>Flaskには標準でJinja2というテンプレートエンジンが付いています。<br />
templatesというフォルダを作り、そこに、htmlを置きます。</p>
<h2 id="フォルダ構成"><a href="#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90">フォルダ構成</a></h2>
<p>フォルダ構成は以下のようになります。</p>
<pre><code class="python">flask/run.py
/templates/layout.html
/hello.html
</code></pre>
<h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2>
<h3 id="layout.html"><a href="#layout.html">layout.html</a></h3>
<pre><code class="html"><!doctype html>
<html>
<head>
<title><span>{</span><span>{</span> title <span>}</span><span>}</span></title>
</head>
<body>
{% block content %}
<!-- ここにメインコンテンツを書く -->
{% endblock %}
</body>
</html>
</code></pre>
<h3 id="hello.html"><a href="#hello.html">hello.html</a></h3>
<pre><code class="html">{% extends "layout.html" %}
{% block content %}
<h3>Hello</h3>
こんにちは。<span>{</span><span>{</span> name <span>}</span><span>}</span>さん。
{% endblock %}
</code></pre>
<h3 id="run.py"><a href="#run.py">run.py</a></h3>
<pre><code class="python">from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def hello():
name = "Hoge"
return render_template('hello.html', title='flask test', name=name)
if __name__ == "__main__":
app.run(debug=True)
</code></pre>
<h2 id="コード解説"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E8%AA%AC">コード解説</a></h2>
<h3 id="layout.html"><a href="#layout.html">layout.html</a></h3>
<p>共通テンプレートです。<br />
フッターとかヘッダーとかをここに定義するといいと思います。</p>
<pre><code class="html">{% block content %}
<!-- ここにメインコンテンツを書く -->
{% endblock %}
</code></pre>
<p>通常のHTMLと異なる部分は上記部分のみです。<br />
<code>{% block content %}</code>と<code>{% endblock %}</code>部分にコンテンツをインポートします。</p>
<h3 id="hello.html"><a href="#hello.html">hello.html</a></h3>
<p>コンテンツ部分です。<br />
今回はこんにちは。<code><span>{</span><span>{</span> name <span>}</span><span>}</span></code>さん。と表示させます。</p>
<pre><code class="html">{% extends "layout.html" %}
{% block content %}
<h3>Hello</h3>
こんにちは。<span>{</span><span>{</span> name <span>}</span><span>}</span>さん。
{% endblock %}
</code></pre>
<p><code>{% extends "layout.html" %}</code>でlayout.htmlを継承しています。</p>
<h3 id="run.py"><a href="#run.py">run.py</a></h3>
<pre><code class="python">def hello():
name = "Hoge"
return render_template('hello.html', title='flask test', name=name)
</code></pre>
<p><code>return render_template('hello.html', title='flask test', name=name)</code>この部分でhello.htmlを呼び出しタイトルとnameの変数を渡しています。</p>
<p>他の部分の説明は<a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/flask/flask_hello.html">Flaskでhello world</a></p>
aocory
tag:crieit.net,2005:PublicArticle/15195
2019-07-03T17:31:24+09:00
2019-07-03T17:31:24+09:00
https://crieit.net/posts/Flask-Hello-World-Python
FlaskでHello Worldと表示させる|Pythonでなんか書く
<h1 id="FlaskでHello Worldと表示させる"><a href="#Flask%E3%81%A7Hello+World%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B">FlaskでHello Worldと表示させる</a></h1>
<h2 id="フォルダ構成"><a href="#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E6%88%90">フォルダ構成</a></h2>
<p>フォルダ構成は以下のようになります。</p>
<pre><code class="python"><br />/flask/run.py
</code></pre>
<h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2>
<pre><code class="python">from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<html><body><h1>Hello World</h1></body></html>'
if __name__ == '__main__':
app.run(debug=True)
</code></pre>
<h2 id="コード解説"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E8%AA%AC">コード解説</a></h2>
<h3 id="Flask読み込み"><a href="#Flask%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF">Flask読み込み</a></h3>
<p><code>from flask import Flask</code></p>
<h3 id="Flaskインスタンスの呼び出し"><a href="#Flask%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97">Flaskインスタンスの呼び出し</a></h3>
<p><code>app = flask.Flask(__name__)</code> という行は、 Flask クラスのインスタンスを作って、 <code>app</code> という変数に代入しています。</p>
<p>オブジェクトの属性にアクセスする場合は、 <code>.</code> という記号を使って、<br />
<code>オブジェクト名.要素名</code> のようにします。</p>
<p>クラスのインスタンスの場合はメソッドやメンバー変数が属性になりますが、 モジュールの場合はそのモジュールが持っているクラスや関数などが属性になります。</p>
<p>この場合、flaskモジュールが提供しているFlaskクラスを利用していることになります。</p>
<p><code>__name__</code> というのは、自動的に定義される変数で、現在のファイルのモジュール名が入ります。</p>
<p>ファイルをスクリプトとして直接実行した場合、 <code>__name__</code> は <code>__main__</code> になります。</p>
<h2 id="ルーティング"><a href="#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">ルーティング</a></h2>
<p><code>@app.route('/')</code>という行は、<code>app</code> に対して <code>/</code> というURLに対応するアクションを登録しています。</p>
<p><code>@</code>で始まる行はデコレータといって、その次の行で定義する関数やクラスに対して何らかの処理を行います。</p>
<p><code>@app.route('/')</code> は、次の行で定義される関数を指定した<code>URL</code>にマッピングするという処理を実行しています。</p>
<h2 id="index関数を定義"><a href="#index%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9">index関数を定義</a></h2>
<p><code>def index():</code> という行は、defという関数を定義しています。</p>
<h2 id="HTMLを返す"><a href="#HTML%E3%82%92%E8%BF%94%E3%81%99">HTMLを返す</a></h2>
<p><code>return '<html><body><h1>Hello World</h1></body></html>'</code> は、 'Hello, World!' という文字列を返しています。</p>
<p><code>app.run(debug=True)</code> という行は、Flaskが持っている開発用サーバーを、デバッグモードで実行しています。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/flask/">flask入門</a></p>
aocory
tag:crieit.net,2005:PublicArticle/15181
2019-07-01T10:40:49+09:00
2019-07-01T10:40:49+09:00
https://crieit.net/posts/for-Python
forを用いた組み合わせ|Pythonでなんか書く
<h1 id="forを用いた組み合わせ"><a href="#for%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B">forを用いた組み合わせ</a></h1>
<p>これはPythonプログラムで、3つの異なる数字を受け取り、その数字から可能なすべての組み合わせを出力します。</p>
<h2 id="問題の説明"><a href="#%E5%95%8F%E9%A1%8C%E3%81%AE%E8%AA%AC%E6%98%8E">問題の説明</a></h2>
<p>プログラムは3つの異なる数字を取り、その数字から可能なすべての組み合わせを出力します。</p>
<h2 id="考え方"><a href="#%E8%80%83%E3%81%88%E6%96%B9">考え方</a></h2>
<ol>
<li>1番目、2番目、3番目の数値を取り、別々の変数に格納します。</li>
<li>その後、3つの番号をすべてリストに追加します。</li>
<li>3つのforループを使用し、互いに等しいインデックスがない場合は、リスト内の数字を出力します。</li>
<li>終了します。</li>
</ol>
<h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2>
<p>以下はPythonプログラムのソース・コードで、3つの異なる数字を受け取り、その数字から可能なすべての組み合わせを出力します。プログラムの出力も以下に示します。</p>
<pre><code class="python">
a=int(input("Enter first number:"))
b=int(input("Enter second number:"))
c=int(input("Enter third number:"))
d=[]
d.append(a)
d.append(b)
d.append(c)
for i in range(0,3):
for j in range(0,3):
for k in range(0,3):
if(i!=j&j!=k&k!=i):
print(d[i],d[j],d[k])
</code></pre>
<h2 id="コードの解説"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A7%A3%E8%AA%AC">コードの解説</a></h2>
<ol>
<li>ユーザーは1番目、2番目、3番目の番号を入力する必要があります。</li>
<li>比較しやすいように、すべての要素がリストに追加されます。</li>
<li>forループの範囲は0~2で、基本的にはリスト内の3つの要素のインデックスです。</li>
<li>すべての索引が互いに等しくない場合は、リスト内の特定のエレメントに関連付けられたエレメントが印刷されます。</li>
</ol>
<h2 id="出力例"><a href="#%E5%87%BA%E5%8A%9B%E4%BE%8B">出力例</a></h2>
<pre><code class="python">Case 1:
Enter first number:1
Enter second number:2
Enter third number:3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
</code></pre>
<p>Case 2:</p>
<pre><code class="python">Enter first number:5
Enter second number:7
Enter third number:3
5 7 3
5 3 7
7 5 3
7 3 5
3 5 7
3 7 5
</code></pre>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<p><a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/list/list_append.html">append()</a><br />
<a target="_blank" rel="nofollow noopener" href="https://oneminutepython.com/keywords/keyword_for.html">for</a></p>
aocory
tag:crieit.net,2005:PublicArticle/15105
2019-06-14T07:56:24+09:00
2019-06-14T07:56:24+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-123C-Python
# AtCoder Beginner Contest 123CをPythonで解く
<h1 id="Five Transportations"><a href="#Five+Transportations">Five Transportations</a></h1>
<ol>
<li><a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc123/tasks/abc123_c">Five Transportations</a></li>
</ol>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<blockquote>
<p>AtCoder社は成長し、2028 年になってついに6つの都市 (都市1,2,3,4,5,6) からなる AtCoder 帝国を作りました!<br />
AtCoder帝国には5つの交通機関があります。<br />
電車:都市1から2まで1分で移動する。1つの電車にはA人まで乗ることができる。<br />
バス:都市2から3まで1分で移動する。1つのバスには B人まで乗ることができる。<br />
タクシー:都市3から4まで1分で移動する。1つのタクシーにはC人まで乗ることができる。<br />
飛行機:都市4から5まで1分で移動する。1つの飛行機にはD人まで乗ることができる。<br />
船:都市5から6までを1分で移動する。1つの船にはE人まで乗ることができる。<br />
それぞれの交通機関は、各整数時刻 (0,1,2,3,...) に、都市から出発します。<br />
いま、N人のグループが都市1におり、全員都市6まで移動したいです。全員が都市<br />
6に到着するまでに最短で何分かかるでしょうか?<br />
なお、乗り継ぎにかかる時間を考える必要はありません。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li>詰まるポイントのA1>A2はA1/A2の切り上げ分時間がかかる。</li>
<li>Forループでそれぞれの時間を計算して追加する。</li>
</ul>
<blockquote>
<p>🐍これでいけんちゃうかな?入力のところは改善できるはず。</p>
</blockquote>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">import math
L=[int(input()) for i in range(6)]
Step=0
min=L[0]
for i in range(5):
if min > L[i+1]:
Step=Step+math.ceil(min/L[i+1])
min=L[i+1]
else:
Step=Step+1
print(Step)
</code></pre>
<blockquote>
<p>🐍これならループも5回やしTLEにはならへんやろ。。</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>WA!!</p>
<blockquote>
<p>🐍WA!!</p>
</blockquote>
<h2 id="解説読む"><a href="#%E8%A7%A3%E8%AA%AC%E8%AA%AD%E3%82%80">解説読む</a></h2>
<blockquote>
<p>最も通りにくい、つまり容量が最も小さい交通機関を考えます。直感的には、最短時間で移動する場合でも、1 分でたどり着けるのは 𝑋 人 (交通機関の容量の最小を 𝑋 とする) になります。これは、「1秒に 15 L のペースで水を送れるポンプと、1 秒に 12 L のペースで水を送れるポンプをつなげたときに、1 秒に送れる水の量は小さい方を取って 12 L」 になるのと同じ原理です。つまり、先ほどの貪欲的な方法ではなくて、1 分に 𝑋 人ずつ 1 つ先に進めてやっても、直感的には<br />
かかる時間は変わらなさそうです。また、移動時間は 「(𝑁 ÷ 𝑋 を切り上げた値) + 4 分」 と、簡単に計算できるようになります。</p>
<p>🐍WA!!</p>
</blockquote>
<h2 id="解説を読んで実装したコード"><a href="#%E8%A7%A3%E8%AA%AC%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">解説を読んで実装したコード</a></h2>
<pre><code class="python">import math
N=int(input())
L=[int(input()) for i in range(5)]
m=math.ceil(N/min(L))
print(m+4)
</code></pre>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC!!</p>
<blockquote>
<p>🐍でけたで!</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15102
2019-06-13T08:22:34+09:00
2019-06-13T08:22:34+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-063b-Python
AtCoder Beginner Contest 063bをPythonで解く
<h1 id="AtCoder Beginner Contest 063bをPythonで解く"><a href="#AtCoder+Beginner+Contest+063b%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 063bをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc073/tasks/abc063_b">AtCoder Beginner Contest 063b</a>を解いていきたいと思います。</p>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<blockquote>
<p>英小文字からなる文字列Sが与えられます。Sに含まれる文字がすべて異なるか判定してください。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li><code>set()</code>に変換し長さを取得</li>
<li><code>len(S)</code>と<code>set(len(S))</code>を比較し同じであればYes、そうでなければNo</li>
</ul>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">S=input()
if len(set(S))==len(S):
print("yes")
else:
print("no")
</code></pre>
<blockquote>
<p>🐍これでいけんちゃうかな?</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC!!</p>
<blockquote>
<p>🐍おし!</p>
</blockquote>
<h2 id="勉強になったコード"><a href="#%E5%8B%89%E5%BC%B7%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">勉強になったコード</a></h2>
<pre><code class="python"><br />a=input();print(['no','yes'][len(a)==len(set(a))])
</code></pre>
<blockquote>
<p>🐍<code>print([][])</code>みたいなので条件かけるんや</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15101
2019-06-13T08:03:00+09:00
2019-06-13T08:03:00+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-122c-Python
AtCoder Beginner Contest 122cをPythonで解く
<h1 id="GeT AC"><a href="#GeT+AC">GeT AC</a></h1>
<ol>
<li><a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc122/tasks/abc122_c">GeT AC</a></li>
</ol>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<blockquote>
<p>A, C, G, T からなる長さNの文字列 Sが与えられます。以下の Q個の問いに答えてください。問 i (1≤i≤Q): 整数 li,ri (1≤li<br />
Sの先頭から li 文字目から ri 文字目までの (両端含む) 部分文字列を考える。この文字列に AC は部分文字列として何回現れるか。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li><code>count</code>でACの数を計算して出力する。</li>
</ul>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">N,Q=map(int,input().split())
S=input()
for q in range(Q):
l,r=map(int,input().split())
s=S[l-1:r]
print(s.count("AC"))
</code></pre>
<blockquote>
<p>🐍これでいけんちゃうかな?</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>TLE</p>
<blockquote>
<p>🐍計算量の問題か</p>
</blockquote>
<h2 id="Atcoderの標準回答"><a href="#Atcoder%E3%81%AE%E6%A8%99%E6%BA%96%E5%9B%9E%E7%AD%94">Atcoderの標準回答</a></h2>
<pre><code class="python">N,Q=map(int,input().split())
S=input()
t = [0] * (N + 1)
for i in range(N):
t[i + 1] = t[i] + (1 if S[i : i + 2] == 'AC' else 0)
for q in range(Q):
l,r=map(int,input().split())
print(t[r-1] - t[l-1])
</code></pre>
<blockquote>
<p>🐍ACのカウントの配列をつくるんやな。</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC</p>
<blockquote>
<p>🐍文字列検索って結構時間喰うねんな。。</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15097
2019-06-12T11:27:17+09:00
2019-06-12T11:27:17+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-129D-Python
AtCoder Beginner Contest 129DをPythonで解く
<h1 id="AtCoder Beginner Contest 129DをPythonで解く"><a href="#AtCoder+Beginner+Contest+129D%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 129DをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc129/tasks/abc129_d">AtCoder Beginner Contest 129D</a><br />
を解いていきたいと思います。</p>
<h2 id="問題文"><a href="#%E5%95%8F%E9%A1%8C%E6%96%87">問題文</a></h2>
<blockquote>
<p>縦H行横W列のグリッドが与えられます。このグリッドのうち、いくつかのマスには障害物が存在します。すぬけ君は、障害物のないマスのうち一つを選び、そのマスに明かりを設置しようとしています。 設置されたマスから、上下左右の四方向にまっすぐに光線が伸びます。それぞれの方向について、最初に障害物が存在するマスにぶつかる、もしくはグリッドの端にぶつかる手前のマスまで照らされます。明かりを設置したマスも照らされますが、障害物が存在するマスは照らされません。<br />
すぬけ君は明かりによって照らされるマスの個数を最大化したいです。<br />
H個の長さWの文字列 Si(1≤i≤H)が与えられます。Siの j文字目 (1≤j≤W) が # のとき、グリッドの上からi行目で左からj列目のマスには障害物があり、 . のときは障害物がありません。<br />
照らされるマスの個数の最大値を求めてください。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li>numpyを使う</li>
<li>二次元配列に<code>[h,w]</code>を入力する空の配列を作る。</li>
<li>マス目毎に上、下、右、左を確認するコードを作成し、h,wに格納する。</li>
<li><code>max()</code>で出力</li>
</ul>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">L=[list(input() )for i in range(H)]
L = np.array(L)
print(L)
M=[]
for h in range(H):
for w in range(W):
if L[h][w]=="#":
M.append([0,0])
else:
R=1
for r in range(W-w-1):
if L[h][w+r+1]==".":
R=R+1
else:
break
for r in range(w-1):
if L[h][w-r-1]=="." and w-r-1>=0:
R=R+1
else:
break
M.append(R)
print(M)
</code></pre>
<blockquote>
<p>🐍ここまで書いたけど知識不足で書けない。。</p>
</blockquote>
<h2 id="コードを読んでみる"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B">コードを読んでみる</a></h2>
<pre><code class="python">from numpy import*
h,*s=open(0)
h,w=int64(h.split())
r=range
s=array([list(t[:-1])for t in s])
a,b,c,d=eval('zeros((h,w),"i"),'*4)
for i in r(w):
a[:,i]=-~a[:,i-1]*(s[:,i]>'#')
b[:,~i]=-~b[:,-i]*(s[:,~i]>'#')
for i in r(h):
c[i,:]=-~c[i-1,:]*(s[i,:]>'#')
d[~i,:]=-~d[-i,:]*(s[~i,:]>'#')
print(int((a+b+c+d).max())-3)
</code></pre>
<h3 id="3行目まで"><a href="#3%E8%A1%8C%E7%9B%AE%E3%81%BE%E3%81%A7">3行目まで</a></h3>
<pre><code class="python">h,*s=open(0)
print(h)
print(s)
h,w=int64(h.split())
print(h)
print(w)
</code></pre>
<blockquote>
<p>🐍とりあえず出力確認や</p>
</blockquote>
<pre><code class="python">4 6
['#..#..\n', '.....#\n', '....#.\n', '#.#...']
4
6
</code></pre>
<blockquote>
<p>🐍なるほど</p>
</blockquote>
<pre><code class="python">r=range
</code></pre>
<blockquote>
<p>🐍なるほど後で<code>for i in range()</code>が何度か出てくるからここで定義してるねんな。</p>
</blockquote>
<pre><code class="python">s=array([list(t[:-1])for t in s])
</code></pre>
<blockquote>
<p>🐍numpyのarrayに変換してるねんな。なんで<code>[list(t[:-1])</code>なんやろ?</p>
</blockquote>
<pre><code class="python">[['#', '.', '.', '#', '.', '.'] ['.', '.', '.', '.', '.', '#']
['.', '.', '.', '.', '#', '.'] ['#', '.', '#', '.', '.']]
['#..#..\n' '.....#\n' '....#.\n' '#.#...']
</code></pre>
<blockquote>
<p>🐍1次元配列なるし、改行も含まれてまうねんな。</p>
</blockquote>
<pre><code class="python">a,b,c,d=eval('zeros((h,w),"i"),'*4)
</code></pre>
<blockquote>
<p>🐍 eval は第1引数を式として評価してるから<code>'zeros((h,w),"i"),'</code>までが今回は引数。zerosは、0で初期化されたndarrayを生成する関数やな。abcdで4つ生成してるねんな。</p>
</blockquote>
<pre><code class="python">for i in r(w):
a[:,i]=-~a[:,i-1]*(s[:,i]>'#')
b[:,~i]=-~b[:,-i]*(s[:,~i]>'#')
</code></pre>
<pre><code>Traceback (most recent call last):
File "./Main.py", line 8, in <module>
a[:,i]=-~a[:,i-1]*(s[:,i]>'#')
IndexError: too many indices
</code></pre>
<blockquote>
<p>🐍 ACしてるのにエラーでるな。このコードの読コードはここまでや。</p>
</blockquote>
<h3 id="参考にしたコード"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">参考にしたコード</a></h3>
<pre><code class="python">import numpy as np
H,W=map(int,input().split())
S=[list(input()) for h in range(H)]
S=[[1 if s=='.' else 0 for s in S[h]] for h in range(H)]
S=np.array(S)
L=S.copy()
R=S.copy()
U=S.copy()
D=S.copy()
for w in range(1,W):
L[:,w]=(L[:,w-1]+1)*S[:,w]
R[:,-(1+w)]=(R[:,-w]+1)*S[:,-(1+w)]
for h in range(1,H):
U[h,:]=(U[h-1,:]+1)*S[h,:]
D[-(1+h),:]=(D[-h,:]+1)*S[-(1+h),:]
print(int((L+R+U+D).max())-3)
</code></pre>
<pre><code class="python">S=[[1 if s=='.' else 0 for s in S[h]] for h in range(H)]
[[0, 1, 1, 0, 1, 1], [1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 0, 1], [0, 1, 0, 1, 1, 1]]
</code></pre>
<blockquote>
<p>🐍 ここは文字列を0と1に置き換えてるんやな。</p>
</blockquote>
<pre><code class="python">L[:,w]=(L[:,w-1]+1)*S[:,w]
</code></pre>
<blockquote>
<p>🐍 <code>,</code>ってなんや外したろ</p>
</blockquote>
<pre><code class="python">Traceback (most recent call last):
File "./Main.py", line 12, in <module>
L[:w]=(L[:w-1]+1)*S[:w]
ValueError: could not broadcast input array from shape (0,6) into shape (1,6)
</code></pre>
<blockquote>
<p>🐍多次元の場合は、カンマ(,)で区切ってそれぞれを指定せなあかんねんな。</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15096
2019-06-12T08:28:48+09:00
2019-06-12T08:28:48+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-090B-Python
AtCoder Beginner Contest 090BをPythonで解く
<h1 id="AtCoder Beginner Contest 090BをPythonで解く"><a href="#AtCoder+Beginner+Contest+090B%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 090BをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc073/tasks/abc090_b">AtCoder Beginner Contest 090B</a>を解いていきたいと思います。</p>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<blockquote>
<p>A以上B以下の整数のうち、回文数となるものの個数を求めてください。 ただし、回文数とは、先頭に0をつけない10進表記を文字列として見たとき、前から読んでも後ろから読んでも同じ文字列となるような正の整数のことを指します。</p>
</blockquote>
<h2 id="考え方"><a href="#%E8%80%83%E3%81%88%E6%96%B9">考え方</a></h2>
<ul>
<li>文字列で入力をうけて</li>
<li>[-1::-1]で逆の文字列を作成</li>
<li><code>if</code>文で逆の文字列と入力の文字列が同じならカウントを1追加</li>
</ul>
<h2 id="実際書いたコード"><a href="#%E5%AE%9F%E9%9A%9B%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">実際書いたコード</a></h2>
<pre><code class="python">A,B=map(int,input().split())
n=0
for i in range(A,B):
C=(str(i)[-1::-1])
if int(C)==i:
n=n+1
print(n)
</code></pre>
<blockquote>
<p>🐍これでいけそう</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>WA</p>
<blockquote>
<p>🐍あっ、rangeは<code>B+1</code>にしなあかん。</p>
</blockquote>
<h2 id="修正したコード"><a href="#%E4%BF%AE%E6%AD%A3%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">修正したコード</a></h2>
<pre><code class="python">A,B=map(int,input().split())
n=0
for i in range(A,B+1):
C=(str(i)[-1::-1])
if int(C)==i:
n=n+1
print(n)
</code></pre>
<blockquote>
<p>🐍これでいけそう</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC</p>
<blockquote>
<p>🐍ケアレスミスや</p>
</blockquote>
<h2 id="勉強になったコード"><a href="#%E5%8B%89%E5%BC%B7%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">勉強になったコード</a></h2>
<pre><code class="python">a,b=map(int,input().split())
print(len([i for i in map(str,range(a,b+1)) if i==i[::-1]]))
</code></pre>
<blockquote>
<p>🐍 <code>map(str,)</code>を<code>range</code>につかえるんや。</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15095
2019-06-12T07:53:01+09:00
2019-06-12T07:53:01+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-044A-Python
AtCoder Beginner Contest 044AをPythonで解く
<h1 id="AtCoder Beginner Contest 044AをPythonで解く"><a href="#AtCoder+Beginner+Contest+044A%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 044AをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc073/tasks/abc044_a">AtCoder Beginner Contest 044A</a>を解いていきたいと思います。</p>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<blockquote>
<p>1軒のホテルがあります。 このホテルの宿泊費は、次のようになっています。<br />
最初のK泊までは、1泊あたり X円K+1泊目以降は、1泊あたり Y円高橋君は、このホテルにN泊連続で宿泊することにしました。 高橋君の宿泊費は合計で何円になるか求めてください。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li><code>N<=K</code>で<code>if</code>分岐させて出力を分ける。</li>
<li><code>if N<=K:</code>は<code>print(X*N)</code></li>
<li><code>else:</code>は<code>print(X*K+Y*(N-K))</code></li>
</ul>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">N=int(input())
K=int(input())
X=int(input())
Y=int(input())
if N<=K:
print(X*N)
else:
print(X*K+Y*(N-K))
</code></pre>
<blockquote>
<p>🐍これでいけんちゃうかな?入力のところは改善できるはず。</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC!!</p>
<blockquote>
<p>🐍おし!</p>
</blockquote>
<h2 id="入力を改善したコード"><a href="#%E5%85%A5%E5%8A%9B%E3%82%92%E6%94%B9%E5%96%84%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">入力を改善したコード</a></h2>
<pre><code class="python">n,k,x,y=[int(input()) for i in [0]*4]
print(n*x-(x-y)*max([n-k,0]))
</code></pre>
<blockquote>
<p>🐍リスト内包表記便利や</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15091
2019-06-11T14:00:20+09:00
2019-06-11T14:00:20+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-087C-Python
AtCoder Beginner Contest 087CをPythonで解く
<h1 id="AtCoder Beginner Contest 087CをPythonで解く"><a href="#AtCoder+Beginner+Contest+087C%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 087CをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc073/tasks/abc087_c">AtCoder Beginner Contest 087C</a>を解いていきたいと思います。</p>
<h2 id=" 問題"><a href="#%E3%80%80%E5%95%8F%E9%A1%8C"> 問題</a></h2>
<blockquote>
<p>2×Nのマス目があります。上からi行目、左からj列目 (1≤i≤2, 1≤j≤N) のマスをマス(i,j)と表すことにします。あなたははじめ、左上のマス(1,1)にいます。<br />
あなたは、右方向または下方向への移動を繰り返し、右下のマス(2,N)に移動しようとしています。マス(i,j)にはAi,j個のアメが置かれています。<br />
あなたは移動中に通ったマスに置いてあるアメをすべて回収します。 左上および右下のマスにもアメが置かれており、あなたはこれらのマスに置かれているアメも回収します。<br />
移動方法をうまく選んだとき、最大で何個のアメを回収できるでしょうか。</p>
</blockquote>
<h2 id="こう考えた。"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F%E3%80%82">こう考えた。</a></h2>
<ul>
<li>入力を<code>N,L1,L2"</code>でそれぞれ受ける。</li>
<li><code>for</code>で全組み合わせを列挙し回答の配列に格納する。</li>
<li><code>print</code>で表示する。</li>
</ul>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">N=int(input())
L1=list(map(int,input().split()))
L2=list(map(int,input().split()))
C=[]
for n in range(N):
C.append(sum(L1[:n+1])+sum(L2[n:]))
print(max(C))
</code></pre>
<blockquote>
<p>🐍これでいけんちゃうかな?</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC!!</p>
<blockquote>
<p>🐍おし!</p>
</blockquote>
<h2 id="勉強になったコード"><a href="#%E5%8B%89%E5%BC%B7%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">勉強になったコード</a></h2>
<pre><code class="python">n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
print(max(sum(a[:i+1])+sum(b[i:]) for i in range(n)))
</code></pre>
<blockquote>
<p>🐍リスト内に<code>for</code>かけるんや。</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15089
2019-06-11T08:13:15+09:00
2019-06-11T08:13:15+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-088B-Python
AtCoder Beginner Contest 088BをPythonで解く
<h1 id="AtCoder Beginner Contest 088BをPythonで解く"><a href="#AtCoder+Beginner+Contest+088B%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 088BをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc073/tasks/abc088_b">AtCoder Beginner Contest 088B</a>を解いていきたいと思います。</p>
<h2 id="問題文"><a href="#%E5%95%8F%E9%A1%8C%E6%96%87">問題文</a></h2>
<blockquote>
<p>N枚のカードがあります. i枚目のカードには, aiという数が書かれています.<br />
Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります.<br />
2 人がすべてのカードを取ったときゲームは終了し, 取ったカードの数の合計がその人の得点になります. 2 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください.</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li>リストで標準入力を取得</li>
<li>ターンを<code>%2</code>表現してAliceとBobの番を表現</li>
<li><code>(max)</code>を使い最大値を取得しAliceまたはBobに加算</li>
<li><code>remove</code>を用いて配列から最大値を除去</li>
</ul>
<h2 id="実際書いたコード"><a href="#%E5%AE%9F%E9%9A%9B%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">実際書いたコード</a></h2>
<pre><code class="python">N=int(input())
A=list(map(int,input().split()))
Alice=0
Bob=0
n=1
while n<=N:
if n%2==1:
Alice=Alice+max(A)
A.remove(max(A))
n=n+1
else:
Bob=Bob+max(A)
A.remove(max(A))
n=n+1
print(Alice-Bob)
</code></pre>
<blockquote>
<p>🐍やや冗長やけど書くとこんな感じになった。</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC!</p>
<blockquote>
<p>🐍やったで。</p>
</blockquote>
<h2 id="勉強になったコード"><a href="#%E5%8B%89%E5%BC%B7%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">勉強になったコード</a></h2>
<pre><code class="python">N = int(input())
a = sorted(list(map(int, input().split())), reverse=True)
alice = sum(a[0::2])
bob = sum(a[1::2])
print(abs(alice - bob))
</code></pre>
<blockquote>
<p>🐍 <code>reverse=True</code>で配列を逆にして、リストの<code>step</code>を<code>2</code>にして<code>sum()</code>で合計値を出しているんやな。</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15088
2019-06-11T08:03:29+09:00
2019-06-11T08:03:29+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-095C-Python
AtCoder Beginner Contest 095CをPythonで解く
<h1 id="AtCoder Beginner Contest 095CをPythonで解く"><a href="#AtCoder+Beginner+Contest+095C%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 095CをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc073/tasks/abc095_c">AtCoder Beginner Contest 095C</a>を解いていきたいと思います。</p>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<p>ファーストフードチェーン「ピザアット」のメニューは「Aピザ」「Bピザ」「ABピザ」の3種類です。AピザとBピザはまったく異なるピザで、これらをそれぞれ半分に切って組み合わせたものがABピザです。AピザBピザ、ABピザ1枚あたりの値段はそれぞれA円、B円、C円です。</p>
<p>中橋くんは、今夜のパーティーのためにAピザX枚とBピザY枚を用意する必要があります。これらのピザを入手する方法は、AピザやBピザを直接買うかABピザ2枚を買ってAピザ1枚とBピザ1枚に組み替える以外にはありません。このためには最小で何円が必要でしょうか?なお、ピザの組み替えにより、必要な量を超えたピザが発生しても構いません。</p>
<h2 id="考えたこと"><a href="#%E8%80%83%E3%81%88%E3%81%9F%E3%81%93%E3%81%A8">考えたこと</a></h2>
<ul>
<li>Cピザが、AピザとBピザの値段両方より高ければ<code>A*X+B*Y</code>が最安値。</li>
<li>Cピザが、AピザとBピザの両ピザより安ければ<code>C*max(X,Y)*2</code>が最安値。</li>
<li>Cピザが、AピザかBピザどちらかの1つのピザより安く、かつ安いピザが枚数の多い方ならば<code>C*min(X,Y)*2+min(A,B)*abs(X-Y))</code></li>
<li>Cピザが、AピザかBピザどちらかの1つのピザより安く、かつ高いピザが枚数の多い方ならば<code>C*max(X,Y)*2</code></li>
</ul>
<blockquote>
<p>🐍これでいけそう。</p>
</blockquote>
<h2 id="実装したコード"><a href="#%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">実装したコード</a></h2>
<pre><code class="python">A,B,C,X,Y=map(int,input().split())
print(min(A*X+B*Y,C*max(X,Y)*2,C*min(X,Y)*2+min(A,B)*abs(X-Y)))
</code></pre>
<blockquote>
<p>🐍C問題が2行で書けたのは少し嬉しい。</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>WA</p>
<blockquote>
<p>🐍なんでや!</p>
</blockquote>
<h2 id="正解のコード"><a href="#%E6%AD%A3%E8%A7%A3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89">正解のコード</a></h2>
<pre><code class="python">A,B,C,X,Y = map(int,input().split())
print(min(X*A+Y*B,X*2*C+B*max(0,Y-X),Y*2*C+A*max(0,X-Y)))
</code></pre>
<blockquote>
<p>🐍 <code>X*2*C+B*max(0,Y-X)</code>と<code>Y*2*C+A*max(0,X-Y)</code>で分岐しているねんな。</p>
</blockquote>
<h2 id="ifで書くとややこしい"><a href="#if%E3%81%A7%E6%9B%B8%E3%81%8F%E3%81%A8%E3%82%84%E3%82%84%E3%81%93%E3%81%97%E3%81%84">ifで書くとややこしい</a></h2>
<pre><code class="python">a, b, c, x, y = [int(i) for i in input().split()]
if c < a/2 and c < b/2:
cost = max(x, y)*2*c
elif c < a/2:
if x < y:
cost = x*2*c + (y-x)*b
else:
cost = x*2*c
elif c < b/2:
if y < x:
cost = y*2*c + (x-y)*a
else:
cost = y*2*c
elif c < (a+b)/2:
cost = min(x, y)*2*c+(x-min(x,y))*a + (y-min(x,y))*b
else:
cost = x*a+y*b
print(cost)
</code></pre>
<blockquote>
<p>🐍 あかん。書いてて頭破裂しそうになった。</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15084
2019-06-10T13:04:01+09:00
2019-06-10T13:04:01+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-073C-Python
AtCoder Beginner Contest 073CをPythonで解く
<h1 id="AtCoder Beginner Contest 073CをPythonで解く"><a href="#AtCoder+Beginner+Contest+073C%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 073CをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc073/tasks/abc073_c">AtCoder Beginner Contest 073C</a>を解いていきたいと思います。</p>
<h2 id="問題文"><a href="#%E5%95%8F%E9%A1%8C%E6%96%87">問題文</a></h2>
<blockquote>
<p>あなたは、joisinoお姉ちゃんと以下のようなゲームをしています。<br />
最初、何も書いていない紙がある。<br />
joisinoお姉ちゃんが一つの数字を言うので、その数字が紙に書いてあれば紙からその数字を消し、書いていなければその数字を紙に書く。これをN回繰り返す。<br />
その後、紙に書かれている数字がいくつあるかを答える。<br />
joisinoお姉ちゃんが言った数字が、言った順番に A1,...,AN として与えられるので、ゲーム終了後に紙に書かれている数字がいくつあるか答えてください。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li>空の配列<code>L</code>を作成</li>
<li><code>for</code>で配列Lに要素が無ければ<code>append</code></li>
<li><code>for</code>で配列Lに要素があれば<code>remove</code></li>
<li><code>len(L)</code>で答えを出力</li>
</ul>
<blockquote>
<p>🐍<code>for</code>1つしか使ってないイケてるコードが書けそうや</p>
</blockquote>
<h2 id="実際書いたコード"><a href="#%E5%AE%9F%E9%9A%9B%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">実際書いたコード</a></h2>
<pre><code class="python">N=int(input())
L=[]
for i in range(N):
A=int(input())
if A in L:
L.remove(A)
else:
L.append(A)
print(len(L))
</code></pre>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>TLE</p>
<blockquote>
<p>🐍<code>for</code>1つしか使ってないのになんでや!</p>
</blockquote>
<h2 id="解説を元に考え直す。"><a href="#%E8%A7%A3%E8%AA%AC%E3%82%92%E5%85%83%E3%81%AB%E8%80%83%E3%81%88%E7%9B%B4%E3%81%99%E3%80%82">解説を元に考え直す。</a></h2>
<p>Aをソートすると、同じ数が隣り合うように並べ替えられる。</p>
<p>これを左か順にみていくと、奇数回登場する数が何種類あるかを数えることができる。</p>
<blockquote>
<p>🐍実装してみよ。</p>
</blockquote>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">N=int(input())
L=[]
for i in range(N):
L.append(int(input()))
ans=0
for i in set(L):
if L.count(i)%2==1:
ans=ans+1
print(ans)
</code></pre>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>TLE</p>
<blockquote>
<p>🐍まじかよ。。</p>
</blockquote>
<h2 id="ListからSetに変えてみる"><a href="#List%E3%81%8B%E3%82%89Set%E3%81%AB%E5%A4%89%E3%81%88%E3%81%A6%E3%81%BF%E3%82%8B">ListからSetに変えてみる</a></h2>
<blockquote>
<p>🐍<code>set</code>早いってまじかよ。。</p>
</blockquote>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">n = int(input())
s = set()
for i in range(n):
a = input()
if a in s:
s.remove(a)
else:
s.add(a)
print(len(s))
</code></pre>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC</p>
<blockquote>
<p>🐍まじかよ。。</p>
<p>🐍<code>set()</code>は<code>List()</code>より早い。覚えた。</p>
</blockquote>
aocory