#!/usr/bin/ucblogo

; Copyright 2012 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/>.


; Usage: ucblogo sierpinski-triangle-text.logo
;
; Print the Sierpinski triangle pattern in text with spaces and stars,
; using BITAND to decide whether to plot at a given X,Y or not.
;
; :limit determines the padding at the left, and within that limit the
; range of :y to print is arbitrary.
; Print rows of the triangle from 0 to :limit inclusive.
;
;            *
;           * *
;          *   *
;         * * * *
;        *       *
;       * *     * *
;      *   *   *   *
;     * * * * * * * *
;

make "limit 15
for [y 0 :limit] [
  for [x -:limit :y] [
    type ifelse (and :y+:x >= 0                ; blank left of triangle
                     (remainder :y+:x 2) = 0   ; only "even" squares
                     (bitand :y+:x :y-:x) = 0  ; Sierpinski bit test
                ) ["*] ["| |]                  ; star or space
  ]
  print []
]