見出し画像

Retro-gaming and so on

関数型言語脳テスト

ごめん、実の事言うとC++って言語については全く知らない。
参考書さえ読んだ事がないんだ(笑)。

でもある時、洒落で一回書いたら「書けないワケじゃあねぇな」って事を発見した。
すべてテンプレートのお陰、である。

C++の付属ライブラリ、テンプレート、と言うのはC++で一種、関数型言語のようなプログラミングが出来るモノで、実はこれだけで「チューリング等価」ならしい(※1)。言わば、C++付属のクセに、これはまるで独立したプログラミング言語のようなモノ、である。
テンプレートはラムダ式も使えるし、高階関数も使える。いや、「使える」ってだけで使いやすいかどうかは別問題だが(笑)。しかし辛うじて、ホント辛うじて、Lispを母体にしたようなプログラムを記述する事が可能だ。
とは言っても、繰り返すがC++は全く知らんので、書く度に検索のお世話になって何とかでっち上げる、って程度である。そしてその度、「Map」で検索して、「これってハッシュテーブルじゃん!」って叫んでいる(笑・※2)。

もちろん、自発的にわざわざC++で何かを書く事はない。
つまり、教えて!gooでC++の問題を見かけて、誰も回答を付けないような時に書いてるわけ。
じゃないとC++なんて多分、一生触らなかっただろう。教えて!gooは敢えてC++を触る口実になっている。
そして僕がやってるのは、事実上、C++でのプログラミング、と言うよりテンプレートでのプログラミングだ。

もちろん、C++ド素人が解ける問題なのか否か、ってのをチェックするわけだが(そういう意味では質問投下者と「C++」って範疇だと大してレベルは変わらない)、それより「関数型言語の考え方で解けるかどうか」の方が個人的には大事だ。
故に思考は、あからさまに「Lispだったら・・・」と言う検査になる。

と言うわけで、教えて!gooで投稿されたC++の質問をここで紹介しよう。
これを「どういうスタイルで解くか」が、その人が「関数型言語的」な思考回路になってるか、あるいはフツーの「宣言的な」プログラミングの思考回路になってるか、の違いになって現れると思う。

画像のような部分文字列を,std::vector<std::string> vec にどんどん代入するプログラムを書いてください。つまり,vec[0] は "s" で,vec[1] は "sa" になってほしいです。
なお,どんな文字列でもうまくいくようにしてください。



もちろん、ここでは別に、C++を使わないで良い。RacketでもPythonでも好きな言語処理系を用いて良い。
そして別に出力はマジメに考えないで良い。この問題もオリジナルがC系の問題なんで、「出力せんとどーにもならない」んで、出力してるが、本質的な問題ではない。余力があったら出力すればいいし、そうじゃなかったら出力せんでいい。どっちみち、インタプリタだったら結果はすぐに見れるからだ。
同時に、本問ではデータ型がベクタである、って事にしてるが、これもいわゆるコンテナ系とかシーケンス系だったら何でも良いだろう。
問題の完全移植、ではなく「考え方がどうなのか」と言う事の方が大事だ。
参考までに。Racketの組み込み関数を使えば(インデントすると)三行程度で書けるプログラムだ。Pythonだと二行程度になる。
言い換えると、Racket/Pythonで二〜三行で済むトコを済まなくなるのが、C++等のC系言語だ、と言う事だ。問題を殊更複雑化するのがC系言語の特徴だ、と言えよう(それでもC++のテンプレートを使えばCよりは短くなるだろう・・・・・・Lispには負けるが)。
回答例はまた別の機会に。

※1: チューリング等価、とは平たく言うと、「真っ当なプログラミング言語である条件を満たしてる」事。
例えば、HTMLはチューリング等価ではないので、プログラミング言語ではない。

※2: C++及びJavaでは、Mapと言うとハッシュテーブルを指してるらしい。関数型言語で言うMapping関数ではないのだ。そしてそれを毎回俺は忘れてる(苦笑)。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事