2012年3月26日 星期一

節約符咒

梅蘭城的法師們研究出了一種魔法道具:符咒。
即便是未曾學習魔法的人,
只要念出符咒上獨特的咒語就能施展特定魔法,
並且該咒語的魔力就會消失。
現在為了訓練新進的法師,需要使用大量的符咒。
但是梅蘭城(不事生產的)法師們並不會造紙這種技術,必須從首都艾克隆購買。
在紙張有限的情況下,
必須按照特定的規則來記述這些為數龐大的咒語才行。
假設有一張地震術符咒的內容是:aaabb
咒語是由三個a和兩個b所組成,所以在符咒上的記述內容必須改成:3a2b
並且咒語的每個字都是有順序的,假如符咒治癒術是xxxyywwyy的話,必須記作3x2y2w2y,"y"的部分不能記作4y
如果採取這個格式後沒有得到咒文的節約,那麼就選擇直接使用原本的咒語就可以了。
然而…
越強的法術寫出來的咒文就會越臭長!快寫個程式幫助魔法師節約咒文吧!
(他們總是基於好奇喜歡對電腦這東西施展破壞性的閃電魔法,所以沒人知道怎麼寫程式。)


輸入說明 :
第一行有正整數n(1<=n<=10000000),表示原本咒文的長度(以字元為單位)
第二行則是咒文的內容連續的n個字元。
其中咒文的字元是由小寫字母所組成。

輸出說明 :
如果簡化過的咒文長度小於原咒文,則輸出簡化版本
如果簡化後和原咒文字數相同甚至更多,則輸出原咒文

範例輸入 :
20 
aaaaabbbbbcccccaabba 
3 
abc
範例輸出 :
5a5b5c2a2b1a 
abc

3 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Input #1, x
    Line Input #1, y
    b = 0
    c = 0
    a = Mid(y, 1, 1)
    ans = ""
    For i = 1 To x + 1
    c = c + 1
    If a = Mid(y, i, 1) Then
    b = b + 1
    Else
    ans = ans & b & a
    a = Mid(y, c, 1)
    b = 1
    End If
    Next
    If Len(ans) > x Then
    Print #2, y
    Else
    Print #2, ans
    End If
    Loop
    Close
    Close
    End
    End Sub

    回覆刪除
  2. 小冰好,
    程式正確。
    計數歸零的地方,寫的很好。
    (Else
    ans = ans & b & a
    a = Mid(y, c, 1)
    b = 1
    End If)
    當中的 b=1的部分。

    回覆刪除
  3. Private Sub Form_Load()
    Dim g() As String
    Dim tf As Boolean
    Me.Hide
    tf = False
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Input #1, n
    Input #1, r
    ReDim g(Len(r) + 1)
    For i = 1 To Val(n)
    g(i) = Mid(r, i, 1)
    Next i
    s = 1
    ans = ""
    For i = 2 To UBound(g)
    If g(i) = g(i - 1) Then
    s = s + 1
    Else
    If s = 1 Then s = ""
    ans = ans & s & g(i - 1)
    s = 1
    End If
    Next i
    Print #2, ans
    Print #2,
    Loop
    Close #2
    Close #1
    End
    End Sub

    回覆刪除