File: triangle-spiral.pl

package info (click to toggle)
libmath-planepath-perl 129-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 8,100 kB
  • sloc: perl: 115,748; ansic: 299; sh: 272; lisp: 73; makefile: 13
file content (121 lines) | stat: -rw-r--r-- 2,855 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/perl -w

# Copyright 2011, 2012, 2013, 2015, 2019, 2020 Kevin Ryde

# This file is part of Math-PlanePath.
#
# Math-PlanePath is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 3, or (at your option) any later
# version.
#
# Math-PlanePath is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with Math-PlanePath.  If not, see <http://www.gnu.org/licenses/>.

use 5.004;
use strict;

# uncomment this to run the ### lines
# use Smart::Comments;

{
  # A023531 L-system

  my %to;

  %to = (S => 'STF+',   # TF second form "TriangleSpiral2" in a023531.l
         T => 'TF',
         F => 'F',
         '+' => '+');

  %to = (S => 'SFT+',   # FT first form "TriangleSpiral" in a023531.l
         T => 'FT',
         F => 'F',
         '+' => '+');

  my $str = 'S';
  foreach (1 .. 7) {
    my $padded = $str;
    $padded =~ s/./$& /g;  # spaces between symbols
    print "$padded\n";
    $str =~ s{.}{$to{$&} // die}ge;
  }

  $str =~ s/F(?=[^+]*F)/F0/g;
  $str =~ s/F//g;
  $str =~ s/\+/1/g;
  $str =~ s/S|T//g;
  print $str,"\n";

  require Math::NumSeq::OEIS;
  my $seq = Math::NumSeq::OEIS->new (anum => 'A023531');
  my $want = '';
  while (length($want) < length($str)) {
    my ($i,$value) = $seq->next;
    $want .= $value;
  }
  $str eq $want or die "oops";
  print "end\n";
  exit 0;
}

{
  # A010054 L-system

  my %to = (S => 'S+TF',
            T => 'TF',
            F => 'F', '+' => '+');
  my $str = 'S+TF';
  $str = 'S';
  foreach (1 .. 7) {
    my $pad = $str;
    $pad =~ s/./$& /g;
    print "$pad\n";
    $str =~ s{.}{$to{$&} // die}ge;
  }
  exit 0;
}
{
  # A010054 characteristic of triangular numbers
  # turn seq with Language::Logo

  require Math::NumSeq::OEIS;
  my $seq = Math::NumSeq::OEIS->new(anum=>'A010054');

  #     $seq->next;

  require Language::Logo;
  my $lo = Logo->new(update => 20, port=>8222);
  $lo->command("seth 0; forward 50; pendown; forward 200; backward 200; penup; backward 50; pendown");

  for (;;) {
    logo_blob(5);
    my ($i,$value) = $seq->next;
      $lo->command("left ".($value*120));
    if ($i > 0) {
    }
    $lo->command("forward 30");
  }
  $lo->disconnect("Finished...");
  exit 0;

  sub logo_blob {
    my ($size) = @_;
    my $half = $size/2;
    $lo->command("
    penup; forward $half; pendown;
    left 90; forward $half;
    left 90; forward $size;
    left 90; forward $size;
    left 90; forward $size;
    left 90; forward $half;
    right 90;
    penup; backward $half; pendown
");
  }
}