-
Posts
1416 -
Joined
-
Last visited
-
Days Won
44
Everything posted by MrGrj
-
Se cauta una bucata coder Node.js pentru un start-up nou. Cerinte: - sa fie din Bucuresti - cunostinte avansate Node.js ( +4 ani minim ) experienta - Amazon Services ( AWS etc) - disponibilitate full-time Colegul de la munca are deja aplicatia facuta in intregime de el si a obtinut ceva finantari, iar acum vrea sa dezvolte toata treaba. Nu trimiteti PM-uri aiurea daca stiti ca nu aveti cunostintele necesare.
-
[VB.net]CPU load-ul procesului deschis de aplicatia mea
MrGrj replied to Rickets's topic in Programare
Incearca asa: Public Shared Function GetProcessInstanceName(ByVal PID As Integer) As String Dim cat As New PerformanceCounterCategory("Process") Dim instances() = cat.GetInstanceNames() For Each instance In instances Using cnt As PerformanceCounter = New PerformanceCounter("Process", "ID Process", instance, True) Dim val As Integer = CType(cnt.RawValue, Int32) If val = PID Then Return instance End If End Using Next End Function -
Ce-ai facut Napoleoane ? ON: Raspunsul la intrebarea ta depinde de mai multe aspecte: ce cunostinte ai in momentul de fata ? cat timp esti dispus sa aloci, etc. Mie personal mi-a luat ceva timp sa invat sa gandesc algoritmic si structurat ( 1 an si putin ). Apoi totul tine de sintaxa limbajului ales, best practices si imaginatie.
-
A cerut pseudocod. Nu un limbaj specific. Odata ce ai pseudocodul poti implementa solutia in orice limbaj doresti. Important e sa intelegi conceptul din spatele pseudocodului.
-
Does having a very low TopCoder rating make someone unemployable?
MrGrj posted a topic in Programare
Am dat peste un raspuns destul de elaborat si bine construit / argumentat si m-am gandit sa il shareuiesc pentru ca poate schimba perspectiva multor useri de p-aici. ( asta daca stiu engleza, desigur ) Argh. No. We really need to stop with the current internet-penis-size mentality around algorithm skills. Yes, testing for basic algorithmic knowledge is an excellent interview shit-test to weed out people that have absolutely no business writing code, but other than that has very little to do with the job of being a software developer. You can spend all bloody day churning out bug-free code with perfect linear time complexity at laser-finger speed, but you might still be a totally shitty developer. We are not athletes or musicians that perform on stage - we are engineers. Our job is to build things. More specifically, (1) build the right things, that (2) work as expected, are (3) easily maintainable for a year or two, and (4) built within reasonable time-frames. This is sort of how I spend my time at work: 40% Talking about WHAT to build. Communication about requirements is by far the most complex, important, and time-consuming aspect of software development. This includes negotiating them, measuring success of them, preventing feature creep from entering the backlog, prioritizing work, how to evolve the architecture instead of just welding the feature on top of it, convincing your product owner that you need to deal with technical debt, and another billion things. If you don't get this right, it will fail your project no matter how good you are at the other stuff. 40% Diving through other peoples code. It is absolutely crucial to be able to absorb other peoples code correctly and quickly, so that you'll make changes that fit (1) in the architecture and (2) don't break existing functionality. It's even more important that you are able to GENERATE code that is easy to understand and absorb, or you'll be a sort of "time cancer" for the team that constantly produces more and more code that wastes more and more time for people to read and understand. I don't care if a programmer has 200 in IQ - if she neglects writing unit tests (the best kind of code documentation), he's GOING to be a detriment for the team, not an asset. 15% Hunting down existing bugs and performance bottlenecks. This has very little to do with algorithmic skills, because humans cannot "look" at 500 000 lines of code and see what is wrong. You need the skillset to methodically narrow down your suspects until you've found the offending method, which usually takes a lot of methodical patience. Once you actually find WHERE the bug/bottleneck resides, it's almost always easy to fix and doesn't require algorithmic genius. 4% Writing actual, new functionality. 1% (and I'm being generous here) Thinking about the time complexity of things. In conclusion: When interviewing, by all means, do a little bit of algorithms just to make sure that the candidate can code, but primarily look at if the person has actually gotten shit done, in a team, in the past. -
Well, let's see: 8809 = 6 ( 4 zerouri de la cifra 8 + un zero + inca un zero de la 9 ) 7111 = 0 ( nici o cifra nu contine vreun zero in ea ) ... 2581 = 2 ( cifra 8 contine 2 zerouri )
-
Pacat.Putea sa iasa un Job Description dragut.
-
Dai unsubscribe. Daca omu' e taran nu incerca sa il depasesti. Daca nu are link de unsubscribe baga filter pe adresa si aia e.
-
Salutare. Uite: #include <iostream> #include <string> #include <cctype> #include <sstream> using namespace std; string acronym(string str) // creez functia necesara { stringstream res; char prev = ' '; for (int i = 0; i < str.length(); i++) // parcurg stringul introdus in functia main { if( isspace(prev) && !isspace(str[i]) ) // cauta si vezi ce face 'isspace' { res << (char) toupper(str[i]); } prev = str[i]; } return res.str(); // } int main(){ string str; // aici retin stringul introdus char NumChar; char str_1; cout << "Baga stringul boss: " << endl; // afisez pe ecran mesajul din ghilimele getline(cin,str);// astept inputul din partea userului // aplic functia si afisez acronimele cout << acronym(str) << endl; } Pentru restul liniilor la care nu am pus comment-uri...vezi ce se intampla fara ele
-
Salut. Pentru mine faptul ca esti la Google si ai x ani este egal cu 0. Cunostintele sunt cele mai importante. Avem pe-aici oameni intre 17 - 23 ani (neangajati) care au dat m*ie de multe ori site-urilor ca Yahoo / PayPal / Google etc. Scuze limbaju'. Zi grea la munca + ploua. Cacat. Vreau salariu mai mare.
-
E posibil sa iti baneze ip-ul din cauza requesturilor numeroase. Daca spui ca uneori merge alteori nu, cred ca asta e problema. Incearca si alte solutii: curl -i http://lotostats.ro/fisier/fisier.php | less Mai poti incerca sa adaugi si un user-agent: wget "http://lotostats.ro/fisier/fisier.php" --user-agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"
-
In principiu ai in cazul general: FOR i = val.initial, val.finala, pas Deci in cazul tau ar veni cam asa: for(x=a;x<=b;x--){ //ceva_de_executat; } Pasii vor fi urmatorii: Initializarea lui x cu valoarea lui a Cat timp x<=b Efectuam ceva_de_executat Efectuam x = x-1 Instructiunile 1,2 si 4 iti arata de fapt ce se intampla in for
-
New Computer Algorithm Learns Rap Lyrics and Writes Its Own Rap Song
MrGrj replied to Che's topic in Stiri securitate
Deci de ce au revolutionat astia ceva? Iei niste versuri cu curl si le bagi in DB. Faci un algoritm pt verificarea rimei pe care l-am facut in clasa a 9a daca nu ma insel Eventual mai faci un algoritm pentru a numara vocalele (asonanta) Iei cateva randuri dintr-un DB si faci un random si iese un rap song. Wow. Nu m-as fi gandit niciodata la ceva asa complicat -
This article will cover almost every OOP concept that a novice/beginner developer hunt for, and not only beginners, the article’s purpose is to be helpful to experience professionals also who need to sometimes brush-up their concepts or who prepare for interviews. Pre-requisites Since this is the first part of the series, my readers should have basic knowledge of C# and should be aware of OOP concepts and terminology. OOP 1. What is OOP and what is advantage of OOP? OOP stands for "Object-Oriented Programming." Remember, it's OOP not OOPS,’S’ may stand for system, synopsis, structure etc. It is a programming approach entirely based on objects, instead of just functions and procedures like in procedural languages. It is like a programming language model organized around objects rather than "actions" and data rather than logic. An "object" in an OOP language refers to a specific type, or "instance," of a class. Each object has a structure exactly similar to other objects in a class, but can have individual properties/values. An object can also invoke methods, specific to that object OOP makes it easier for developers to structure and organize software programs. Individual objects can be modified without affecting other aspects of the program therefore it is also easier to update and change programs written in object-oriented languages. Since the nature of software programs have grown larger over the years, OOP has made developing these large programs more manageable and readable. 2. What are OOP Concepts? Following are OOP concepts explained in brief, we’ll take the topics in detail. Data Abstraction: Data Abstraction is a concept in which the internal and superfluous details of the implementation of a logic is hidden from an end user(who is using the program) .A user can use any of the data and method from the class without knowing about how this is created or what is the complexity behind it. In terms of a real world example, when we drive a bike and change the gears we don’t have to care about how internally its working, like how lever is pulled or how chain is set. Inheritance: Inheritance is most popular Concept in OOP’s .This provides a developer an advantage called reusability of code. Suppose a class is written having functions with specific logic, then we can derive that class into our newly created class and we don’t have to write the logic again for derived class functions, we can use them as it is. Data Encapsulation: Wrapping up of member data and member functions of a class in a single unit is called encapsulation. The visibility of the member functions,data members is set via access modifiers used in class. Polymorphism: Poly means many and morphism means changing or alterable. The Concepts Introduces in the form of Many behaviours of an object. Message Communication: Message Communication means when an object passes the call to method of class for execution. OK, we covered lots of theory, now it’s time for action. I hope that will be interesting. We’ll cover the topics in a series as follows: 3. Polymorphism: In this article we will cover almost all the scenarios of compile type polymorphism, the use of params keyword in detail, and case study or hands on to different possible combinations of the thoughts coming to our mind while coding. Method Overloading or Early Binding or Compile Time Polymorphism Note: Each and every code snippet written in this article is tried and tested. 1. Let's create a simple console application named InheritanceAndPolymorphism, and add a class named Overload.cs and add three methods named DisplayOverload having varied parameters as follows: Overload.cs public class Overload { public void DisplayOverload(int a){ System.Console.WriteLine("DisplayOverload " + a); } public void DisplayOverload(string a){ System.Console.WriteLine("DisplayOverload " + a); } public void DisplayOverload(string a, int { System.Console.WriteLine("DisplayOverload " + a + ; } } In the main method in Program.cs file, add the following code: Program.cs class Program { static void Main(string[] args) { Overload overload = new Overload(); overload.DisplayOverload(100); overload.DisplayOverload("method overloading"); overload.DisplayOverload("method overloading", 100); Console.ReadKey(); } } Now when you run the application, the output is: The class Overload contains three methods named DisplayOverload, they only differ in the datatype of the parameters they consist of. In C# we can have methods with the same name, but the datatypes of their parameters should differ. This feature of C# is called method overloading. Therefore, we need not to remember lots of method names if a method differs in behavior, only providing different parameters to the methods can call a method individually. Point to remember: C# recognizes the method by its parameters and not only by its name. A signature signifies the full name of the method. So the name of a method or its signature is the original method name + the number and data types of its individual parameters. If we run project using following code: public void DisplayOverload() { } public int DisplayOverload(){ } We certainly get a compile time error as: Here we had two functions who differ only in the data type of the value that they return, but we got a compile time error, therefore, another point to remember comes, Point to remember: The return value/parameter type of a method is never the part of method signature if the names of the methods are same. So this is not polymorphism. If we run the project using following code: static void DisplayOverload(int a) { } public void DisplayOverload(int a) { } public void DisplayOverload(string a){ } We again get a compile time error: Can you differentiate with the modification done in the above code, we now have two DisplayOverload methods, that accept an int (integer). The only difference is that one method is marked static. Here the signature of the methods will be considered same as modifiers such as static are also not considered to be a part of method signature. Point to remember: Modifiers such as static are not considered as part of method signature. If we run the program as per following code, considering the method signature is different now: private void DisplayOverload(int a) { } private void DisplayOverload(out int a) { a = 100; } private void DisplayOverload(ref int a) { } We again get a compile time error: The signature of a method not only consists of the data type of the parameter but also the type/kind of parameter such as ref or out etc. Method DisplayOverload takes an int with different access modifiers i.e. out/ref etc, the signature on each is different. Point to remember: The signature of a method consists of its name, number and types of its formal parameters. The return type of a function is not part of the signature. Two methods can not have the same signature and also non-members cannot have the same name as members. 4. Role of Params Parameter in Polymorphism A method can be called by four different types of parameters: Pass by value, Pass by reference, As an output parameter, Using parameter arrays. As explained earlier the parameter modifier is never the part of method signature. Now let’s focus on Parameter Arrays. A method declaration means creating a separate declaration space in memory. So anything created will be lost at the end of the method. Running following code: public void DisplayOverload(int a, string a) { } public void Display(int a) { string a; } Results in compile time error: Point to remember: Parameter names should be unique. And also we can not have a parameter name and a declared variable name in the same function as same. In the case of pass by value, the value of the variable is passed and in the case of ref and out, the address of the reference is passed. When we run the following code: Overload.cs public class Overload { private string name = "Akhil"; public void Display() { Display2(ref name, ref name); System.Console.WriteLine(name); } private void Display2(ref string x, ref string y) { System.Console.WriteLine(name); x = "Akhil 1"; System.Console.WriteLine(name); y = "Akhil 2"; System.Console.WriteLine(name); name = "Akhil 3"; } } Program.cs class Program { static void Main(string[] args) { Overload overload = new Overload(); overload.Display(); Console.ReadKey(); } } We get out put as: We are allowed to pass the same ref parameter as many times as we want. In the method Display the string name has a value of Akhil. Then by changing the string x to Akhil1, we are actually changing the string name to Akhil1 as name is passed by reference. Variables x and name refer to the same string in memory. Changing one changes the other. Again changing y also changes name variable as they refer to the same string anyways. Thus variables x, y and name refer to the same string in memory. When we run the following code: Overload.cs public class Overload { public void Display() { DisplayOverload(100, "Akhil", "Mittal", "OOP"); DisplayOverload(200, "Akhil"); DisplayOverload(300); } private void DisplayOverload(int a, params string[] parameterArray) { foreach (string str in parameterArray) Console.WriteLine(str + " " + a); } } Program.cs class Program { static void Main(string[] args) { Overload overload = new Overload(); overload.Display(); Console.ReadKey(); } } We get output: We will often get into a scenario where we would like to pass n number of parameters to a method. Since C# is very particular in parameter passing to methods, if we pass an int where a string is expected, it immediately breaks down. But C# provides a mechanism for passing n number of arguments to a method, we can achieve it with the help of params keyword. Point to remember: This params keyword can only be applied to the last argument of the method. So the n number of parameters can only be at the end. In the case of method DisplayOverload, the first argument has to be an integer, the rest can be from zero to an infinite number of strings. If we add a method like: private void DisplayOverload(int a, params string[] parameterArray, int { } We get a compile time error as: Thus is is proved that params keyword will be the last parameter in a method, this is already stated in the latest point to remember. Overload.cs public class Overload { public void Display() { DisplayOverload(100, 200, 300); DisplayOverload(200, 100); DisplayOverload(200); } private void DisplayOverload(int a, params int[] parameterArray) { foreach (var i in parameterArray) Console.WriteLine(i + " " + a); } } Program.cs class Program { static void Main(string[] args) { Overload overload = new Overload(); overload.Display(); Console.ReadKey(); } } When we run the code we get: Therefore: Point to Remember: C# is very smart to recognize if the penultimate argument and the params have the same data type. The first integer is stored in the variable a, the rest are made part of the array parameterArray. private void DisplayOverload(int a, params string[][] parameterArray) { } private void DisplayOverload(int a, params string[,] parameterArray) { } For the above written code, we again get a compile time error and a new point to remember as well: Point to remember: same as error above. The data type of the params argument must be a single dimensional array. Therefore [ ][ ] is allowed but not [,]. We also not allowed to combine the params keyword with ref or out. Overload.cs public class Overload { public void Display() { string[] names = {"Akhil", "Ekta", "Arsh"}; DisplayOverload(3, names); } private void DisplayOverload(int a, params string[] parameterArray) { foreach (var s in parameterArray) Console.WriteLine(s + " " + a); } } Program.cs class Program { static void Main(string[] args) { Overload overload = new Overload(); overload.Display(); Console.ReadKey(); } } Output We are, therefore, allowed to pass a string array instead of individual strings as arguments. Here, names is a string array which has been initialized using the short form. Internally when we call the function DisplayOverload, C# converts the string array into individual strings. Overload.cs public class Overload { public void Display() { string [] names = {"Akhil","Arsh"}; DisplayOverload(2, names, "Ekta"); } private void DisplayOverload(int a, params string[] parameterArray) { foreach (var str in parameterArray) Console.WriteLine(str + " " + a); } } Program.cs class Program { static void Main(string[] args) { Overload overload = new Overload(); overload.Display(); Console.ReadKey(); } } Output So, we got two errors. For the above mentioned code, C# does not permit mix and match. We assumed that the last string “Ekta” would be added to the array of strings names or convert names to individual strings and then add the string “Ekta” to it. Quite logical. Internally before calling the function DisplayOverload, C# accumulates all the individual parameters and converts them into one big array for the params statement. Overload.cs public class Overload { public void Display() { int[] numbers = {10, 20, 30}; DisplayOverload(40, numbers); Console.WriteLine(numbers[1]); } private void DisplayOverload(int a, params int[] parameterArray) { parameterArray[1] = 1000; } } Program.cs class Program { static void Main(string[] args) { Overload overload = new Overload(); overload.Display(); Console.ReadKey(); } } Output We see that the output produced is the proof of concept. The member parameterArray[1] of array has an initial value of 20 and in the method DisplayOverload, we changed it to 1000. So the original value changes, this shows that the array is given to the method DisplayOverload, Hence proved. Overload.cs public class Overload { public void Display() { int number = 102; DisplayOverload(200, 1000, number, 200); Console.WriteLine(number); } private void DisplayOverload(int a, params int[] parameterArray) { parameterArray[1] = 3000; } } Program.cs class Program { static void Main(string[] args) { Overload overload = new Overload(); overload.Display(); Console.ReadKey(); } } Output In the above mentioned scenario C# creates an array containing 1000 102 and 200. We now change the second member of array to 3000 which has nothing to do with the variable number. As DisplayOverload has no knowledge of number, so how can DisplayOverload change the value of the int number? Therefore it remains the same. Overload.cs public class Overload { public void Display() { DisplayOverload(200); DisplayOverload(200, 300); DisplayOverload(200, 300, 500, 600); } private void DisplayOverload(int x, int y) { Console.WriteLine("The two integers " + x + " " + y); } private void DisplayOverload(params int[] parameterArray) { Console.WriteLine("parameterArray"); } } Program.cs class Program { static void Main(string[] args) { Overload overload = new Overload(); overload.Display(); Console.ReadKey(); } } Output Now we'll talk about method overloading. C# is extremely talented though partial. It does not appreciate the params statement and treats it as a stepchild. When we invoke DisplayOverload only with one integer, C# can only call the DisplayOverload that takes a params as a parameter as it matches only one int. An array can contain one member too. The fun is with the DisplayOverload that is called with two ints now. So here we have a dilemma. C# can call the params DisplayOverload or DisplayOverload with the two ints. As discussed earlier, C# treats the params as a second class member and therefore chooses the DisplayOverload with two ints. When there are more than two ints like in the third method call, C# is void of choice but to grudgingly choose the DisplayOverload with the params. C# opts for the params as a last resort before flagging an error. Now a bit tricky example, yet important: Overload.cs public class Overload { public static void Display(params object[] objectParamArray) { foreach (object obj in objectParamArray) { Console.Write(obj.GetType().FullName + " "); } Console.WriteLine(); } } Program.cs class Program { static void Main(string[] args) { object[] objArray = { 100, "Akhil", 200.300 }; object obj = objArray; Overload.Display(objArray); Overload.Display((object)objArray); Overload.Display(obj); Overload.Display((object[])obj); Console.ReadKey(); } } Output In the first instance we are passing the method Display an array of object that looks like object. Since all the classes are derived from a common base class object, we can do that. The method Display gets an array of objects objectParamArray. In the foreach object class has a method named GetType that returns an object that looks like Type, which too has a method named FullName that returns the name of the type. Since three different types displayed. In the second method call of Display we are casting objArray to an object. Since there is no conversion available from converting an object to an object array i.e. object [ ], so only a one element object [ ] is created. It's the same case in the third invocation and the last explicitly casts to an object array. For proof of concept: Overload.cs public class Overload { public static void Display(params object[] objectParamArray) { Console.WriteLine(objectParamArray.GetType().FullName); Console.WriteLine(objectParamArray.Length); Console.WriteLine(objectParamArray[0]); } } Program.cs class Program { static void Main(string[] args) { object[] objArray = { 100, "Akhil", 200.300 }; Overload.Display((object)objArray); Console.ReadKey(); } } Output 5. Conclusion In this article of our Diving in OOP series we learnt about compile time polymorphism, it is also called early binding or method overloading. We catered most of the scenarios specific to polymorphism.We also learned about the use of powerful params keyword and its use in polymorphism. To sum up lets list down all the point to remembers once more: C# recognizes the method by its parameters and not only by its name. The return value/parameter type of a method is never the part of method signature if the names of the methods are same. So this is not polymorphism. Modifiers such as static are not considered as part of method signature. The signature of a method consists of its name, number and types of its formal parameters. The return type of a function is not part of the signature. Two methods can not have the same signature and also non-members cannot have the same name as members. Parameter names should be unique. And also we can not have a parameter name and a declared variable name in the same function as same. In case of pass by value, the value of the variable is passed and in the case of ref and out, the address of the reference is passed. This params keyword can only be applied to the last argument of the method.So the n number of parameters can only be at the end. C# is very smart to recognize if the penultimate argument and the params have the same data type. Parameter array must be a single dimensional array. Sursa
- 1 reply
-
- c# tutorial
- diving in oop
-
(and 3 more)
Tagged with:
-
The PHP development team announces the immediate availability of PHP 7.0.0 Alpha 1. This release marks the beginning of the PHP 7 major series. All users of PHP are encouraged to test this version carefully, and report any bugs and incompatibilities in the bug tracking system. THIS IS A DEVELOPMENT PREVIEW - DO NOT USE IT IN PRODUCTION! PHP 7.0.0 Alpha 1 comes with new version of the Zend Engine with features such as (incomplete list): Improved performance: PHP 7 is up to twice as fast as PHP 5.6 Consistent 64-bit support Many fatal errors are now Exceptions Removal of old and unsupported SAPIs and extensions The null coalescing operator (??) Combined comparison Operator (<=>) Scalar Type Declarations Anonymous Classes For more information on the new features and other changes, you can read the NEWS file or the or the UPGRADING file for a complete list of upgrading notes. These files can also be found in the release archive. For source downloads of PHP 7.0.0 Alpha 1 please visit the download page, Windows binaries can be found on windows.php.net/qa/. The second alpha will be released on 25th of June. You can also read the full list of planned releases on our wiki. Thank you for helping us making PHP better. Source
-
Sunt baietii de la Madrivo. Am lucrat la ei. Pe langa premiul in bani va puteti alege si cu o angajare
-
Pahelika: Revelations HD
-
Uite cam ce poti face.
-
Viral Facebook post shows how buyers can get meals at half the price from McDonald’s Self-Serving exploiting a system glitch Customers in Australia were treated to a 50% discount meal due to a glitch in the self-service system at a McDonald’s unit. The fault could be made full use of straight from the menu option. Had someone not posted a video on Facebook explaining the steps to get the price cut, probably McDonald’s would have taken some time to find the fault. Max Jalal shared the mobile phone footage showing how he and his group of friends get a family value Dinner Box that usually costs $19.95 / €17.50 for just $9.95 / €8.80 by doing nothing but using the self-serve tills. Jalal suggests going with the option to pay at the counter instead of the machine, in order to keep the employees unaware of the trick. Max Jalal selects a $20 dinner box, then his friend doing the filming, is heard saying: “This is the best bit, watch this.” He then selects an L and P option from the drinks menu and adds it to his bill, but it reduces the total price down to $17.20. He then repeats this step three more times until the total is reduced to less than half. The option is easy to locate as it shows no image of a product or price. Jalal’s bill was half the original value after repeating this step four times. It seemed like like the glitch could not be exploited further than this. The video clip was shot in a branch of the fast-food retailer in Melbourne, Australia. As expected, the Facebook post went viral and managed to garner a lot of attention. The video clip was viewed by more than 1.5 million people after it was posted to Facebook and shared. Self-service systems have been available in other parts of the world for years, but it is not clear if this process has the same effect on them too. The machine at the respective location has been fixed by McDonald’s Australia and the machine should now work as it is meant to be. It looks apparently that this was an exceptional case. A McDonald’s spokesman speaking to Daily Mail Australia said: “It is a new computer system and the nature of computer systems mean sometimes glitches can happen.” He added he was “fairly confident” there weren’t any other faults in the system that would let people to reduce the price of their meal. Source