James Tsang

James Tsang

A developer.
github
twitter
tg_channel

ARTS 打卡第 2 日

A:26. ソートされた配列から重複を削除する

あなたに昇順に並べられた配列 nums が与えられます。重複する要素をその場で削除し、各要素が一度だけ現れるようにしてください。削除後の配列の新しい長さを返します。要素の相対的な順序はそのままにしてください。そして、nums のユニークな要素の数を返します。
nums のユニークな要素の数を k と考えると、あなたは以下のことを行う必要があります。あなたの解答が通過することを確認してください:
配列 nums を変更し、nums の最初の k 個の要素にユニークな要素を含め、それらが nums に最初に現れた順序で並べます。nums の残りの要素は nums のサイズに関しては重要ではありません。
k を返します。

最初に書いたバージョン:

function removeDuplicates(nums: numbs[]): number {
  const record: Record<string, boolean> = {}
  for (let i = 0; i < nums.length; i += 1) {
    if (record[nums[i]]) {
      nums.splice(i, 1)
      i -= 1
    } else {
      record[nums[i]] = true
    }
  }
  return nums.length
}

提出後、実行時間とメモリ使用量が下から 20% のランク位置にあることが表示されました。そこで、より優れた解法を見てみると、「二つのポインタ」について言及されていました。

「二つのポインタ」の考え方は、二つのポインタの位置を記録することです(実際のメモリポインタではありません)。一つは速いポインタ、もう一つは遅いポインタで、速いポインタは配列を走査し、遅いポインタは最後の異なる数字の位置を記録し修正します。速いポインタが走査を終えると、遅いポインタもすべての異なる数字を記録しています。コードの例は以下の通りです:

function removeDuplicates(nums: numbs[]): number {
  if (nums.length < 2) {
    return nums.length
  }
  let fast = 1
  let slow = 0
  while (fast < nums.length) {
    if (nums[fast] !== nums[slow]) {
      slow += 1
      nums[slow] = nums[fast]
    }
    fast += 1
  }
  return slow + 1
}

nums[fast] !== nums[slow] の場合、新しい異なる値に出会ったことを示し、その値を slow+1 の位置に記録します。fastnums を走査し終えると、すべての異なる値が遅いポインタによって一つずつ記録されます。この方法が使用できる前提は、これはソートされた配列であることです。最初は問題文のこの条件に気づかず、しばらく困惑しました。

「二つのポインタ」メソッドは、このシナリオだけでなく、「ソートされた配列の中で二つの数の和が特定の値に等しいかを探す」といった状況にも使用できます。全体の考え方は、二つの位置を記録し、それぞれを走査または操作すること、または両方を走査することです。例えば、左右から中央に近づくように。

R:コードインタープリタ API

著者は YouTube で多くの ChatGPT のコードインタープリタの宣伝を見た後、ここにまだ実現されていないニーズがあることに気づき、自分で実装しました。

ChatGPT の公式バージョンと比べて、この自作のバージョンの利点は:1. リアルタイムデータを取得するためにインターネットに接続できること、例えば 2023 年のビットコインの価格曲線を描くことができる;2. ローカルにデプロイできること:これにより、ローカルの他のアプリケーションと連携でき、より自由な環境管理が可能になります。例えば、追加のパッケージをインストールすることができます。

コードインタープリタを実現するためには、二つの核心要素があります。一つは OpenAI API のファンクションコーリング機能を利用して呼び出す関数のコードを生成すること;もう一つは Python コードを実行できる環境を持つことです。例えば、ユーザーが正弦関数のグラフを出力するように指定した場合、正弦関数のグラフを描くためのコードを取得し、それを Python インタープリタに送信して実行し、画像を出力してユーザーに表示します。このプロセスでは、LLM エージェントが結果に対していくつかの説明や詳細な補足を行う必要があるかもしれません。また、ファイル IO やセッション中の変数保存の能力も考慮する必要があります。

ここで、Python インタープリタとファイル IO、変数保存は LangChain の一つのツールと見なすことができ、これを LangChain に組み込んで呼び出すことができます。この「ツール」を著者は codebox-api プロジェクトとして作成しました(これは昨日の打刻時に共有したプロジェクトでもあります)。その底層の実装は、新しいセッションを作成するたびに新しい Jupyter カーネルセッションが作成されることです。

全体の解決策を著者は codeinterpreter-api としてパッケージ化し、ユーザーがより簡単にセッションを作成し、コードインタープリタを実行できるようにしました。

著者の今後の計画は:それをより簡単にデプロイし、拡張可能にし、商業利用可能な API に変え、さらに多くのモデルをサポートすることです。例えば Claude-V2 や Open Orca などです。著者は皆さんの貢献も歓迎しています。

T:中国語の DOS ゲーム

中国語の DOS ゲームプロジェクトで、ウェブサイト で 2000 以上のクラシックな DOS ゲームをプレイできます。

S:読書『飢餓の盛世:乾隆時代の得と失』 のノート

文明が採用する体制には唯一の基準はなく、最良のものはなく、より良いものだけがあります。乾隆は封建王朝の体制効率を極限まで引き出しましたが、歴史の車輪が王朝を押しつぶすのを止めることはできません。体制の進化を実現するためには、文化と思想の解放が必要条件です。飛躍的で超越的な思想だけが文明を次の段階に押し進めることができます(もちろん、それが破滅をもたらす可能性もあります)。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。