Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

42 SILICON VALLEY Piscine 2017 match/nmatchを考える(後編) 最後は力業

42 SILICON VALLEY Piscineの個人プロジェクト、2つ目はmatch/nmatch。2つの課題で構成されるプロジェクトだ。問題文には明記されていないが、再帰構造の理解と実装が求められている。

再帰はややこしく、理解し難いと言われる。実際その通りだと思う。しかし再帰を用いずにロジックを組むと、さらに複雑になるだろう。再帰の流れを理解するのは難しくとも、ロジックの「見た目」は、それを用いない場合に比べて、非常にシンプルになる。

今回の投稿では二つ目の課題、nmatchを採り上げる。一つ目の課題であるmatchについては、前回の投稿を参照してほしい。

題材は文字列比較だがmatchとは求められていることが異なる。単純な比較結果を出力するのではなく、合致するパターン数を出力しなければならない。前回同様、これまで考えもしなかったロジックで、かなり手間取った。

前回同様、サンプル・コードはPythonで記述したが、Piscine受講生に配慮して、C言語的な記述になるよう配慮した。

  • 準備
  • nmatch
    • 文字列比較再訪
    • matchの答え合わせ
  • 余談-再帰が理解できない人へ
  • 参照
  • サンプル・コード
    • code - pattern A
    • code - pattern B
続きを読む

42 SILICON VALLEY Piscine 2017 match/nmatchを考える(前編) 再帰とバックトラック法の実践

42 SILICON VALLEY Piscineの個人プロジェクト、2つ目はmatch/nmatch。2つの課題で構成されるプロジェクトだ。問題文には明記されていないが、再帰構造の理解と実装が求められている。加えてDay04の話題で触れたバックトラック法の実践だ。

再帰はややこしく、理解し難いと言われる。実際その通りだと思う。しかし再帰を用いずにロジックを組むと、さらに複雑になるだろう。再帰の流れを理解するのは難しくとも、ロジックの「見た目」は、それを用いない場合に比べて、非常にシンプルになる。

題材は文字列比較だ。C言語の練習プログラムの定番の一つだが、難易度を上げているのがワイルドカードの存在だ。私自身、ワイルドカードを含む文字列比較は、正規表現などの与えられた関数を、当然のごとく用いるばかりだったので、このロジックを考えるのは少々手間取った。

今回の投稿では一つ目の課題、matchだけを採り上げる。サンプル・コードはPythonで記述したが、Piscine受講生に配慮して、C言語的な記述になるよう配慮した。

  • 準備
  • match
    • 文字列比較
  • ワイルドカードを考える
    • s1を1文字進める。s2はそのまま「*」を参照する。
    • s1、s2の両方を1文字進める。不一致の場合、s2だけを戻す(「*」を再参照する)。
    • s2を1文字進める。s1はそのまま。不一致の場合、s2を戻し、s1を1文字進める。
    • どちらが正解なのか?
  • 余談-再帰が理解できない人へ
  • 参照
  • サンプル・コード
    • code - pattern A
    • code - pattern B
続きを読む

42 SILICON VALLEY Piscine 2017 Sastantuaを考える Pythonの場合

42 Tokyoでは課題のことをプロジェクトと呼ぶらしい。ここでは日々の課題とは別に課される、特別な課題をプロジェクトとする。プロジェクト資料を読み解くと、Piscineには3種類のプロジェクトが存在するようだ。

  • 個人プロジェクト
  • グループ・プロジェクト
  • 最終プロジェクト

今回、採り上げるSastantuaは、どうやら最初の個人プロジェクトのようだ。問題の形式はロジック問題だが、その詳細を示さない。プログラム上定める必要のある仕様策定を受講生に委ねている節がある。

今回はアプローチ、考え方を示すのにサンプル・コードを併記した説明が分かりやすいだろうと考えた。サンプル・コードはPythonで記述している。Piscine受講生はアプローチからロジックまでを真似することはできるが、コードは自分で考えて書き直す必要がある。
ちなみにライブラリは使用していない。自動的にFloatになってしまう箇所だけ、intのキャスト関数を用いた。それ以外には、関数も用いていない。

  • 準備
  • Sastantua
    • ピラミッドを考える
    • 段数を考慮する-段数から行数を考える
    • 段数を考慮する-Sastantuaを描画する
    • ドアを描画する
  • 余談
  • 参照
  • サンプル・コード
    • コード1
    • コード2
    • コード3
    • コード4
続きを読む