fork download
  1. #!/usr/bin/perl
  2. use 5.016;
  3. use warnings;
  4.  
  5. package _Stream;
  6.  
  7. sub new {
  8. my $class = shift;
  9. return bless [ @_ ], $class;
  10. }
  11.  
  12. sub value { $_[0]->[0] }
  13. sub next { ref $_[0]->[1] eq 'CODE' ? $_[0]->[1] = $_[0]->[1]->() : $_[0]->[1] }
  14.  
  15. package main;
  16.  
  17. my @dir = ([1, 0], [0, 1], [-1, 0], [0, -1]);
  18.  
  19. sub f1 {
  20. my ($x, $y, $l, $c, $d) = @_;
  21.  
  22. my ($dx, $dy) = @{$dir[$d]};
  23.  
  24. return _Stream->new(
  25. [$x, $y],
  26. (($c < 1) ?
  27. sub{ f2($x + $dx, $y + $dy, $l + 1, $l + 1, ($d + 1) % 4) } :
  28. sub{ f1($x + $dx, $y + $dy, $l, $c - 1, $d) }
  29. )
  30. );
  31. }
  32.  
  33. sub f2 {
  34. my ($x, $y, $l, $c, $d) = @_;
  35.  
  36. my ($dx, $dy) = @{$dir[$d]};
  37.  
  38. return _Stream->new(
  39. [$x, $y],
  40. (($c < 1) ?
  41. sub{ f1($x + $dx, $y + $dy, $l, $l, ($d + 1) % 4) } :
  42. sub{ f2($x + $dx, $y + $dy, $l, $c - 1, $d) }
  43. )
  44. );
  45. }
  46.  
  47. sub f { f2(0, 0, 0, 0, 0) }
  48.  
  49. sub is_prime {
  50. my ($n) = @_;
  51.  
  52. ($n < 2) and return 0;
  53. ($n == 2) and return 1;
  54. ($n % 2 == 0) and return 0;
  55.  
  56. for(my $i = 3; $i <= $n / $i; $i += 2){
  57. ($n % $i == 0) and return 0;
  58. }
  59.  
  60. return 1;
  61. }
  62.  
  63. sub g {
  64. my $o = int(shift() / 2);
  65. my $n = ($o * 2 + 1) ** 2;
  66.  
  67. my @d;
  68. my $f = f();
  69. foreach(1 .. $n){
  70. my ($x, $y) = @{$f->value};
  71. $f = $f->next;
  72. $d[$o - $y]->[$o + $x] = (is_prime($_) ? '*' : ' ');
  73. }
  74.  
  75. return @d;
  76. }
  77.  
  78. foreach(g(79)){
  79. say @{$_};
  80. }
  81.  
Success #stdin #stdout 0.07s 4000KB
stdin
Standard input is empty
stdout
      *     *     *             *     *   *     *       *                 *   *
                             *     * *   *                   *     *         * 
  *     *                     *     * *   *     *           * *   *     *      
 *       *       *   *             *     *                           *     *   
* *             *           *     *         *                             *    
         *                 *     *     *       *               *     *         
*   * *       *         * *         *                             *         *  
 * *       * *           *     *               *     * *                       
  *                 *         * *                 *     *   *           *      
       *         *         * *         *           * *         *     *     * * 
        *     * *           *   *           * *     *   *     *     *          
           *               * *         *                   *     *   *         
    * *     *       *     *     *         *       *                   *     *  
                   *     *   * *   *     *     *       *   * *     *   * *   * 
        *                             *   *     *       *         *     *      
 * *     *   *         *   *     *     *       *   * *                   * *   
*       * *   *     * *           *         * *   * *               *          
     *               * *                 *     *     *               *     *   
          *             *     *     *     *       *         * * * * *     * *  
     *       * *   *   *             *   *       *   *           *     *     * 
                          *     *   * *   *             *   *                 *
       * *   * *     *     * *     *   * *                 * * *     * *       
    * *     *       *     * *                     *     *             *   *    
     *                     * *     *   *           *     *           *         
                                      *   * *   *             * * *   * *   *  
 *       *         * *               *   *       *   * *           *           
  *     *           *     *   *           * *     *                     *     *
   *         *     * *   * *     * *     *     *           *           *       
* *             *   * *           *           *   *     * *     *              
     *           *     *     *   *       *     *               *           *   
                * *     *   *         *   * *   * * *                 *        
 *   *   *       * * * *       *     *         * *   *     * *     *           
  *                       *     *   * *               *     *     *            
                                       * *     *   *   * *   * * *   * *     * 
    *     * * *     *   *   *   * *   *       *   * *         *           *    
                                       * *   *                 *           *   
*   *     *     * *   *       *   * *     * * *     * * *               * *    
 *   * *   * *     *   * * * * * * * *   *       *         * *         *       
                                      * * *           *           *     *      
       * *   *     *             *   *  ** * * *   * * *     *       * * * *   
    * * *       * *       *       * * *                                        
           *                       *   *                                       
                * *     *   * *   * *   *   * *   *   * *   *   * *       *    
     * *   *   *     *     *   *   *     *     * *   *       *     *     *   * 
  *     *     *                     *           *           *           *      
 * *     *         * *         * *     *   *   *       * *       *       *   * 
* * * *             * *     *   *           *       *     *         *     *    
                       *     *     *   * *                                     
*           *                     * *   *     *   *     *   * * *         *    
   *   *     * *       * * * *         * *     *     * *   * *   *       *   * 
                          *   *           * *                                  
 * *     *     *     *   * *     *     *   * *           *     *   * * *     * 
  *     * * * * *     * *       *         *       *     *             *   *    
     *           *               * *   * *         *     *                     
    *             *           *   *     *     *         * *     *       *   * *
   *       *       *       * *     *                 *             *     *   * 
  *           *     *   *       *           *   *     *           *     *      
             * *                                 *     *   *     *         *   
*     *   * *       *   * *   *     *           *             *     * *     *  
     *           *                 *     *   * *               *     *         
    *           *     *           *       *               *   *     *          
           * * *       *     *   * *   *       *     *                       * 
              *                 *                       *   *                  
 *     *           *             *     *   * *     *   *     *               * 
            * *     *                     *           * *           * *        
           *           *         *           * *     *   * *               *   
*           *                           * *         *       *   *   *   *      
 *     * *           *     *       *   *       *                               
                    *               *       *   * *   * *               *     *
       *           * *   *             *     *   *       *         *     *     
    * * *   *     * *   *     * *           *   *                   *          
     *                 *                       *         *     * *             
    * *                 *     *   *     *     *                 * *         *  
 *             *                 * *     *   *                 *       *       
      *             *     *     *   *     * *         * *               *      
 *     *           *     * *               *     *     *             *         
        *     *     *   *       *         *                               *    
     *   *     * *         * *               *     *                   *   *   
*         *                       * *   *       *     *   *       *