Created
September 17, 2015 22:08
-
-
Save pouyakary/0bb39386f687222ca9bd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Program.cs | |
// | |
// Created by Pouya Kary on 2015/9/18 | |
// Copyright (c) 2015 Pouya Kary. All rights reserved. | |
// | |
// This code is published under the GNU General Public | |
// License v3 published by Free Software Foundation. | |
// | |
using System; | |
using System.Text; | |
using System.Text.RegularExpressions; | |
using System.Collections.Generic; | |
using Kary; | |
using NCalc; | |
namespace FunnyThing { | |
class MainClass { | |
// ──────────────────────────────────────────────────────────────────────────────────────────────────── | |
/// <summary> | |
/// The entry point of the program, where the program control starts and ends. | |
/// </summary> | |
/// <param name="args">The command-line arguments.</param> | |
public static void Main ( string[] args ) { | |
// ──────────────────────────────────────────────────────────────────────────────── | |
Terminal.PrintLn( "The Solver..." ); | |
// | |
// ─── GETTING THE INPUT ────────────────────────────────────────────────────────── | |
// | |
string InputString = Terminal.Input( "Please enter a number with 7 digits: " ).Trim( ); | |
if ( !Regex.IsMatch( InputString , "([0-9]){7}" ) ) { | |
// | |
// Someone so much wanted this checking... | |
// | |
Terminal.Red( ); | |
Terminal.PrintLn( "The input was not in the currect format" ); | |
Terminal.Reset( ); | |
Environment.Exit( 1 ); | |
} | |
Terminal.PrintLn( "--> Input in right format." ); | |
// | |
// ─── FIRST STUFF... ───────────────────────────────────────────────────────────── | |
// | |
Terminal.Print( "--> Inintilizing the evnironment: " ); | |
Expression InitTimeExpr = new Expression( "34 + 34 / 3" ); | |
InitTimeExpr.Evaluate(); | |
Dictionary<string, bool> History = new Dictionary<string, bool> { }; | |
Random RND = new Random(); | |
Terminal.PrintLn(" [DONE]"); | |
// | |
// ─── BODY ─────────────────────────────────────────────────────────────────────── | |
// | |
Terminal.PrintLn( "--> Process started" ); | |
int TryNumber = 1; | |
for ( ; ; ) { | |
ForStart: | |
// | |
// Generating a formula and seeing if it exsists... | |
// | |
string Formula = FormulaGenerator( InputString , ref RND ); | |
if ( History.ContainsKey( Formula ) ) { | |
goto ForStart; | |
} else { | |
History.Add( Formula , true ); | |
} | |
// | |
// Evaluating | |
// | |
Expression FormulaExpression = new Expression( Formula ); | |
object EvaluatedFormula = 0; | |
try { | |
EvaluatedFormula = FormulaExpression.Evaluate( ); | |
Terminal.PrintLn( "--> Try: " + TryNumber + " -> " + Formula + " = " + EvaluatedFormula + "\n" ); | |
} catch { | |
Terminal.PrintLn("--> NCalc Error"); | |
} | |
// | |
// Checking | |
// | |
try { | |
if ( EvaluatedFormula.ToString() == "100" ) { | |
Terminal.Print( "--> " ); | |
Terminal.Green( ); | |
Terminal.PrintLn( "FOUND THE ANSWER!" ); | |
Terminal.Reset( ); | |
Terminal.NewLine(); | |
Terminal.PrintLn( " " + Formula); | |
Terminal.NewLine(); | |
Terminal.NewLine(); | |
Environment.Exit( 0 ); | |
} | |
} catch { | |
Terminal.PrintLn( "--> Error catched..." ); | |
} | |
TryNumber++; | |
} | |
// ──────────────────────────────────────────────────────────────────────────────── | |
} | |
// ──────────────────────────────────────────────────────────────────────────────────────────────────── | |
public static char[] OperatorList = { '+' , '-' , '*' , '/' }; | |
// ──────────────────────────────────────────────────────────────────────────────────────────────────── | |
public static string FormulaGenerator ( string Number , ref Random RND ) { | |
// ──────────────────────────────────────────────────────────────────────────────── | |
bool DidUseParentheses = false; | |
bool DidFinishParentheses = false; | |
StringBuilder Result = new StringBuilder( ); | |
// | |
// ─── THE FIRST PART ───────────────────────────────────────────────────────────── | |
// | |
if ( DoOrDoNotParentheses( ref RND ) ) { | |
Result.Append( '(' ); | |
DidUseParentheses = true; | |
} | |
// | |
// ─── THE MIDDLE ───────────────────────────────────────────────────────────────── | |
// | |
for ( int Index = 0 ; Index < 6 ; Index++ ) { | |
// | |
// Adding the Number | |
// | |
Result.Append( Number[ Index ] ); | |
// | |
// Deciding to how to add the operator: | |
// The operator goes befor open Parentheses | |
// and after closing match. So we have to | |
// go with that. | |
// | |
if ( DidUseParentheses ) { | |
// ──────────────────────────────────────────────────────────── | |
if ( DidUseParentheses && !DidFinishParentheses ) { | |
if ( DoOrDoNotParentheses( ref RND ) ) { | |
Result.Append( ')' ); | |
DidFinishParentheses = true; | |
} | |
} | |
Result.Append( ChooseOperator( ref RND ) ); | |
// ──────────────────────────────────────────────────────────── | |
} else /* of DidUseParentheses */ { | |
// ──────────────────────────────────────────────────────────── | |
Result.Append( ChooseOperator( ref RND ) ); | |
if ( !DidUseParentheses ) { | |
if ( DoOrDoNotParentheses( ref RND ) ) { | |
Result.Append( '(' ); | |
DidUseParentheses = true; | |
} | |
} | |
// ──────────────────────────────────────────────────────────── | |
} /* end of DidUseParentheses */ | |
} /* for ( int Index = 0 ; Index < 6 ; Index++ ) { */ | |
Result.Append( Number[ 6 ] ); | |
// | |
// ─── THE LAST ─────────────────────────────────────────────────────────────────── | |
// | |
if ( DidUseParentheses && !DidFinishParentheses ) { | |
Result.Append( ')' ); | |
} | |
// ──────────────────────────────────────────────────────────────────────────────── | |
return Result.ToString( ); | |
// ──────────────────────────────────────────────────────────────────────────────── | |
} | |
// ──────────────────────────────────────────────────────────────────────────────────────────────────── | |
public static char ChooseOperator ( ref Random RND ) { | |
return OperatorList[ RND.Next( OperatorList.Length ) ]; | |
} | |
// ──────────────────────────────────────────────────────────────────────────────────────────────────── | |
public static bool DoOrDoNotParentheses ( ref Random RND ) { | |
return RND.Next( 5 ) < 2; | |
} | |
// ──────────────────────────────────────────────────────────────────────────────────────────────────── | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment