aUCBLogo Demos and Tests / palindromic_numbers_robbie


setLogoLanguage "ucblogo

to palindromic_numbers_robbie
;traceall
;trace primitives
   
doit 19
end

to doit :x
   
print "########################################################
   
cs pu ht home
   
setlabelfont [[Arial] -10 0 0 400 0 0 0 0 3 2 1 34]
   
make "outray (array 301)
   
make "n 1 make "k :x
   
repeat 301 [checkloop (pack :x) 0 make "x :x+1 make "n :n+1]
   
make "outlist arraytolist :outray
   
print "########################################################
   
yaxis
   
make "j 0 pu make "itt 0 setpos (list -200 -50) pd
   
repeat 301 [xaxis make "j :j+1]
   
print (list "doit :k+300)
   
gifsave (word "doit :k ".gif)
end

to checkloop :xlist :I
   
if :i > 99 [
      
setitem :n :outray 100 
      
print (list (:n+(:k-1)) "... :i "... :xlist) stop
   
]
   
if (:xlist = (reverse :xlist)) [
      
setitem :n :outray :i
      
print (list (:n+(:k-1)) "... :i "... :xlist) stop
   
]
   
;ignore (reverse :xlist)
   
checkloop (addm :xlist (reverse :xlist)) :i+1
end

to addm :a :b
   
make "la (count :a)+1
   
make "aa (array :la 1)
   
make "z 0
   
addloop :a :b :la
   
setitem 1 :aa :z
   
make "cc arraytolist :aa
   
if :z=0 [make "cc butfirst :cc]
   
output :cc
end

to addloop :a :b :la
   
if :la = 1 [stop]
;(show :a (last :a) :b (last :b) :z)
;(print typeof (last :a) typeof (last :b) typeof :z)
   
make "c (last :a)+(last :b)+:z
   
make "z 0
   
if :c > 9 [make "c (last :c) make "z 1]
   
setitem :la :aa :c
   
addloop (butlast :a) (butlast :b) (:la-1)
end

to pack :x
   
make "xlist :x
   
output :xlist
end

to jump
   
pd bk 15
   
pu fd 3 rt 90 bk 7 pd label (:j+:k) pu fd 7 lt 90 bk 3
   
fd 15 pu
end

to spike
   
pu fd ((first :outlist)*3)+1 rt 90 bk 7 lt 90
   
if (:itt > 2) [pd label (:j+:k)]
   
pu bk ((first :outlist)*3)+1 rt 90 fd 7 lt 90
   
make "itt 0
end

to xaxis
   
bk 1 fd 1
   
fd (first :outlist)*3 bk (first :outlist)*3
   
if (modulo :j+:k 10) = 0 [pd bk 5 fd 5 pu]
   
if (modulo :j+:k 100) = 0 [jump]
   
if (first :outlist) > 10 [spike make "itt 0]
   
pu rt 90 fd 2 lt 90 pd
   
make "outlist butfirst :outlist
   
make "itt :itt+1
end

to yaxis
   
make "f 5
   
pu setpos (list -220 -50)
   
pd rt 90 bk 3 fd 3
   
pu fd 2 lt 90 fd 6 rt 90 pd label 0 pu
   
lt 90 bk 6 rt 90 bk 2 lt 90
   
repeat 20 [pd fd 15 rt 90 bk 3 fd 3
   
pu fd 2 lt 90 fd 6 rt 90 pd label (list :f) pu
   
lt 90 bk 6 rt 90 bk 2 lt 90 make "f :f+5]
   
pd fd 10
   
setlabelfont [[Arial] -10 0 0 400 255 0 0 0 3 2 1 34]
   
label (list "--> "8) pu bk 10
   
setlabelfont [[Arial] -10 0 0 400 0 0 0 0 3 2 1 34]
   
bk 300 pu
   
setpos (list -237 85) label "iterations
   
setpos [75 -70] rt 90 label (list "positive "integers)
   
seth 0
end