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-29 11:00 am (UTC)Задачу вычисления F(F(a)) (без возможности манипуляции промежуточными результатами, да и как ими поманипулируешь, у тебя F(a) возвращает всегда ноль, например) это решает. Судя по простоте этого, задача настолько неинтересна, что особого рассмотрения не заслуживает.
4. Лолшто? У тебя в реквайрментах записано: "Написать F(x) такую что F(F(x)) = -x за исключением тех случаев, когда существует y, такой что x = F(y)"? Я там что-то такого уточнения не видел! Это ж ключевой момент, что F(x) должно сработать корректно на ЛЮБОМ x, а тут оно вдруг перестаёт работать на тех x, которые совпадают с возвращаемыми значениями.
5. Ага, ага. И контрольную сумму ещё. А лучше две. Стекфрейм тебе, кстати, не поможет совершенно, я всё в одной функции делаю.
6. Ну да, не совсем хэштейбл, ок. Ты согласен, что ты воспринимаешь память как хранилище, держащее интерфейс
int AddValue(int value); //returns hashed key
bool TryGetValue(int key, out int value);
? И ничего больше? Ты согласен, что память и попытки скастить адрес в объект вообще говоря являются крайне плохой имплементацией этого интерфейса? И что даже очень хорошая имплементация этого интерфейса обломается на пункте 4?
7. Кстати, и от себя вопрос ещё. Ты думал, что ты будешь делать с GC? =)
(no subject)
Date: 2008-02-29 11:06 pm (UTC)#4 - ещё раз. моя имплементация работает безо всяких исключений для F(F(x)), если промежуточными результатами не манипулировать. включая многотредность. есть возражения?
на самом деле, конечно, нужно просто добавить public static implicit operator int(Helper h), чтобы можно было результат напрямую инту присваивать - и всё, с синтактической точки задача тоже будет решена (с точки зрения прохождения тестов она и до того была решена).