タグ

プログラミングと数学に関するUhoNiceGuyのブックマーク (6)

  • 空の配列に対するmaxは何を返すか - きしだのHatena

    ちょっと前に「配列中のすべての要素が条件を満たすかどうか判別する関数で、空の配列はTrueを返すべきかFalseを返すべきか」のような話が話題になってました。 まあこれは「Trueを返す」が答えなわけですが、では「配列中の最大値を返す関数で空の配列の場合は何を返すか」が気になりました。 「配列中のすべての要素が条件を満たすかどうか判別する関数」について言えば、簡単に言えばこんな感じ。 まず、配列のすべての要素が偶数であるかどうか判別する関数を考えます。 void main() { int[] data = { 23, 44, 12, 98, 5 }; System.out.println(allEven(data)); } boolean allEven(int[] data) { for (int n : data) { if (n % 2 != 0) return false; } r

    空の配列に対するmaxは何を返すか - きしだのHatena
    UhoNiceGuy
    UhoNiceGuy 2023/06/06
    -infがmaxの単位元だと考えるとJavaScriptの実装も納得できる。Optionalを返す実装はどうなのだろう
  • 人に「センスない」って言っているやつが一番センスない - Qiita

    はじめに きっかけは、以下のツイートです。 「配列のすべての要素が条件を満たすならtrueを返す」関数を定義するとき、空の配列を渡したらfalseを返すかtrueを返すかが、良いプログラマかどうかの一つの境目だ — ふみ a.k.a.DJ Monad (@fumieval) May 29, 2023 このリプライや引用リツイート欄では、Trueを返すべき、Falseかな、例外を返すべき、要件による、といった意見がありました。 建設的な議論ができるコミュニティは素晴らしいと思う反面、同じコミュニティに属するエンジニアに対して「センスがない」「プログラマを辞めてほしい」と言っている人がいて非常に残念です。 そのように敢えて煽り他人へのリスペクトが欠如している人が一番センスがないという話です。 元ネタと反応 「「配列のすべての要素が条件を満たすならtrueを返す」関数を定義するとき、空の配列を渡

    人に「センスない」って言っているやつが一番センスない - Qiita
    UhoNiceGuy
    UhoNiceGuy 2023/06/01
    0^0とか、平行線は交わるかとか、数学って割と時と場合による、とか、仕様によるなんだよね//ForAll([])がfalse返す実装がないという事実。全てのcheckを通ったら、が目的ならcheck項目がなければtrueを返して欲しいよね
  • 畳み込みの視点から見たforall(every)とexists(some): 空集合に対するforallは常にtrueになる - Lambdaカクテル

    こういうツイートが話題になっていた。 「配列のすべての要素が条件を満たすならtrueを返す」関数を定義するとき、空の配列を渡したらfalseを返すかtrueを返すかが、良いプログラマかどうかの一つの境目だ— ふみ (DJ Monad) (@fumieval) 2023年5月29日 つまりScalaで言うと次のようなコードが何になるか、というものである。 val xs = Seq.empty[Int] xs.forall(_ == 42) 結論から言うと、このような関数は常にtrueを返す。 なぜだろう?その理由をこれから説明する。 ちなみに他に以下のような意見があった: 仕様による 例外を投げるべき いずれもまぁありえなくはないが、やめておいたほうが良いと思う。もし仮にfalseを返すような仕様があった場合、それは数学から乖離しているのでいずれ仕様内部で矛盾する可能性が高いし*1、最終的に

    畳み込みの視点から見たforall(every)とexists(some): 空集合に対するforallは常にtrueになる - Lambdaカクテル
    UhoNiceGuy
    UhoNiceGuy 2023/05/31
    数学のルール(どういう定義や公理を採用するか)って人間が決めるんでしょ。結局、仕様による、じゃないの
  • 高校生がアルゴリズムとスパコンの力で、京都の碁盤目状道路を13.9%効率化した話 - Qiita

    2. 研究で解く問題 「いざ研究しよう!」と思っても、条件や設定を決めないと何も始まりません。 まずは研究を分かりやすくするために、「一つの問題」に落とし込むことにしました。 問題設定 縦 $N$ 行・横 $N$ 列の大きさの碁盤の目があります。隣り合う交差点間の距離は 1 です。つまり、交差点が合計で $N^2$ 個あり、それぞれ座標 $(1, 1), (1, 2), ..., (1, N),$ $(2, 1), (2, 2), ..., (N, N-1), (N, N)$ に位置すると考えることもできます。 下の図は、$N = 4$ の場合の交差点の位置です。 あなたは、碁盤の目の交差点の位置は変えずに、道路の並びのみを変えることができます。上手く道路の並びを変えることで、できるだけ「便利」な道路網を建設してください。 「便利な道路網」って何? 私は、以下の 2 つの条件を満たす道路

    高校生がアルゴリズムとスパコンの力で、京都の碁盤目状道路を13.9%効率化した話 - Qiita
    UhoNiceGuy
    UhoNiceGuy 2020/02/17
    凄い!!面白いね。長さがルート2以下の束縛の代わりに、評価関数に長さを入れるとどうなるだろう。
  • 圏論勉強会 @ ワークスアプリケーションズ

    Seminar of category theory

  • スパコンで約2時間36分かかったという、5×5の魔方陣の全解列挙を、パソコンで試す(C ) | 配電盤

    魔方陣の解の列挙は並列化しやすそうな問題ですが、ここでの方針では、探索効率を上げるためには条件分岐が不可欠なので、(「数」を求めるだけだとしても)GPGPUでうまくやる方法がわかりません。そこで、CPUに載っているコアのみで並列化します(Xeon Phiなら簡単なのでしょうか→追記参照)。 一番外側の、0から(1<<25)-1まで変化する変数iのループをOpenMPで並列化します(schedule(guided)では遅くなります。schedule(auto)はVisual C++でサポートされたら試します)。変数iは上の図の緑の部分(カンで5個にしました)を各数5ビットで表現し、つなげたものです。マスに入りうる数は1から25までなので、5ビットというのはちょっと冗長ですが、とりあえずはよしとしましょう。 出力はバイナリ形式で、1つの解に25バイト使います(1つのマスに入る数を1バイトで表現

    スパコンで約2時間36分かかったという、5×5の魔方陣の全解列挙を、パソコンで試す(C ) | 配電盤
  • 1