Как стать автором
Обновить

Комментарии 50

А как поведет себя работодатель, если я откажусь решать это в уме, потому что это маразм и просто спрошу, а что они пытаются выяснить, давая такие задания?
P.S. Если у них правда такие исходники, то я бы и сам отказался с таким работать.
Вашу реакцию на глупость

Эмм… Что?


Q: А как поведёт себя работодатель, если ...?
A: Вашу реакцию на глупость.

что они пытаются выяснить, давая такие задания?

Неточно выразился. Я это цитировал.
Забавная задачка, по ней сразу видно, имеет ли человек опыт программирования на C/C++ :-)
(ключевые слова – точка следования/sequence point, в JavaScript такого вроде нету)
Задаём вопрос: у вас есть такой код в проде?
Если ответ утвердительный — бежим куда глаза глядят.
Если отрицательный — то спрашиваем, а нафига такой вопрос, но дорогу к выходу всё равно стоит прикинуть.

Вот не понимаю я таких программистов. Вам настолько в лом по-человечески разобраться в языке, на котором вы работаете, что все, что глубже текущего модного фреймворка, вы считаете бесполезной фигней?
Мне кажется, что это из той же серии, что и вопросы зачем в школе математику проходить, если у меня в кармане калькулятор есть. А кто думать учиться будет? А логику тоже за вас калькулятор будет продумывать?
С таким подходом и надеждой, что всю сложную работу за вас всегда будет делать компилятор с оптимизацией, очень скоро можно случайно обнаружить себя на обочине профессии, замененным нейросетью или более дешевым студентом, который знает более модный фреймворк.

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

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

Вот, это тоже JS. Разберитесь и пофиксите ошибку :)
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ: ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) — (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) — (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
Uncaught SyntaxError: Invalid or unexpected token
Я ж говорю: Пофиксите ошибку. В современных браузерах уже не работает, увы.

Работает если в двух местах тире — заменить на минус -. В результате вызов alert(0).

А, ну значит форматирование в статье кривое было :) Я ж помню, что работало :)
Такого я точно не ожидал.

После такого обфусцированный код на изи читается.

Кстати да: к запутанному куску логики можно задать вопрос "как бы вы это написали"/"перепишите нормально", сразу увидите и способность человека к чтению всякой ереси, и его стиль.

Мне в лом. Я пишу на нескольких языках, и нет никакого единого стандарта на порядок выполнения операндов. Например, в JS в V8 результат будет 163, в Python3 аналогичный код выдает 99, а в Go просто не компилируется.
И самое главное — этот код нечитаем. Его сложно понять, сложно объяснить работу, сложно изменить.
Самое главное — этот код бессмысленен.
Это просто проверка на знание js и его компилятора. Знаешь как работает или просто фигачишь и оно чет там само крутится.
Если только наниматель хочет писать свой Javascript-движок.
Не обязательно, знать как работает язык и компилятор уже само по себе полезно. Не часто возникают ситуации когда нужны эти знания, но лишними их не назвать точно.
Давайте ещё на собеседовании на JS-вакансию просить кандидата решить дифур преобразованием Лапласа. Нечасто возникают ситуации, когда нужны эти знания, но лишними их не назвать точно.
Знание корейского языка и систематики остракодов тоже не лишнее. А если хотите более жизненный пример, то знания в области физики и стереометрии, о которых при собеседовании на программиста никто не спрашивает, в моей практике гораздо более необходимы, чем вот это всё, которое непонятно, к чему и прикрутить, кроме собеседования следующих кандидатов.
Стереометрия и физика как и корейский язык — это предметная область. Я не навязываю свое мнение, ваше мне тоже навязывать не надо. Хотите блистать корейским на собесе на должность программиста, пожалуйста, звучит даже смешно)
Стереометрия и физика большей частью сводятся к прикладной математики, а она в том или ином виде нужна практически везде, за что не возьмись. А вот для чего нужно разбирать такие ребусы, ещё никто внятно не объяснил. «Само по себе полезно»! Само по себе вообще всякое знание полезно, а к делу это имеет такое же отношение, как корейский язык, и меньшее, чем какая-нибудь аналитическая геометрия.
А вот для чего нужно разбирать такие ребусы, ещё никто внятно не объяснил. «Само по себе полезно»!

Наверное, это чуть более связанная с реальной работой версия тех ребусов, которые любили загадывать на собеседованиях раньше — про количество теннисных мячей в автобусе и пианистов в Сан-Франциско.
Да ну? Этот код точно так же отработает в Java, PHP или Perl.
Только выдаст разные результаты в зависимости от языка и интерпретатора.
Ничего подобного: во всех трёх 163, как и в JS.
Это не бесполезная фигня, это smelly code. Большая разница.
Посчитать легко (ну, для JavaScript… Для C уже нет), писать нельзя.
Я предпочитаю код оставлять читаемым и пригодным для использования. И прекрасно понимаю, что код с обилием побочных эффектов между sequence point-ами сопровождать нереально.

Неудобно не только сопровождать, но и гонять в отладчике. Всё неочевидное и с побочкой (в том числе и await) тоже стараюсь "растягивать вертикально".

Я возможно туплю после бессонной ночи дежурства, но тут разве не наоборот?


function ++x(x) {
  const oldValue = x;
  x = x + 1;
  return oldValue;
}
function x++(x) {
  x = x + 1;
  return x
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment


If used postfix, with operator after operand (for example, x++), the increment operator increments and returns the value before incrementing.

If used prefix, with operator before operand (for example, ++x), the increment operator increments and returns the value after incrementing.
В коде строго наоборот, в документации всё верно.
Какая-то задачка из десятого класса. Я ожидал увидеть хотя бы пару UB, а получил всего лишь аккуратно разобранное выражение по таблице operator precedence.
В JS нет UB.
15.1 The Global Object

The values of the [[Prototype]] and [[Class]] internal properties of the global object are implementation-dependent.

15.1.2.2 parseInt (string, radix)

[If there are too many significant digits] mathInt may be an implementation-dependent approximation to the mathematical integer value that is represented by Z in radix-R notation.

15.3.4.2 Function.prototype.toString

An implementation-dependent representation of the function is returned.

15.4.4.11 Array.prototype.sort (comparefn) — likely the best example:

If comparefn is not undefined and is not a consistent comparison function for the elements of this array, the behaviour of sort is implementation-defined.

[…] If proto is not null and there exists an integer j such that all of the conditions below are satisfied then the behaviour of sort is implementation-defined:

obj is sparse (15.4)
0 ≤ j < len

The behaviour of sort is also implementation defined if obj is sparse and any of the following conditions are true:

The [[Extensible]] internal property of obj is false.
Any array index property of obj whose name is a nonnegative integer less than len is a data property whose [[Configurable]] attribute is false.

The behaviour of sort is also implementation defined if any array index property of obj whose name is a nonnegative integer less than len is an accessor property or is a data property whose [[Writable]] attribute is false.

Perform an implementation-dependent sequence of calls […]

15.5.4.9 String.prototype.localeCompare (that)

The two Strings are compared in an implementation-defined fashion

15.5.4.11 String.prototype.replace [In replacement symbols, if the number is greater than the number of groups], the result is implementation-defined.
Отличный индикатор организации в которую не стоит устраиваться. Подобный простите академический дроч дожен был остаться в общаге второго курса универа, когда молодые программисты соревнуются кто напишет более сложный код. Потом с осознанием реальности и опытом приходит понимание, что качественный код это когда написано просто, доступно и модульно. Человек который во взрослой жизни продолжает писать подобный юношеский соревновательный дроч в прод как правило быстро лишается работы.

Все, кто тут пишут про "если у них такой код — в баню такую контору" — может стоит иногда подумать, что не все в жизни может быть так прямолинейно?


Ну, то есть, есть категория задач на более практическое применение ваших знаний — например, написать какую-то ту-душку или еще что-нибудь в этом роде. Но есть и такие, где работодатель хочет "пощупать" будущего сотрудника и за другие его качества: знает ли он банальнейшую теорию (эта вот задачка решается в уме минут за 5 если вспомнить что к чему) и способен он в конце концов решать поставленные задачу вместо вот этого вот бухтения "а зачем это? да кому это нужно?". Более того, эта задача расчитана, возможно, также на то, что если ты все-таки забыл как там операторы работают и что когда присваивается (хотя ей Богу не могу себе представить человека, которому трудно это решить) — то тогда можно посмотреть как вы справляетесь с этим косяком — будете ли вы спрашивать / гуглить / ватевер. Ну, то есть, когда вам зрение проверяют на буквах, это еще не означает, что доктор долбан, потому что заставляет читать не рассказы Чехова, а какие-то никому не нужные буковки.


Мне эта задача тоже не оч, просто потому, что никакого финта ушами там делать не нужно. Вот могу подкинуть парочку тоже ориентированных на синтаксис JS:


1) В голове посчитать результат:


120 + 102 + 012 + 002 + .12 + (0,1 + 2,3)

2) Что будет в "х"?


let i
for (i = 0; i++; i < 5) {
  i = i + 3
}
const x = i

Да-да, это не про солид и дядю Боба, это просто синтаксис.

С JS не дружу, но второй пример заинтересовал.
Ответ x=8?
Цикл не выполнится, так как i++ вернет 0 в условие цикла, а потом добавит 1 к i
Поначалу бодобные задачи вводят в ступор: какой смысл во всём говнокоде?.. Но потом понимаешь, что можно быть в теме, если реально работаешь в этой сфере и не только думаешь.
Если бы нам пришлось думать таким образом, JavaScript был бы гораздо более запутанным

Ну-ну, не будь правой ассоциативности и приоритета операций — этой задачи вообще бы и не возникло. Читать и писать код стало бы проще, было бы меньше багов с операторами. Одни проблемы от этого наследия математики.

По слухам, первоначально вместо JavaScript планировалась Scheme. Так что ваша мечта могла реализоваться)

Решил задачку с листком бумаги за пару минут, вроде, ничего сложного, ответ сошёлся.
Задача на усидчивость, которая больше характеризует задающего ее. Подразумевает представление об инкременте в префиксе-постфиксе, приоритете операторов и том, что "+ +" и "++" — не одно и то же. И все. Зато елочка получилась красивая и избыточная. С приведением типов хотя бы могло быть интересней и ближе к практике.

То, что негодующие по поводу таких задач, не понимают, как они соотносятся с реалиями, и это больше характеризует их. Даже если сам разраб и его коллеги не пишут грязный код, нужно чтобы лишний раз не тупить часами в дебаггере или на Стеке, когда есть проблема, которая упирается в незнание основ языка.
Да при чём тут знание языка? Негодующие возмущаются из-за культуры разработки, которая грубо попирается подобным говнокодом.

Дело не в усидчивости, а в том, что у всех разная оценка ценности собственного времени. Я на подобное не стал бы тратить своё время, потому что могу его применить с гораздо бо́льшей пользой для заказчика (и бо́льшей пользой для себя).

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

Спойлер
— Мы займемся арифметикой… У вас в кармане два яблока…
Буратино хитро подмигнул:
— Врете, ни одного…
— Я говорю, — терпеливо повторила девочка, — предположим, что у вас в кармане два яблока. Некто взял у вас одно яблоко. Сколько у вас осталось яблок?
— Два.
— Подумайте хорошенько.
Буратино сморщился, — так здорово подумал.
— Два…
— Почему?
— Я же не отдам Некту яблоко, хоть он дерись!
— У вас нет никаких способностей к математике, — с огорчением сказала девочка. — Займемся диктантом.

Есть разница между отсутствием желания и возможности правильно решить задачу. У некоторых отказников будет наблюдаться второе. Как я сказал, задача простая и скучная, и мне бы не хотелось, чтобы меня собеседовал дятел, который вычитал ее в интернетах. Но претензии ведь не к деталям задачи, а к самому факту, что вопрос о релевантных навыках, а возмущающиеся считают его ниже своего достоинства.

Свой код может быть сколь угодно красивым, но в библах говнокод сплошь и рядом, и ковыряться в сырцах и отлаживать их иногда приходится. Если спесивый мидл выбьет себе предложение, потому что по другим дисциплинам он волочет, а потом засыплется на основах из такой задачки и пойдет курить мануал вместо того, чтобы пофиксить баг еще вчера, то в чем тут польза для заказчика? Насчет себя знаю, что когда-то вовремя закрыв вопросы по матчасти, я себе сэкономил десятки часов. На примере коллег по цеху нередко вижу обратное.
Само выражение не корректно и мы должны его отрефакторить, так-как наличие инкремента/декремента в выражении — грубейшая ошибка, которая приводит данное выражение в состояние неопределенности и любой ответ не может считаться корректным.

Другими словами, сегодня вы можете получите 42, а завтра 54 из-за того, что реализация инкремента/декремента отдана на откуп компиляторам и, если я правильно помню, не стандартизирована.
Это unspecified behaviour в C/C++, но корректный код в JS, с совершенно чётко определённым поведением: tc39.es/ecma262/#sec-postfix-increment-operator
Зарегистрируйтесь на Хабре, чтобы оставить комментарий