SHOW:
|
|
- or go back to the newest paste.
1 | --TangentAutomaton V. 1.4 | |
2 | --Notes: | |
3 | --Code is now 100% all mine | |
4 | --Removed my custom matrix, reducing memory usage by a factor of math.huge() | |
5 | --Shortened a ton of long functions | |
6 | --Removed all un-needed variables and functions | |
7 | --Added some sexy line numbering | |
8 | --Revised a few comments | |
9 | --Re-arranged the order that data is asked for at the beginning | |
10 | --Fixed the fickle way that some rules got cut off | |
11 | --Tweaked the seed providing functions just a bit | |
12 | --The rule table is now either "1" or "0" instead of "true" or "false" | |
13 | ||
14 | cellon="#" | |
15 | celloff="_" | |
16 | ||
17 | seeddata={} --Put your seed information here! | |
18 | ||
19 | states = {} | |
20 | rulegiven={} | |
21 | output={} | |
22 | ||
23 | ||
24 | function dectobin(input) | |
25 | conversion={1,2,4,8,16,32,64,128} --I'll make this into 2^n eventually. | |
26 | output={0,0,0,0,0,0,0,0} --The output table, keeping it like this for now. | |
27 | i=8 --Starting number to decrement from | |
28 | for h=1,8 do --It's 8 bit! | |
29 | input=input-conversion[i] --Grabs the number to convert, and subtracts it from the lookup table. | |
30 | if input <0 then --If it's less than 0 (negative)... | |
31 | input=input+conversion[i] --...undo that subtraction. | |
32 | else --If it isn't less than 0 (greater than or equal to)... | |
33 | output[h]=1 --...set the output bit high (change "h" to "i" to swap endianess). | |
34 | end | |
35 | i=i-1 --The simple decrementer | |
36 | end | |
37 | end | |
38 | ||
39 | ruletable= --The rule lookup table, the heart of this script. | |
40 | { | |
41 | {1,1,1}, | |
42 | {1,1,0}, | |
43 | {1,0,1}, | |
44 | {1,0,0}, | |
45 | {0,1,1}, | |
46 | {0,1,0}, | |
47 | {0,0,1}, | |
48 | {0,0,0} | |
49 | } | |
50 | ||
51 | rule={} --Sets up the actual table the algorithm looks at. | |
52 | ||
53 | function grabrule() --This function decodes the given rule. | |
54 | userinput=io.read() --Gets the user's input. | |
55 | dectobin(userinput) --Sends the input to get decoded into binary. | |
56 | rulegiven=output --Takes that binary number and sticks it into "rulegiven". | |
57 | rulecounter=1 --Starts a sync counter. | |
58 | for i=1,#rulegiven do --This will turn the binary into bollean logic. | |
59 | if rulegiven[i]==1 then --If the bit is 1... | |
60 | rule[rulecounter]=ruletable[i] --...set it to true (rather pointless, since I could combine this with the next part of the program). | |
61 | rulecounter=rulecounter+1 | |
62 | end | |
63 | end | |
64 | end | |
65 | ||
66 | function grabseed() --This function asks for an input, and stores it to "state" | |
67 | seedgiven={} --I always store "binary" data in a table. | |
68 | print("Please enter a starting seed in binary!") | |
69 | print("Note: This seed will be placed in the center of the algorithm.") | |
70 | inputseed=io.read() --Asks for the seed. | |
71 | for i=1,string.len(inputseed) do --This loop chops the user input up, and stuffs it into my table. | |
72 | seedgiven[i]=string.sub(inputseed,i,i) | |
73 | end | |
74 | for i=1,#seedgiven do --Appearently, it's a string, and I need numbers. | |
75 | if seedgiven[i]=="1" then --If the string is a "1"... | |
76 | seedgiven[i]=1 --...make it into a number 1... | |
77 | else | |
78 | seedgiven[i]=0 --...else it's a 0. | |
79 | end | |
80 | end | |
81 | bitshift=((width-#seedgiven)/2) --To find how much the data should be shifted, the lenght of the given seed is subtracted from the width, then divided by 2. | |
82 | bitshift=math.floor(bitshift) --If it's an odd number, it gets rounded down (an even number is always created). | |
83 | j=bitshift --To keep the two numbers synced. | |
84 | for i=1,#seedgiven do --This stores the given string into the "states" table. | |
85 | states[j]=seedgiven[i] --Mirrors the value in "seedgiven" to "states". | |
86 | j=j+1 --To keep j and i in sync. | |
87 | end | |
88 | end | |
89 | ||
90 | function compute(row) --Here's where all the computation happens. | |
91 | io.write(row..":".."\t") --This adds line numbering. | |
92 | for i=1,#states do --For as many cells as there are in "states"... | |
93 | if states[i]==1 then io.write(cellon) else io.write(celloff) end --...if it's "1" then write an "on" state, else write an "off" state. | |
94 | end | |
95 | io.write("\n") --Writes a new line. | |
96 | current_gen = {} --This table stores the current information to get computed. | |
97 | for i = 1, #states do --This goes along the rows for as many starting states there are. | |
98 | current_gen[i] = 0 --Sets up every cell in this table as "0". | |
99 | for j = 1, #rule do --It computes for as many rules it is given. | |
100 | if (states[i - 1] == rule[j][1] and states[i] == rule[j][2] and states[i + 1] == rule[j][3]) then --If it complies with the rules... | |
101 | current_gen[i] = 1 --...set the current cell to an "on" state. | |
102 | end | |
103 | end | |
104 | end | |
105 | states = current_gen --changes "states" to reflect the changes made. | |
106 | end | |
107 | ||
108 | print("Please take a look at the top of this script to configure it!") | |
109 | ||
110 | function interface() --The user interface function. | |
111 | print("Please enter the width to run for.") | |
112 | width=io.read() --Gets the width from the user. | |
113 | height = width / 2 --In an obtuse isosceles triangle, the height is usually half of the width (The trangles generated are usually 45 degrees). | |
114 | ||
115 | for i = 1, width+1 do states[i] = 0 end --Sets up the "states" table, which is where the computations begin. | |
116 | states[(width / 2)+1] = 1 --The default seed is a "1" in the center of the table. | |
117 | ||
118 | print("Please enter a rule in decimal.") | |
119 | grabrule() --Asks for the rule from the user. | |
120 | ||
121 | print("Would you like to input a seed?(y/n)") | |
122 | input=io.read() --Gets the user's choice. | |
123 | if input=="y" then --If the choice is "y", then... | |
124 | grabseed() --...go to the custom seed input function. | |
125 | else | |
126 | print("Would you like to use a randomly generated seed?(y/n)") | |
127 | input=io.read() --Gets the user's choice. | |
128 | if input=="y" then --If the choice is "y", then... | |
129 | for i=1,#states do --...for as many cells as there are in "states"... | |
130 | states[i]=math.random(0,1) --...set the cell to a random number of either "1" or "0". | |
131 | end | |
132 | else --If the user's decision is not one of the above options, "states" is not changed at all... | |
133 | print("Going with standard seed...") --...and goes with the default configuration set at the beginning. | |
134 | end | |
135 | end | |
136 | end | |
137 | ||
138 | interface() --Runs the above function. | |
139 | ||
140 | for i = 1, height do --This runs the computation function for the desired height. | |
141 | compute(i) | |
142 | end |