あなたは他の2人の親友と一緒に住んでいる若いプログラミングオタクです。毎週、あなたの一人が家のすべての雑用をしなければなりません、そして、あなたは棒を選ぶことによってそれが誰の番であるかを決定します。最も短い棒を選んだ人は、すべての雑用を失い、します。
皆さんはプログラマーであり、パズルを作成するのが大好きなので、「最短のスティックを選ぶ」をコンピューターパズルに変更しました。
ここにパズルのルールがあります。
- 各列が棒を表す2Dマトリックスが表示されます。
- 各列の1はスティックの一部を表し、0は空のスペースを表します
- 各列の上から下に移動すると、最初にがあり、を押す
0
とすぐ1
にスティックが開始され、列の残りの部分がいっぱいになります1
だけ - 1つの列を選択するプログラムを作成できます。その列のスティックのサイズが勝者/敗者を決定します。スティックのサイズ==その列の1の数。
- ただし、そのプログラムは線形の最悪の場合の時間の複雑さしか持つことができません。
みなさんはプログラマーなので、他の誰かのプログラムが時間の複雑さの限界に達しているかどうかを知るでしょう。
あなたの仕事は:
- 2D形式または文字列の配列で入力を受け入れるプログラムまたは関数を作成します。
- 入力は、STDIN / prompt / consoleまたは関数の引数から取得できます。
- STDIN /プロンプトから入力を読み込んでいる場合、入力の読み込みと配列への変換にかかる時間は0時間であると想定できます(そうするためのコードが答えに含まれていなければなりません)
- 最も長い棒が入っている列を決定します。
- 出力は、関数の戻り値またはSTDOUT / console / alertになります。
- プログラム/関数は、線形の最悪の場合の時間の複雑さを持つ必要があります。
O(m+n)
ここm
で、は行n
数と列数です。
入力は、次の形式のいずれかです。
2D配列:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
文字列の配列:
[ "0000", "1000", "1101", "1111" ]
入力には次のプロパティがあります。
- 配列のサイズは不明です。任意のサイズの長方形を想定します
- トップダウンの列では、1が表示された場合、以下のすべてが1つになります。
- 空の列(長さ0)のスティックが許可されます。
これはコードゴルフなので、最短のコードが勝ちますます!*
コードを説明するか、予期しない2つの入力形式のいずれかとともに、(時間の複雑さを確認するために)未使用バージョンを提供してください。
ここでの更新の線形時間の複雑さは、nが列サイズでmが行サイズであるO(n + m)を意味します。(不明瞭な人向け)
更新2 これは間違いなく線形時間で実行できます。また、回答を投稿する場合は、公正な戦いのためにロジック/アルゴリズムの投稿を数日遅らせてください。
更新3時間の複雑さとプログラムを検証するために、数時間ですべての回答を確認します:)
1
、入力の最後のセルだけが入力全体を読み取る必要があります。言語の標準ライブラリがstdinへのランダムアクセスを偽装している場合でも、シーンではそれがバッファリングされるため、かかる時間はOmega(n * m)です。