2011年4月21日 星期四

節約符咒

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


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

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

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

6 則留言:

  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, nlong
    Input #1, N

    Print #2, ans(N, nlong)

    Loop

    Close
    Close
    End
    End Sub


    Function ans(a, b)

    Dim X, tmpX, cou, N, Nans As String



    N = 1


    Do
    For i = N To b
    X = Mid(a, i, 1)
    If X = tmpX Or tmpX = "" Then cou = cou + 1 Else Exit For
    tmpX = X
    Next

    '處理cou

    Nans = Nans & cou & tmpX

    '--------

    N = i
    tmpX = ""
    cou = 0
    Loop Until i > b


    If Len(Nans) < b Then ans = Nans Else ans = a
    End Function

    回覆刪除
  2. Private Sub Form_Load()
    Dim Times As Integer
    Dim N As String

    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, Times
    Input #1, N
    K = 1
    ans = ""
    For i = 1 To Times
    If Mid(N, i, 1) = Mid(N, i + 1, 1) Then
    K = K + 1
    Else
    ans = ans & K & Mid(N, i, 1)
    K = 1
    End If
    Next i

    If Len(ans) > Len(N) Then ans = N
    Print #2, ans

    Loop

    End
    End Sub

    很有趣的題目^^

    回覆刪除
  3. Private Sub Form_Load()
    Me.Hide
    Dim m As String
    Open App.Path & "\out.txt" For Output As #2
    Open App.Path & "\in.txt" For Input As #1

    Do Until EOF(1)
    Input #1, n, m
    ans = ""
    x = Split("a b c d e f g h i j k l m n o p q r s t u v w x y z")
    s = 0
    i = 0
    c = 1
    Do Until c > n
    If x(i) = Mid(m, c, 1) Then
    s = s + 1
    c = c + 1
    Else
    If s <> 0 Then
    If s = 1 Then
    ans = ans & x(i)
    Else
    ans = ans & s & x(i)
    End If
    End If
    s = 0
    If i = 25 Then i = 0 Else i = i + 1
    End If
    Loop

    If s <> 0 Then
    If s = 1 Then
    ans = ans & x(i)
    Else
    ans = ans & s & x(i)
    End If
    End If

    Print #2, ans
    Loop

    Close #1
    Close #2
    End
    End Sub
    --------------------
    in.txt
    20
    aaaaabbbbbzzzzzwwyyn
    3
    abc
    1
    a
    5
    bbbbb
    --------------------------
    out.txt
    5a5b5z2w2yn
    abc
    a
    5b

    回覆刪除
  4. arro,佑,好,
    你們兩個的程式都有小錯誤哦。你們去試試緣尉的輸入,看會不會得到同樣的輸出呢?
    arro你的那個雙迴圈,是不是用同一個迴圈就完成了呢?

    緣尉好,
    你的程式ok,而且,將輸入輸出給po上來,很好。繼續加油。

    回覆刪除
  5. Private Sub Form_Load()
    Me.Hide
    Dim m As String
    Open App.Path & "\out.txt" For Output As #2
    Open App.Path & "\in.txt" For Input As #1

    Do Until EOF(1)
    Input #1, n, m
    ans = ""
    x = Split("a b c d e f g h i j k l m n o p q r s t u v w x y z")
    s = 0
    i = 0
    c = 1
    Do Until c > n
    If x(i) = Mid(m, c, 1) Then
    s = s + 1
    c = c + 1
    Else
    If s <> 0 Then
    If s = 1 Then
    ans = ans & x(i)
    Else
    ans = ans & s & x(i)
    End If
    End If
    s = 0
    If i = 25 Then i = 0 Else i = i + 1
    End If
    Loop
    If s <> 0 Then ans = ans & s & x(i)
    If Len(ans) >= Len(m) Then ans = m

    Print #2, ans
    Loop

    Close #1
    Close #2
    End
    End Sub
    ----------------------------
    恩 原來看錯題義了-. -
    in.txt
    20
    aaaaabbbbbcccccaabba
    3
    abc
    6
    abcccc
    6
    abcdef
    ------------------------
    out.txt
    5a5b5c2a2b1a
    abc
    ab4c
    abcdef

    回覆刪除
  6. 1.OK,原來是我也看錯了。
    所以,題目要看清楚,不然就白花了時間哦。
    2.也知道,題目可以小小改變一下要求,就是另外的一小題了。
    在解題目時,也可以試著想想,題目如何怎麼改了,要怎麼去解。舉1反3,就是這個意思,試試吧。

    回覆刪除