アンエスケープ 2018.12.8

問題の概要

あなたの知らない遠い世界。ここにもコンピュータがあり、ファイルシステムがあり、パスもある。

パスは「エントリ」と呼ばれる文字列のリストになっている。例えば、
foo/bar
というパスがある場合、 foobar がエントリである。

しかし。
我々の世界と異なり、エントリ名にパス区切り文字と同じスラッシュ / が使える。

というわけで、パスを文字列として表現しようとするとエスケープする必要がある。

で。

エスケープ済みのパス文字列を与えるので、アンエスケープしてほしい。

パス文字列とエスケープ

生のエントリ

生のエントリには、以下の文字が使える:

スラッシュ

パスを文字列として表現する際には、区切り文字としてスラッシュ / を使う。
スラッシュはエントリ内にも登場するので、エントリ内のスラッシュは区切り文字でないことを明示する必要がある。
区切り文字でないことを示しつつスラッシュを表現する方法は、下記の3通りがある:

以下に例を挙げる:

パス文字列 エントリのリスト
foo/bar/baz foo , bar , baz
foo"/"bar/baz foo/bar , baz
foo/'/bar/'/baz foo , /bar/ , baz
foo"/"bar/baz foo/bar , baz
foo//bar/baz foo/bar , baz
foo"//"bar/baz foo//bar , baz
foo///bar foo/ , bar
foo/bar////baz foo , bar//baz

クオート文字

区切り文字でない / を表現するのにクオート文字を使うので、クオート文字をエスケープする必要がある:

ダブルクオートで囲まれた範囲は、

シングルクオートも同様。
例を挙げる:

パス文字列 エントリのリスト
"foo'"/"bar'"/"baz'" foo' , bar' , baz'
File/'I/O' File , I/O
'foo//bar'//baz/qux foo//bar/baz , qux
What/is/'"real"' What , is , "real"
"foo'bar"/'hoge"fuga' foo'bar , hoge"fuga
'"'a'"'/b "a" , b
hoge"//"fuga//piyo hoge//fuga/piyo
'foo"""bar' foo"""bar

入力

入力はこんな感じ:
foo/bar/baz
パス文字列がそのまま来る。

出力

出力は、生のエントリのリストをコンマ区切りで。
こんな
foo,bar,baz
感じ。ただし、
/foo/bar/baz'/
のようなパス文字列として無効なもの(後述)に対しては、
-
を出力すること。

無効なパス文字列の条件

以下の場合は無効とする(とはいえ、前述の「生のエントリ」に含まれない文字が来た場合は不正な入力なので対処しなくてよい。下記のパターンに対処すれば良い。)

補足

サンプルデータ

# 入力 期待
0 foo/bar/baz foo,bar,baz
1 /foo/bar/baz'/ -
2 " -
3 ' -
4 / -
5 "" -
6 '' -
7 // /
8 "/' -
9 '/" -
10 Qux Qux
11 Foo/Bar Foo,Bar
12 foo"bar -
13 foo'bar -
14 /foo/bar -
15 Foo//Bar Foo/Bar
16 foo/bar/ -
17 '"'a'"'/b "a",b
18 Foo"/"Bar Foo/Bar
19 foo"'"bar foo'bar
20 foo'"'bar foo"bar
21 foo///bar foo/,bar
22 "Z""tO"uFM ZtOuFM
23 ''/foo/bar -
24 ////'/"//' ///"//
25 File/'I/O' File,I/O
26 Foo'//'Bar Foo//Bar
27 foo/''/bar -
28 foo/bar/"" -
29 '/////'//// ///////
30 'foo"""bar' foo"""bar
31 //'int'/V/c /int,V,c
32 foo/bar/baz foo,bar,baz
33 'H//Sg//zN'/ -
34 //'//"/'/'"' ///"/,"
35 foo//bar/baz foo/bar,baz
36 """///"/'/'// ///,//
37 58""N"//nIk'd -
38 foo"/"bar/baz foo/bar,baz
39 /////'"/'/'"/' //,"/,"/
40 f"//J"/O9o"//' -
41 foo"//"bar/baz foo//bar,baz
42 foo/bar////baz foo,bar//baz
43 """'/'//'''/"// '/'//'''//
44 8//'/k///"3da"' 8//k///"3da"
45 foo/'/bar/'/baz foo,/bar/,baz
46 ///''"//""///""" /,/////
47 //wUJ8KNAk'n0//" -
48 What/is/'"real"' What,is,"real"
49 "//'/////"''/'//' //'/////,//
50 "8hKE"3Fx/4//Hk/J 8hKE3Fx,4/Hk,J
51 '////''"'//'/"///' ////"//"///
52 Ro"/j''/2u/f/r/"3n Ro/j''/2u/f/r/3n
53 hoge"//"fuga//piyo hoge//fuga/piyo
54 'foo//bar'//baz/qux foo//bar/baz,qux
55 //'//"'/"///'"/''// ///",///',/
56 2/L'3'A8p/7//wP49Jb 2,L3A8p,7/wP49Jb
57 "foo'"/"bar'"/"baz'" foo',bar',baz'
58 '//'"//'///'///''"// ////'///'///''/
59 F6vX/q/Zu//5/'/H"/'w F6vX,q,Zu/5,/H"/w
60 "foo'bar"/'hoge"fuga' foo'bar,hoge"fuga
61 /"/'//'/"""''//'/"''' -
62 0gK"koYUb""S/p''z/"Et 0gKkoYUbS/p''z/Et
63 Foo/Bar/"Hoge'/'Fuga" Foo,Bar,Hoge'/'Fuga

C/C++/Java 用のテストデータ

JSON 形式のテストデータ

data.json