- 论坛徽章:
- 7
|
回复 8# bmne
duiyu d, l, u, dlup you jiasu.
palermo.c:
- # include "palermo.h"
- MY *TEMPLATE[] = {
- "0123456789",
- "abcdefghijklmnopqrstuvwxyz",
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
- "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
- };
- My LENTEM[] = { 10, 26, 26, 32 };
- My KARA, SIZE, ITEM;
- # define TEST ($numa == 4)
- # define BAD(N) (atoi ($para[N]) <= 0)
- # define ERROR ($numa < 4) || BAD(2) || BAD(3)
- int main( int $numa, MY **$para ) {
- if (ERROR) help( $para[0] );
- My $indes[] = { 4, 4, 4, 4 };
- init( $para, $indes );
- if (TEST) gimme(NULL);
- else explore( $para, $indes );
- }
- /* _____________________ SUB _____________________ */
- sub init ( MY **$para, My *$indes ) {
- KARA = atoi( $para[2] );
- SIZE = atoi( $para[3] );
- MY *$template = $para[1];
- My $lentem = strlen($template);
- MY *$it = "dlup";
- My $pos = 0;
- for ( My $i = 0; $i < 4; $i++ ) {
- for ( My $j = 0; $j < $lentem; $j++ ) {
- if ( $it[$i] == $template[$j] ) {
- ITEM += LENTEM [$i];
- $indes[ $pos++ ] = $i;
- last;
- }
- }
- }
- }
- /* init */
- sub gimme (our *$dat) {
- my $laast = 1;
- for ( My $i = 0; $i < KARA; $i++ ) $laast *= ITEM;
- my $sizeB = ( KARA + 1 ) * $laast;
- my $sizeG = $sizeB / ( 1024 * 1024 * 1024 );
- my $glob = SIZE * 1024 * 1024 * 1024LLU / ( KARA + 1 );
- my $split = $sizeB / ( $glob * ( KARA + 1 ) );
- if ( SIZE >= $sizeG )
- SIZE = $sizeG, $glob = $laast, $split = 0;
- if ( !$dat ) {
- printf( "\nSIZE = %llu G\n", $sizeG );
- printf( "LINES = %llu\n", $laast );
- printf( "RANGE = 0 .. %llu\n", $split );
- printf( "PARTX = %d G\n", SIZE );
- printf( "LINE = %llu\n\n", $glob );
- return;
- }
-
- *$dat = (our) { $glob, $split, $laast };
- } /* gimme */
- sub explore ( MY **$para, My *$istr ) {
- if ( atoll( $para[4] ) < 0 ) help( $para[0] );
- our $dat;
- gimme(&$dat);
- my $split = atoll( $para[4] ); // OK
-
- if ( $split > $dat.split ) return;
- My $item = 0;
- for ( My $i = 0; $i < 4; $i++ )
- if ( $istr[$i] < 4 ) $item++;
- my $start = $dat.glob * $split;
- my $stop = $start + $dat.glob;
-
- if ( $stop > $dat.laast ) $stop = $dat.laast;
- Our $dit = { $start, $stop };
-
- if ( $item == 2 || $item == 3 || $istr[0] == 3 ) {
- sub1( $dit, $istr );
- }
- else {
- MY $head[] = { '0', 'a', 'A', '!' };
- My $i = $item == 1 ? $istr[0] : 3;
- sub2( $dit, $head[$i] );
- }
- } /* explore */
- sub sub1 ( Our $dat, My *$istr ) {
- MY $template[ ITEM + 1 ];
- $template[0] = 0;
- for ( My $i = 0; $i < 4; $i++ ) {
- if ( $istr[$i] == 4 ) last;
- strcat( $template, TEMPLATE[ $istr[$i] ] );
- }
- MY $this[ KARA + 1 ];
- My $posi[KARA];
- pick( $dat.start, $this, $posi, $template );
- My $end = ITEM - 1;
- My $tail = KARA - 1;
- for ( my $i = $dat.start; $i < $dat.stop; $i++ ) {
- say($this);
- if ( $posi[$tail]++ < $end ) {
- $this[$tail] = $template[ $posi[$tail] ];
- next;
- }
- for ( int $j = $tail; $j >= 0; $j-- ) {
- if ( $posi[$j]++ < $end ) {
- $this[$j] = $template[ $posi[$j] ];
- last;
- }
- else {
- $posi[$j] = 0;
- $this[$j] = $template[0];
- }
- }
- }
- } /* sub1 */
- sub sub2 ( Our $dat, MY $A) {
- MY $template[ITEM];
- for ( My $i = 0; $i < ITEM; $i++ )
- $template[$i] = $A + $i;
- MY $this[ KARA + 1 ];
- My $posi[KARA];
- pick( $dat.start, $this, $posi, $template );
- MY $B = $A + ITEM - 1;
- My $tail = KARA - 1;
- for ( my $i = $dat.start; $i < $dat.stop; $i++ ) {
- say($this);
- if ( $this[$tail]++ < $B ) next;
- for ( int $j = $tail; $j >= 0; $j-- ) {
- if ( $this[$j]++ < $B ) last;
- else $this[$j] = $A;
- }
- }
- } /* sub2 */
- sub pick ( my $indes, MY *$kara, My *$posi, MY *$template ) {
- my $var[KARA];
- $var[ KARA - 1 ] = 1;
- for ( int $i = KARA - 2; $i >= 0; $i-- )
- $var[$i] = $var[ $i + 1 ] * ITEM;
- $posi[0] = $indes / $var[0];
- $posi[ KARA - 1 ] = $indes % ITEM;
- for ( My $i = 1; $i < KARA - 1; $i++ )
- $posi[$i] = $indes / $var[$i] % ITEM;
- for ( My $i = 0; $i < KARA; $i++ )
- $kara[$i] = $template[ $posi[$i] ];
- $kara[KARA] = 0;
- }
- sub help (MY *$app) {
- printf( "\n[ CHARS > 0, SIZE > 0, PARTX >= 0 ] \n" );
- printf( "USE:\t%s TYPE CHARS SIZE [PARTX]\n", $app );
- printf( "TEST:\t%s dlu 8 200\n", $app );
- printf( "RUN:\t%s dlu 8 200 0\n", $app );
- exit(1);
- }
复制代码
palermo.h:
- # include <stdio.h>
- # include <stdlib.h>
- # include <string.h>
- typedef char MY;
- typedef unsigned My;
- typedef unsigned long long my;
- typedef struct { my glob, split, laast; } our;
- typedef struct { my start, stop; } Our;
- # define last break
- # define next continue
- # define say puts
- # define sub void
- sub gimme (our*);
- sub explore (MY**, My*);
- sub sub1 (Our, My*);
- sub sub2 (Our, MY);
- sub pick (my, MY*, My*, MY*);
- sub help (MY*);
- sub init (MY**, My*);
复制代码
|
|