綾log(x^b)

毎日眠たい

カロリーメイト5種類食べ比べ

 こんにちは。カロリーメイトという食べ物をご存じでしょうか?私はあまり食べたことはありませんが、若者に人気のバランス栄養食らしいです。1本20gで100kcalと計算が容易で栄養成分表示に色々な栄養が書いてあります。ビタミンがたくさん書いてあると健康食という感じがしますね(違いは分かりませんが)。

 数日前、買い出しに行ったとき、カロリーメイトが4本入り120円程度と安かったので全種類コンプリートしてみました。プレーン味、チョコレート味、チーズ味、フルーツ味、メープル味の5種類です。栄養面は5種類とも大きな違いはなく、例えばタンパク質は最も多いチョコレート味で8.7g、最も少ないプレーン味は8.0gです。1箱4本で1日に必要なビタミンの半分が含まれているらしいです。凄いですね。

 前置きが長くなりましたが食べ比べをしたので感想を列挙します。

〈プレーン味〉
 クッキーとスコーンの間のような食感でしっとりとしていて美味しかったです。特に癖もなくサクサクいけました。シンプルで良いと思います。

〈チョコレート味〉
 チョコというほど強い主張を感じませんが、生地にチョコが練り込んであるチョコパンのような味がしました。やはりチョコ味は良いですね。美味しかったです。

〈チーズ味〉
 すぐにチーズと分かる強い味ではありませんが、噛んだ瞬間に拡がる良い香りはチーズ独特のものを感じました。最初に発売された味だけあって普通に美味しかったです。

〈フルーツ味〉
 どこかで嗅いだことのある懐かしい匂いと、甘味の中にやや酸味と苦味を感じました。原材料にレモンピール加工品とグレープフルーツパウダーとあるので柑橘の類いでしょう。食べる前は抵抗がありましたが思ったより美味しかったです。

〈メープル味〉
 他の味は見たことあるのですが、メープル味は今回初めて見ました。メープルの甘さがしっとりかつサクッとした食感と相まって、噛んだ瞬間、良い匂いが口に目一杯拡がっていきました。蜂蜜をかけたホットケーキのような風味でした。美味しかったです。

 以上です。全部美味しいとしか言っていませんが、個人的にはチョコレート味とチーズ味を特に気に入りました。保存しやすい形なので保存食として家に常備するのもありだと思います。下手な食レポですが最後まで読んでくださりありがとうございました。終わり。

私がAtCoderで茶色になれない理由

 これは適当な態度で競技プログラミングに取り組んでいる私の雑記です。真面目に取り組んでいる人にとっては腹が立つような内容だと思います。お目汚しになりますが、反面教師程度に読んでください。

 私が競プロを始めたのは去年の5月です。大学でPythonが必要となり、プログラミングの勉強を始めたことを切っ掛けに始めました。私は情報学専攻でありながらITに疎く、コンピュータやプログラミングに対して強い苦手意識がありました。競プロを始めて8ヶ月が経ち未だに灰色で茶色にすらなっていません。今回は反省を兼ねて、私の競プロへの態度を書いていこうと思います。

 5月、AtCoderに登録しました。コンテストって何?どうやってプログラムを提出するの?そもそもプログラムってどうやって書くの?等と不安ばかりで中々登録できませんでした。意を決して登録し終えたら、まず最初にビギナー10問を解きました。入出力に戸惑い、ネットで調べたり他人のコードを読んで混乱していました。初めて参加したコンテストがAGCなこともあり、競プロって難しいなぁという印象を受けました。ABCも精々1完2完程度でした。TLEになることが多く、このとき初めて計算量の概念を知りました。6月以降はABCは3完が安定し、D問題もあと少しで解けそうというレベルになりました。今は1月ですが、未だにD問題以上を本番で解けたことはありません。

 競プロへの取り組みですが、そもそも普段から勉強をしていません。コンテストがあれば取り合えず参加して終わったら見直しをせず放置、その繰り返して一切勉強をしていませんでした。たまに勉強してみても、他人のコードは調べても理解できないことが多く、疲れてやる気が削がれていきました。また、テストケースは通るのに提出すると1,2個だけ通らないということが多かったです。自分の書いたコードの何を直せば良いのか考えても分かりませんでした。他人のコードを見ても書き方が異なっていて、結局一部分だけでなく全部書き直すことが多かったです。せっかく頑張って書いたのに全部書き直すことが多くて、自分で考えて書くことを無駄に感じるようになりました。元から苦手意識があったことに加え、自信のなさからもプログラミングに対して強い苦手意識を強く持つようになりました。こういう面倒くさがりで目先の成功を欲しがる性格や理解力のなさ自体、プログラミングに向いていないのかもしれません。面倒に思って勉強せず、出来ない状態が続くとやる気を失って面倒になるという悪循環に陥っています。何でもそうですが、努力出来ない人は何をやっても駄目です。

 ここまで読んでいただいたら分かると思いますが、茶色に上がる要素が何一つありません。初心者にもかかわらず、勉強もせず惰性で競プロを続けているのだから成長しなくて当たり前です。ネットを見ると、皆は最初の数回で茶色になってすぐ緑色や水色になっています。自分も1年くらい続けていれば緑色くらいにはなれるだろうと思っていました。当たり前ですが、自発的に勉強していかないと何も成長しません。

 以上が8ヶ月間の競プロへの取り組みです。このままではいけないと思いつつ、面倒で後回しにしてしまうのは悪い癖です。惰性で続けるのは良くありませんが、だからと言って辞めてしまっては元も子もないので、これからもチマチマと続けていこうと思います。気が向けばアルゴリズムの勉強やD埋めをやってみようと思います。最後まで読んでいただきありがとうございました。

初めてのコンテスト

先月AtCoderに登録して、今日初めてコンテストというものに参加した。今回はそのことについて書く。


今回参加したのはAtCoder Grand Contest 033 (通称AGC)。AからFまで全部で6問あった。問題を見たところAとBくらいしか方針が立たなかったので、まずはAから挑戦することにした。

問題の詳細は省くが、Aは感染のシミュレーションのように隣接したものを黒く変化させる問題だった。まず躓いたのが入力である。これは行列を使うのか、それともリストに入れるのか、普通に入れても大丈夫なのか迷った。行列の作り方が分からないのでリストでなんとかしようと思った。forを使って処理しようと思ったが複数行入れようとすると変数が上書きされてしまう。リストの中にリストを入れれば良いのではと思ったが、要素の取り出し方が分からなかったので別の方法を探すことにした。appendで逐一リストに追加していけば上手くいきそうなので書いてみた。書けるには書けるのだが横に繋がった文字を1文字ずつに分解して取り出す方法が分からなかった。ちなみに行列を作るにはNumPyというライブラリを使うらしいが入力の仕方が分からなかったので諦めた。


Aが駄目だったので今度はBを解くことにした。
指定された範囲の中に1つのコマがあり2人が交互に計N回ずつ動し、上下左右に動かす権利を持つ文字列を順に消費していって一方は範囲外に押し出そうとして他方は盤面に残そうと最適行動を取る、という問題だった。問題の解釈に少し時間が掛かったが取り合えず把握したので書くことにした。最初に思いついたのはお互いの文字列を利用して行動を決めるというものだったが、書き方が分からないので別の方法を考えることにした。次に思いついたのは盤面のどこにいるのかによって行動を決めるというものだった。右に移動出来る権利を持つとして、もしも盤面の右側にコマがあれば、盤面の外に出したい人は権利を使い右に移動させ、盤面に残したい人は右に動かさない選択をする、というものだ。ただこれには欠点がある、もし相手が左移動の権利をたくさん持っているとすれば、残したい側は盤面の右にコマがあっても中央に戻すべきではない。やはり相手の文字列を考える必要があるらしい。ともかく難しいことは分からないので一旦コードを書くことにした。


場所によって判断するコードを書いた。綺麗なコードが書けず、移動用の関数を作ったり上下左右の4パターンを全て列挙したり長くなってしまった。試しに実行してみると大量のエラーが出てきた。このエラーに苦戦して1時間以上溶かした。文字に括弧をしてなかったりif文の最後の処理を忘れていたりインデントがずれていたり色々細かいミスがあった。大きなミスとしては関数を定義するdefの使い方を間違えていた。外から文字を持ってきてdef内で処理しようと思っていたのだが、それが原因でエラーが起きてしまった。関数内で文字を定義し直して外に出してから元の文字に代入しなければいけないのかと思ったが、本来便利な機能であるはずのdefでそんな二度手間を必要とする訳がないと思ったので別の方法を考えた。引数として中に入れてやれば処理できるのではないかと思い書き直してみたらエラーが消えて実行出来た。


試しに入力例を入れてみると出力例と一致した。これはもしやACなのでは?そう思い提出してみたところRE(実行時エラー)だった。詳細を見てみると一部のケースでAC(正解)だったがほとんどがREになっていた。質問欄を見てみると二人はお互いの文字列を把握しているらしく、やはり最適行動にはお互いの文字列を考える必要があったらしい。色々考えている内に時間切れとなった。



2時間半、21時から23時半まで頑張ってみたが1問も解けなかった。とても難しかった。beginners selectionを全問解いたしA問題くらいなら解けるかなーと思っていたが全然解けなかった。そういえば競プロ始めました報告の記事でbeginners selectionを半分解いたら続きを書くと言っていたが、全問解いた翌日にコンテストが始まったのでこちらを優先して書いた。beginners selectionについてはまた今度書く。今回解けなかった問題は他人のコードを読んで勉強することにする。今回はここまで、終わり。

馬鹿にプログラミングは難しい

最近プログラミングを勉強している。英語と記号の羅列で何をしているのかさっぱり分からない。入門書に書いてあるPythonC言語のコードは読めるし書けるが、ある程度複雑になってくると分からない。シェルスクリプトを用いたプログラミングは複雑で理解すら出来ない。

プログラミングというのは独学が基本である。自分でコードや説明を読みながら理解して書いて失敗して書き直してを延々と繰り返してやっとある程度出来るようになる。調べる力と理解する力が必要である。当然忍耐力も求められる。

プログラミングが出来ない人は基本的に勉強が足りていない。数学のように一つ一つの理解が難しいわけではない。文法を覚えたりコンピュータの仕組みを理解する作業をしていないから難しいのである。時間を掛けて勉強すればある程度の知識は身に付き、程度に差はあれど、ある程度理解できるようになる。


初心者にとって一番の壁は環境構築である。ネットで調べると色々出てくるし入門本にも色々書いてある。だがコンピュータに疎い人間には当たり前に出てくるPC用語を理解出来ない。ファイルとフォルダって何が違うの?エクスプローラーって何?拡張子って何の意味があるの?何をどこに保存すればいいの?そういうレベルである。少なくとも私はそうだった。出来る人は皆言う、「調べたら出てくるじゃん」、その通りである。後から読むと普通に理解できる、だがやる前は読んでもよく分からない。些細なことに疑問を抱き思わぬところで引っ掛かる、中々前に進まない。書いて保存して実行する、たったこれだけのことが出来ない。いくら文法を勉強しても世界に挨拶すら出来ないのである。

私も環境構築には相当苦戦した。調べても意味不明な用語や意味不明な概念ばかり。Pythonはanacondaがいいらしい、取り合えずインストールしよう。あれ、何をどこに保存すればいいんだろう。どうやって開くんだ?なんか黒い画面が出てきた、何これ、分からない。数か月後、たまたま読んだ本に「黒い画面にはpythonと打てばいいよ!」と書いてあった、打ってみると起動出来た。高性能電卓の誕生である。1行だけ書けるようになった。ファイルの呼び出し方法や、spyderやJupyter notebookの使い方を知るのはもっと後の話である。

C言語にも苦戦した。統合開発環境?なくても出来る?コンパイル?よく分からない言葉や概念がたくさん出てくる。色々悩んでいると、「atomが簡単でオススメだよー」と教えてもらった。色々なサイトを見ながらatomで環境を作った。慣れるまで保存や実行に四苦八苦していたが、なんとか書けるようになった。教えてくれた人には感謝の極みである。

ようやく環境を構築できたら今度はエラー地獄である。おかしい、文法は合ってるはずなのにエラーが出てくる。ファイルが存在しないと言われる、保存したはずなのに。確認する。確かにファイルは存在する。もしかして保存場所がおかしいのか?そう思って場所を移動する。まだエラーが出る。なぜ?調べても分からない。拡張子がおかしいのでは?調べる。確かにこれであってるはずだ。ファイルの情報を見る。拡張子が間違っている、どういうことだ、調べる。デフォルトで拡張子が非表示になっているらしい、表示されている文字を拡張子だと勘違いしていたようだ。これでやっと実行出来る、出来た。ここまで数日掛かった。度重なるエラーに嫌気が差し、日を跨いでしまった。一度分かると後は簡単である。同じようなエラーが起きても同じように調べれば対処出来る。色々試して新しい環境で実行する度にファイルが見つからないと言われる。色々して解決する、もはや恒例行事である。

そもそもプログラムって何が出来るんだ?今はこの段階にいる。プログラミングでやったことといえば世界に挨拶して四則演算をしたくらいである。ループや分岐を駆使して簡単な数値解析をした程度である。まだ何かを作れるほどの知識はない。正直あまり楽しくない。当たり前だ、まだ自分で何も書いていない。書き写しや簡単な計算しかやっていないのだから楽しいわけがない。自分で何かを作って初めてプログラミングを楽しいと思えるのだろう。


コンピュータ素人にとってプログラミングは語学である。よく分からないものに英語や記号を打ち込んでerrorと共に大量の英語が表示される。ひたすら新しい文法を覚えて書いての繰り返し。ある程度上達すればアルゴリズムなど数学的な要素が出てくるのだろうが、とにかく最初は異世界語を理解するところから始まる。話の通じないコンピュータとの対話である。彼らは機械語のネイティブであり第一外国語は英語である、我々と一緒だ。あらゆる条件を揃えて初めて思い通りに動いてくれる。

色々言ってきたがプログラミングはやれば出来るようになるのである。分からないなら調べる、分からないから試す、分からないので調べる、調べる、試す、調べる、その繰り返しである。初学の段階では書いた内容によるエラーよりもコンピュータの知識不足によるエラーの方が圧倒的に多い。プログラミング教育で真っ先に教えるべきは文法ではなくコンピュータの基礎知識ではないかと思う。

私はコンピュータについてあまりよく知らないし英語だって読めない。毎日何時間も必死に取り組めるような性格でもない。Excelの勉強してた方が将来の役に立つのでは?といったレベルである。それでも私は勉強をしている、道のりは長い。馬鹿にプログラミングは難しいのである。

ブログの編集と練習

ブログを始めて一週間、文字を延々と打ち続けた。これで良いのだろうか?読みづらくないだろうか?ハッキリ言って読みづらい。書いた自分ですら読みづらいのだから読者はもっと読みづらいに違いない。少しは編集して読みやすくしよう!そう思った。

 よく分からないので取り合えずデフォルトの見たままモードで編集することにした。スマホの画面を眺める。これ、編集出来るのか?調べた。何やら画面が違う、なるほど、PC表示に切り替えると色々なアイコンが出てきた。何が何やら分からない、初めてWordを使ったときのようだ。順番に使って確認していこう。

 

三本の横線の左に点が書いてあるアイコン

  • 個条書きらしきアイコンを押すと・が出てきた
  • 改行すると自動で・が表示される
  • 列挙するとき使えそうだ

三本の横線の左に数字が書いてあるアイコン

  1. 数字が出てきた、予想がつく
  2. 改行すると数字が増えた
  3. 先程の内容に数字が加わったものらしい
  4. これもリストを列挙するとき使えそうだ

斜めのクリップみたいなアイコン

nemuri-aya.hatenablog.com

 何やらURLのリンクが書けるらしい、過去の記事でも載せておこう

 

上下の四角の間に点線が書いてあるアイコン

続きを読む