Skip to content

Instantly share code, notes, and snippets.

@ikedaisuke
Last active December 15, 2015 22:49
Show Gist options
  • Save ikedaisuke/5335869 to your computer and use it in GitHub Desktop.
Save ikedaisuke/5335869 to your computer and use it in GitHub Desktop.
すごい Haskell 読書会 in 大阪 #8 における課題です。

すごいHaskell読書会 in 大阪 #8 課題

提出者 いけがみ @ikegami__

変更:ネタバレはよくないことに気がついたので、当初書いていたいくつかの問題は削除します。

Haskell code golf に挑戦しよう!

Code golf とは、与えられた仕様を満たす、できるだけ短いプログラムをつくることです。言語はなんでもよいのですが、今回はすごい Haskell を使いましょう。

プログラムを書いたファイルを Foo.hs としたとき、Unix ならば

% wc -c Foo.hs
25
%

のように、 wc -c を使うことで、ファイルが何バイトかを知ることができます。工程は、まず仕様を満たすプログラムを書いて、その次に同じことをする短いプログラムを考えます。そうでなくて、いきなり最短のコードを思いつくひとはすごい。

では、問題です:

  • 標準入力に含まれる @ を数えなさい。つまり、標準入力から文字を読み取り、その文字列のなかにある @ の個数を標準出力に表示せよ。

サンプル入力:

ACTIVE
@iseebi
@yashigani
INACTIVE
@ikegami__

サンプル出力:

3

この問題は僕が実際に必要だったプログラミングから思いついたものです。このような処理は動的言語やエディタの機能で解くひともいますが、実は僕もそうだったのですが、改めて Haskell でやってみると縮んだので皆さんにも驚いていただきたかったのです。

code golf のテクニックは、実際のプログラミングでは以下の理由で推奨しません:

  • 可読性が低くなりがち(空白とか削るから)

  • 不必要な知識を活用しがちだから(f@main とか…)

しかし、知的なゲームとして楽しんだり、リファレンスを調べてみるなどの教育的な効果があると思います。

教科書の第 9 章後半に即した課題は他の人が出してくれると期待しているので、予想外の問題を出してみました。いかがなものでしょうか。

質問は Lingr で受け付けます。

Haskell golf については、@notogawa さんの秀逸な文章があります。今回の問題のヒントも含まれています。

http://d.hatena.ne.jp/notogawa/20101011/1286814280

ゴルフ場はこちらです:

http://golf.shinh.org/

@ikedaisuke
Copy link
Author

推敲せずに文章を書いてしまったので、日本語がおかしくてごめんなさい。URL を固定するために、追記はコメントを通じて行います。

@ikedaisuke
Copy link
Author

非常に重要なヒントを一つ。cojna さんを初めとして、henkma さん、notogawa さん、ともに 37 bytes を達成しています。皆さんのコードが 37 bytes よりも長いならば、さらに縮む余地があるということです。エイセッ、がんばろう。

@ikedaisuke
Copy link
Author

余力のある方は、Haskell 以外の言語でも golf を試してみてください。長い短いは言語の善し悪しとは関係ありません。が、比較することでプログラミングパラダイムの違いを見ることができます。

@ikedaisuke
Copy link
Author

経過を眺めるのも golf の楽しみのひとつです。思いついたコードは全部とっておきましょう。バージョン管理すれば完璧です。

@ikedaisuke
Copy link
Author

大切なことを言い忘れていました。この問題は 5/9 (木) 21:00 頃に Lingr の sugoih 部屋でオープンします。それまでは、解答を公にしないでください。ネタバレ禁止にご協力ください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment