init
This commit is contained in:
commit
402054df64
4 changed files with 491 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/target
|
||||
Cargo.lock
|
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
|
@ -0,0 +1,11 @@
|
|||
[package]
|
||||
name = "alchemysolver"
|
||||
version = "0.1.0"
|
||||
authors = ["LordMZTE <lord@mzte.de>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.40"
|
||||
petgraph = "0.5.1"
|
385
assets/combinations.txt
Normal file
385
assets/combinations.txt
Normal file
|
@ -0,0 +1,385 @@
|
|||
Airplane = Metal + Bird
|
||||
Albert Einstine = Scientist + Energy
|
||||
Alcohol = Fire + water
|
||||
Alcoholic = Man + Alcohol
|
||||
Algae = Life + water
|
||||
Alien = Star + Life
|
||||
Aluminium = Airplane + Metal
|
||||
Ambulance = Hospital + Car
|
||||
Aquarium = Glass + Fish
|
||||
Arable = Earth + Tool
|
||||
Arms = Metal + Tool
|
||||
Ash = Fire + Tree
|
||||
Ashtray = Ash + Glass
|
||||
Assassin = Man + Poisoned Weapons
|
||||
Austrialia = Kangaroo + Country
|
||||
Avian Flu = Bird + Flu
|
||||
Baby = Man + Sex
|
||||
Bacon = Fire + Pig
|
||||
Bacteria = Life + Swamp
|
||||
Bar = Brick House + Beer
|
||||
Barbeque = Fire + Meat
|
||||
Bat = Bird + Vampire
|
||||
Batman = Bat + Man
|
||||
Beach = Water + Sand
|
||||
Bear = Beast + Forest
|
||||
Beast = Earth + Lizard
|
||||
Beaver = Dam + Beast
|
||||
Bee = Flower + beetle
|
||||
Beer = Alcohol + Wheat
|
||||
Beetle = Earth + Worm
|
||||
Beetroot = Sugar + Seed
|
||||
Belarus = Tractor + Country
|
||||
Berry = Grass + Fruit
|
||||
Bicycle = Wheel + Wheel
|
||||
Bird = Air + Egg
|
||||
Bitumen = Kerogen + Pressure
|
||||
Blood = Beast + Hunter
|
||||
Boat = Wood + Water
|
||||
Boiler = Metal + Steam
|
||||
Book = Feather + Paper
|
||||
Borscht = Beetroot + Fire
|
||||
Bow = Robin Hood + Arms
|
||||
Bread = Dough + Fire
|
||||
Brick = Clay + Fire
|
||||
Brick House = Brick + Concrete
|
||||
Butterfly = Air + Worm
|
||||
C-3PO = Gold + Robot
|
||||
Cactus = Desert + Tree
|
||||
Camel = Desert + Beast
|
||||
Cancer = Man + Tobacco
|
||||
Car = Cart + Combustion Engine
|
||||
Caramel = Sugar + Fire
|
||||
Carbon Dioxide = Oxygen + Man
|
||||
Carmine = Cochineal + Fire
|
||||
Cart = Wheel + Wood
|
||||
Cat = Mouse + Hunter
|
||||
Catdog = Cat + Dog
|
||||
Caviar = Fish + Fish
|
||||
Cement = Clay + Limestone
|
||||
Cemetery = Grave + Grave
|
||||
Ceramics = Clay + Man
|
||||
Champagne = Soda water + Wine
|
||||
Chariot = Warrior + Cart
|
||||
Cheese = Quark + Fire
|
||||
Chicken = Egg + Life
|
||||
China = Dragon + Country
|
||||
Chocolate = Cocoa + Sugar
|
||||
Christmas Tree = Tree + Lightbulb
|
||||
Cigarettes = Paper + Tobacco
|
||||
City = Skyscraper + Skyscraper
|
||||
Clay = Sand + Swamp
|
||||
Clock = Hourglass + Electricity
|
||||
Cloth = Tool + Wool
|
||||
Clothing = Cloth + Man
|
||||
Cloud = Air + Steam
|
||||
Coal = Fire + Tree
|
||||
Coca-Cola = Soda Water + Carmine
|
||||
Cochineal = Cactus + Beetle
|
||||
Cocoa = Seed + Mexico
|
||||
Coffin = Corpse + wood
|
||||
Coin = Silver + Pressure
|
||||
Combustion Engine = Steam Engine + Gasoline
|
||||
Concrete = Cement + Water
|
||||
Continent = Country + Country
|
||||
Copper = Silver + Gold
|
||||
Corpse = Fire + Man
|
||||
Country = City + City
|
||||
Crop Circles = UFO + Arable
|
||||
Dam = Water + Brick
|
||||
Desert = Sand + Sand
|
||||
Diamond = Uncut Diamond + Tool
|
||||
Diet = Man + Yogurt
|
||||
Dilemma = Egg + Chicken
|
||||
Dinosaur = Earth + Egg
|
||||
Doctor = Hospital + Scientist
|
||||
Dog = Wolf + Man
|
||||
Dough = Flour + Water
|
||||
Dr. Zoidberg = Doctor + Lobster
|
||||
Dragon = Dinosaur + Fire
|
||||
Dust = Air + Earth
|
||||
E-Book = Microchip + Book
|
||||
Ectoplasm = Ghost + Energy
|
||||
Egg = Life + Stone
|
||||
Egypt = Cat + Country
|
||||
Electric Eel = Snake + Electricity
|
||||
Electric Ray = Fish + Electricity
|
||||
Electricity = Energy + Metal
|
||||
Elephant = Whale + Earth
|
||||
Energy = Air + Fire
|
||||
ENT = Tree + Life
|
||||
Explosion = Gasoline + Fire
|
||||
Fabrege Egg = Egg + Diamond
|
||||
Farmer = Man + Seed
|
||||
Fat = Man + Pig
|
||||
Feather = Bird + Hunter
|
||||
Fern = Moss + Swamp
|
||||
Finland = Sauna + Country
|
||||
Fire Elemental = Fire + Life
|
||||
Firearms = Arms + Gunpowder
|
||||
Firefighter = Hero + Fire
|
||||
Firefly = Light + Beetle
|
||||
Fish = Bacteria + Plankton
|
||||
Fisherman = Hunter + Fish
|
||||
Flour = Stone + Wheat
|
||||
Flower = Water + Seed
|
||||
Flu = Air + Bacteria
|
||||
Fondue = Cheese + Fire
|
||||
Forest = Grove + Grove
|
||||
Fossil = Butterfly + Earth
|
||||
France = Champagne + Country
|
||||
Frankenstein = Corpse + Electricity
|
||||
Fried Chicken = Chicken + Fire
|
||||
Frog = Lizard + Swamp
|
||||
Fruit = Tree + Farmer
|
||||
Fugu = Fish + Poison
|
||||
Gasoline = Petroleum + Pressure
|
||||
Genie = Lamp + Ghost
|
||||
Germany = VW Beetle + Country
|
||||
Geyser = Steam + Earth
|
||||
Ghost = Ash + Life
|
||||
Ghostbusters = Hunter + Ghost
|
||||
Glass = Fire + Sand
|
||||
Gold = Philosopher's Stone + Silver
|
||||
Golem = Clay + Life
|
||||
Grape = Earth + Wood
|
||||
Grass = Earth + Moss
|
||||
Grave = Earth + Corpse
|
||||
Grove = Tree + Tree
|
||||
Gunpowder = Dust + Fire
|
||||
Hen Coop = Chicken + Hut
|
||||
Hero = Dragon + Warrior
|
||||
Honey = Bee + Tree
|
||||
Hospital = Brick House + Sick
|
||||
Hot Chocolate = Chocolate + Fire
|
||||
Hourglass = Glass + sand
|
||||
House M.D. = Man + Vicodin
|
||||
Hunter = Arms + Man
|
||||
Hut = Man + Stone
|
||||
Hydrogen = Electricity + Water
|
||||
Ice = Water + Glass
|
||||
Iceland = Volcano + Country
|
||||
Idea = Man + Light bulb
|
||||
India = Kama Sutra + Country
|
||||
Iodine = Algae + Fire
|
||||
iPhone = Phone + Fruit
|
||||
Island = Sea + Volcano
|
||||
Italy = Venice + Country
|
||||
Japan = Sushi + Country
|
||||
Jedi = Warrior + Lightsaber
|
||||
Juice = Berry + Pressure
|
||||
Kama Sutra = Book + Sex
|
||||
Kangaroo = Frog + 1UP
|
||||
Kerogen = Fossil + Pressure
|
||||
Kilt = Scotland + Clothing
|
||||
Knife = Meat + Tool
|
||||
Lamp = Glass + Fire
|
||||
Lance Armstrong = Cancer + Bike
|
||||
Lava = Earth + Fire
|
||||
Lava Golem = Lava + Life
|
||||
Lava Lamp = Lava + Lamp
|
||||
Lawn Mower = Scissors + Combustion Engine
|
||||
Leech = Blood + Worm
|
||||
Library = Book + Book
|
||||
Lichen = Mushroom + Algae
|
||||
Life = Energy + Swamp
|
||||
Light = Electricity + Light Bulb
|
||||
Light Bulb = Electricity + Glass
|
||||
Lighthouse = Skyscraper + Light
|
||||
Lightning Rod = Thunderstorm + Metal
|
||||
Lightsaber = Arms + Light
|
||||
Lime = Fire + Limestone
|
||||
Limestone = Shells + Stone
|
||||
Livestock = Beast + Man
|
||||
Lizard = Snake + Worm
|
||||
Lobster = Scorpion + Water
|
||||
Locomotive = Cart + Steam Engine
|
||||
Man = Golem + Life
|
||||
Manure = Grass + Livestock
|
||||
Mario = 1up + Man
|
||||
McDonald's = Coca-Cola + Sandwich
|
||||
Meat = Beast + Hunter
|
||||
Mentos = Coca-Cola + Geyser
|
||||
Mermaid = Woman + Fish
|
||||
Metal = Fire + Stone
|
||||
Metal Golem = Metal + Life
|
||||
Mexico = Tequila + Country
|
||||
Microchip = Transistor + Transistor
|
||||
Milk = Livestock + Man
|
||||
Mirror = Aliminium + Glass
|
||||
Mite = Life + Dust
|
||||
Mold = Mushroom + Mud
|
||||
Molotov Cocktail = Fire + Alcohol
|
||||
Money = Coin + Paper
|
||||
Moon = Cheese + Sky
|
||||
Moss = Swamp + Algae
|
||||
Motorboat = Boat + Combustion Engine
|
||||
Morotcycle = Bicycle + Combustion Engine
|
||||
Mouse = Cheese + Beast
|
||||
Mud = Dust + Water
|
||||
Mummy = Paper + Zombie
|
||||
Museum = Brick House + Fossil
|
||||
Mushroom = Earth + Algae
|
||||
Music = Sound + Idea
|
||||
Obesity = Man + McDonald's
|
||||
Old Man = Man + Time
|
||||
Omelette = Egg + Fire
|
||||
Oxygen = Electricity + Water
|
||||
Oxyhydrogen = Oxygen + Hydrogen
|
||||
Ozone = Oxygen + Electricity
|
||||
Panda = Tree + Beast
|
||||
Paper = Reed + Tool
|
||||
Pearl = Sand + Shells
|
||||
Peat = Swamp + Tree
|
||||
Penguin = Bird + Ice
|
||||
Penicillin = Mold + Scientist
|
||||
Perfume = Alcohol + Flower
|
||||
Petri Dish = Glass + Bacteria
|
||||
Petroleum = Bitumen + Pressure
|
||||
Philosopher's Stone = Philosophy + Stone
|
||||
Philosophy = Dilemma + Scientist
|
||||
Phoenix = Fire + Bird
|
||||
Phone = Wire + Sound
|
||||
Pie = Fruit + Dough
|
||||
Pig = Livestock + Mud
|
||||
Piggy Bank = Ceramics + Coin
|
||||
Pillow = Feather + Cloth
|
||||
Pinocchio = Wood + Life
|
||||
Pizza = Cheese + Dough
|
||||
Planet = Continent + Continent
|
||||
Plankton = Bacteria + Water
|
||||
Plesiosauria = Water + Dinosaur
|
||||
Poison = Mushroom + Tool
|
||||
Poisoned Weapons = Arms + Poison
|
||||
Pressure = Earth + Earth
|
||||
Prisoner = Assassin + Time
|
||||
Pterodactyl = Air + Dinosaur
|
||||
Quark = Soured Milk + Fire
|
||||
Quetzalcoatl = Snake + Bird
|
||||
R2-D2 = Star Wars + Robot
|
||||
Rain = Water + Cloud
|
||||
Rainbow = Light + Storm
|
||||
Reed = Grass + Swamp
|
||||
Robin Hood = Forest + Hero
|
||||
Robot = Metal Golem + Electricity
|
||||
Romania = Transylvania + Country
|
||||
Ruby = Aluminuim + Oxygen
|
||||
Russia = Vodka + Country
|
||||
Rust = Water + Metal
|
||||
Sailboat = Boat + Cloth
|
||||
Sailing Ship = Cloth + Wooden ship
|
||||
Sailor = Man + Boat
|
||||
Salamander = Lizard + Fire
|
||||
Salo = Man + Pig
|
||||
Salt = Sea + Fire
|
||||
Saltpeter = Limestone + Manure
|
||||
Sand = Water + Stone
|
||||
Sandstorm = Sand + Storm
|
||||
Sandwich = Meat + Bread
|
||||
Santa Clause = Old Man + Christmas Tree
|
||||
Saudi Arabia = Petroleum + Country
|
||||
Sauna = Steam + Hut
|
||||
Scarab = Beetle + Manure
|
||||
Scientist = Library + Man
|
||||
Scissors = Knife + Knife
|
||||
Scorpion = Beetle + Sand
|
||||
Scotch Whiskey = Alcohol + Peat
|
||||
Scotland = Scotch Whiskey + Country
|
||||
Sea = Water + Water
|
||||
Seed = Life + Sand
|
||||
Sex = Man + Woman
|
||||
Sex and the City = Sex + City
|
||||
Shells = Plankton + Stone
|
||||
Sick = Man + Flu
|
||||
Silicon = Pressure + Sand
|
||||
Silk = China + Cloth
|
||||
Silver = Moon + Metal
|
||||
Sith = Jedi + Assassin
|
||||
Sky = Air + Cloud
|
||||
Skyscraper = Brick House + Glass
|
||||
Smoke = Tobacco + Fir
|
||||
Snail = Shells + Worm
|
||||
Snake = Swamp + Worm
|
||||
Sniper = Assassin + Firearms
|
||||
Soap = Ash + Fat
|
||||
Soda Water = Carbon Dioxide + Water
|
||||
Soldier = Firearms + Man
|
||||
Sound = Metal + wind
|
||||
Soured Milk = Milk + Yogurt
|
||||
Spinning Wheel = Wheel + Wool
|
||||
Stake = Wood + Knife
|
||||
Star = Sun + Scientist
|
||||
Star Wars = Jedi + Sith
|
||||
Statue = Stone + Tool
|
||||
Statue of Liberty = USA + Statue
|
||||
Steam = Air + Water
|
||||
Steam Engine = Boiler + Coal
|
||||
Steamer = Steam Engine + Wooden Ship
|
||||
Stone = Air + Lava
|
||||
Storm = Air + Energy
|
||||
Sugar = Lime + Reed
|
||||
Sulfur = Bacteria + Swamp
|
||||
Sun = Sky + Chariot
|
||||
Sunflower = Sun + Flower
|
||||
Sushi = Fish + Algae
|
||||
Swamp = Earth + Water
|
||||
Sweater = Yarn + Tool
|
||||
Swine Flu = Pig + Flu
|
||||
Swiss Army Knife = Knife + Tool
|
||||
Switzerland = Fondue + Country
|
||||
Team = Beast + Cart
|
||||
Tequila = Alcohol + Worm
|
||||
The Beatles = Beetle + Beetle
|
||||
Thread = Spinning Wheel + Yarn
|
||||
Thunderbird = Bird + Storm
|
||||
Thunderstorm = Storm + Electricity
|
||||
Time = Life + Hourglass
|
||||
Toast = Fire + Bread
|
||||
Tobacco = Fire + Grass
|
||||
Tool = Man + Metal
|
||||
Totoro = Forest + Ghost
|
||||
Tractor = Lawn Mower + Arable
|
||||
Transformers = Car + Life
|
||||
Transistor = Silicon + Electricity
|
||||
Transylvania = Vampire + Country
|
||||
Tree = Earth + Seed
|
||||
Turtle = Sand + Egg
|
||||
Twilight Saga = Vampire + Werewolf
|
||||
Typhoon = Storm + Water
|
||||
UFO = Alien + Airplane
|
||||
Ukraine = Salo + Country
|
||||
Uncut Diamond = Coal + Pressure
|
||||
Undead = Zombie + Corpse
|
||||
United Kingdom = Beatles + Country
|
||||
USA = Coca-Cola + Country
|
||||
Vampire = Blood + Man
|
||||
Venice = City + Water
|
||||
Venus = Woman + Planet
|
||||
Vicodin = Sick + Doctor
|
||||
Vinegar = Alcohol + Oxygen
|
||||
Vodka = Alcohol + Water
|
||||
Volcano = Lava + Pressure
|
||||
Vulture = Corpse + Bird
|
||||
VW Beetle = Car + Beetle
|
||||
Warrior = Arms + Hunter
|
||||
Weevil = Flour + Beetle
|
||||
Werewolf = Beast + Vampire
|
||||
Whale = Beast + Water
|
||||
Wheat = Arable + Seed
|
||||
Wheel = Tool + Wood
|
||||
Whey = Soured Milk + Fire
|
||||
Wind = Air + Air
|
||||
Wine = Grape + Alcohol
|
||||
Wire = Thread + Copper
|
||||
Wolf = Moon + Beast
|
||||
Woman = Milk + Man
|
||||
Wood = Tool + Tree
|
||||
Wooden Ship = Boat + Wood
|
||||
Wool = Beast + Hunter
|
||||
Worm = Earth + Plankton
|
||||
Yarn = Spinning Wheel + Wool
|
||||
Yoda = Jedi + Swamp
|
||||
Yogurt = Bacteria + Milk
|
||||
Yoshi = 1up + Egg
|
||||
Zombie = Fossil + Life
|
||||
Zoo = Beast + Museum
|
93
src/main.rs
Normal file
93
src/main.rs
Normal file
|
@ -0,0 +1,93 @@
|
|||
use petgraph::dot::{Dot, Config};
|
||||
use petgraph::{Graph, graph::NodeIndex};
|
||||
use anyhow::Context;
|
||||
use std::{collections::HashMap, str::FromStr};
|
||||
use std::env;
|
||||
|
||||
fn main() -> anyhow::Result<()> {
|
||||
let g = include_str!("../assets/combinations.txt").parse::<GraphGen>()?;
|
||||
let searched = env::args().nth(1).context("Supply argument for searched element")?;
|
||||
let graph = g.create_graph(&searched);
|
||||
let dot = Dot::with_config(&graph, &[Config::EdgeNoLabel]);
|
||||
println!("{}", dot);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
struct GraphGen {
|
||||
map: HashMap<String, (String, String)>,
|
||||
graph: Graph<String, String>,
|
||||
}
|
||||
|
||||
impl GraphGen {
|
||||
fn try_parse_comb(&mut self, c: &str) -> anyhow::Result<()> {
|
||||
let err = "Failed to Parse combination";
|
||||
let mut split = c.splitn(2, '=');
|
||||
let name = split.next().context(err)?.trim().to_owned();
|
||||
let rest = split.next().context(err)?;
|
||||
|
||||
let mut split = rest.splitn(2, '+');
|
||||
let ing_a = split.next().context(err)?.trim().to_owned();
|
||||
let ing_b = split.next().context(err)?.trim().to_owned();
|
||||
|
||||
self.map.insert(name, (ing_a, ing_b));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn populate(&mut self, elem: String) {
|
||||
let ab = self.map.get(&elem);
|
||||
|
||||
if !self.graph.node_indices().any(|n| self.graph.node_weight(n).unwrap() == &elem) {
|
||||
self.graph.add_node(elem);
|
||||
}
|
||||
|
||||
if let Some((a, b)) = ab {
|
||||
let a = a.clone();
|
||||
let b = b.clone();
|
||||
|
||||
self.populate(a);
|
||||
self.populate(b);
|
||||
}
|
||||
}
|
||||
|
||||
fn link(&mut self) {
|
||||
for n in self.graph.node_indices() {
|
||||
let w = self.graph.node_weight(n).unwrap();
|
||||
if let Some((a, b)) = self.map.get(w) {
|
||||
if let Some(i) = self.find_node(a) {
|
||||
self.graph.add_edge(i, n, String::new());
|
||||
}
|
||||
|
||||
if let Some(i) = self.find_node(b) {
|
||||
self.graph.add_edge(i, n, String::new());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn find_node(&self, w: &str) -> Option<NodeIndex>{
|
||||
self.graph.node_indices().find(|g| &self.graph[*g] == w)
|
||||
}
|
||||
|
||||
fn create_graph(mut self, node: &str) -> Graph<String, String> {
|
||||
self.populate(node.to_owned());
|
||||
self.link();
|
||||
self.graph
|
||||
}
|
||||
}
|
||||
|
||||
impl FromStr for GraphGen {
|
||||
type Err = anyhow::Error;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
let mut this = Self::default();
|
||||
|
||||
for l in s.lines() {
|
||||
this.try_parse_comb(l)?;
|
||||
}
|
||||
|
||||
Ok(this)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in a new issue