ユーザーがバイナリマトリックスを入力する必要があるプログラムを書いています。どうやってやるの。その行列を入力する方法をユーザーに伝える最良の方法は何ですか?
1 に答える
多くの異なる可能性があります。例えば:
まず、スプレッドシートのような GUI (または同様のcurses
UI)、コンソール スタイルのテキスト入力、またはその他のあらゆる種類のものを使用できます。
コンソール入力を使用することに決めたと仮定すると、最も明白な解決策は、おそらくスペースで区切られた列、改行で区切られた行です。しかし、それはあなたのユースケースにとって最善の解決策ではないかもしれません.
ユーザーが 1 つの実行の出力をコピーして次の入力に貼り付けたい場合、それらを出力する際に括弧とカンマを許可または要求する必要があります。または、CSV ファイルからコピーする可能性がある場合は、コンマを許可または要求します。等々。
行列が正方形でなければならない場合、改行は必要ありません。一方、それらを使用すると、入力の見栄えが良くなり、エラー処理が大幅に改善されます (「行 3 には 7 ではなく 8 つの値があります」対「49 ではなく 50 の値を入力しました」)。
値はバイナリであるため、スペースも必要ありません。これにも同様のトレードオフがあります。
また、キーボード上で1
とよりも近くに 2 つの文字を使用し0
たり、視覚的に区別したり (例:X
と.
)、問題領域により関連したりすることもできます。
等々。重要なのは、「最善の方法」というものは 1 つもないということです。何十ものトレードオフが必要であり、さらに多くのトレードオフにつながる革新的な設計上の決定さえあるかもしれません。
1 つ選んだら、ほとんどすべて簡単に実装できます。たとえば、スペースで区切られた列、改行で区切られた行、空白行が最後を意味するようにしましょう:
print("Please enter your matrix as 1s and 0s, with spaces between the columns.")
print("Use one row per line, and a blank row when you're done.")
matrix = []
while True:
line = input()
if not line: break
values = line.split()
row = [int(value) for value in values]
matrix.append(row)
もちろん、これらの行のいくつかを一緒にマージしたり、全体をリスト内包表記やジェネレーターに変換したりできますが、適切と思われるエラー処理を追加できるように、このままにしておきます。(エラー処理がまったくないことに気付くかもしれません。ある行に間違った列数を入力すると、ぎざぎざの行列が表示されます。誤ってq
代わりに入力すると1
、例外が発生します。など)。