Pythonで競技プログラミング用語集を作ってみた

#目次
1. 開発環境
1. 用語集のコード
1. 解説
1. 参考文献

##1. 開発環境
MacOS Big Sur
11.0.1
Spyderで実行しています。
このプログラムを実行する前にターミナルまたはコマンドプロンプトで

```
pip install pyttsx3
```
と書き、pyttsxをインストールしてください。これにより、読み上げ機能が使えます。PaizaなどのWEBサイトでpyttsxをインストールしていても実行すると、

```
ターミナル、コマンドプロンプトで
pip install pyttsx3
と書き、pyttsx3をインストールしてください。
インストールしないとこのプログラムは動かせません。
```
と言うメッセージが出ます。エディタまたはSpyderなどで実行してください。

##2. 用語集のコード
```Python
from webbrowser import open
from sys import exit
try:
    import pyttsx3
except:
    print("ターミナル、コマンドプロンプトで\npip install pyttsx3\nと書き、pyttsx3をインストールしてください。")
    print("インストールしないとこのプログラムは動かせません。")
    exit()
    
def ask(S):
    
    while True:
        n = input(str(S)+"(Y/N)\n>>>")
        if n == "Y" or n == "N":
            break
    return n

def settei():
    
    a = {}
    n = "a"
    print("初期設定を始めます。")
    n = ask("読み上げをしますか?")
    a["read"] = n
    if n == "Y":
        print("音量に気をつけてください")
    return a
    

def read(ph):
    
    engine = pyttsx3.init()
    voices = engine.getProperty('voices')
    engine.setProperty("voice", voices[18].id)
    engine.say(ph)
    engine.runAndWait()
    

    
n = "a"
atcoder = ["AC","WJ","TLE","コンテスタント","競技プログラミング","WA","MLE","OLE","IE","RE"]#Atcoder用語集に飛べる用語
paiza = ["paiza","paizaラーニング","EN:TRY","Paiza新卒"]#paiza用語集に飛べる用語


l = {"Atcoder":'''解けた！を世界に届けたい。

AtCoderは、世界最高峰の競技プログラミングサイトです。
リアルタイムのオンラインコンテストで競い合うことや、
3,000以上の過去問にいつでもチャレンジすることができます。
'''
,"paiza":'''

スキルチェック で 
プログラミング力診断
累計受験数 200万件の プログラミングスキルチェックにより、 スキルレベルを 6段階で 可視化。
'''
,"paizaラーニング":'''

paiza（パイザ）ラーニング は、動画を使ったオンラインのプログラミング入門学習コンテンツです。 
プログラミング講座では、 Java、Python、Ruby、PHP、C言語、SQL、JavaScript、HTML+CSS などの講座を公開。1本約3分の動画とそれぞれのチャプターに対応した演習課題で効率よく学べます。
'''
,"EN:TRY":'''

EN:TRY（エントリー）は、コードを書いて書類選考なしで面接・カジュアル面談に進める、 全く新しいカタチのコーディング転職サービスです。 
開発実務は未経験でもチャレンジできる求人を中心に掲載！ たとえば「未経験だけどこれからITエンジニアを目指したい！」 
「もっと本格的に開発経験を積みたい！」という思いを叶えます。
'''
,"Paiza新卒":'''

paiza（パイザ）は、コードを書いて書類選考なしで面接・カジュアル面談に進める、
全く新しいカタチのコーディング就活サービスです。実務経験がない分野、言語でもコードが書ければ面接可能！

'''
,"Qiita":'''

「Qiita」とは、知見を共有しスキルを高めることができる、プログラミングに特化したオープンな情報共有コミュニティです。
2011年9月16日にリリースして以降順調にアクセスユーザー数を増やし、約250万人を超えるユーザーがアクセスするサービスとなりました。毎日約200件の情報が新しく投稿され、17万件を超える投稿が集まっています。
(アクセスユーザー数、投稿数は共に2016年9月末時点での数字です。)
'''
,"note.nkmk.me":'''

様々なプログラミングの情報(アルゴリズムのこと、関数の使い方など)がある便利なサイト。
例えば、下のサイトは高校までの数学が解けるような関数のまとめです。
https://note.nkmk.me/python-mathematics/
'''
,"高橋直大":'''

東京都出身。筑波大学附属駒場中学校・高等学校、慶應義塾大学環境情報学部卒業、慶應義塾大学 政策・メディア研究科修士課程修了[3]。
大学在学中にマイクロソフト主催のプログラミングコンテストであるイマジンカップ 2008のアルゴリズム部門において、世界3位に入賞した[2][4][5][6][7]。
現在はプログラマの傍ら、AtCoderというプログラミングコンテストを企画する会社を経営している[8]。
過去にITmediaで「最強最速アルゴリズマー養成講座」という連載を行っていた[2]。
'''
,"Atcoderの色":'''

説明はこのサイトを見てください。
http://chokudai.hatenablog.com/entry/2019/02/11/155904
'''
,"Python":'''

グイド・バン・ロッサム氏が開発したスクリプト言語。
プログラムをモジュール化して（ほかの言語で作成したものも可能）、ほかのプログラムに組み込んで利用することが容易であるという特徴を持つ。
また、ソースコードの書き方に関するルールが厳密で、ルールに従うことで読みやすいソースコードになることが考慮されている。欧米で人気の高い言語だったが日本語を扱う仕組みは完備していなかった。
現在はUnicodeによる文字列操作をサポートしており、日本語の文字列も操作可能。Webアプリケーションの開発に使用されることが多い。
'''
,"C++":'''

C++（シープラスプラス）は、汎用プログラミング言語のひとつである。日本語話者の間では「シープラ」又は「シープラプラ」と通称される。
派生元であるC言語の機能や特徴を継承しつつ、表現力と効率性の向上のために、手続き型プログラミング・データ抽象・オブジェクト指向プログラミング・ジェネリックプログラミングといった複数のプログラミングパラダイムが組み合わされている[2]。
C言語のようにハードウェアを直接扱うような下位層向けの低水準言語としても、複雑なアプリケーションソフトウェアを開発するための上位層向け高水準言語としても使用可能である。
アセンブリ言語以外の低水準言語を必要としないこと、使わない機能に時間的・空間的コストを必要としないことが、言語設計の重要な原則となっている[3][4]。
C++は、1983年にAT&Tベル研究所の計算機科学者ビャーネ・ストロヴストルップによって公開された。また様々なプラットフォームでその開発環境が導入された。
1998年からISOとIECの共同で言語仕様とテンプレートライブラリの標準化が行われるようになり、その後2003年、2011年、2014年、2017年に標準規格が改訂されている。
2019年現在の最新規格は「ISO/IEC 14882:2017」通称「C++17」である。
'''
,"標準入力":'''

UNIX上で動作するプログラムは標準入力への読み込み要求を発行することで、キーボードからのデータを受け取ることができる。
ファイルポインタはstdin、ファイル記述子は0が割り当てられている。
キーボードからデータを受け取る代わりに、ファイルからデータを標準入力として受け取ることができる。
このような操作はリダイレクトと呼ばれる。
UNIX上で動作するプログラムには、標準入力・標準出力・標準エラー出力の3つが暗黙的に割り当てられる。
'''
,"AC":'''

正答です。運営が用意したテストを全てパスし、正しいプログラムであると判定されました。
'''
,"WJ":'''

提出したプログラムはジャッジを待っている状態です。
'''
,"コンテスタント":'''
コンテスト参加者のこと。
'''
,"競技プログラミング":'''

与えられた問題に対してどれだけ正確、かつ素早くプログラムを作成できるか競う競技です。
'''
,"TLE":'''

問題で指定された実行時間以内にプログラムが終了しませんでした。(誤答)
'''
,"WA":'''

誤答です。提出したプログラムの出力は正しくありません。
'''
,"MLE":'''

問題で指定されたメモリ制限を超えています。
'''
,"OLE":'''

問題で指定された制限を超えるサイズの出力を行いました。
'''
,"IE":'''

内部のエラー、つまりジャッジシステムのエラーです。
'''
,"RE":'''

プログラムの実行中にエラーが発生しました。コンパイル時に検知できなかったエラーがあります.スタックオーバーフロー、ゼロ除算などが原因です.
'''
}

sannkou = ["WEBサイト"
           ,"https://note.nkmk.me/python-dict-keys-values-items/","https://increments.co.jp/products/qiita/"
           ,"https://paiza.jp/guide/career","https://paiza.jp/guide/student"
           ,"https://paiza.jp/guide/en_try","https://paiza.jp/guide/works"
           ,"https://note.nkmk.me/python-mathematics/","https://ja.wikipedia.org/wiki/競技プログラミング"
           ,"https://ja.wikipedia.org/wiki/高橋直大","http://chokudai.hatenablog.com/entry/2019/02/11/155904"
           ,"http://chokudai.hatenablog.com","https://tonari-it.com/python-webbrowser-open/"
           ,"https://ja.wikipedia.org/wiki/C%2B%2B","https://atcoder.jp/contests/abc074/glossary?lang=ja"
           ,"https://code-graffiti.com/anaconda-navigator-does-not-start/","https://miyukimedaka.com/2020/06/16/0145-speech-synthesis/"
           ,"\n辞書","ASCII.jpデジタル用語辞典","IT用語辞典バイナリ"]


settings = settei()
while True:
    while True:
        n = input("何をしますか?\n000終了 001 用語説明 002 用語一覧 100 使い方 101 参考文献 102 設定 500 注意\n>>>")
        try:
            n = int(n)
            break
        except:
            print("整数を入力してください")
            pass
    
    if n == 0:
        break
    
    elif n == 1:
        while True:
            s = input("どの言葉を調べますか?\n>>>")
            try:
                x = l[s]
                print(x)
                if settings["read"] == "Y":
                    read(x)
                if s == "高橋直大":
                    print("直大様が書いているchokudaiのブログというものもあります。")
                    while True:
                        y = input("開きますか?(Y/N)\n>>>")
                        if y == "Y" or y == "N":
                            break
                    if y == "Y":
                        open("http://chokudai.hatenablog.com")
                        break
                    else:
                        print("YかNで答えてください。(YesならY,NoならN)")
                
                elif s == "Atcoder":
                    while True:
                        y = input("Atcoderのサイトを開きますか?(Y/N)\n>>>")
                        if y == "Y" or y == "N":
                            break
                        else:
                            print("YかNで答えてください。(YesならY,NoならN)")
                    if y == "Y":
                        open("https://atcoder.jp/home")
                        break
                    
                elif s in paiza:
                    while True:
                        y = input("paizaのサイトを開きますか?(Y/N)\n>>>")
                        if y == "Y" or y == "N":
                            break
                        else:
                            print("YかNで答えてください。(YesならY,NoならN)")
                    if y == "Y":
                        open("https://paiza.jp")
                        break
                
                elif s == "C++":
                    while True:
                        y = input("このサイトはwikipediaから引用されました。\nWikipediaを開きますか?(Y/N)\n>>>")
                        if y == "Y" or y == "N":
                            break
                    if y == "Y":
                        open("https://ja.wikipedia.org/wiki/C%2B%2B")
                        break
                    
                elif s in atcoder:
                    while True:
                        y = input("このサイトはAtcoderの用語集から引用されました。\nAtcoderを開きますか?(Y/N)\n>>>")
                        if y == "Y" or y == "N":
                            break
                    if y == "Y":
                        open("https://atcoder.jp/contests/abc074/glossary?lang=ja")
                        break
                
                elif s == "標準入力":
                    while True:
                        y = input("Pythonの標準入力まとめがあります。開きますか?(Y/N)\n>>>")
                        if y == "Y" or y == "N":
                            break
                    if y == "Y":
                        open("https://qiita.com/zenrshon/items/c4f3849552348b3dbe67")
                        break
                
                if y == "N" or y == "Y":
                    break
                
                    
            except:
                print(s+"は用語には含まれていません。")
                if ask("Yahoo検索しますか?") == "Y":
                    open("https://search.yahoo.co.jp/search?p="+s+"&fr=top_ga1_sa&ei=UTF-8&ts=20826&aq=-1&oq=&at=&ai=5989b88a-191c-4cca-857f-f555e6ba52cb")
                pass
    
    elif n == 2:
        print("\n~~用語一覧~~")
        for i in l:
            print(i)
        
    elif n == 100:
        print('''　　　　　　　　　　　　　　　　　　　　　　　<使い方>
              まず、「何をしますか?」と聞かれるので、あなたがやりたい操作の番号を入力してください。
              　　　　　　　　用語一覧、参考文献は一覧が表示されます。''')
        print("                             ちなみに入力は全角数字でも反応しました。")
        print("                             ちなみに入力はちちめても良い　　(例)000>>>0 002>>>2")
    
    elif n == 101:
        print("\n~~参考文献一覧~~")
        print("\n".join(sannkou))
        
    elif n == 102:
        settings = settei()
        
    elif n == 500:
        print("注意")
        print("この言葉(キャッチコピー)は作者が考えたものだけでなく、他のサイトにに載っていたものもあります。(参考文献に入れてあります。)")
        print("また、他の用語と共通している文章をいれていない可能性があります。")
```
<a id="Ans"></a>
##3. プログラムの説明
###1. import文
まず、

```Python
from webbrowser import open
from sys import exit
try:
    import pyttsx3
except:
    print("ターミナル、コマンドプロンプトで\npip install pyttsx3\nと書き、pyttsx3をインストールしてください。")
    print("インストールしないとこのプログラムは動かせません。")
    exit()
```
これは、読み上げ機能ができるか、と言う判断とWEBページを開くためのライブラリをimportしています。

###2. 関数
```Python
def ask(S):

    while True:
        n = input(str(S)+"(Y/N)\n>>>")
        if n == "Y" or n == "N":
            break
    return n

def settei():

    a = {}
    n = "a"
    print("初期設定を始めます。")
    n = ask("読み上げをしますか?")
    a["read"] = n
    if n == "Y":
        print("音量に気をつけてください")
    return a


def read(ph):

    engine = pyttsx3.init()
    voices = engine.getProperty('voices')
    engine.setProperty("voice", voices[18].id)
    engine.say(ph)
    engine.runAndWait()


```

それぞれ、"Y"か"N"と答えるまでS(文字列)ときき続ける関数・初期設定の関数・読み上げる関数である。
###3. 辞書
```Python
atcoder = ["AC","WJ","TLE","コンテスタント","競技プログラミング","WA","MLE","OLE","IE","RE"]#Atcoder用語集に飛べる用語
paiza = ["paiza","paizaラーニング","EN:TRY","Paiza新卒"]#paiza用語集に飛べる用語


l = {"Atcoder":'''解けた！を世界に届けたい。

AtCoderは、世界最高峰の競技プログラミングサイトです。
リアルタイムのオンラインコンテストで競い合うことや、
3,000以上の過去問にいつでもチャレンジすることができます。
'''
,"paiza":'''

スキルチェック で 
プログラミング力診断
累計受験数 200万件の プログラミングスキルチェックにより、 スキルレベルを 6段階で 可視化。
'''
,"paizaラーニング":'''

paiza（パイザ）ラーニング は、動画を使ったオンラインのプログラミング入門学習コンテンツです。 
プログラミング講座では、 Java、Python、Ruby、PHP、C言語、SQL、JavaScript、HTML+CSS などの講座を公開。1本約3分の動画とそれぞれのチャプターに対応した演習課題で効率よく学べます。
'''
,"EN:TRY":'''

EN:TRY（エントリー）は、コードを書いて書類選考なしで面接・カジュアル面談に進める、 全く新しいカタチのコーディング転職サービスです。 
開発実務は未経験でもチャレンジできる求人を中心に掲載！ たとえば「未経験だけどこれからITエンジニアを目指したい！」 
「もっと本格的に開発経験を積みたい！」という思いを叶えます。
'''
,"Paiza新卒":'''

paiza（パイザ）は、コードを書いて書類選考なしで面接・カジュアル面談に進める、
全く新しいカタチのコーディング就活サービスです。実務経験がない分野、言語でもコードが書ければ面接可能！

'''
,"Qiita":'''

「Qiita」とは、知見を共有しスキルを高めることができる、プログラミングに特化したオープンな情報共有コミュニティです。
2011年9月16日にリリースして以降順調にアクセスユーザー数を増やし、約250万人を超えるユーザーがアクセスするサービスとなりました。毎日約200件の情報が新しく投稿され、17万件を超える投稿が集まっています。
(アクセスユーザー数、投稿数は共に2016年9月末時点での数字です。)
'''
,"note.nkmk.me":'''

様々なプログラミングの情報(アルゴリズムのこと、関数の使い方など)がある便利なサイト。
例えば、下のサイトは高校までの数学が解けるような関数のまとめです。
https://note.nkmk.me/python-mathematics/
'''
,"高橋直大":'''

東京都出身。筑波大学附属駒場中学校・高等学校、慶應義塾大学環境情報学部卒業、慶應義塾大学 政策・メディア研究科修士課程修了[3]。
大学在学中にマイクロソフト主催のプログラミングコンテストであるイマジンカップ 2008のアルゴリズム部門において、世界3位に入賞した[2][4][5][6][7]。
現在はプログラマの傍ら、AtCoderというプログラミングコンテストを企画する会社を経営している[8]。
過去にITmediaで「最強最速アルゴリズマー養成講座」という連載を行っていた[2]。
'''
,"Atcoderの色":'''

説明はこのサイトを見てください。
http://chokudai.hatenablog.com/entry/2019/02/11/155904
'''
,"Python":'''

グイド・バン・ロッサム氏が開発したスクリプト言語。
プログラムをモジュール化して（ほかの言語で作成したものも可能）、ほかのプログラムに組み込んで利用することが容易であるという特徴を持つ。
また、ソースコードの書き方に関するルールが厳密で、ルールに従うことで読みやすいソースコードになることが考慮されている。欧米で人気の高い言語だったが日本語を扱う仕組みは完備していなかった。
現在はUnicodeによる文字列操作をサポートしており、日本語の文字列も操作可能。Webアプリケーションの開発に使用されることが多い。
'''
,"C++":'''

C++（シープラスプラス）は、汎用プログラミング言語のひとつである。日本語話者の間では「シープラ」又は「シープラプラ」と通称される。
派生元であるC言語の機能や特徴を継承しつつ、表現力と効率性の向上のために、手続き型プログラミング・データ抽象・オブジェクト指向プログラミング・ジェネリックプログラミングといった複数のプログラミングパラダイムが組み合わされている[2]。
C言語のようにハードウェアを直接扱うような下位層向けの低水準言語としても、複雑なアプリケーションソフトウェアを開発するための上位層向け高水準言語としても使用可能である。
アセンブリ言語以外の低水準言語を必要としないこと、使わない機能に時間的・空間的コストを必要としないことが、言語設計の重要な原則となっている[3][4]。
C++は、1983年にAT&Tベル研究所の計算機科学者ビャーネ・ストロヴストルップによって公開された。また様々なプラットフォームでその開発環境が導入された。
1998年からISOとIECの共同で言語仕様とテンプレートライブラリの標準化が行われるようになり、その後2003年、2011年、2014年、2017年に標準規格が改訂されている。
2019年現在の最新規格は「ISO/IEC 14882:2017」通称「C++17」である。
'''
,"標準入力":'''

UNIX上で動作するプログラムは標準入力への読み込み要求を発行することで、キーボードからのデータを受け取ることができる。
ファイルポインタはstdin、ファイル記述子は0が割り当てられている。
キーボードからデータを受け取る代わりに、ファイルからデータを標準入力として受け取ることができる。
このような操作はリダイレクトと呼ばれる。
UNIX上で動作するプログラムには、標準入力・標準出力・標準エラー出力の3つが暗黙的に割り当てられる。
'''
,"AC":'''

正答です。運営が用意したテストを全てパスし、正しいプログラムであると判定されました。
'''
,"WJ":'''

提出したプログラムはジャッジを待っている状態です。
'''
,"コンテスタント":'''
コンテスト参加者のこと。
'''
,"競技プログラミング":'''

与えられた問題に対してどれだけ正確、かつ素早くプログラムを作成できるか競う競技です。
'''
,"TLE":'''

問題で指定された実行時間以内にプログラムが終了しませんでした。(誤答)
'''
,"WA":'''

誤答です。提出したプログラムの出力は正しくありません。
'''
,"MLE":'''

問題で指定されたメモリ制限を超えています。
'''
,"OLE":'''

問題で指定された制限を超えるサイズの出力を行いました。
'''
,"IE":'''

内部のエラー、つまりジャッジシステムのエラーです。
'''
,"RE":'''

プログラムの実行中にエラーが発生しました。コンパイル時に検知できなかったエラーがあります.スタックオーバーフロー、ゼロ除算などが原因です.
'''
}

```
これは言葉とその意味を載せています。意味は色々なサイトから引用している。そのうち、[paiza]

###4. while文の処理
```Python
while True:
    while True:
        n = input("何をしますか?\n000終了 001 用語説明 002 用語一覧 100 使い方 101 参考文献 102 設定 500 注意\n>>>")
        try:
            n = int(n)
            break
        except:
            print("整数を入力してください")
            pass
```
何をするか、の入力を受け取る。また、入力が整数かどうかを判定する。n(入力)が整数でない時は

```Python
n = int(n)
```
でエラーが発生するのでexceptの処理(「整数を入力してください」と出力して何もやらない)をすることになる。
###5. 条件分岐
```Python
   if n == 0:
        break
```
と

```Python
    elif n == 100:
        print('''　　　　　　　　　　　　　　　　　　　　　　　<使い方>
              まず、「何をしますか?」と聞かれるので、あなたがやりたい操作の番号を入力してください。
              　　　　　　　　用語一覧、参考文献は一覧が表示されます。''')
        print("                             ちなみに入力は全角数字でも反応しました。")
        print("                             ちなみに入力はちちめても良い　　(例)000>>>0 002>>>2")

    elif n == 101:
        print("\n~~参考文献一覧~~")
        print("\n".join(sannkou))

    elif n == 102:
        settings = settei()

    elif n == 500:
        print("注意")
        print("この言葉(キャッチコピー)は作者が考えたものだけでなく、他のサイトにに載っていたものもあります。(参考文献に入れてあります。)")
        print("また、他の用語と共通している文章をいれていない可能性があります。")
```
これにより、参考文献・注意・使い方が見られる。また、n=0の時は終了(break文の活用)することができる。また、使い方は真ん中に揃えてある(実行して調整した)。


<a id="sannkou"></a>
##4.参考文献
####WEBサイト
Markdownの書き方...[Markdown で ページ内リンク付き の 目次 を 作成 する 方法](https://qiita.com/miriwo/items/11b717dfc501b5b4e286)
        　　　　　　　　　　[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)

用語の意味・コードの書き方...

#####paiza
https://paiza.jp/guide/career
https://paiza.jp/guide/student
https://paiza.jp/guide/en_try
https://paiza.jp/guide/works
#####note.nkmk.me
https://note.nkmk.me/python-mathematics/
https://note.nkmk.me/python-dict-keys-values-items/
#####Wikipedia
https://ja.wikipedia.org/wiki/競技プログラミング
https://ja.wikipedia.org/wiki/高橋直大
https://ja.wikipedia.org/wiki/C%2B%2B
#####chokudaiのブログ
http://chokudai.hatenablog.com/entry/2019/02/11/155904
http://chokudai.hatenablog.com
https://miyukimedaka.com/2020/06/16/0145-speech-synthesis/
#####Qiita
https://increments.co.jp/products/qiita/
https://help.qiita.com/ja/articles/qiita-edit
https://qiita.com/tsunasandot/items/d0972fb3bfc0d4156b34#1-はじめに
#####その他
https://tonari-it.com/python-webbrowser-open/
https://atcoder.jp/contests/abc074/glossary?lang=ja
https://code-graffiti.com/anaconda-navigator-does-not-start/


####辞書
[ASCII.jpデジタル用語辞典](https://yougo.ascii.jp/caltar/メインページ)
[IT用語辞典バイナリ](https://www.weblio.jp/cat/computer/binit)

####本
```
何をしますか?
000終了 001 用語説明 002 用語一覧 100 使い方 101 参考文献 102 設定 500 注意
>>>
```
というようにきく形式を本からかアイディアをもらいました(すみません、どの本かは忘れてしまいました)。