この記事はQiitaに投稿されたものの転載です。


新個体の出現

2015年に繁殖期のD言語くんが発見され、D言語くんが単為生殖で増殖するようすが明らかになった。
しかしこの繁殖方法は

  • 並列で増えることができない
  • 繁殖期のD言語くんが増えない

等の問題点を抱えており、同時にD言語くんの絶滅が危惧された。
だが、最近現地の住民の証言からD言語くんが別の繁殖方法を獲得したらしいことがわかった。その様子を撮影しようと試みたが、その姿をカメラに捉える前に12月になり、D言語くんはクリスマスの装飾に擬態して見えなくなってしまった。かわりに現地住民のスケッチを用いて紹介しよう。

2匹で行われる繁殖

D言語くんの繁殖の様子を描いた現地住民のスケッチ

現地住民から得られた情報により再現されるD言語くんの繁殖は以下のようなプロセスを経る。

  1. 2匹が密着する
  2. 餅のように伸びる
  3. 伸びた部分が膨らんでくる
  4. スライスされ、分離する

ここで注目したいのは、スケッチ上でのD言語くんの胴体に穴が開いていることである。これがD言語くんの通常個体ならば1匹しかいない繁殖期のD言語くんに頼ることなく繁殖することが可能ということで、特定の個体に依存する繁殖方法から脱したということだ。タスマニアデビルがデビル顔面腫瘍性疾患に適応したように、D言語くんが突然変異により進化しているということが考えられる。おせちのカマボコにお餅のエッセンスがmixinしたのだ。また、さらに証言を集めるととんでもない長さに伸びたD言語くんの目撃情報も得られた。

全然キモくないD言語くんの画像

超絶キモい可愛らしい。並列で増える能力を獲得したことによりD言語くんは今後ますます発展していくだろう。

それはともかく

D言語には並列処理を簡単に行う方法がある。

import std.stdio;
import std.math : log;
import std.range : iota;
import std.string : format;
import std.parallelism : TaskPool;

void main()
{
    auto pool = new TaskPool();
    foreach(index,c;pool.parallel(iota(10)))
    {
        writeln(format("%s: %s",index,log(index)));
    }
    pool.finish();
}
/*
出力:
0: -inf
3: 1.09861
5: 1.60944
8: 2.07944
9: 2.19722
6: 1.79176
4: 1.38629
1: 0
2: 0.693147
7: 1.94591
*/

数分原因がわからなくて困ったのでメモする。pool.finish()がないとプログラムが終了しない。

import std.stdio;
import std.math : log;
import std.range : iota;
import std.string : format;
import std.parallelism : parallel;

void main()
{
    foreach(index,c;iota(10).parallel())
    {
        writeln(format("%s: %s",index,log(index)));
    }
}

こんなふうにも書ける。こっちのほうがお手軽。