【paiza】ランクS問題から見る各種言語の特徴

# 本投稿の目的

1. 各種言語の特徴を整理し、 私のようにまだ1つの言語しか使ったことのない初学者のための足がかりとする。
1. 以下のPaizaの問題に対して、どの言語が1番”優れた回答"と言えるかを検証する。

ちなみに私はPythonしか使ったことがなく、他の言語は特徴をなんとな〜くしか知りません。そのため、、私と同じように「Python以外わからない」という方には特にお役に立てると思います。何より私自身、このpaizaキャンペーンを他の言語を知るきっかけにしたいと思います。

# 取り組む問題

https://paiza.jp/works/mondai/real_event/word_collection

:::note 
問題
あなたは文字列の愛好家で、文字列を収集することにとても熱心です。

文字列は市場で高値で取引されています。今、市場には N 個の文字列が出まわっており、文字列 S_i (1 ≦ i ≦ N) の価格は P_i です。 あなたは数ある文字列の中でも、とくに先頭がある特定の文字列で始まる文字列に興味があり、そのような文字列をすべて買い占めたいです。例え、同じ文字列が複数売っていたとしてもそのすべてを買います。

そこで、市場に出回っている N 個の文字列 S_i とそれぞれの価格 P_i (i ≦ i ≦ N)、また、M 個のクエリ文字列 Q_i (1 ≦ i ≦ M) が与えられるので、それぞれのクエリ Q_i に対し、市場に出回っている文字列の中で先頭が Q_i で始まる文字列すべてを買い占めるのに必要な金額を出力するプログラムを作成してください。
:::
各変数や出力方法など、各種条件は上記サイトをご覧ください。


# 比較言語 5つ

## 1.Java
@irochi さま

https://qiita.com/irochi/items/987cb92c02d18980f4f2

- 簡潔さ・行数
    - 44行（コメント・改行を含む）
- 手順
    1. スキャナーを使って入力を読み込む
    1. NとMの読み込み
    1. 文字列と価格を格納するリストの作成
    1. 文字列とその価格をリストに格納
    1. クエリの処理
    1. 文字列リストを確認して、クエリで始まるものを探す
    1. 合計金額を出力

- コードのポイント
    - Javaのユーティリティパッケージをインポート（ここではScannerクラスとArrayListを使用）
    - クラス・オブジェクト生成の概念理解が必須
    - System.inで標準入力（通常はキーボード入力）


- その他、個人的な所感
    - 基本的な手順・考え方はPythonと同じ
    - 新しいリストを作成している点がPythonよりわかりやすい。
    - forやint,startswithなど、Pythonコードと共通するものも多い。


## 2.C#

@short_creeper さま

https://qiita.com/short_creeper/items/cbea0cea704fbacf56b9


- 簡潔さ・行数
    - 51行（コメント・改行を含む）

- 手順
    1. 名前空間のインポート
    1. クラス宣言
    1. 最初の入力を読み込む
    1. 売られている文字列の数とクエリの数を取得
    1. クエリごとの取得・計算
    1. 文字列リストを確認して、クエリで始まるものを探す
    1. 合計金額を出力


- コードのポイント
    - System名前空間…基本的なデータ型や入出力操作、文字列操作などを提供する標準ライブラリ
    - Mainメソッド…C#プログラムのエントリーポイント（プログラムにおいて一番最初に実行される場所のこと）

- その他、個人的な所感
    - Pythonにはないコードの始まり方「名前空間」
    - Java同様、forやint,startswithなど、Pythonコードと共通するものも多い。

## 3.JavaScript　

@AsilHatake さま

https://qiita.com/AsilHatake/items/a19264ec6de16fafe8ff

- 簡潔さ・行数
    - 12行（コメント・改行を含む、一部除く）

- 手順
    1. NとMの取得
    1. 文字列と価格の取得
    1. クエリ処理と結果の出力

- コードのポイント
    - const…JavaScriptで定数（値を再代入できない変数）を宣言するためのキーワード
    - filter, map, reduce, forEachなどの高階関数（別の関数を引数に取る関数）で、ループ処理がより短く書ける。
    - アロー関数 (=>) によって、無名関数を簡潔に表現できている。

- その他、個人的な所感
    - コードがとにかく短い。このかたのセンスもあるが、JavaScriptの「高階関数」「アロー関数」によって、短縮が可能になっている。
    - その分1行あたりのコードが複雑で暗記も増える印象。

## 4.PowerShell
@wagreagrw さま

https://qiita.com/wagreagrw/items/7b5568d886dd8c9f54b0


- 簡潔さ・行数
    - 30行（コメント・改行を含む）

- 手順
    1. 文字列数Nとクエリ文字列数Mを受け取る
    1. 文字列と価格をリストに分割して格納
    1. クエリを格納
    1. クエリごとに合計金額を計算して出力

- コードのポイント
    - cread-host はユーザー入力を受け取るコマンド
    - ループを $i=0 から $i -lt $N（$i が $N より小さい間）まで回し、$N 回の入力を受け取り

- その他、個人的な所感
    - 見慣れないルールは多そうだが、コードだけ見てもなんとなくやっていることはわかる。Pythonの形と似ていると感じる。
    - Read-Host,Write-HostはPowerShell独特のコマンドレット、システム管理やタスク実行に特化したものが多数ある。
    
    

## 5.Python

私　@setowatson

https://qiita.com/setowatson/items/e1a04581861a6b0aecfc


- 簡潔さ・行数
    - 47行（コメント・改行を含む、入力行除く）

- 手順
    1. データ入力
    1. データ分割
    1. 計算する関数の定義
    1. 計算結果を出力

自分で作成したPythonコードのため、省略。
    

# 比較一覧

表にして並べてみます。
「簡潔さ」「わかりやすさ」は上記paiza問題の回答から見た、私の主観ランキングです。
Pythonは普段使っており1番使いやすいのは明確なので除いています。

|  |言語 |一般的な特徴  |主な用途 |簡潔さ |わかりやすさ  |
|---|---|---|---|---|---|
|1|Java|オブジェクト指向、豊富な標準ライブラリ、互換性が高い |アプリケーション、Androidアプリ、サーバーサイドの開発  |5位|2位|
|2|C#|オブジェクト指向、Windows統合、NETライブラリと豊富なフレームワーク |Windowsアプリケーションやゲーム開発  |4位|3位|
|3|JavaScript|動的型付け、非同期処理が得意、クラスベースではなくプロトタイプベースのオブジェクト指向|フロントエンド・バックエンド含めたウェブ開発   |1位|4位|
|4|PowerShell|システム管理特化、パイプライン機能  |Windowsのシステム管理や自動化タスク  |2位|1位|
|5|Python|動的型付け、スクリプト言語 |データ分析、機械学習、ウェブ開発、スクリプト作成など幅広い分野  |3位|-|



# 引用・参考にした方々の記事

みなさま、勉強になりました。ありがとうございました。
こうして同じコーディングの問題に取り組めるpaizaの企画、
またブログ形式で気軽に発信・受信ができるQiitaは本当に有り難いですね。

Java部門 @irochi さま

https://qiita.com/irochi/items/987cb92c02d18980f4f2

C#部門 @short_creeper さま

https://qiita.com/short_creeper/items/cbea0cea704fbacf56b9

JavaScript部門　@AsilHatake さま

https://qiita.com/AsilHatake/items/a19264ec6de16fafe8ff

PowerShell部門 @wagreagrw さま

https://qiita.com/wagreagrw/items/7b5568d886dd8c9f54b0

Python部門　@setowatson(私)

https://qiita.com/setowatson/items/e1a04581861a6b0aecfc


別途わかりやすい記事

https://qiita.com/eric50905/items/2215aa0003e4b5cf7467#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91