2014-08-29 2 views
1

Я был на ярмарке карьеры, и меня задал вопрос «что делает этот запрос и на каком языке он»..NET-запрос получения неуместного ответа

Я сказал, что это в .NET LINQ, но не смог предсказать, что он делает.

Может ли один помочь мне

я писал в .NET и попробовал.

var youShould = from c 
    in "3%[email protected]/[email protected]%35-%@4/@./3,!#+%23 !2#526%N#/-" 
         select (char)(c^3 << 5); 

     Label1.Text = youShould.ToString(); 

И получил этот результат:

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Char,System.Char] 
+4

Честно говоря, если они думают, что это достоверный тест способности, они смеясь. Вы действительно хотите работать на этих парней? – spender

+0

Ответом будет «.net Linq, и то, что он делает, путает меня от меня, и если кто-нибудь из моей команды написал это без значимого комментария, он будет покупать остальную часть команды в случае пива. есть что-то делать с BitShifting там » –

+0

Истина заключается в том, что она ничего не делает, пока вы не потребляете« IEnumerable »... Но я сомневаюсь, что это то, что они искали. Может, это то, что вы искали? Потреблять его и, возможно, превращать его в строку? – SimpleVar

ответ

2

Для каждого символа в строке, проект характер по XOR-ING его (3 слева сдвинута на 5), затем отливали числовое значение обратно символ.

Вы можете создать свои собственные строки кода, выполнив запрос снова по некодированной строке, потому что если вы XOR число дважды по тому же значению, вы останетесь с тем же номером, с которого вы начали. (Например x^y^y = x)

Я оставлю его в качестве упражнения для читателя, чтобы выяснить, что следующее:

4()[email protected])[email protected][email protected]$5-"@4%34 

Я предполагаю, что тесты:

  • Linq к объектам
  • Понимание интерфейса IEnumerable<T> и как оно относится к строкам
  • Отливка
  • Битовые операции
  • побитовое оператор старшинства

Лично я считаю, что это бесполезно тест, который на самом деле не отражают реальные мировые проблемы.

12

Прежде всего, не чувствуйте себя плохо, что вы не получили ответа. Я точно знаю, что здесь происходит, и я бы, наверное, просто рассмеялся и ушел, если кто-то спросил меня, что это сделал.

Там есть ряд вещей, происходящих здесь, но начать с выходом:

var youShould = from c in "3%[email protected]/[email protected]%35-%@4/@./3,!#+%23 !2#526%N#/-" 
       select (char)(c^3 << 5); 
Label1.Text = youShould.ToString(); 

>>> System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Char,System.Char] 

При выполнении запроса LINQ, или использовать любого из эквивалентных методов, таких как Select(), которые возвращают наборы, что вы получите обратно является особым внутренним типом объекта, называемым «итератором», в частности, объектом, реализующим интерфейс IEnumerable. .NET использует эти объекты повсюду; например, целью цикла foreach является итерация по итераторам.

Одна из самых важных вещей, которые нужно знать об этих объектах, состоит в том, что просто создание одного на самом деле ничего не делает. Итератор фактически не содержит множество вещей; скорее, он содержит инструкции, необходимые для произвести набор вещей. Если вы попытаетесь сделать что-то вроде, например, ToString, результат, полученный вами, не будет очень полезен.

Однако, это говорит нам одно: он сообщает нам, что этот конкретный итератор принимает исходный список типа char и возвращает новый набор, также типа char. (Я знаю, потому что я знаю, что это то, что две общие параметры «выберите итератора» делать.) Для того, чтобы получить реальные результаты из этого итератора вам просто нужно перебрать это как-то, например:

foreach (var c in youShould) 
{ 
    myLabel.Text += c; 
} 

или , немного легче,

myLabel.Text = new string(youShould.ToArray()); 

на самом деле выяснить, что он делает, вы должны также признать, второй факт: LINQ обрабатывает строку как «набор символов». Он будет обрабатывать каждый символ в этой строке, по одному за раз, и выполнять побитовые операции над значением.

Длинная форма эквивалент этого запроса что-то вроде этого:

var input= "3%[email protected]/[email protected]%35-%@4/@./3,!#+%23 !2#526%N#/-"; 
var output = string.Empty; 
foreach (var c in input) 
{ 
    var i = (int)c; 
    var i2 = i^(3 << 5); 

    var c2= (char)i2; 

    output += c2; 
} 

Если вы сделали математику вручную вы получите правильное сообщение вывода. Чтобы сэкономить вам упражнение на ошеломление мозга, я просто скажу вам: он переключает биты 5 и 6 значения ASCII, меняя каждый символ на один дальше по таблице ASCII. Полученная строка:

SEND ваше резюме [адрес электронной почты]

.NET Скрипки демонстрационные: https://dotnetfiddle.net/x7UvYA

+4

Я бы выиграл, если бы мог просто ввести меня в dotnetfiddle. –

+0

Мне нравится, как их трюк обернулся и сделал кучу SOER держаться подальше от своей компании. – Aron

+0

meh. в ретроспективе, цель их трюков, возможно, заключалась в том, чтобы заставить вас пойти домой и запустить код для себя, а не сидеть там на ярмарке вакансий и понять это. Не будучи там, я решил, что, вероятно, нечестно издеваться над ними, не зная больше. –

Смежные вопросы