added templates and comments
This commit is contained in:
parent
ed63a65924
commit
484bb8a8a0
11 changed files with 418 additions and 0 deletions
104
cpp/template.cpp
Normal file
104
cpp/template.cpp
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
using ull = unsigned long long;
|
||||
|
||||
auto next(ull x) -> std::vector<ull>;
|
||||
auto is_prime(ull n) -> bool;
|
||||
|
||||
/* all tree stuff, don't really need to change it unless you have some ideas for
|
||||
* optimizations
|
||||
*/
|
||||
class Tree
|
||||
{
|
||||
public:
|
||||
ull value;
|
||||
std::vector<Tree> children;
|
||||
|
||||
Tree(ull value, std::vector<ull> tree_children) : value(value) {
|
||||
for (ull child : tree_children) {
|
||||
children.push_back(Tree(child, {}));
|
||||
}
|
||||
}
|
||||
|
||||
void step() {
|
||||
if (children.size() == 0) {
|
||||
auto xs = next(value);
|
||||
for (auto val : xs) {
|
||||
children.push_back(Tree(val, {}));
|
||||
}
|
||||
} else {
|
||||
for (auto &child : children) {
|
||||
child.step();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto longest_path() -> std::vector<ull> {
|
||||
if (children.size() == 0) {
|
||||
return { value };
|
||||
}
|
||||
std::vector<ull> max_path;
|
||||
int max_length = 0;
|
||||
for (auto &child : children) {
|
||||
auto temp = child.longest_path();
|
||||
if (temp.size() > max_length) {
|
||||
max_length = temp.size();
|
||||
max_path = temp;
|
||||
}
|
||||
}
|
||||
std::vector<ull> retval = { value };
|
||||
retval.insert(retval.end(), max_path.begin(), max_path.end());
|
||||
return retval;
|
||||
}
|
||||
};
|
||||
|
||||
/* TODO Tweak this to change functionality according to explanation on the
|
||||
* Overleaf
|
||||
*/
|
||||
auto next(ull x) -> std::vector<ull> {
|
||||
std::vector<ull> new_xs;
|
||||
return new_xs;
|
||||
}
|
||||
|
||||
/* some helper functions */
|
||||
auto is_prime(ull n) -> bool {
|
||||
static std::unordered_map<ull, bool> primes;
|
||||
if (n < 2) {
|
||||
primes[n] = false;
|
||||
return false;
|
||||
}
|
||||
if (primes.count(n) > 0) {
|
||||
return primes[n];
|
||||
}
|
||||
for (int i = 2; i * i <= n; i++) {
|
||||
if (n % i == 0) {
|
||||
primes[n] = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
primes[n] = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
auto print_vec(std::vector<T> vec) -> void {
|
||||
std::cout << '[';
|
||||
for (T &val : vec) {
|
||||
std::cout << val << ", ";
|
||||
}
|
||||
std::cout << "]\n";
|
||||
}
|
||||
|
||||
auto main() -> int {
|
||||
/* starts off with a tree with value 0 and no children and searches 20
|
||||
* iterations, feel free to tweak to whatever you want
|
||||
*/
|
||||
Tree tree(0, {});
|
||||
for (int i = 0; i < 20; i++) {
|
||||
tree.step();
|
||||
print_vec(tree.longest_path());
|
||||
}
|
||||
}
|
||||
19
java/template/Main.java
Normal file
19
java/template/Main.java
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
import java.util.ArrayList;
|
||||
|
||||
/* Here is where you can tweak the starting conditions */
|
||||
public class Main
|
||||
{
|
||||
public static void main(String[] args)
|
||||
{
|
||||
Util.init();
|
||||
|
||||
/* here we create a new list with value 0 and no children and check 20
|
||||
* iterations, feel free to tweak this to your heart's content
|
||||
*/
|
||||
Tree tree = new Tree(0, new ArrayList<Long>());
|
||||
for (int i = 0; i < 20; i++) {
|
||||
tree.step();
|
||||
Util.printList(tree.longestPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
61
java/template/Tree.java
Normal file
61
java/template/Tree.java
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
import java.util.ArrayList;
|
||||
|
||||
/* Basic tree stuff. I wouldn't recommend tweaking this unless you have some
|
||||
* ideas for optimizations. Or if my code is bad; it's been a long while since I
|
||||
* wrote Java. However, please modify `next` below to change functionality as
|
||||
* described in the Overleaf
|
||||
*/
|
||||
class Tree
|
||||
{
|
||||
private long value;
|
||||
private ArrayList<Tree> children;
|
||||
|
||||
public Tree(long tree_value, ArrayList<Long> tree_children)
|
||||
{
|
||||
value = tree_value;
|
||||
children = new ArrayList<Tree>();
|
||||
for (long child : tree_children) {
|
||||
children.add(new Tree(child, new ArrayList<Long>()));
|
||||
}
|
||||
}
|
||||
|
||||
public void step()
|
||||
{
|
||||
if (children.isEmpty()) {
|
||||
ArrayList<Long> xs = next(value);
|
||||
for (long val : xs) {
|
||||
children.add(new Tree(val, new ArrayList<Long>()));
|
||||
}
|
||||
return;
|
||||
}
|
||||
for (Tree child : children) {
|
||||
child.step();
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<Long> longestPath()
|
||||
{
|
||||
ArrayList<Long> retval = new ArrayList<Long>();
|
||||
if (children.isEmpty()) {
|
||||
retval.add(value);
|
||||
return retval;
|
||||
}
|
||||
int max_length = 0;
|
||||
for (Tree child : children) {
|
||||
ArrayList<Long> temp = child.longestPath();
|
||||
if (temp.size() > max_length) {
|
||||
max_length = temp.size();
|
||||
retval = temp;
|
||||
}
|
||||
}
|
||||
retval.add(0, value);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* TODO please tweak this function according to what you want the code to do */
|
||||
public ArrayList<Long> next(long val)
|
||||
{
|
||||
ArrayList<Long> new_xs = new ArrayList<Long>();
|
||||
return new_xs;
|
||||
}
|
||||
}
|
||||
61
java/template/Util.java
Normal file
61
java/template/Util.java
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
import java.util.HashMap;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/* Just some utility functions like isPrime, isSquareFree, and printList, all of
|
||||
* which do exactly what they sound like. I wouldn't recommend tweaking this
|
||||
* unless you have some really good ideas for optimization
|
||||
*/
|
||||
class Util
|
||||
{
|
||||
private static HashMap<Long, Boolean> primes;
|
||||
private static HashMap<Long, Boolean> squareFree;
|
||||
|
||||
public static void init()
|
||||
{
|
||||
primes = new HashMap<Long, Boolean>();
|
||||
squareFree = new HashMap<Long, Boolean>();
|
||||
}
|
||||
|
||||
public static boolean isPrime(long val)
|
||||
{
|
||||
if (primes.containsKey(val)) {
|
||||
return primes.get(val);
|
||||
}
|
||||
for (int i = 2; i * i <= val; i++) {
|
||||
if (val % i == 0) {
|
||||
primes.put(val, false);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
primes.put(val, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean isSquareFree(long val)
|
||||
{
|
||||
if (squareFree.containsKey(val)) {
|
||||
return squareFree.get(val);
|
||||
}
|
||||
for (int i = 2; i * i <= val; i++) {
|
||||
if (isPrime(i)) {
|
||||
if (val % (i * i) == 0) {
|
||||
squareFree.put(val, false);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
squareFree.put(val, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void printList(ArrayList<Long> ls)
|
||||
{
|
||||
System.out.print("[");
|
||||
for (int i = 0; i < ls.size() - 1; i++) {
|
||||
System.out.print(ls.get(i));
|
||||
System.out.print(", ");
|
||||
}
|
||||
System.out.print(ls.get(ls.size() - 1));
|
||||
System.out.print("]\n");
|
||||
}
|
||||
}
|
||||
80
python/template.py
Normal file
80
python/template.py
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
import math
|
||||
|
||||
# tree stuff, I wouldn't recommend tweaking unless you have serious ideas for
|
||||
# optimizations
|
||||
class Tree:
|
||||
def __init__(self, value, children):
|
||||
self.value = value
|
||||
self.children = []
|
||||
for child in children:
|
||||
self.children.append(Tree(child, []))
|
||||
|
||||
def step(self):
|
||||
if len(self.children) == 0:
|
||||
for val in next(self.value):
|
||||
self.children.append(Tree(val, []))
|
||||
return
|
||||
for child in self.children:
|
||||
child.step()
|
||||
|
||||
def __str__(self):
|
||||
retval = '[' + str(self.value) + ': '
|
||||
for child in self.children:
|
||||
retval += str(child)
|
||||
retval += ']'
|
||||
return retval
|
||||
|
||||
def __repr__(self):
|
||||
return str(self)
|
||||
|
||||
def longest_path(self):
|
||||
if len(self.children) == 0:
|
||||
return [self.value]
|
||||
max_path = []
|
||||
max_length = 0
|
||||
for child in self.children:
|
||||
temp = child.longest_path()
|
||||
if len(temp) > max_length:
|
||||
max_path = temp
|
||||
max_length = len(temp)
|
||||
return [self.value] + max_path
|
||||
|
||||
# some utility functions, same as above
|
||||
def is_square(x):
|
||||
return int(math.sqrt(x)) == math.sqrt(x)
|
||||
|
||||
primes = {}
|
||||
|
||||
def is_prime(x):
|
||||
try:
|
||||
return primes[x]
|
||||
except KeyError:
|
||||
if x < 2:
|
||||
primes[x] = False
|
||||
return False
|
||||
i = 2
|
||||
while i * i <= x:
|
||||
if x % i == 0:
|
||||
primes[x] = False
|
||||
return False
|
||||
i += 1
|
||||
primes[x] = True
|
||||
return True
|
||||
|
||||
# TODO: tweak this to do whatever you want as I described in the Overleaf
|
||||
def next(x):
|
||||
return []
|
||||
|
||||
|
||||
# here we create a tree with value 0 and no children and check it for 20
|
||||
# iterations, but feel free to change that up
|
||||
def main():
|
||||
tree = Tree(0, [])
|
||||
for i in range(20):
|
||||
print(tree.longest_path())
|
||||
tree.step()
|
||||
print(tree.longest_path())
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
10
rust/template/Cargo.toml
Normal file
10
rust/template/Cargo.toml
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
[package]
|
||||
name = "append_digit_primes"
|
||||
version = "0.1.0"
|
||||
authors = ["William Ball <wball1@swarthmore.edu>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
primal = "0.3.0"
|
||||
81
rust/template/src/main.rs
Normal file
81
rust/template/src/main.rs
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
/* tree stuff, I wouldn't recommend tweaking any of this unless you have serious ideas for
|
||||
* optimization
|
||||
*/
|
||||
#[derive(Debug)]
|
||||
struct Tree {
|
||||
value: u64,
|
||||
children: Vec<Tree>,
|
||||
}
|
||||
|
||||
impl Tree {
|
||||
fn new(value: u64, children: Vec<u64>) -> Tree {
|
||||
let mut tree_children = Vec::with_capacity(children.len());
|
||||
for child in children {
|
||||
tree_children.push(Tree::new(child, Vec::new()));
|
||||
}
|
||||
Tree {
|
||||
value,
|
||||
children: tree_children,
|
||||
}
|
||||
}
|
||||
|
||||
fn to_string(&self) -> String {
|
||||
let mut retval = format!("[{}: ", self.value);
|
||||
for child in &self.children {
|
||||
retval.push_str(&child.to_string()[..]);
|
||||
}
|
||||
retval.push(']');
|
||||
retval
|
||||
}
|
||||
|
||||
fn step(&mut self) {
|
||||
if self.children.is_empty() {
|
||||
let xs = next(self.value);
|
||||
for val in xs {
|
||||
self.children.push(Tree::new(val, Vec::new()));
|
||||
}
|
||||
return;
|
||||
}
|
||||
for child in &mut self.children {
|
||||
child.step();
|
||||
}
|
||||
}
|
||||
|
||||
fn longest_path(&self) -> Vec<u64> {
|
||||
if self.children.is_empty() {
|
||||
return vec![self.value];
|
||||
}
|
||||
let mut max_path = vec![];
|
||||
let mut max_length = 0;
|
||||
for child in &self.children {
|
||||
let temp = child.longest_path();
|
||||
if temp.len() > max_length {
|
||||
max_length = temp.len();
|
||||
max_path = temp;
|
||||
}
|
||||
}
|
||||
let mut retval = vec![self.value];
|
||||
retval.append(&mut max_path);
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO: tweak this function like I mentioned in the Overleaf to get this to do what you want; also
|
||||
* NOTE: use `Primal::is_prime` to test if a number is prime; it's a library that is way faster
|
||||
* than anything I could write
|
||||
*/
|
||||
fn next(x: u64) -> Vec<u64> {
|
||||
let mut new_xs = Vec::new();
|
||||
return new_xs;
|
||||
}
|
||||
|
||||
/* here are the initial conditions. By default it creates a tree with value 0 and no children, but
|
||||
* feel free to tweak this to your heart's content
|
||||
*/
|
||||
fn main() {
|
||||
let mut tree = Tree::new(0, Vec::new());
|
||||
for _ in 0..20 {
|
||||
tree.step();
|
||||
println!("{:?}", tree.longest_path());
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
(load "util.scm")
|
||||
|
||||
; If you are messing with any of this, you already know what you are doing
|
||||
|
||||
(define (val tree) (car tree))
|
||||
(define (children tree) (cdr tree))
|
||||
(define (new-tree val children)
|
||||
|
|
|
|||
Loading…
Reference in a new issue