intprog_hackery/lol.rb

255 lines
7.0 KiB
Ruby
Raw Normal View History

2019-10-13 12:08:50 +00:00
require_relative 'find_algos'
require_relative 'sorting_algos'
2019-10-14 10:54:53 +00:00
require_relative 'Type'
2019-10-14 11:41:58 +00:00
require_relative 'functional_functions'
require_relative 'Filter'
2019-10-14 10:54:53 +00:00
2019-10-13 12:08:50 +00:00
# Hi! Steffan was here...
2019-10-14 12:38:22 +00:00
container_obj = "ferries"
2019-10-17 09:03:11 +00:00
name = "Ferry"
container_class = "Harbour"
to_string_template = "0 1 x 2 meter"
sorting_one = Type.new("String", "Name")
sorting_two = Type.new("int", "Length")
sorting_three = Type.new("int", "Width")
2019-10-17 09:48:54 +00:00
sorting_two.comparator = "<"
sorting_three.comparator = "<"
2019-10-17 09:28:05 +00:00
sorting_filters = [sorting_one, sorting_two, sorting_three]
2019-10-14 10:54:53 +00:00
2019-10-17 09:03:11 +00:00
def construct_class(name_of_class, parameters, to_string_template, sorting_filters)
sorting_string = compare_to(sorting_filters)
2019-10-14 10:54:53 +00:00
2019-10-13 12:08:50 +00:00
fields = ""
parameters.each do |x|
2019-10-16 20:18:59 +00:00
fields += "private #{x[:type]} #{x[:name]}; \n"
2019-10-13 12:08:50 +00:00
end
2019-10-17 09:28:05 +00:00
constructor_parameters = parameters.map { |x| "#{x[:type]} #{x[:name]}"}.join ","
2019-10-13 12:08:50 +00:00
2019-10-17 09:28:05 +00:00
getters = parameters.map do |x|
2019-10-13 12:08:50 +00:00
"public #{x[:type]} get#{x[:name]}(){
return #{x[:name]};
}"
2019-10-17 09:28:05 +00:00
end.join "\n"
2019-10-13 12:08:50 +00:00
lol = parameters.map do |x|
"this.#{x[:name]} = #{x[:name]};"
end
(0...parameters.length).each do |x|
2019-10-17 09:34:45 +00:00
pls = "\" + #{parameters[x][:name]} + \""
2019-10-13 12:08:50 +00:00
to_string_template.sub! "#{x}", pls
end
"
2019-10-14 10:54:53 +00:00
public class #{name_of_class} implements Comparable<#{name_of_class}> {
2019-10-13 12:08:50 +00:00
#{fields}
public #{name_of_class}(#{constructor_parameters}) {
#{lol.join("\n")}
}
#{getters}
public String toString() {
return " + '"' + "#{to_string_template}" + '"' + ";
}
2019-10-14 10:54:53 +00:00
public int compareTo(#{name_of_class} other) {
#{sorting_string}
}
2019-10-13 12:08:50 +00:00
}
"
end
def construct_driver(class_name, parameters, methods, container_class, container_params)
def args(parameters)
2019-10-17 09:34:45 +00:00
parameters.map do |x|
2019-10-13 12:08:50 +00:00
type = x[:type]
2019-10-17 09:34:45 +00:00
type == "int" ? "#{rand(max=100)}" : "\"#{(0...10).map { ('a'..'z').to_a[rand(26)] }.join}\""
end.join ","
2019-10-13 12:08:50 +00:00
end
maggie = methods.map do |x|
2019-10-14 10:54:53 +00:00
if x[:print]
2019-10-17 07:56:33 +00:00
"System.out.println(lol.#{x[:name]}(#{args x[:parameters]}));"
2019-10-14 10:54:53 +00:00
else
"lol.#{x[:name]}(#{args x[:parameters]});"
end
2019-10-13 12:08:50 +00:00
end
2019-10-17 09:48:54 +00:00
"
public class TestDriver {
2019-10-17 07:56:33 +00:00
public TestDriver(){}
public static void test() {
var tmp1 = new #{class_name}(#{args parameters});
var tmp2 = new #{class_name}(#{args parameters});
var tmp3 = new #{class_name}(#{args parameters});
var tmp4 = new #{class_name}(#{args parameters});
var tmp5 = new #{class_name}(#{args parameters});
System.out.println(tmp1);
System.out.println(tmp2);
System.out.println(tmp3);
System.out.println(tmp4);
System.out.println(tmp5);
#{container_class} lol = new #{container_class}(#{args container_params});
lol.add#{class_name}(tmp1);
lol.add#{class_name}(tmp2);
lol.add#{class_name}(tmp3);
lol.add#{class_name}(tmp4);
lol.add#{class_name}(tmp5);
System.out.println(\"\");
System.out.println(\"Some checkpoint\");
#{maggie.join "\n\n\tSystem.out.println(\"Some Checkpoint\"); \n\t"}
}
public static void main(String[] args) {
TestDriver.test();
}
}
2019-10-13 12:08:50 +00:00
"
end
def construct_container(name, parameters, given_fields, methods, arraylist_name)
fields = ""
parameters.each do |x|
2019-10-16 20:18:59 +00:00
fields += "private #{x[:type]} #{x[:name]};\n"
2019-10-13 12:08:50 +00:00
end
given_fields.each do |x|
2019-10-16 20:18:59 +00:00
fields += " private #{x[:type]} #{x[:name]};\n"
2019-10-13 12:08:50 +00:00
end
maggie = methods.map do |x|
"
public #{x[:return_type]} #{x[:name]} (#{x[:params].map {|y| "#{y[:type]} #{y[:name]}"}.join ","}) {
#{x[:method_type]}
}
"
end
construtor_params = parameters.map do |x|
"#{x[:type]} #{x[:name]}"
end
constructor_handlers = parameters.map do |x|
print(x[:name])
"this.#{x[:name]} = #{x[:name]};"
end
2019-10-17 09:48:54 +00:00
"
2019-10-13 12:08:50 +00:00
import java.util.*;
2019-10-14 10:54:53 +00:00
import java.util.stream.Collectors;
2019-10-13 12:08:50 +00:00
public class #{name} {
#{fields}
public #{name}(#{construtor_params.join ","}) {
#{constructor_handlers.join "\n"}
this.#{arraylist_name} = new ArrayList<>();
}
#{maggie.join "\n"}
2019-10-14 10:54:53 +00:00
2019-10-17 09:48:54 +00:00
public void print#{name}() {
System.out.println(\"#{name}\");
Collections.sort(#{arraylist_name});
2019-10-14 10:54:53 +00:00
2019-10-17 09:48:54 +00:00
for (var i : #{arraylist_name}) {
System.out.println(i);
}
2019-10-14 10:54:53 +00:00
}
2019-10-17 09:48:54 +00:00
}"
2019-10-13 12:08:50 +00:00
end
container_methods = [
{
:return_type => "void",
:name => "addFerry",
:params => [{
:type => "Ferry",
:name => "f"
}],
2019-10-14 12:38:22 +00:00
:method_type => add_method(container_obj, "f")
2019-10-13 12:08:50 +00:00
},
{
:return_type => "ArrayList<Ferry>",
:name => "smallFerries",
:params => [{
:type => "int",
:name => "maxLength"
}],
2019-10-14 12:38:22 +00:00
:method_type => find_all(container_obj, "Length", " < ", "#{name}", "maxLength")
2019-10-13 12:08:50 +00:00
},
{
:return_type => "#{name}",
:name => "longFerry",
:params => [{
:type => "String",
:name => "Name"
}],
2019-10-14 12:38:22 +00:00
:method_type => find_best_with_extra_parameter(container_obj, "Length", " > ", "#{name}", "Name", ".equals", "Name", "int")
2019-10-14 11:41:58 +00:00
},
{
:return_type => "List<#{name}>",
:name => "findFerries",
:params => [{
:type => "int",
:name => "min",
},
{
:type => "int",
:name => "max"
}],
2019-10-14 12:38:22 +00:00
:method_type => func_find_all(container_obj, "Width", [Filter.new("min", ">="), Filter.new("max", "<=")])
},
{
:return_type => "int",
:name => "findLength",
:params => [{
:type => "String",
:name => "Name"
}],
2019-10-17 09:48:54 +00:00
:method_type => find_whatever_of_variable(container_obj, "Name", [Filter.new("Name", ".equals")], "sum", "Length")
2019-10-13 12:08:50 +00:00
}
]
2019-10-14 10:54:53 +00:00
2019-10-17 09:48:54 +00:00
file = File.open("#{name}.java", "w")
params = [{:type => "String", :name => "Name"}, {:type => "int", :name => "Length"}, {:type => "int", :name => "Width"}]
file.puts(construct_class name, params, to_string_template, sorting_filters)
file.close
2019-10-14 10:54:53 +00:00
2019-10-13 12:08:50 +00:00
another_another_file = File.open("#{container_class}.java", "w")
2019-10-14 12:38:22 +00:00
another_another_file.puts(construct_container(container_class, [{:type => "String", :name => "Name"}], [ {:type => "ArrayList<#{name}>", :name => container_obj}], container_methods, container_obj))
2019-10-13 12:08:50 +00:00
another_another_file.close
# TODO: When creating find algorithms, remember to add a space or two (lol for consistency) for <, >, <=, >=
another_file = File.open("TestDriver.java", "w")
another_file.puts(construct_driver name, params, [{:name => "smallFerries", :parameters => [{:type => "int"}], :print => true},
2019-10-14 10:54:53 +00:00
{:name => "longFerry", :parameters => [{:type => "String"}], :print => true},
2019-10-14 11:41:58 +00:00
{:name => "printHarbour", :parameters => [], :print => false},
2019-10-14 12:38:22 +00:00
{:name => "findFerries", :parameters => [{:type => "int"}, {:type => "int"}], :print => true },
2019-10-17 09:03:11 +00:00
{:name => "findLength", :parameters => [{:type => "String"}], :print => true}], container_class, [{:type => "String"}])
2019-10-13 12:08:50 +00:00
another_file.close
`javac *.java`
`java TestDriver`