Комментарии 28
Первое легко
if (printf("hello")) {}
А return 0; в некоторых компиляторах можно не писать
Второе тоже элементарно — xor-им все и делов то. Любой системщик это сразу поймет.
Было похожее задание на собеседовании, недоумения у меня не вызвало. Идея проверить знает ли кандидат битики и умеет ли их применять хотя бы на простом уровне.
Да, это очевидно с самого начала.
"Мы говорим "чётное" — подразумеваем XOR,
Мы говорим "XOR" — подразумеваем чётное!" ©
Отсортировать 8-терабайтный массив байтовСортируется за O(n) — надо завести массив из 256 счётчиков.
Тем более учитывая объем данных — маловероятно что там не встретятся ВСЕ 256 вариантов, а значит ваше решение на рандомных данных проиграет и по памяти и по скорости.
Это, кстати, причина по которой не используется везде hashmap, и все таки часто используется обычный map. Хотя казалось бы — hashmap быстрее же в лучшем случае. Ну в лучшем случае да, быстрее. А в худшем — медленней.А map дает стабильно O(log(n))
P.S. может мы о разном спорим, я то имел в виду для уже отсортированного массива, а не для исходного.
Да что там "зря занимать"…
Чтобы адресовать 4G надо 32 бита. Для 8T, соответственно, 43. Если округлять до байтов — проще взять 6 (т.е. 48 бит), а значит, можно что 8T, что 128T шпарить одним и тем же кодом.
6 байт на 256 значений — 1.5К. Это не влезет в L1, но вроде как начиная с L2 будет прямо совсем шустро, не обращая внимания на "псевдо-массивное" обращение.
А по итогу да, считаем получившийся блоб окончательным, закодированным с помощью RLE.
Решить без запуска. В тексте незначительные ошибки, чтобы сразу не скомпилировалось.
Меня кстати подобного рада один раз спрашивали. Только не уточняли что ошибки там специально.
Я начал читать код последовательно в слух, собираясь размышлять, но сразу как дошел до синтаксической ошибки сказал что не скомпилируется. :D Было слышно что чел расстроился, но настаивать на ответе не стал :D
А каков сценарий то?
Ну, допустим, не скомпилируется из-за пары пропущенных;
На примере без шаблонов и на пару десятков строчек — ну, я тупо скопипащу, запущу раз — поправлю первую ошибку. Запущу два — вторую.
Если ошибка буквально в каждой строчке — интуитивно допишу.
Цель то какая? Подозреваю, понять, сообразит ли кандидат, как решить задачу проще всего (т.е. не напрягая мозг). Запускать компиляцию в течение минуты и каждый раз править ошибки (сколько раз выйдет? Дважды? Пятирежды? Десятикратно?) — ок. Понять, что ошибка буквально в каждой строчке — проще на раз пройтись глазами.
Компилировать "в уме" весь пример — наверное, супер-гуру хотят нанять...
"Есть два регистра: R1 и R2
Есть две команды:
C1: R1 := KR2 — R1
C2: R2 := KR1 + R2
Есть целевое число N
На входе: K, N, R1, R2
Нужно: распечатать минимальную последовательность из команд, позволяющую получить N в R1 или в R2 (в любом из двух регистров)
Либо напечатать ничего
Известно, что K != 0, R1 != R2, K, R1, R2 — натуральные, N — целое."
Какая злобная задачка. Понятно, что N просто так в машину не засунешь. Придется где-то отыгрывать это число, например, в количестве команд или их групп, стало быть надо искать операции инкремента и декремента ибо N может быть отрицательным. Тогда можно используя заранее заданные значения R1 R2 и K использовать их для зануления. И от этого уже отыграть N раз инкремент или декремент. Но если вчитаться в условие задачи внимательнее, то нам оставили возможность напечатать ничего вместо поиска программы. Так давайте же воспользуемся этой возможностью. Ответ "напечатать ничего".
Если R1 и R2 повторились, то для этого узла вычисления не продолжаем.
Далее нужно выяснить, будут ли последовательности R1,R2 постепенно убывать или возрастать. Если постепенность будет, то с какого-то числа, по модулю большего чем N (2N, 3N и т.п.), построение дерева можно прекратить. Т.о. получится конечное дерево. Если в нем не нашли N, то результат пустая строка. Если нашли, то цепочка узлов до корня дерева дает последовательность команд.
Но это наивные предположения. Точно доказать не могу, забыл уже математику.
Ну что… "syntax error..."
А под капотом разочарованные вздохи — не смогли усилить армию леммингов...
А что код должен выводить и вообще делать — это по сути эквивалент «что хотел сделать кодер». И чтоб это узнать, надо залезть кодеру в голову, ведь сущности «что хотел сделать» и «что реально сделал» могут не совпадать. Хотя, конечно, какие-то предположения строить можно.
Другими словами, это «восстановите ТЗ по результату».
Для справки: все "мои" задачи на Senior Backend (PHP) Developer. Там, где принимал в итоге оффер, ни интерпретаторов, ни синков тактовых компов и близко не было :) Но было интересно, в частности вспомнить теорию компиляторов, AST, обход его и т. п. — собственно один раз за 20 лет и пригодилась.
На последнем вопросе в голову тут же пришла классика 2008 года:
https://bash.im/quote/394858
Именно после этой цитаты я решил, что однажды буду изучать перл. Но пока ещё это время не пришло.
Вообще, "странными" тут являются задачи из третьей группы. Нафига такое спрашивать на собеседовании? Первая группа — синтаксис (и то скорее шуточная) и простой алгоритм, вторая — на чтение code flow, пусть и довольно извратная конкретно эта, кое-где нужно понимать, что выполнится сначала, что потом, четвертая, вообще говоря, на чтение ТЗ (конкретно эта, а алгоритм-то нетривиален, если решать в лоб), пятая — на сортировки типа count.
Подведение итогов конкурса самых странных заданий на собеседованиях