web-dev-qa-db-ja.com

アルゴリズム競争のための言語選択

こんにちはオンラインコーディングコンテストに参加し始めたばかりです。効率とデバッグのしやすさの点で、どちらの言語が優れているか知りたいのですが。私はc ++を避ける傾向があり、通常はJavaを使用します。 1.他の言語が適していますか? cシャープまたはpythonまたは他のいくつか(新しいものを学習しても問題はありません))はどうですか?2.効率的なプログラミングを行うには、C++の熟練が必要ですか?3.そしてJava&c#のうち、アルゴリズムの競争に適していますか?

6
filokalk

Pythonを使用する

まず、pythonは短いので、競争シナリオでは大きな利点になります。

検討してください:

std::map<string, int> foo;
std::stringstream str(input);
while(!str.eof())
{
      std::string x;
      str >> x;
      foo[x] += 1
}

対:

foo = Counter( text.split() )

そのpythonは、無駄なタイピングを排除するだけでなく、より迅速にコードを作成できるようにするより強力な構成を提供します。

次に、デバッグがうまく機能します。

オブジェクトは便利な方法で印刷されます。あなたはどんなオブジェクトでも「印刷」することができます。コンテナはその内容を表示します。これは、印刷スタイルのデバッグを行うときに役立ちます。グラフィカルデバッガー(私はwinpdbを使用しています)を使用している場合、pythonの内省的で動的な機能により、オブジェクトのすべての側面を簡単に表示および操作することができます。

しかしながら:

最大の問題は、コンテストがPythonをサポートする必要があることです。通常、ACMのようなものには、C、C++、Java、または同様のものが必要です。ただし、オンラインコンテストの多くはpythonをサポートしています。

2番目の問題は速度です。ただし、アルゴリズムは実行速度に基づいて成功するのではなく、アルゴリズムの巧妙さに基づいているため、通常、これはそれほど問題ではありません。つまりC++ではO(n ^ 5)アルゴリズムをより適切に実行できるかもしれませんが、全体は本当にO(n)アルゴリズムを見つけることです。適切なアルゴリズムを見つけると、言語は案件。

10
Winston Ewert

これは programmers SE に投稿する必要があると思いますが、これは私の2セントです。

  1. Cに習熟することをお勧めします。シンプルさ、例、およびJavaおよびC#の基礎となるものは、将来の準備として役立ちます。また、多くの例とデモがCです。例として this site の統計を参照してください。

  2. C++の知識は必要ないと思います。しかし、C oneはそうだと信じてください。

  3. JavaとC#の間では、柔軟性のためにC#を使用します。

10

私は米国のACMコンテストに参加しています。オンラインのコンテストにも参加しています。コンテストでは、Javaを選択します。オンラインジャッジでは、裁判官のコンピューターが遅く、時間を費やすよりもアルゴリズムをコーディングするだけなので、c ++/Cを使用する傾向があります。 Javaを実行するためのさまざまな入出力メソッド(一部の時間制限はばかげており、JavaはI/Oの処理が少し遅いため) 。これは私の意見ですが、好きなように自由に使用できます。最も人気のある言語はC++とJavaなので、最終結果の言語カテゴリを見ると、おそらくこれらのいずれかで問題が発生します(明らかに、他の多くは、頻繁に使用されないだけでサポートされています)。

5
Jesus Ramos

JavaまたはC#のどちらかを使用すると、どちらもデバッグが非常に簡単です。Javaでは、適切なIDEのようなデバッグをサポートします

ブレークポイントは、スタックが監視する変数がローカルを監視することを呼び出します。

しかし、C#では、Visual C#IDEで既に構築されていることを心配する必要はありません。

5
SSpoke

F#Haskell などの関数型言語は、アルゴリズムを実行している場合は一見の価値があります。識別された共用体やパターンマッチングなどの機能により、数学/計算タスクの概念化、プロトタイプ作成、洗練が大幅に容易になります

F#は、マルチパラダイム(F#もC#と同じくらい高速で、多くの場合高速)であるため、おそらくより親しみやすくなりますが、Haskellは楽しい挑戦です。

4
Rei Miyasaka

コンテストの時間制限があり、任意の言語が許可されている場合は、Perlを選択します。 Javaは非常に冗長で、C標準ライブラリは非常に制限されています。Perlはプログラミングコンテストにとって非常に優れているので、 1998)

3
kevin cline

私はすでに賛成しています...

これはコメントに含めるべきものですが、多すぎます...

Cは、C++、C#などでサポートされている不要な大規模システムの多くを取り除きます。小さなアルゴリズム中心のシステムを作成するために、OOPやテンプレートなどは必要ありません。

そうは言っても、C++にはプラスポイントがあります。それを知っていて、データの非表示や他の抽象化レイヤーの問題を回避する方法/時期を知っている場合は、それを使用してください。

むかしむかし、Cの代わりにModula 2(または非標準のPascal、場合によってはAda)を提案しました。より厳密なタイピングにはいくつかの利点があり、あまり豊富でない演算子のセットにはいくつかの欠点があります。 。しかし最近では、世界はこれらの言語をほとんど残していないので、おそらく本当の選択肢ではなくなっています。

Pythonは、あなたが何をしているのかに応じて、おそらくはるかに速い開発速度を提供します。もちろん、OOPがありますが、C#やJavaよりも不要な場合は回避する方が簡単です。問題は、(1)(Cで作成されたライブラリを使用するのではなく)低レベルのものをすべて自分で実行すると、ランタイムパフォーマンスが得られない可能性があること、(2)場合によっては、低レベルのコードでメモリを自分で管理したい-ガベージコレクションなどに頼らずに、ヒープを雑然とさせるのではなく、スタックに物を置いておきたい。

Pythonジェネレーター/イテレーターも、他の多くの言語では見られない非常に便利なツールです。

Pythonで使用するためにCモジュールで重要なコンポーネントを作成することはオプションですが、コンテストの時間制約がある多言語開発に入るのは非常に緊張します-少なくとも2回はあります物事が途方もなく間違って行くための範囲。

Objective CAMLは不純な関数型言語です。通常の命令型言語が実行できるすべてのことを実行でき、関数型の世界からの非常に便利なトリックもいくつかあります。私はそれを経験したわけではありませんが、確かにそれが多くの混乱を取り除き、あなたがやっていることに集中できるようになると主張していると確信しています-パターンマッチングは最初の主張をサポートします。そして、それはfastを実行するネイティブコンパイル言語です-「おそらく自分のためにメモリを管理したいかもしれない」がおそらくObjective CAML(およびF#)にも適用されます。

Haskell-絶対にそれを学ぶが、強力なアルゴリズムに焦点を当てたコンテストに使用することを目的としていないが、あなたが思うところに到達した場合「良い選択になるだろう、そしてあなたは私の批判を理解し、それらを拒否しました(またはそれらを有効であるが重要ではないことがわかりました)-それとも戦わないでください。

2
Steve314

一部のコンテストでは、特定の許可された言語のセットがあり、あなたが望むものを使用する贅沢はありません。

競技では、スクリプトと動的言語を好みます。コードを速くして、結果をより速く見る必要があります。さらに重要なのは、コードをすばやく変更する必要があることです。
Python、RubyまたはJavaScriptは強力な候補です。

私は過去にGoogle Jamに参加しましたが、Javaは最良の選択ではありませんでした。

関数型プログラミングに本当に慣れている場合(そして私が本当に快適であることを意味する場合)、この方法をお勧めします。
私の個人的な選択は、LISP、Haskell、またはErlangです。

1
Chiron

私はIOIに2、3回参加し、Cでコーディングしました。そのとき、OOについて、またはヒープにメモリを割り当てる方法さえ知りませんでした(スタックに必要なすべてのメモリを割り当てました)。すべての焦点はアルゴリズムにありました。

しかし、利用できるアルゴリズムとデータ構造のライブラリが大きいため、今日ではJavaを使用しています。ただし、もちろん、IOIでは準備済みのコードを持ち込むことはできないため、アルゴリズムと構造の巨大なライブラリは非常に有利です。オンライン競技はおそらく別の問題です...

1

私はデバッグが最も簡単で言語はC#だと思います(VSにはやるべきことがたくさんあるのでより良いです。)

  1. 効率的なプログラミングを行うには、C++に習熟している必要がありますか?

そうじゃない!機械の仕組みも知っておくべきです。

  1. Java&c#のうち、アルゴリズムの競争に適していますか?

C#がJavaもそれほど悪くありません。NetBeansでJavaを使用して作業する場合は、Javaを選択してください。NetBeansの後はVSを使用するのが難しいためです。

1
Kak Ylia

あなたが抱えている問題は、異なる開発者が異なる言語を好むことであり、これは常に健全な技術的議論についてではなく、彼らが最も快適に感じる開発スタイルについてです。

個人的には、言語ごとにカテゴリーがあるコンテストを開催します。各言語の競争は、その言語のファンである誰かが設定する必要があります(したがって、そのタスクは、その言語の他のファンにアピールするものになります)

0
Peter Lawrey