2011-02-28 45 views
2

我有一個字符串驗證函數,我想優化。該字符串長度爲2n,由01組成,例如str="100001"。我想測試:Mathematica中的字符串驗證

1)的數量(是否必須在字符串中奇怪indexded位置1的不小於1)等於在均勻索引位置

2)是否對於每StringTake[str,2*i],i運行從1n-1,1在該字符串中的奇怪索引位置中的數量不等於均勻索引位置中的數量。

總之,我想測試位置2n是否首次在字符串中的奇怪indexded位置1的數量等於在均勻度位置。

"100001"101101是一個很好的字符串,但不100100100000也不000000

非常感謝。

回答

5

此代碼不測試無效字符串(字符不是「0」或「1」,長度不均勻)。

goodString[str_String] := Module[ 
    {digits, cumdiffs, pos}, 
    digits = Transpose[Partition[ 
    IntegerDigits[ToExpression[str], 10, StringLength[str]], 2]]; 
    cumdiffs = Subtract @@ Accumulate /@ digits; 
    pos = Position[cumdiffs, 0, 1, 1]; 
    Length[pos] == 1 && pos[[1, 1]] == Length[cumdiffs] 
] 

你的例子:

goodString /@ {"100001" , "101101", "100100", "100000", "000000"} 

缺貨[302] = {TRUE,TRUE,FALSE,FALSE,FALSE}

可能有更快的方式例如與NestList。此外,如果速度是一個大問題,字符串可能很長,您可以在預處理中分割出IntegerDigits [ToExpression [...]],並在其餘部分使用Compile。

丹尼爾Lichtblau 沃爾夫勒姆研究

+0

對於「000011」結果是否可以? – 2011-03-01 02:54:42

+0

@belisarius這應該是False,因爲1的數目在第一個偶數和第一個奇數條目中是相同的。我的代碼錯誤(可能是特殊情況)的情況是「00」。聲稱是真實的,但違反規則,我們至少需要一個1。 – 2011-03-01 22:24:18

+0

我發表了評論,然後意識到它是如此。但忘了刪除評論。對不起,謝謝 – 2011-03-01 22:40:01

1

(道歉男生代碼,這是我用繩子在Mathematica中的第一次努力,所以我留在我的思想-AS-I-去了,也有一些註釋掉的調試/追蹤值)

charcountsvec[s_String, c_String] := Table[ 
    If[StringTake[s, {i, i}] == c, 1, 0] 
    , {i, 1, StringLength[s]} 
]; 

oddchars[s_String] := StringTake[s, {1, -1, 2}]; (*pick out odd chars*)  
evenchars[s_String] := StringTake[s, {2, -1, 2}]; 

validatestr[str_String] :=  
Block[{evencounts, oddcounts, answer1, answer2 (*, odds, evens*)}, 
    evencounts = [email protected][(*evens=*)evenchars[str], "1"]; 
    oddcounts = [email protected][(*odds=*)oddchars[str], "1"]; 
    (*my interpretation of "number of 1's in odd positions the same as in even positions"*)  
    answer1 = Last[oddcounts] == Last[evencounts]; 
    (*my interpretation of "for every..string...whether number of 1's in even/odd positions is not equal"*)  
    answer2 = Fold[And, True, 
    MapThread[Unequal, {Most[oddcounts], Most[evencounts]}]]; 

    {str, And[answer1, answer2](*,odds,evens,oddcounts,evencounts,answer1,answer2*)} 
    ]; 

測試:

validatestr/@{"100001","101101","100100","100000","000000"} 

{{ 「100001」,TRUE},{ 「101101」,TRUE},{ 「100100」,FALSE},{ 「100000」, FALSE},{ 「000000」,FALSE}}

validatestr["0000001"](*odd length string pukes, and returns False*) 

期間的(本地)評價在[428]:= MapThread :: MPTC:在位置{2物體的尺寸不兼容,1}和{2 ,2} MapThread [不等式,{{0,0,0},{0,0}}];維度是{3}和{2}。 >>

(Local)Out [432] = {「0000001」,False}