2014-10-15 6 views
1

Мне нужно закодировать алгоритм, который, давая шестнадцатеричную строку, генерирует массив с 5 элементами из 4 шестнадцатеричных цифр и еще один массив с 2 элементами из 2 шестнадцатеричных цифр. Уникальные два помещения:Javascript split string в подстроках разного размера

  • если 4 цифры строка = «0000» не принимать это во внимание, и если 2 цифры длиной гекс «00» (EDIT: или «01») Дон» Не учитывайте это.
  • не используют цифры, используемые для пяти строк 4char для строк 2char. Я не возражаю, если вы начинаете формировать начало, а другое - с конца или середины, или оба из середины ... Я имею в виду, что подстроки не должны быть последовательными, они просто должны отличаться от 0 и одинаковые позиции строк, которые не используются в обоих массивах. Edit: Представьте себе, что пять последовательностей 4char построены с использованием первых 20 символов (нет последовательности «0000» после разделения основной строки каждые четыре символа). Это означает, что две последовательности 2char не должны принимать во внимание первые 20 символов, поскольку они уже использовались.

Пример одного правильного вывода:

Строка: 87b86156d0000a4200005e02002f56614f7a2f54f7ebf45670ed62cbaa78e6f228297b0e7338215fb4

Первый массив: [ "87b8", "6156", "D000", "0a42", "5e02"]

второй массив: [ "2f", "56"]

Мой подход начинается так:

var mystring = "87b86156d0970a4200005e02612f56614f7a2f54f7ebf45670ed62cbaa78e6f228297b0e7338215fb4" 
var firststring = mystring.match(/.{1,4}/g); 

Который дает мне:

[ "87b8", "6156", "d097", "0a42", "0000", ...]

затем:

for (x=0;x<firststring.length;x++){ 
     if (firststring[x]=="0000") {firststring.splice(x, 1)} 
} 

    var secondstring = mystring.match(/.{1,2}/g); 

Что дает мне:

[ "87", "b8", "61", "56", "d0", "97" ...]

for (x=0;x<secondstring.length;x++){ 
     if (secondstring[x]=="00") {secondstring.splice(x, 1)} 
} 

Вот где я теряюсь, я не знаю точно, как кодировать ту часть, где я избежать основных строк цифр (позиции), которые будут использоваться в обоих массивах ...

С уважением,

ответ

1

Ну , это не красиво, но это работает:

var str = "87b86156d0970a4200005e02612f56614f7a2f54f7ebf45670ed62cbaa78e6f228297b0e7338215fb4"; 

var grabLength = 4, 
    // 4-char strings 
    grp1 = [], 
    // 2-char strings 
    grp2 = [], 
    chunk; 

while(chunk = str.slice(0, grabLength)) { 
    str = str.slice(grabLength); 

    // skip all zeros 
    if (/^0+$/.test(chunk)) continue; 

    if (grabLength === 4) { 
    if (grp1.push(chunk) === 5) { 
     grabLength = 2; 
    } 
    continue; 
    } 

    // skip 2-char sequences that match the start of a 4-char sequence 
    var hasMatch = false; 
    for (var i = 0; i < grp1.length; i++) { 
    if (chunk === grp1[i].slice(0, 2)) { 
     hasMatch = true; 
     continue; 
    } 
    } 
    if (hasMatch) continue; 

    grp2.push(chunk); 

    if (grp2.length === 2) break; 
} 

console.log(grp1); 
console.log(grp2); 

JSBin

+0

это здорово работает! Мне просто интересно, почему он получил «2f» в качестве первой строки с 2-значной длиной после последней 4-значной длины «5e02» вместо следующей подстроки с 2-значной длиной, которая была «61» ... – Egidi

+0

ОК, я вижу, так как «61» уже является частью второй строки с четырьмя цифрами, это не учитывает ее ... в этом случае она должна учитывать это, поскольку 61 находится в разных местах и ​​должен действительны для первой строки с 2-значной длиной – Egidi

+0

Можете ли вы объяснить, что вы подразумеваете под положением? Я интерпретировал это как «первые два символа любой из 4-х символьных строк». Если вместо этого «первая 2-символьная последовательность не должна совпадать с первыми двумя символами в первой 4-символьной последовательности»? – jmar777