プログラマ4級【Valid Braces (括弧の妥当性チェック)】このプログラミング問題があなたに解けるでしょうか！！(XML/HTML/Lispソースパーザーの基礎テクニック)

[【Codewars】ブラウザでコーディングの基礎からトレーニングできるサイト (ブラウザでvimが使えて32種類のプログラミング言語に対応。4000個以上の問題が投稿されています！)](https://qiita.com/javacommons/items/7c473cda7825ab99e08c) という記事で Codewars サイトを紹介させていただいたんですが、なんせ英語のサイトなので「問題が読めましぇーん」という方も少なくないと思いますので、簡単な(正答率の多い)問題から順に「問題文の日本語訳」を提示してみたいと思います。

**尚、Codewars にサインアップしてなくても問題を解くことはできますので、上記記事をご覧になって操作方法についてご理解いただけたら、下記の「URL:」をクリックして問題のページに直接とんでください。IDE(解答)画面を開くには「TRAIN(トレーニングをする)」というボタンをクリックしてください。**

**[Codewars](https://qiita.com/javacommons/items/7c473cda7825ab99e08c) はブラウザ上で(自分のマシンに開発環境がなくても)コード作成・デバッグ・(問題作成者が提供する)テストの実行ができて、「正解であるとお墨付きがもらえた時点で解答を提出できる」という特徴があります。(なので、ラクチンで安心です。また、[CodinGame](https://qiita.com/javacommons/items/86efba2d0ce6b2a21fb9) もその点は同じです)
また、本テストを含めてテスト実行でエラーとなっても一切ペナルティはありませんので、(ご自身の環境の方が開発しやすいという理由でなければ)、Codewars上(ブラウザ内)でがんがんテスト実行してみてくださいね。**

**【追記2018/01/15】
オンラインプログラム実行環境「paiza.io」上にテスト環境を用意しました(但し、JavaScriptのみ。他の言語についてはCodewars上でテスト実行をお願いします)。下記URLを開いて「answer.js」を編集した後で Ctrl-Enter を押してください。コンソールに「All Tests Successful.」と表示されたら成功です。(paiza.io の使い方が分からない場合はコメントしてください。よろしくお願いいたします)**
https://paiza.io/projects/UVzT6SOGVrUMoZcWy7RPBg?locale=ja-jp

ご不明な点があったらコメントしてくださいませ。また、無事に SUBMIT できたら、是非とも自慢の解答(ソースコード)をコメント欄に貼り付け(投稿)してください。問題がサポートしている言語であれば、どのプログラミング言語を使っていただいても構いません。

* 問題の名称: Valid Braces (括弧のバリデーションチェック)
* URL: https://www.codewars.com/kata/valid-braces
* 対応言語: **CoffeeScript C++ C# Dart Elixir Haskell Java JavaScript PHP Python Ruby Rust Swift TypeScript (※Codewars の各問題は32種類のプログラミング言語のうちのいずれかに対応しています。問題毎に対応言語が異なります)**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/2c85a0ba-8f4e-554f-458b-857778c9d61e.png)

# さて今回の問題文です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/e0f628e0-d049-f38a-8c9b-89260119fc5a.png)

```:【上記問題文の日本語訳】
Write a function that takes a string of braces, and determines if the order of the braces is valid. It should return true if the string is valid, and false if it's invalid.
一連のカッコ群を含む文字列を受け取り、カッコの順番が妥当かどうかを判定する関数を書いてください。
文字列が妥当であれば true を、妥当でない場合は false を返すものとします。

All input strings will be nonempty, and will only consist of parentheses, brackets and curly braces: ()[]{}.
入力文字列はすべて空ではなく、parentheses, brackets, curly braces つまり ()[]{} のいずれかで構成されています。

What is considered Valid? どういう場合に妥当とみなされるか

A string of braces is considered valid if all braces are matched with the correct brace.
全てのカッコが正しい(同種の)カッコとマッチする場合に文字列が妥当であるとみなされます。
```

```:【サンプル】

"(){}[]"   =>  True
"([{}])"   =>  True
"(}"       =>  False
"[(])"     =>  False
"[({})](]" =>  False
```

# 今回の問題はパージングの基本テクニックです。

入れ子になった複数種のカッコの対応を取ることができれば、XML(やHTML)のようなものを解析するような場合にも役立ちます。(XML/HTMLタグの対応関係等を解析するための基礎となります) また、例えばダブルクオート等の括弧以外の記号にも対応させれば、Lispのソースコードにおける文字列を解析するのにも役立ちます。今回の問題の入力は単純ですので、プログラムの仕組み作りを頑張ってみてくださいね。

**ヒントとしては「スタック」を使うと良いかもしれません。**

尚、必ずしも Codewars サイト(のIDE)上で開発されるとは限らないので、本テストの入力データと期待される出力(正解の値)を【本テストデータ】として以下に載せています。ご自分の環境(マシン)で開発される方は、これらのデータを使ってテスト(動作検証)をしてみてください。

今回は私のコードは載せません。是非解答をコメントでお寄せください。(Codewars で作業されていない場合でも、ソースコードを貼り付けていただければ私の方で動作確認をして結果をお知らせします。)

それでは！ｗ　次回をお楽しみに！！ｗｗ

```:【本テストデータ】(※本テストではランダムなデータが使われることがあり、ここに示したデータ以外が入力されることがあります)
Time: 505ms Passed: 15 Failed: 0

[Test1]
input=()
Test Passed: Value == true

[Test2]
input=[]
Test Passed: Value == true

[Test3]
input={}
Test Passed: Value == true

[Test4]
input=(){}[]
Test Passed: Value == true

[Test5]
input=([{}])
Test Passed: Value == true

[Test6]
input=(}
Test Passed: Value == false

[Test7]
input=[(])
Test Passed: Value == false

[Test8]
input=({})[({})]
Test Passed: Value == true

[Test9]
input=(})
Test Passed: Value == false

[Test10]
input=(({{[[]]}}))
Test Passed: Value == true

[Test11]
input={}({})[]
Test Passed: Value == true

[Test12]
input=)(}{][
Test Passed: Value == false

[Test13]
input=())({}}{()][][
Test Passed: Value == false

[Test14]
input=(((({{
Test Passed: Value == false

[Test15]
input=}}]]))}])
Test Passed: Value == false

```

# 問題文を日本語訳してみるプロジェクト！！ｗ (どんどん問題がチャレンジングになりますよ～！)

* [プログラマ8級【Even or Odd (偶数または奇数)】このプログラミング問題があなたに解けるでしょうか！！](https://qiita.com/javacommons/items/908d87efd41af6cece3d)
* [プログラマ5級【Moving Zeros To The End (ゼロを最後尾に移動)】このプログラミング問題があなたに解けるでしょうか！！](https://qiita.com/javacommons/items/f37ca062958267241b78)
* [プログラマ4級【Sum Strings as Numbers (文字列を数値として加算)】このプログラミング問題があなたに解けるでしょうか！！(Number.MAX_SAFE_INTEGER を超える正の整数値における和算器を実装しなさい)](https://qiita.com/javacommons/items/3434ffd780a512a880e8)
* [プログラマ4級【Valid Braces (括弧の妥当性チェック)】このプログラミング問題があなたに解けるでしょうか！！(XML/HTML/Lispソースパーザーの基礎テクニック)](https://qiita.com/javacommons/items/9cdd4fdbf6e74c7f106b)