UWSCで文字列変換を考える
先日、公式掲示板にUWSC FizzBuzzコードゴルフを投稿した。
他にお題ないか考えていたのだけど、なかなかいいのが見つからない。
「AABBCCC」を「A2B2C3」に変換、というのを見つけたのでやってみたが、、、短くなりそうな気配がない、、、、。
一応、書いておく。
スクリプト
素直に書いてみる。
元の文字列にはアルファベットしかない想定ね。
MSGBOX(Compress("ABBbbbbbbbbbbbbbbbbbbbbbbbbbbBCCCCCCBBBBddddddddddd")) FUNCTION Compress(str) c=1 p=COPY(str,1,1) FOR i = 2 TO LENGTH(str) t=COPY(str,i,1) IF t<>p THEN RESULT=RESULT+p+c p=t c=0 ENDIF c=c+1 NEXT IF c THEN RESULT=RESULT+p+c FEND
大文字・小文字の件は放置。
SPLITを駆使してみる。
素直に書いた方が短い、、、。
FUNCTION Compress(str) WHILE LENGTH(str) t=COPY(str,1,1) a=SPLIT(str,t) FOR l=0 TO LENGTH(a)-2 b=LENGTH(a[l]) a[l]=JOIN(SLICE(a,l),t) IF b THEN BREAK NEXT RESULT=RESULT+t+l str=a[l] WEND FEND
正規表現は、、、UWSCコードゴルフでは不利だけど意外にすっきり。
でも、素直に書いた方が短い。
FUNCTION Compress(str) r=CreateOleObj("VBScript.RegExp") r.Pattern="(.)\1*" WHILE LENGTH(str) m=r.Execute(str) RESULT=RESULT+COPY(str,1,1)+LENGTH(m.Item(0).Value) str=r.Replace(str,"") WEND FEND
正規表現を使うなら、こんな書き方もできる。
が、上の方が短い。
でも、Executeが一回なのがウリ。
FUNCTION Compress(str) r=CreateOleObj("VBScript.RegExp") r.Pattern="(.)\1*" r.Global=TRUE m=r.Execute(str) FOR i=0 TO m.Count-1 RESULT=RESULT+m.Item(i).SubMatches.Item(0)+LENGTH(m.Item(i).Value) NEXT FEND
目から鱗な方法を思いつけなかったので、没ネタに。