progs/catastrophic/catastrophic.js
author Christian Urban <christian.urban@kcl.ac.uk>
Wed, 10 Sep 2025 15:57:21 +0100
changeset 982 617fc6cfc94a
parent 753 30ea6b01db46
permissions -rwxr-xr-x
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
745
905b60a029bf updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 741
diff changeset
     1
#!/usr/local/bin/node
614
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     2
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     3
// A case of catastrophic backtracking in JavaScript/Node.js
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     4
//
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     5
// regex: (a*)*b
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     6
// strings: aa...
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     7
//
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     8
// call with:
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     9
//
753
30ea6b01db46 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 745
diff changeset
    10
//  $> ./catastrophic.js 20
614
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    11
//
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    12
// call with timing as:
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    13
//
753
30ea6b01db46 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 745
diff changeset
    14
//  $> time ./catastrophic.js 25
614
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    15
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    16
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    17
const args = process.argv[2]
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    18
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    19
var str = 'a'.repeat(args);
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    20
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    21
console.log(str)
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    22
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    23
var re = /^((a)*)*b$/;
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    24
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    25
var res = re.test(str);
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    26
3ed8ac396863 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    27
console.log(res)