@vrcalphabet/paiza-ts-input-parser
v2.3.4
Published
paiza-tsで入力データを型安全に取り出すためのライブラリ
Readme
paiza-ts
paiza-tsで入力データを型安全に取り出すためのライブラリ
使い方
- paiza-tsをセットアップしたディレクトリで、以下のコマンドを実行します。 ※ 最新版のcreate-paiza-tsでセットアップした場合、デフォルトでインストールされるのでこの手順は必要ありません。
npm i @vrcalphabet/paiza-ts-input-parsermain.tsなどでスキーマを定義(後述)したparseInputを実行します。
import { parseInput } from '@vrcalphabet/paiza-ts-input-parser'
const input = parseInput(`
+n
arr[]
point[x, y]
`)
// 入力例
// 5
// apple banana
// 10 -5
// 結果
// {
// n: 5,
// arr: ["apple", "banana"],
// point: ["10", "-5"]
// }スキーマ構文
name: 次の文字列を読む+name: 次の数値を読むa, b, +c: 同じ行の複数カラムを読むname={...}: 文字列リテラルのユニオンを指定する(パイプ(|)区切り)name # name: string +n # n: number dir={N|E|S|W} # dir: "N" | "E" | "S" | "W"arr[]: 1行を文字列配列として読む+arr[]: 1行を数値配列として読むarr[][]: その行以降の全行を文字列配列として読む+arr[][]: その行以降の全行を数値配列として読むarr[0][]: その行以降の全行の1列目だけを取り出して文字列配列として読む+arr[0][]: その行以降の全行の1列目だけを取り出して数値配列として読む+C arr[][C] # arr[0][C] # ...arr[C] # obj[a, b][C]直前に読み取った数値分の行数を読む
...s: 1行を1文字ずつ分割して文字列配列として読む...+n: 1行を1文字ずつ分割して数値配列として読む...arr[]: その行以降の全行を1文字ずつ分割して文字列配列として読む...+arr[]: その行以降の全行を1文字ずつ分割して数値配列として読むobj[a, +b]: 同じ行の複数カラムからオブジェクトを作るobj[a, +b][]: その行以降の全行からオブジェクト配列を作る+~name: 読んだ数値から1引いたものを結果にする(paizaの問題はすべて1オリジンなので、JSで配列直アクセスをするために0オリジンに直す構文)# +~name1 # +~arr1[] # +~arr2[][] # ...+~n # ...+~arr[] # ...obj[+~a]_name,+_name: 値を読み取るが結果に含めない# コメント: 行コメント
例1: 単一値と複数列
入力:
3
alice 20 mathスキーマ:
+n
name, +age, _subject # これはコメントです。先頭に _ が付いている変数は出力されません。結果:
{
n: 3,
name: "alice",
age: 20,
}例2: 配列と複数行配列
入力:
red blue green
11 22 33 44
1 2
3 4スキーマ:
colors[]
+numbers[]
+grid[][]結果:
{
colors: ["red", "blue", "green"],
numbers: [11, 22, 33, 44],
grid: [
[1, 2],
[3, 4],
],
}例3: スプレット構文
入力:
GREEN
12345
67890スキーマ:
...color
...+map[]結果:
{
color.: ["G", "R", "E", "E", "N"],
map: [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 0],
],
}例4: オブジェクト形式と無視変数
入力:
3
200 300
id-1 taro 90
id-2 hanako 85スキーマ:
+n
prices[+apple, banana]
rows[_id, name, +score][]結果:
{
n: 3,
prices: {
apple: 200,
banana: "300",
},
rows: [
{ name: "taro", score: 90 },
{ name: "hanako", score: 85 },
],
}例5: 行数指定
入力:
3
10
20
30
2
taro jiro 2
jiro taro 1スキーマ:
+n
+points[0][n]
+m
logs[from, to, +type][m]結果:
{
n: 3,
points: [10, 20, 30],
m: 2,
logs: [
{ from: "taro", to: "jiro", type: 2 },
{ from: "jiro", to: "taro", type: 1 },
],
}例6: +~ 構文
入力:
2
1 3
2 4スキーマ:
+n
+~entry[][n]結果:
{
n: 2,
entry: [
[0, 2],
[1, 3],
],
}注意点
arr[][]/...arr[]/obj[...][]のような複数行を読む構文は、その行から末尾までをすべて消費します。これより下の行にスキーマがあっても無視されます。- 行数や列数が不足している場合は、実行時に
Errorが投げられます。 - スキーマ自体の構文ミスは、TypeScript の型エラーとして検出されます。(!)
貢献
プロジェクトへの貢献を歓迎します!以下のルールに従うと,あなたの貢献がスムーズになります!
Issue / PR
Issueを立てる際は,バグ報告・機能要望のどちらかを明記してください。 PRの説明には,目的・変更点・影響範囲・サンプルコードがあるとありがたいです。
※スクリーンショットを添付する際は、チャレンジ問題の問題文が画像に含まれていないことを確認してください。
ライセンス
MIT License
詳細はLICENSEファイルを参照してください。
