in reply to secret code generator

He is just creating all combinations of letters, numbers and puncuation. The obvious, but wrong, solution is to use string increment. That is wrong because you don't, for instance, get punctuation characters. Here is a silly solution in Perl.
use Math::Fleximal; my $flex = ["a".."z", "A".."Z", 0..9, split //, qq(!"#$%&'()*+,-./:;<=>?@[\\]^_ +`{|}~)]; my $x = Math::Fleximal->new("a", $flex); my $one = Math::Fleximal->new("b", $flex); while (1) { print $x->to_str; print "\n"; $x = $x->add($one); }
A less silly solution (ie one that doesn't push all of the work under the covers) takes just a bit more effort.
#! /usr/bin/perl -w use strict; my @chars = ("a".."z", "A".."Z", 0..9 , split //, qq(!"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~)); my $x = 0; while (++$x) { nested_for( sub {print join "", @_, "\n";} , map \@chars, 1..$x ); } sub nested_for { ret_iter(@_)->(); } sub ret_iter { my $fn = shift; my $range = shift; my $sub = sub {$fn->($_, @_) for @$range}; return @_ ? ret_iter($sub, @_) : $sub; }
(Astute people may notice that I borrowed from Re (tilly) 1 (perl): What Happened...(perils of porting from c).)

Update: As johngg noted, I did not get \ in the punctuation set. Fixed.

Replies are listed 'Best First'.
Re^2: secret code generator
by johngg (Canon) on Dec 19, 2006 at 10:22 UTC
    A simpler way to populate the @chars array.

    my @chars = map {pack q{C}, $_} 0x21 .. 0x7e;



      Simpler still

      my @chars = map chr, 0x21 .. 0x7e;

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Blast, I thought it was char and when I couldn't find that in the Camel book I decided I had imagined the function so went for pack instead :(
      Simpler, yes. Easier to understand, no - unless you use ASCII codes all day long.

      Also, note BrowserUK's solution, your map can be written simply as map chr, 0x21 .. 0x7e;

      Update: BrowserUK noted himself :)

      -- Hofmator

      Code written by Hofmator and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

        Easier to understand? Debateable. I feel that this

        my @chars = ("a".."z", "A".."Z", 0..9 , split //, qq(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~));

        looks a bit messy and it is difficult to see at a glance, or even with a long stare, if you've got them all. In fact, I think tilly will have missed one since qq{...} is going to lose the backslash so q{...} might have been better.

        $ perl -le 'print for split m{}, qq{!@#{}[\]&*};' ! @ # { } [ ] & * $ perl -le 'print for split m{}, q{!@#{}[\]&*};' ! @ # { } [ \ ] & * $



        Update: Added one-liners to show backslash behaviour

Re^2: secret code generator
by xiaoyafeng (Deacon) on Dec 20, 2006 at 02:41 UTC
    wow! smart code. nest sub is a good idea!