Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Eine Liste von Zahlen gleicher Länge (Postleitzahlen)
- # zu einem regulären Ausdruck zusammenfassen,
- # der eine Obermenge der Zahlen gemäß ihrer Ziffernverteilung repräsentiert
- # die unten folgende Liste gibt z.B. den regex
- #
- # [5-6][0-7]\d\d
- #
- # Die Idee ist verfeinerbar:
- # für alle einzelnen Ziffern in jeder Position absteigen
- # "wenn es sich lohnt", d.h. für einzelne Ziffern eine "seltene" Kombination vorkommt:
- # diese in eine Alternierung aufnehmen ...|...
- use strict;
- use warnings;
- use v5.28;
- use Carp::Assert;
- use List::Util qw(all);
- use Set::Light;
- my @plz = (<DATA>);
- chomp @plz;
- my $result = regexify( \@plz );
- say $result;
- # Collect the set of digits in each place
- sub regexify {
- my @array = @{ shift() };
- my $length = length( $array[0] );
- assert all { length == $length } @array;
- my @digitSets = map { Set::Light->new() } (1..$length);
- for my $w (@array) {
- for my $i (0..$length-1) {
- $digitSets[$i]->insert( substr( $w, $i, 1) );
- }
- }
- my $result = "";
- for my $s (@digitSets) {
- $result .= simplify( join '',sort keys %$s);
- }
- return $result;
- }
- # This serves only to prettify the result, replacing e.g. [5678] by [5-8]
- sub simplify {
- my @digits = split '',shift;
- assert all { $digits[$_] > $digits[$_-1] } (1..$#digits);
- my @stack = ([-1,-1]);
- my $low = sub : lvalue { $stack[-1]->[0] };
- my $high = sub : lvalue { $stack[-1]->[1] };
- for my $d (@digits) {
- my ($l,$h) = (&$low(),&$high());
- if ($l == -1) {
- &$low() = $d;
- } elsif ($h == -1) {
- if ($l == $d - 1) {
- &$high() = $d;
- } else {
- push @stack, [$d,-1];
- }
- } elsif ($h == $d - 1) {
- &$high() = $d;
- } else {
- push @stack, [$d,-1];
- }
- }
- my $result = join '',map {
- $_->[1] == -1 ?
- $_->[0] :
- ($_->[0] == 0 and $_->[1] == 9) ?
- "\\d" :
- "[$_->[0]-$_->[1]]"
- } @stack;
- return $result;
- }
- __DATA__
- 5000
- 5001
- 5004
- 5010
- 5012
- 5013
- 5014
- 5015
- 5017
- 5018
- 5022
- 5023
- 5024
- 5025
- 5026
- 5027
- 5028
- 5032
- 5033
- 5034
- 5035
- 5036
- 5037
- 5040
- 5042
- 5043
- 5044
- 5046
- 5053
- 5054
- 5056
- 5057
- 5058
- 5062
- 5063
- 5064
- 5070
- 5072
- 5073
- 5074
- 5075
- 5076
- 5077
- 5078
- 5079
- 5080
- 5082
- 5083
- 5084
- 5085
- 5102
- 5103
- 5105
- 5106
- 5107
- 5108
- 5112
- 5113
- 5116
- 5200
- 5201
- 5210
- 5212
- 5213
- 5222
- 5223
- 5224
- 5225
- 5232
- 5233
- 5234
- 5235
- 5236
- 5237
- 5242
- 5243
- 5244
- 5245
- 5246
- 5272
- 5273
- 5274
- 5275
- 5276
- 5277
- 5300
- 5301
- 5303
- 5304
- 5305
- 5306
- 5312
- 5313
- 5314
- 5315
- 5316
- 5317
- 5318
- 5322
- 5323
- 5324
- 5325
- 5326
- 5330
- 5332
- 5333
- 5334
- 5400
- 5401
- 5402
- 5404
- 5405
- 5406
- 5408
- 5412
- 5413
- 5415
- 5416
- 5417
- 5420
- 5423
- 5425
- 5426
- 5430
- 5431
- 5432
- 5436
- 5442
- 5443
- 5444
- 5445
- 5452
- 5453
- 5454
- 5462
- 5463
- 5464
- 5465
- 5466
- 5467
- 5502
- 5503
- 5504
- 5505
- 5506
- 5507
- 5510
- 5512
- 5522
- 5524
- 5525
- 5600
- 5601
- 5603
- 5604
- 5605
- 5606
- 5607
- 5608
- 5610
- 5611
- 5612
- 5613
- 5614
- 5615
- 5616
- 5617
- 5618
- 5619
- 5620
- 5621
- 5622
- 5623
- 5624
- 5625
- 5626
- 5627
- 5628
- 5630
- 5632
- 5634
- 5636
- 5637
- 5642
- 5643
- 5644
- 5645
- 5646
- 5647
- 5702
- 5703
- 5704
- 5705
- 5706
- 5707
- 5708
- 5712
- 5722
- 5723
- 5724
- 5725
- 5726
- 5727
- 5728
- 5732
- 5733
- 5734
- 5735
- 5736
- 5737
- 5742
- 5745
- 5746
- 6000
- 6002
- 6003
- 6004
- 6005
- 6006
- 6007
- 6008
- 6009
- 6010
- 6011
- 6012
- 6013
- 6014
- 6015
- 6016
- 6017
- 6018
- 6019
- 6020
- 6021
- 6022
- 6023
- 6024
- 6025
- 6026
- 6027
- 6028
- 6030
- 6031
- 6032
- 6033
- 6034
- 6035
- 6036
- 6037
- 6038
- 6039
- 6042
- 6043
- 6044
- 6045
- 6047
- 6048
- 6052
- 6053
- 6055
- 6056
- 6060
- 6061
- 6062
- 6063
- 6064
- 6066
- 6067
- 6068
- 6072
- 6073
- 6074
- 6078
- 6102
- 6103
- 6105
- 6106
- 6110
- 6112
- 6113
- 6114
- 6122
- 6123
- 6125
- 6126
- 6130
- 6132
- 6133
- 6142
- 6143
- 6144
- 6145
- 6146
- 6147
- 6152
- 6153
- 6154
- 6156
- 6160
- 6161
- 6162
- 6163
- 6166
- 6167
- 6170
- 6173
- 6174
- 6182
- 6192
- 6196
- 6197
- 6203
- 6204
- 6205
- 6206
- 6207
- 6208
- 6210
- 6211
- 6212
- 6213
- 6214
- 6215
- 6216
- 6217
- 6218
- 6221
- 6222
- 6231
- 6232
- 6233
- 6234
- 6235
- 6236
- 6242
- 6243
- 6244
- 6245
- 6246
- 6247
- 6248
- 6252
- 6253
- 6260
- 6262
- 6263
- 6264
- 6265
- 6274
- 6275
- 6276
- 6277
- 6280
- 6281
- 6283
- 6284
- 6285
- 6286
- 6287
- 6288
- 6289
- 6294
- 6295
- 6300
- 6301
- 6302
- 6303
- 6304
- 6310
- 6312
- 6313
- 6314
- 6315
- 6317
- 6318
- 6319
- 6330
- 6331
- 6332
- 6333
- 6340
- 6341
- 6342
- 6343
- 6344
- 6345
- 6346
- 6349
- 6353
- 6354
- 6356
- 6362
- 6363
- 6365
- 6370
- 6371
- 6372
- 6373
- 6374
- 6375
- 6376
- 6377
- 6382
- 6383
- 6386
- 6387
- 6388
- 6390
- 6391
- 6402
- 6403
- 6404
- 6405
- 6410
- 6414
- 6415
- 6416
- 6417
- 6418
- 6422
- 6423
- 6424
- 6430
- 6431
- 6432
- 6433
- 6434
- 6436
- 6438
- 6440
- 6441
- 6442
- 6443
- 6452
- 6454
- 6460
- 6461
- 6462
- 6463
- 6464
- 6465
- 6466
- 6467
- 6468
- 6469
- 6472
- 6473
- 6474
- 6475
- 6476
- 6482
- 6484
- 6485
- 6487
- 6490
- 6491
- 6493
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement