8 мар. 2017 г.

Произведение n чисел массива на JavaScript

Задача 1.1. У вас есть массив целых чисел, найдите наибольшее произведение из трёх чисел данного массива.
Решение.

var unsortedArray = [-10, 7, 29, 30, 5, -10, -70];
 
computeProduct(unsortedArray); // 21000
 
function sortIntegers(a, b) {
  return a - b;
}
 
// Наибольшее прозиведение - это (min1 * min2 * max1 || max1 * max2 * max3)
function computeProduct(unsorted) {
  var sortedArray = unsorted.sort(sortIntegers),
    product1 = 1,
    product2 = 1,
    array_n_element = sortedArray.length - 1;
 
  // Получаем произведение трёх наибольших элементов уже отсортированного массива
  for (var x = array_n_element; x > array_n_element - 3; x--) {
      product1 = product1 * sortedArray[x];
  }
 
  product2 = sortedArray[0] * sortedArray[1] * sortedArray[array_n_element];
 
  if (product1 > product2) return product1;
 
  return product2;
}
Возникла идея, чтобы скрипт находил произведение из произвольного количества чисел данного массива.
Решение.
// Массив из 21 элемента.
var unsortedArray = [-10, 7, 29, 30, 5, -10, -70, -11, 8, 28, 31, 6, -11, -71, -13, 79, 99, 32, 55, -100, -170];

// Вывод массива по элементам.
function outArrayByElement(ar) {
    var i;
    for (i = 0; i < ar.length; i += 1) {
        document.writeln(ar[i] + '>br /<');
    }
}

// Основная функция. Подсчет минимального и максимального произведений заданного количества элементов массива.
function multiPulti(ar, m) {
    var n = ar.length - 1,
        keys = [],
        max, min,
        maxAr, minAr,
        tmp,
        flag;

    // Возвращает произведение элементов массива по переданному массиву индексов.
    // Если указано, что print равно true, выводит строку из вышеуказанных значений.
    function multi(_ar, print = false) {
        var _i, _m;
        if (print) { _m = '( '; } else { _m = 1; }
        for (_i = 0; _i < _ar.length; _i += 1) {
            if (print) {
                _m += ar[_ar[_i]] + ' ';
            } else {
                _m *= ar[_ar[_i]];
            }
        }
        if (print) { _m += ')' }
        return _m;
    };

    // Наполнение массива индексов начальными значениями.
    // Анонимная функция для ограничения области видимости переменных.
    (function () {
        var _i;
        for (_i = 0; _i < m; _i += 1) {
            keys.push(_i);
        }
    })();

    max = min = multi(keys);

    // Сердце основной функции.
    // Вычисление произведения m элементов n-мерного массива.
    // Вывод минимального и максимального вышеуказанных произведений.
    (function () {
        var _j, _k;
        do {
            for (_j = m - 1; _j >= 0; _j -= 1) {
                flag = false;
                if (keys[_j] < n - m + 1 +_j) {
                    keys[_j] += 1;
                    for (_k = _j + 1; _k < m; _k += 1) {
                        keys[_k] = keys[_k - 1] + 1;
                    }
                    flag = true;
                    _j = -1;
                }
            }
            tmp = multi(keys);
            //document.writeln(multi(keys, true) + '>br /<');
            //outArrayByElement(keys);
            if (tmp > max) { max = tmp; maxAr = multi(keys, true); }
            if (min > tmp) { min = tmp; minAr = multi(keys, true); }
        } while (flag);
        document.writeln('min=' + min + ' ' + minAr + ', ' + 'max=' + max + ' ' + maxAr);
    })();
}
// Первый параетр - массив элементов.
// Второй параметр - количество элементов, произведене которых нужно найти.
multiPulti(unsortedArray, 7);
Некоторые результаты (для последовательностей из 2, 3, 5, 7 и 20 чисел):
min=-16830 ( 99 -170 ), max=17000 ( -100 -170 )
min=-1329570 ( 79 99 -170 ), max=1683000 ( 99 -100 -170 )
min=-9439947000 ( -71 79 99 -100 -170 ), max=8364510000 ( -70 -71 99 -100 -170 )
min=-16614306720000 ( -71 79 99 32 55 -100 -170 ), max=36343795950000 ( -70 -71 79 99 55 -100 -170 )
min=-4.641808736809999e+28 ( -10 7 29 30 -10 -70 -11 8 28 31 6 -11 -71 -13 79 99 32 55 -100 -170 ), max=2.3209043684049993e+28 ( -10 7 29 30 5 -70 -11 8 28 31 6 -11 -71 -13 79 99 32 55 -100 -170 )

1 февр. 2017 г.

Джонатан Литтелл. Благоволительницы

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

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

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

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

Неожиданно между двумя рекламами стирального порошка прозвучали такты довоенного танго, скажем, «Виолетты», и вот всплывает в памяти плеск волн в ночи, фонарики кафешки и еле уловимый запах пота веселой женщины рядом с вами; улыбающееся личико ребенка у входа в парк напоминает вам сына, когда он учился ходить; на улице солнечный луч пронзил облака и высветил раскидистую крону и белый ствол платана — и вы вдруг очутились в детстве, во дворе школы, играете на переменке в войну и вопите от восторга и ужаса. Вот и возникла у вас человеческая мысль. Но это редко случается.

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

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

Но неужели вы и вправду уверены, что урок усвоен? И войны не будет? В определенном смысле война не закончится никогда...

2 мар. 2016 г.

П.А. Судоплатов. Спецоперации

...те, кто больше всего говорят об «антинародном сговоре Сталина и Гитлера» и «секретных протоколах Молотова – Риббентропа», всегда упорно замалчивают три секретных протокола – приложения к решениям Ялтинской конференции, подписанные 11 февраля 1945 года руководителями США, Великобритании и СССР. А ведь этими документами на руководство США и Великобритании фактически возлагались обязательства по наполнению мест заключения в Советском Союзе: лагеря сразу после войны ожидали сотни тысяч «политических противников» и других «подозрительных» лиц, оказавшихся на территории Западной Европы и в союзнической зоне оккупации Германии. Причем насильственная репатриация распространялась не только на бывших советских граждан, но и на тех эмигрантов, которые никогда не состояли в советском гражданстве!

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

Непосредственные создатели главных агентурных подходов к виднейшим физикам Запада Г. Б. Овакимян, С. М. Семенов, Л. П. Василевский, 3. И. Рыбкина, С. И. Апресян, П. П. Пастелъняк, Г. М. Хейфец в ходе позорных чисток были уволены из разведки. Никто из руководителей разведки перед ними так и не извинился, не говоря уже о том, чтобы отметить их всех высокими государственными наградами. Ценнейшие агенты нашей разведки С. Н. Курнаков, соратник Розенбергов Сарант (в СССР жил под фамилией Старов), поддерживавшие прямой контакт с американскими физиками, фактически до конца своих дней оставались без должной материальной и моральной поддержки со стороны руководителей научно-технической разведки 50—60-х годов, которые, кстати, несут ответственность за гибель супругов Розенбергов. Еще более циничным было забвение подвига видного ученого Клауса Фукса, которому неофициально ряд историков разведки приписывают вину за признание факта сотрудничества с СССР и не считают возможным ходатайствовать хотя бы о его посмертном награждении.

10 нояб. 2015 г.

Data Protector Post-exec and extended report of volume

TASK: after backup need to make table of total size and count of files of catalogs of second level for volumes VOL2, VOL4, VOL5 и VOL7 and show it in web.

Data Protector email report has view:

Cell Manager: matador2
Creation Date: 9/8/2015 11:54:14 PM

Session Information

Specification: EngineFC
Session ID: 2015/09/08-3
Type: Backup
Session Owner: matador2\ADMINISTRATOR@matador2
Status: Completed/Failures
Mode: incr
Start Time: 9/8/2015 9:00:05 PM
Queuing: 0:00
Duration: 2:54
GB Written: 733.24
# Media: 3
# Errors: 8
# Warnings: 14
Success: 100%

Command of next view allows to get full list of files and their sizes for volume:
omnidb -winfs engine.zp.ua:/K "K:" -session 2015/10/23-3 -catalog  > c:\report.txt

I have coded test script and pointed his name to the field:
HP Data Protector Manager / Backup / Backup Object Summary / Properties... / Options / Post-exec / dp_post_exec.cmd.
But I got error:
[Critical] From: VBDA@engine.zp.ua "O:"  Time: 09.11.2015 13:04:41
[61:3005]    Cannot perform stat() on script "C:\Program Files\OmniBack\bin\/dp_post_exec.cmd",
    system reports: "[2] The system cannot find the file specified "
[Critical] From: VBDA@engine.zp.ua "O:"  Time: 09.11.2015 13:04:41
    Post-exec failed with exitcode -1 => backup aborted!

After reading Internet I have understood that script is run on client side but I placed script on server!

I pointed script and server in:
HP Data Protector Manager / Backup / Options / Backup Specification Options / Advanced... / Post-exec / Post-exec: dp_post_exec.cmd, On client: matador2.
It worked!

After that I had coded needed script:

@echo off

rem set s=2015/11/09-16
set s=%SESSIONID%
set s=%s:/=-%

rem echo %MODE%

if "%MODE%"=="Full" (

omnidb -winfs engine.zp.ua:/O "engine.zp.ua [/O]" -session %SESSIONID% -catalog > c:\for_popus3\%s%_VOL4.txt
omnidb -winfs engine.zp.ua:/M "engine.zp.ua [/M]" -session %SESSIONID% -catalog > c:\for_popus3\%s%_VOL5.txt
omnidb -winfs engine.zp.ua:/L "engine.zp.ua [/L]" -session %SESSIONID% -catalog > c:\for_popus3\%s%_VOL7.txt
omnidb -winfs engine.zp.ua:/K "engine.zp.ua [/K]" -session %SESSIONID% -catalog > c:\for_popus3\%s%_VOL2.txt

)

I shared catalog and mounted it on web-server:

# cat /etc/fstab |grep popus3
//matador2/for_popus3 /var/www/html/ddd/reports cifs password=ghgh,username=popus3 0 0

# ls -l /var/www/html/ddd/reports
total 324287
-rwxr-xr-x 1 root root    549948 Nov  9 16:01 2015-11-05-3_VOL2.txt
-rwxr-xr-x 1 root root  22405483 Nov  9 14:54 2015-11-05-3_VOL4.txt
-rwxr-xr-x 1 root root 308991002 Nov  9 15:42 2015-11-05-3_VOL5.txt
-rwxr-xr-x 1 root root    122328 Nov  9 15:50 2015-11-05-3_VOL7.txt

Now on web-server need to code script for parsing these reports and showing table in browser.

1 сент. 2015 г.

Джордж Орвелл «1984» (або Тисяча дев'ятсот вісімдесят четвертий)

Вирішив перечитати роман в українському перекладі.

Посилання на джерела:
http://toloka.to/t58233 Джордж Орвелл. 1984 : роман-антиутопія. Переклад з англійської Віталій Данмер. Львів: Видавництво Гуртом, 2013. — 321 с.
- Джордж Орвелл. 1984. Переклад з англійської Віктор Шовкун. Серія "Майстри світової прози". Київ: Видавництво Жупанського, 2015. 312 стор. ISBN 978-966-2355-57-4

Почав читати відредагований редактором переклад аматора Данмера - отримав неприємний осад від непрофесійності автора в галузі літературного перекладу тощо. Звісно, сам я і так не перекладу, але, сподіваюся, що професійний перекладач вкупі з професійним редактором повинні явити щось краще.

Буду чекати на друге джерело.

P.S. В вікіпедії на сторінці Премія імені Максима Рильського є і Віктор Шовкун, і Олег Жупанський... Прикро, що були усі передумови для "другого джерела" щоб стати непоганим перекладом... Але, судячи з коментарів, які я занотував нижче, цього не сталося.