Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Algorytm] wypisujacy kolejne ciagi
flashdev
post
Post #1





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Ma ktos jakis algorytm potrafiacy generowac cos w tym stylu:

Kod
0003
0012
0021
0030
0102
0111
0120
0201
0210
0300
1002
1011
1020
1101
1110
1200
2001
2010
2100
3000


inny przykład:
Kod
004
013
022
031
103
112
121
130
202
211
220
301
310
400


*wypisalem to recznie wiec moga byc jakies drobne pomylki

Kod
var createCombinations = function(len, max){
  var cnt = [];
  var res = [];

  for( var i = 0; i < len; ++i ){
    cnt[i] = 0;
  }

  while( 1 ){
    if (cnt.reduce(function(a, b){
        return a + b;
      }, 0) === max-1) {
      res.push( cnt.slice() );
    }

    var brk = false;
    for (var i = len - 1; i >= 0; --i) {
      if (++cnt[i] >= max) {
        cnt[i] = 0;
      }else{
        brk = true;
        break;
      }
    }
    if (!brk) {
      break;
    }
  }

  res = res.map(function(arr){
    return arr.join('');
  });

  return res;
}

console.log( JSON.stringify(createCombinations(3, 9), null, '  ') );


Pewnie da sie to zrobic lepiej niz przefiltrowac wszystkie mozliwosci.

Ten post edytował flashdev 8.04.2013, 04:55:47


--------------------
Go to the top of the page
+Quote Post
PrinceOfPersia
post
Post #2





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


nareszcie ktoś ogarnięty, kto zna map i reduce w JS, a nie tylko ma problem z podstawami smile.gif
(nie jestem PHPowcem zasadniczo, na to forum przyciągnął mnie dział o JS, ale efekt taki, że głównie tylko siedzę i pomagam początkującym... :/)

haha, udało mi się zrobić prościej:
Kod
    
var base = 5;              
var length = 4;            
var max = 400;
                                                    
for (var i = 0; i < max; i++) {
   var s = i.toString(base);                  
   var res = ~~(s.split('').reduce(function(a, b) {            
      return ~~(a) + ~~(b);
   }));                                            
   if (res === base-1) {
      while (s.length < length) s = '0' + s;
      console.log(s);
   }                            
}


Ten post edytował PrinceOfPersia 8.04.2013, 06:33:07


--------------------
Go to the top of the page
+Quote Post
flashdev
post
Post #3





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Tzn fajnie to napisales widze ze tez znasz JS bardzo dobrze smile.gif
Ale w sumie to ten sam algorytm co ja zaproponowalem. Czyli biore wszyskie mozliwosci i filtruje po nich. Strasznie dlugo to dziala przy wiekszych liczbach smile.gif
A poza tym korzystajac z toString tracisz troszke na base, bo mozesz uzyc max 36 o ile sie nie myle od 0 do z. U mnie mozesz jechac po calym incie praktycznie.

Ale ogolnie dzieki za dobre checi smile.gif

Kod
res = res.map(function(arr){
    return arr.join('');
  });


Te 3 linijki to tylko dla czytelnosci dodalem smile.gif


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 17:23