F(F(n)) = -n
Feb. 26th, 2008 01:31 amах да, я ж тут эту задачку типа решил. напомню, кто не знает: требуется написать функцию, принимающую аргумент типа int, которая, будучи дважды приложена, меняет знак числа.
претензий по поводу MinValue не предлагать: ряд функций, принимающих int, бросают на него. в частности, все функции, которым зачем-то надо делать Abs().
претензии по поводу возврата boxed int вместо ожидаемого unboxed более интересны. напомню, что это задачка для интервью. формальная отмазка могла бы звучать как "требование unboxed int не было озвучено в явном виде" :)
на самом деле, мой код просто демонстрирует идею - поскольку если постараться, то пойнтер можно упихать в соответствующего размера целочисленный тип, а потом, при разборе, аккуратно проверять, лежит ли в том месте нужный тип. тогда и unboxed можно возвращать.
static class I_Function
{
static void Main()
{
Console.WriteLine("F(F(42)) = {0}", F(F(42)));
Console.WriteLine("F(F(-5)) = {0}", F(F(-5)));
Console.ReadKey();
}
static object F(object num)
{
if (num is Helper)
return -((Helper)num).num;
else if (num is int)
{
if ((int)num == int.MinValue)
throw new Exception("Unsupported argument value");
else
return new Helper((int)num);
}
else throw new Exception("Unsupported argument type");
}
class Helper { internal int num; internal Helper(int num) { this.num = num; } }
}претензий по поводу MinValue не предлагать: ряд функций, принимающих int, бросают на него. в частности, все функции, которым зачем-то надо делать Abs().
претензии по поводу возврата boxed int вместо ожидаемого unboxed более интересны. напомню, что это задачка для интервью. формальная отмазка могла бы звучать как "требование unboxed int не было озвучено в явном виде" :)
на самом деле, мой код просто демонстрирует идею - поскольку если постараться, то пойнтер можно упихать в соответствующего размера целочисленный тип, а потом, при разборе, аккуратно проверять, лежит ли в том месте нужный тип. тогда и unboxed можно возвращать.
(no subject)
Date: 2008-02-26 11:49 pm (UTC)