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


目から鱗な方法を思いつけなかったので、没ネタに。