Search
Write a publication
Pull to refresh
-3
0

Программист

Send message
Да адское статическое, зато быстро работает после компиляции.
sum00 = sum00 + sum01 ;  //а такое проканает

Предупреждение C4244: преобразование «float» в «int», возможна потеря данных
Warnings as errors и такое не проканает.
А в случае гонок рано или поздно вы все-таки это заметите.

Я так и не заметил. Наверное надо было пытаться победить, а не вмазать в стену как можно больше тупых аи.
А сейчас возможно? + для конкатенации строк, но — / * для строк нету. Покажите мне тот обобщённый код на JS, который сможет воспользоваться этим с пользой.
Сумма в массиве и в массиве строк? Но это 1 частный случай, и ради него создавать проблемы в куче других мест глупо.
А то получается одни пытаются написать на руби ядро операционнки, другие считают что С++ говно — потому что в нем нет даже сборщика мусора:)

Майкрософт исправил это, однако С++ с GC что-то не пользуется популярностью.
Причём тут JIT? Проблема в динамической типизации а не в JIT. Если типы в JS станут выводиться статически, то JS станет TS. А TS, если очень постараться может и до с++ дотянуть(когда-нибудь). WebAssembly как раз к этому и идёт.
Сейчас же function f(a,b){return a+b;} в JS не оптимизируешь.
Программа на С++ будет работать быстрее чем на JS примерно в 5-10 раз. Я не думаю, что то как тул написан повлияет на производительность так-же сильно.
JS всегда будет проигрывать компилируемым языкам, так как для выполнения a+b процессору всегда придётся выполнять проверку типов. В языке с статической типизацией просто будет сложение.
Да ошибся на единицу 2 раза(не добавил 1 элемент и взял на элемент больше, чем надо).
Код исправленный
N = 5000;
start_ijk = {
    i: 0,
    j: 0,
    k: 0
};
list = {
    v: start_ijk
};
list_last = list;
nums = {
    1: true
};
nums_count = 0;

function getNum(v) {
    return Math.pow(2, v.i) * Math.pow(3, v.j) * Math.pow(5, v.k);
}

function expand(v) {
    if (nums[getNum(v)] == undefined) {
        list_last.next = {
            v: v
        };
        list_last = list_last.next;
        nums_count++;
    }
    nums[getNum(v)] = true;
}

while (nums_count < N) {
    expand({
        i: list.v.i + 1,
        j: list.v.j,
        k: list.v.k
    });
    expand({
        i: list.v.i,
        j: list.v.j + 1,
        k: list.v.k
    });
    expand({
        i: list.v.i,
        j: list.v.j,
        k: list.v.k + 1
    });
    list = list.next;
}

let max_in_loop = Math.max.apply(null,
    Object.keys(nums).map(Number)
);

while (list) {
    if (getNum(list.v) < max_in_loop) {
        expand({
            i: list.v.i + 1,
            j: list.v.j,
            k: list.v.k
        });
        expand({
            i: list.v.i,
            j: list.v.j + 1,
            k: list.v.k
        });
        expand({
            i: list.v.i,
            j: list.v.j,
            k: list.v.k + 1
        });
    }
    list = list.next;
}

nums_array = Object.keys(nums)
    .map(Number)
    .sort(function(a, b) {
        return a - b;
    });

//console.log(nums_array);
console.log(nums_array[N - 1]);


Всё так-же меньше секунды. Сколько ест не скажу, в браузере запускал.
2 3 5 взаимно простые числа, значит каждое число имеет однозначное разложение на множители в виде 2^i*3^j*5^k.
2^i*3^j*5^k <=> (i,j,k)
10 <=> (1,0,1)
15 <=> (0,1,1)
Значит разные наборы ijk создадут разные числа и наоборот.
Я просто переводил код с JS на C#, дабы показать что наличие статических типов не меняет сути решения(а заодно показал, что в символ превратить цифру в языке со статической типизацией проще).
Это типичная олимпиадная задача с подвохом(ещё и не одним), тут не надо супер крутых структур данных. Тут главное понять, какую именно идею подсунул автор. Я хаскель не понимаю, так что сказать что там происходит не могу, но на JS такое можно решить так:
JS
N = 2000;
start_ijk = {
    i: 0,
    j: 0,
    k: 0
};
list = {
    v: start_ijk
};
list_last = list;
nums = {};
nums_count = 0;

function getNum(v) {
    return Math.pow(2, v.i) * Math.pow(3, v.j) * Math.pow(5, v.k);
}

function expand(v) {
    if (nums[getNum(v)] == undefined) {
        list_last.next = {
            v: v
        };
        list_last = list_last.next;
        nums_count++;
    }
    nums[getNum(v)] = true;
}

while (nums_count < N) {
    expand({
        i: list.v.i + 1,
        j: list.v.j,
        k: list.v.k
    });
    expand({
        i: list.v.i,
        j: list.v.j + 1,
        k: list.v.k
    });
    expand({
        i: list.v.i,
        j: list.v.j,
        k: list.v.k + 1
    });
    list = list.next;
}

let max_in_loop = Math.max.apply(null,
    Object.keys(nums).map(Number)
);

while (list) {
    if (getNum(list.v) < max_in_loop) {
        expand({
            i: list.v.i + 1,
            j: list.v.j,
            k: list.v.k
        });
        expand({
            i: list.v.i,
            j: list.v.j + 1,
            k: list.v.k
        });
        expand({
            i: list.v.i,
            j: list.v.j,
            k: list.v.k + 1
        });
    }
    list = list.next;
}

nums_array = Object.keys(nums)
    .map(Number)
    .sort(function(a, b) {
        return a - b;
    });

//console.log(nums_array);
console.log(nums_array[N]);


Работает менее секунды, однако не факт, что решено правильно. Ответ получился 8153726976.
2 задача С#:
var a = "5:11 2:41 1:31 3:8 1:6 2:31".Split(' ').Select(x => new int[]{ int.Parse(x.Split(':')[0]) , int.Parse(x.Split(':')[1]) });
var h = a.Sum(e => e[0]);
var m = a.Sum(e => e[1]);
h += m / 60; 
m %= 60; 
Console.WriteLine(h + ":" + m);

И никакой magic.

3 задача C#:
Console.WriteLine(
(new []{97,67,101,123,114,99,84,84,101,104,95,116,48,121,125,116,53,52,115})
.Select(e => (char)e)
.ToArray()
);

Ага, а потом оказывается что в программе полно дыр для SQL injection. В С++ со строгими типами мне не удаётся представить, как надо извратиться, чтобы такую дыру создать.
Если потом приходится 20 часов искать баг в коде, написанном за 10 минут, то нафик такую продуктивность.
В С++ можно так. Код не скомпилился.
int meters = 1;
std::chrono::seconds seconds{1};
auto val = meters + seconds;


А библиотеку обернуть:
int flib_mul2(int i){
    return i * 2;
} 

std::chrono::seconds mul2(std::chrono::seconds i){
    return std::chrono::seconds{flib_mul2(i.count())};
} 

int main()
{
    std::chrono::seconds seconds{1};
    auto seconds2 = mul2(seconds);
}

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity