Комментарии 47
php > echo PHP_INT_MIN + PHP_INT_MAX;
-1
1. Знать свой инструмент.
2. Иметь воображение.
3. Если однажды возникнет необходимость написать жуткий, но необходимый костыль, иметь интеллектуальную готовность это сделать.
Разумеется, чтобы третий пункт был плюсом, а не минусом, нужно также научиться не писать костыли, пока это действительно не окажется необходимо.
Естественный пример, зачем нужно такое вычитание, я придумать, конечно, не могу — задача осознанно искусственная. Можно пофантазировать о том, что JS необходимо запустить в некоторой багнутой среде, где интерпретатор крашится на символе "-". Но вообще случается так, что реальные задачи требуют хаков. И если ты всю жизнь программировал строго по учебнику, столкновение с первой такой задачей похоже по ощущениям на столкновение лица с асфальтом.
Пожалуйста, только не давайте таких задач студентам с их неокрепшей психикой и несформировавшимся понятиями о том, что допустимо в промышленной разработке, а что нет. Опытным разработчикам, которые понимают границы применимости, — пожалуйста, но не студентам. Иначе подобный код всплывёт потом на работе просто потому что "а почему бы нет, работает же, стильно-модно-молодёжно" и будет очень больно.
Нет. Это совсем другое. В сортировке пузырьком нет ничего плохого, это нормальный код, это основы алгоритмизации. А это именно хак, причем вы сами даже затрудняетесь придумать пример, где такое может понадобиться.
Вообще, введение понятия должно сопровождаться как примерами того, что в этом понятие входит, так и примерами того, что в него не входит. Так что для объяснения того, что такое хороший, добротный код, надо иногда и грязные хаки демонстрировать.
Если это приподнести как пример того, как делать не стоит, то конечно, нет проблем :) Просто нужно чтобы это явно было сказано с самого начала, чтобы понимание формировалось у студентов) Чтобы люди четко и ясно понимали, что так делать нельзя в общем случае) Поверьте, это может быть далеко не очевидно для многих)
Написать функцию sub(a, b), которая будет находить разность чисел a и b. Однако в тексте функции не должно быть символа "-".
function sub(a, b){
return sub_internal(a, b);
}
function sub_internal(a, b){
return a - b;
}
Как-то так, для целых должно работать.
Можно считать инты 32-битными, независимо от системы.Хотя я вот написал и задумался, правда ли это.
В стандарте явно сказано, что битовые операции преобразуют аргументы в int32.
let sub = function(a,b){
let result = 0;
let start = b;
let end = a;
if (a >= b) {
for (let i = start; i<end; i++) {
result++;
}
}
else {
for (let i = end; i<start; i++) {
result--;
}
}
return result;
}
int sub(int a, int b)
{
if (a == b) return 0;
if (a > b) return sub(b, a);
var i = 0;
while (a < b)
{
i++;
a++;
}
return i;
}
Вариант посложнее:
int sub(int a, int b)
{
if (a == b) return 0;
if (b == a + 1) return 1;
if (a > b) return sub(b, a);
int sum = 0;
if (a%2 == 1 ^ b%2 == 1) sum = 1;
sum += 2 * sub(a, (a +b) / 2);
return sum;
}
Правда, оба варианта возвращают разность по модулю… Пойду подумаю еще.
int sub(int a, int b)
{
if (a == b) return 0;
if (b == a + 1) return 1;
if (a > b) return (int)Math.Log10(0.1d) * sub(b, a);
int sum = 0;
if (a % 2 == 1 ^ b % 2 == 1) sum = 1;
sum += 2 * sub(a, (a + b) / 2);
return sum;
}
Варианты с распарсиванием строки в число с указанием номера символа "-" я счел чересчур читерскими )
В порядке бреда :)
String(Number.MIN_SAFE_INTEGER)[0] + 1 | 0 // -1
Ещё чуточку идиотии :)
getComputedStyle(document.body)[0].replace(/\w+/g, '') + 1 | 0 // -1
Очень хочется выцепить "-" как-нибудь через try-catch и поиск символа в тексте ошибки, но что-то никак не могу подобрать подходящую ошибку. Попробовал с регулярками повоевать — тоже пока ничего хитрого не придумал :)
Спасибо. Напомнило измерение высоты здания с помощью барометра.
Пятничный JS: минус без минуса