Date: 2020-07-22 20:35 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Хитрая задача на C есть:
Напечатать числа 1..100 без использования условий (в том числа тернарного оператора) и циклов.

Date: 2020-07-22 20:52 (UTC)
sobriquet9: (Default)
From: [personal profile] sobriquet9
А в чём хитрость? Вот решение для чисел от 1 до 3, точно так же можно и до ста напечатать.

printf("1\n2\n3\n");

Date: 2020-07-22 22:11 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
#include <stdio.h>

void p(int i) {
  printf("%d ", i);
  int stopit = 1 / (100-i);
  p(i+1);
}

int main(int argc, char *argv[]) {
  p(1);
}

Edited Date: 2020-07-22 22:11 (UTC)

Date: 2020-07-22 23:24 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Только не печатает ничего по понятной причине.

Date: 2020-07-22 23:20 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
А без аварийного завершения в том же духе можешь?

Date: 2020-07-23 01:35 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Да я язык-то ваш, си, плохо знаю.
#include <stdio.h>

boolean p(int i) {
  printf("%d ", i);
  i < 100 && p(i+1);
}

int main(int argc, char *argv[]) {
  p(1);
}

Date: 2020-07-23 04:20 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Лучшее решение!

если в кратчайшем виде:

#include
[Error: Irreparable invalid markup ('<stdio.h>') in entry. Owner must fix manually. Raw contents below.]

Лучшее решение!

если в кратчайшем виде:

#include <stdio.h>

int main(int argc) {
printf("%d ", argc);
return argc < 100 && main(argc+1);
}
Edited Date: 2020-07-23 04:21 (UTC)

Date: 2020-07-23 04:23 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
А, точно, это ж не скала, return надо.

Date: 2020-07-24 19:37 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Это всё равно читинг. См. моё решение ниже.

Date: 2020-07-24 19:37 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Операторы сравнения и логические с шорткатом - это читинг. Вот как надо:

#include <stdio.h>
#include <stdlib.h>
void p(int i) {
  printf("%d ", i);
  (*(void(*)(int))(i/100*(unsigned long)exit + (1-i/100)*(unsigned long)p))(i+1);
}

int main(int argc, char *argv[]) {
  p(1);
}

Date: 2020-07-24 19:58 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Красивый фокус!!!

Date: 2020-07-24 21:09 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Круто!
Единственная поправка: вместо unsigned long надо uintptr_t
иначе на VC x64 не работает

Date: 2020-07-22 21:14 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
1. Я уж и думать забыл про 16-битные машины.
9. Правильный ответ должен начинаться с вопроса "как в вашей компании традиционно нумеруются биты, с младшего или со старшего, и с нуля или с единицы?" :)
10. Товарищ не понимает, что r-values всегда константного типа, но делает вид, что он умнее, чем он есть.


Интересно, в каком году эти вопросы были написаны.
Edited Date: 2020-07-22 21:28 (UTC)

Date: 2020-07-23 03:10 (UTC)
x86128: (Default)
From: [personal profile] x86128
Наверное во времена расцвета AVR.

Позволяет подготовиться к интервью подобного типа, освежает. Еще полезно всегда подглядывать что там компилятор на компилил.

Date: 2020-07-24 19:38 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
подглядывать что там компилятор на компилил

Это всю жизнь было моим любимым занятием. :)

Date: 2020-07-23 09:44 (UTC)
From: [personal profile] ex0_planet
1. 32 бита точно также легко переполнить, достаточно посчитать количество миллисекунд.
2. #define MIN — никто уже так не делает, gcc поддерживает анонимные statement-блоки в выражениях с незапамятных времён
8. Я удивлен что про volatile почти правильно, хотя я бы предпочёл чтобы ответ был сформулирован в терминах сайд-эффектов.
8c. А вот тут строго нет, для этого есть atomic. Volatile тут прокатывает только в очень простых контроллерах.

В общем да, навскидку где-то год 2006 или даже раньше.

Date: 2020-07-24 19:40 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
2, 8с. Вот именно, потому и вопрос о датировке. :)

Date: 2020-07-26 10:57 (UTC)
From: [personal profile] caztd
Вот есть люди, которые хорошо готовятся, проходят подобные тесты на отлично,
мнят себя экспертами, а потом пишут код на 10 klocs в одном файле с тучей
глобальных переменных и еще и с рекурсией (если они особенно крутые).
А потом на этот код приходит пара change requests и стопицот bug reports.
А разработчик/консультант, который все это нахерачил уже давно ушел в другой проект.
И что прикажете с этим делать, кроме как переписывать все нахрен?

У тоёты с тормозами такой же примерно специалист код писал,
наверняка все эти тесты на ура прошел :(

Date: 2020-07-29 18:03 (UTC)
From: [personal profile] caztd
К сожалению успех в тестах не является даже необходимым условием.
Есть люди, которые тесты проходят плохо, а код пишут хорошо.
Ergo -- тесты на знание языка бесполезны, а на собеседовании надо смотреть чтоб человек был адекватный и вписывался в коллектив, а не то головная боль потом гарантирована.
А если он какие-то детали языка Си не знает на зубок --
этому научить и научиться в разы проще, чем другим, менее техническим умениям.

Date: 2020-07-29 19:41 (UTC)
From: [personal profile] caztd
> Программист должен писать код не менее свободно, чем говорить.

Это очень специфический тип программиста, так называемый кодер.
Дали задание -- он закодировал (предположим правильно).
Дали задание с ошибкой -- он закодировал как задали и ошибку не нашел.
Ошибку найдут потом через 2 года и она будет стоить много.
Нет, спасибо, не люблю работать с кодерами.

Я, например (ха-ха, себя милого конечно в пример),
давно уже не могу писать код свободно
(примерно после окончания уни разучился) --
да и редко я много кода пишу.
Мне гораздо важнее умение организовать процесс разработки и
выбор правильного дизайна в котором ошибки будут находить быстро.
В 100 раз пример важнее, чем умение свободно писать код.

Одна строчка критичного кода стоит >100 евро.
Мне абсолютно пофигу будет ли разработчик писать ее 1 минуту или
10 минут вспоминая синтакс и через SO, если она будет работать без ошибок
и ее не придется потом переписывать еще 10 раз.

Это конечно все не значит, что разработчик не должен уметь программировать,
но вот тестов на определение этого умения я еще пока нигде не видел.
И конечно же умение рассуждения на тему организации разработки не равносильно умению организовать процесс.
Это трудно понять на собеседовании, тут вы правы.