「素数日」を教えてくれるシステムを作ろう! - 技術編

本記事は前編(「素数日」を教えてくれるシステムを作ろう!)で私が使用したプログラムの 雑な 少しだけ具体的な解説パートです.元々こっちがメインのはずだったのに…おかしいな…

「素数日」を教えてくれるシステムを作ろう!

無次元
りろっしー

前編でもうっすら触れた通り,簡便のためPythonを使って解説しますが,他の言語でもテキストファイルの入出力ができれば同様のことが可能でしょう.

私のコードは全文は載せず,コメントを辿る程度の粒度で説明・紹介をしていきます.

1. 素数日のリストを生成する

100010000(100001231でもいいですが)以下の素数をエラトステネスの篩で列挙し,その中でyyyymmddとみなせるものを抽出してテキストファイルに毎行書き込みました.

これ,暗に要素数1億の配列を用意するってことで,C言語使いの端くれとしては割と無茶振りに感じました.どう頑張っても1億ビット=12.5 MBはメモリを使うので,少なくとも私の環境では配列を宣言した時点で弾かれます.このままでは無責任すぎると思ったので

  • malloc()を使 ってしま 
  • テキストファイルに書き出す
  • 前編添付のprime_dates.csvをダウンロードする

と解決案をいくつかご紹介してお茶を濁します.なお動作確認はしてません(無責任

2. インポートするCSVファイルを生成する

(予定1日分の)出力例を再掲しておくと,

Subject,Start Date,Description
10240229 is prime!,02/29/1024,"Next Coming:
- 1024/03/01 (Tommorow!)
- 1024/03/03 (in 3 days)
- 1024/03/19 (in 19 days)
- 1024/03/27 (in 27 days)"

このようなものを作ります.

手順としては,

  1. パラメータ(後述)を設定する
  2. 素数日リストから設定期間を切り出す
  3. 各素数日に,後続する素数日 数日分(日数は設定による)の日付を紐付ける
  4. 後続する素数日までの日数を計算してこれも紐付ける
  5. 素数日毎に順次出力ファイルに書き込む
  6. 出力文字数の総和を数えておき,ここから出力ファイルサイズを求める
  7. 書き込んだ素数日の日数とファイスサイズを表示する
  8. サイズが1 MBを超えたら,「インポートできないよ」と警告を表示する

手順1.では,次の項目をパラメータとして自由に変更可能としました:

  • 素数日リストへのパス(ファイルの居場所)
  • 出力CSVファイルへのパス
  • 予定を登録する期間(開始日・終了日)
  • Next Comingの予告表示数

例えば前編の添付ファイルでは,後半2項目を2020/01/01~2120/12/31, 4 として出力しました.


あとの実装や各種工夫などはご自由にどうぞ.



メイン画像について

エディタ: Visual Studio Code
配色テーマ: Visual Studio 2019 Dark
フォント: HackGen
拡張機能: Bracket Pair Colorizer, indent-rainbow, LaTeX Workshop

前編のメイン画像を生成する文字列をVSCodeに貼り付けたもの.