Skip to content

Instantly share code, notes, and snippets.

@skalinets
Created January 26, 2012 12:54
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skalinets/1682643 to your computer and use it in GitHub Desktop.
Save skalinets/1682643 to your computer and use it in GitHub Desktop.
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using FluentAssertions;
using NUnit.Framework;
using Nancy.Helpers;
namespace NancySelfHosting
{
using Nancy;
using System;
using System.Diagnostics;
public class Module : NancyModule
{
public Module()
{
Get["/"] = parameters => { return handleQuery(parameters); }; //"Hello World";
}
private String handleQuery(dynamic parameters)
{
var query = HttpUtility.UrlDecode(Request.Url.Query);
Debug.WriteLine(query);
File.AppendAllLines(@"d:\output.txt", new []{query});
return new Calculator().Calculate(query).ToString();
}
}
public class QueryExtractorTests
{
[Test]
public void should_extact_value_after_two_dots()
{
var input = "fuckingstring: some value string 123";
var extractor = new QueryExtractor();
var query = extractor.Extract(input);
Assert.That(query, Is.EqualTo("some value string 123"));
}
[Test]
public void should_extract_with_two_double_dots()
{
var input = "fuckingstring: some value string: 123";
var extractor = new QueryExtractor();
var query = extractor.Extract(input);
Assert.That(query, Is.EqualTo("some value string: 123"));
}
}
public class QueryExtractor
{
public string Extract(string input)
{
//return String.Join(":", input.Split(':').Skip(1).Select(_ => _.Trim()));
return input.Substring(input.IndexOf(":") + 1).Trim();
}
}
public class CalculatorTests
{
[Test]
public void should_get_largest()
{
var input = "?q=11011f20: which of the following numbers is the largest: 763, 334, 44, 87";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("763");
}
[Test]
public void should_support_multiply()
{
var input = "?q=16f97a20: what is 10 multiplied by 0";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("0");
}
[Test]
public void should_support_multiply_and_plus()
{
var input = "?q=b0394b80: what is 0 multiplied by 4 plus 11";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("11");
}
[Test]
public void should_support_plus()
{
var input = "?q=4cba7150: what is 15 plus 1";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("16");
}
[Test]
public void should_support_square_and_cube()
{
var input = "?q=ac6db640: which of the following numbers is both a square and a cube: 857, 4096";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("4096");
var arg0 = Math.Pow(10.0, 1.0/3);
var isInt = ((int)(Math.Round(arg0) - arg0)) == 0;
Console.Out.WriteLine("4096 = {0}", arg0);
Console.Out.WriteLine("4096 = {0}", isInt);
}
[Test]
public void should_support_minus()
{
var input = "?q=c8b39b60: what is 19 minus 7";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("12");
}
[Test]
public void should_support_primes()
{
var input = "?q=7d973090: which of the following numbers are primes: 4, 5, 7, 3, 8";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("5, 7, 3");
}
[Test]
public void should_support_power()
{
var input = "?q=a6465a30: what is 3 to the power of 8";
var calculator = new Calculator();
var result = calculator.Calculate(input);
// Console.Out.WriteLine("Math.Pow(3,8) = {0}", Math.Pow(3,8));
result.Should().Be(Math.Pow(3, 8).ToString());
}
[Test]
public void should_support_twitter()
{
var input = "?q=a7b85650: what is the twitter id of the organizer of this dojo";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("jhannes");
}
[Test]
public void should_support_plus_plus()
{
var input = "?q=0047d850: what is 10 plus 13 plus 8";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("31");
}
[Test]
public void should_support_sale()
{
var input = "?q=11cddf40: what products do you have for sale (comma separated)";
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be("bread, milk");
}
[TestCase("?q=80808ca0: what is the 5th number in the Fibonacci sequence", "3")]
public void should_support_fibonachi(string question, string answer)
{
var input = question;
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be(answer);
}
[TestCase("?q=69655a00: who played James Bond in the film Dr No", "Sean Connery")]
[TestCase("?q=cce09620: A flight from Paris to Oslo leaves from Paris 29.10.2011 at 08:00. It takes 164 minutes. When (local time) does it land in Oslo ?", "29.10.2011 at 10:44")]
public void should_support_james(string question, string answer)
{
var input = question;
var calculator = new Calculator();
var result = calculator.Calculate(input);
result.Should().Be(answer);
}
}
public class PrimeCalculatorTests
{
[TestCase(2, true)]
[TestCase(3, true)]
[TestCase(4, false)]
[TestCase(5, true)]
[TestCase(10, false)]
public void should_be_primes(int candidate, bool expected)
{
var primeCalculator = new PrimeCalculator();
primeCalculator.IsPrime(candidate).Should().Be(expected);
}
}
public class FibonachiNumberTests
{
}
public class PrimeCalculator
{
public bool IsPrime(int candidate)
{
for (var i = 2; i < candidate / 2 + 1; i++)
{
if (candidate % i == 0)
return false;
}
return true;
}
}
public class Calculator
{
int fibbo (int i)
{
if (i > 500)
return 0;
if (i == 0)
{
return 0;
}
else if (i == 1)
{
return 1;
}
else return fibbo(i - 1) + fibbo(i - 2);
}
public string Calculate(string input)
{
input = new QueryExtractor().Extract(input);
if (input.Contains("who played James Bond in the film Dr No"))
{
return "Sean Connery";
}
if (input.Contains("largest"))
{
var regex = new Regex("[0-9]+");
var matches = regex.Matches(input);
int i = 0;
foreach (var match in matches)
{
var i1 = Int32.Parse(((Match) match).Value);
Console.Out.WriteLine("i1 = {0}", i1);
if (i1 > i)
{
i = i1;
}
}
return i.ToString();
}
if (input.Contains("a square and a cube"))
{
var regex = new Regex("[0-9]+");
var matches = regex.Matches(input);
int i = 0;
foreach (var match in matches)
{
var i1 = Int32.Parse(((Match) match).Value);
//if (Math.Sqrt(i1) && Math.Pow(i1, 1.0 / 3))
//{
//}
Console.Out.WriteLine("i1 = {0}", i1);
if (i1 > i)
{
i = i1;
}
}
return i.ToString();
}
if (input.Contains(" Oslo leaves from Paris 29.10.2011 at 08:00. It takes "))
{
var regex = new Regex("It takes ([0-9]+) minutes");
var minutes = Int32.Parse(regex.Match(input).Groups[1].Value);
var dateTime = new DateTime(2011, 10, 29, 08, 00, 00).AddMinutes(minutes);
return dateTime.ToString(@"dd.MM.yyyy a\t hh:mm");
}
if (input.Contains("what products do you have for sale (comma separated)"))
{
return "bread, milk";
}
if (input.Contains("primes"))
{
var regex = new Regex("[0-9]+");
var matches = regex.Matches(input);
var result = (from object match in matches select Int32.Parse(((Match) match).Value) into i1 where new PrimeCalculator().IsPrime(i1) select i1.ToString()).ToList();
return string.Join(", ", result);
}
if (input.Contains("twitter"))
{
return "jhannes";
}
if (input.Contains("Fibonacci"))
{
string pattern = "([0-9]+)[a-z][a-z] number";
var gg = new Regex(pattern).Match(input).Groups[1];
Console.Out.WriteLine("gg = {0}", gg);
var index = Int32.Parse(gg.Value);
return fibbo(index - 1).ToString();
}
if (input.Contains("multiplied by") && input.Contains("plus"))
{
var regex = new Regex("([0-9]+) multiplied by ([0-9]+) plus ([0-9]+)");
var matches = regex.Match(input);
var value0 = matches.Groups[1].Value;
var value1 = matches.Groups[2].Value;
var value2 = matches.Groups[3].Value;
// Console.Out.WriteLine("vvv = {0}", new {value0, value1});
// return 0;
return (Int32.Parse(value0)* Int32.Parse(value1) + Int32.Parse(value2)).ToString();
}
if (input.Contains("multiplied by"))
{
var regex = new Regex("([0-9]+) " + "multiplied by" + " ([0-9]+)");
var matches = regex.Match(input);
var value0 = matches.Groups[1].Value;
var value1 = matches.Groups[2].Value;
// Console.Out.WriteLine("vvv = {0}", new {value0, value1});
// return 0;
return (Int32.Parse(value0)* Int32.Parse(value1)).ToString();
}
if (Regex.IsMatch(input, ".*plus.*plus.*"))
{
var regex = new Regex("([0-9]+) " + "plus " + "([0-9]+)" + " plus " + "([0-9]+)");
var matches = regex.Match(input);
var value0 = matches.Groups[1].Value;
var value1 = matches.Groups[2].Value;
var value2 = matches.Groups[3].Value;
// Console.Out.WriteLine("vvv = {0}", new {value0, value1});
// return 0;
var calculate = Int32.Parse(value0) + Int32.Parse(value1) + Int32.Parse(value2);
return calculate.ToString();
}
if (input.Contains("plus"))
{
var regex = new Regex("([0-9]+) " + "plus" + " ([0-9]+)");
var matches = regex.Match(input);
var value0 = matches.Groups[1].Value;
var value1 = matches.Groups[2].Value;
// Console.Out.WriteLine("vvv = {0}", new {value0, value1});
// return 0;
var calculate = Int32.Parse(value0) + Int32.Parse(value1);
return calculate.ToString();
}
if (input.Contains("minus"))
{
var regex = new Regex("([0-9]+) " + "minus" + " ([0-9]+)");
var matches = regex.Match(input);
var value0 = matches.Groups[1].Value;
var value1 = matches.Groups[2].Value;
// Console.Out.WriteLine("vvv = {0}", new {value0, value1});
// return 0;
var calculate = Int32.Parse(value0) - Int32.Parse(value1);
return calculate.ToString();
}
if (input.Contains("to the power of"))
{
var regex = new Regex("([0-9]+) " + "to the power of" + " ([0-9]+)");
var matches = regex.Match(input);
var value0 = matches.Groups[1].Value;
var value1 = matches.Groups[2].Value;
// Console.Out.WriteLine("vvv = {0}", new {value0, value1});
// return 0;
var calculate = Math.Pow(Int32.Parse(value0), Int32.Parse(value1));
return calculate.ToString();
}
return "-100";
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment