Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/35: Рейтинг темы: голосов - 35, средняя оценка - 4.63
3 / 3 / 1
Регистрация: 26.12.2019
Сообщений: 170

Межцивилизационный телеграф

08.09.2021, 22:50. Показов 7253. Ответов 41

Студворк — интернет-сервис помощи студентам
Гуманоид Коля хочет как можно быстрее и громче передать сигнал Ксеноморфу Васе на другую планету. Ксеноморфы не умеют читать на языке Коли, и Вася не исключение, поэтому придется использовать специальную Ксеноморфную азбуку из 9 символов.

Передача каждого символа Ксеноморфов не бесплатна и стоит сколько-то динаров. Количество динаров у Коли и стоимость передачи каждого символа будут известны в межпланетном телеграфном пункте.

Коля не сильно понимает значения символов Ксеноморфов, но почему-то считает, что чем большим будет кол-во и разнообразие отправленных символов, и чем большее количество динаров заплатит за их передачу — тем быстрее Вася получит сигнал.

Помогите Коле найти такие индексы символов, соединив которые конкатенацией мы получим максимальное число, при этом потратив максимальное кол-во динар. Индекс — число от 1 до 9. Ответ ожидается в виде строки с индексами, которые могут повторяться.

Примеры

Пример 1

Ввод
[5,[5,4,3,2,1,2,3,4,5]]
Вывод
"55555"

Пример 2

Ввод
[2,[9,11,1,12,5,8,9,10,6]]
Вывод
"33"
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2021, 22:50
Ответы с готовыми решениями:

Телеграф
«Телеграф»: Разработайте программу для перевода с естественного языка в азбуку Морзе и обратно. 7.1. Английский. 7.2. Русский.

Программа телеграф.
Помогите решить задачку... Написать программу телеграф, которая принимает от пользователя сообщение и выводит на экран в виде...

старый телеграф
пожалуйста помогите написать прогу на языке си в ворланде си ++ фо дос Старый телеграф. Читать посимвольно исходный файл, переписывая...

41
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
09.09.2021, 10:04
Лучший ответ Сообщение было отмечено ArtoriasDark как решение

Решение

К условию задачи есть определённые вопросы... Надеюсь, я правильно его понял:
JavaScript
1
2
3
4
5
6
7
function telegraph(money, costs) {
  const charsCounts = costs.map(e => Math.floor(money / e)),
        maxChars = Math.max(...charsCounts);
  for (let i = charsCounts.length; i > 0; i--) {
    if (charsCounts[i-1] == maxChars) return i.toString().repeat(maxChars);
  }
}
JavaScript
1
2
telegraph(5,[5,4,3,2,1,2,3,4,5]); // "55555"
telegraph(2,[9,11,1,12,5,8,9,10,6]); // "33"
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
09.09.2021, 15:16
JavaScript
1
2
3
4
5
function telegraph(money, costs) {
  const min = Math.min(...costs),
        index = costs.lastIndexOf(min);
  return (index+1).toString().repeat(money);
}
0
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
09.09.2021, 16:41
Tavashi,
JavaScript
1
telegraph(7, [5, 5, 5, 5, 5, 5, 5, 5, 5]); // "9999999". Ожидается "9"
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
09.09.2021, 21:38
Balanaar,
JavaScript
1
2
3
4
5
function telegraph(money, costs) {
  const min = Math.min(...costs),
        index = costs.lastIndexOf(min);
  return (index+1).toString().repeat(money/costs[index]);
}
0
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
10.09.2021, 09:29
Tavashi,
JavaScript
1
telegraph(7, [4, 5, 5, 5, 5, 5, 5, 5, 5]); // "1". Ожидается "9"
0
0 / 0 / 0
Регистрация: 10.09.2021
Сообщений: 2
10.09.2021, 20:10
ArtoriasDark, Как успехи в решении задачи? не нашёл рабочий алгоритм?
0
3 / 3 / 1
Регистрация: 26.12.2019
Сообщений: 170
10.09.2021, 20:57  [ТС]
не, самое рабочее это 1 что скинули выше
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
10.09.2021, 23:18
Balanaar,
JavaScript
1
2
3
4
5
6
7
8
9
10
11
function telegraph(money, costs) {
    const o = costs.reduce((acc, n, i, a) => (
      acc.min >= n && (acc.iMin = i, acc.min = n),
      acc.max <= n && n <= money && (acc.iMax = i, acc.max = n),
      i === a.length-1 && acc.max < 0 && (acc.max = i),
      acc
      ), {min: Infinity, max: -Infinity, iMin: -1, iMax: -1});
    return money % o.min > money % o.max
        ? (o.iMax+1).toString().repeat(money/costs[o.iMax]) 
        : (o.iMin+1).toString().repeat(money/costs[o.iMin]);
}
Добавлено через 10 минут
ArtoriasDark, так вы бы получше задание расписали, а не сидели в ожидании. Например, выбранное вами решение не учитывает, что сначала нужно потратить максимальное кол-во динар, а уже затем находить индексы:
JavaScript
1
telegraph(19, [15, 16, 16, 10, 17, 11, 19, 15, 11])); // Ответ 7 || 9?
при этом потратив максимальное кол-во динар.
0
3 / 3 / 0
Регистрация: 11.09.2021
Сообщений: 15
11.09.2021, 08:49
Некоторая информация:

Задача - тестовое от яндекса для набора в онлайн-школу. Текст задачи, как по мне, действительно кривой. Уточнить условие - это надо спрашивать у составителя, но он наверное уже не ответит, т.к. выходной. Система, где автоматически тестируется алгоритм, вводные данные на которых алгоритм выдает ошибку - не показывает (там еще есть лимит на память, кстати).

Tavashi

JavaScript
1
telegraph(20, [21, 3, 13, 3, 17, 3, 3, 4, 5])); // I expect 977777, but 777777 returns
Ваш вариант выдает 777777 -> 3 * 6 = 18 ; 977777 -> 5 + 3*5 = 20
0
0 / 0 / 0
Регистрация: 10.09.2021
Сообщений: 2
11.09.2021, 17:42
t1mmz, Проблема в том что нужно ещё учитывать разнообразие символов.
Тоесть при 20, [21, 3, 13, 3, 17, 3, 3, 4, 5] более точный ответ 977642
Цитата Сообщение от ArtoriasDark Посмотреть сообщение
что чем большим будет кол-во и разнообразие отправленных символов
0
3 / 3 / 0
Регистрация: 11.09.2021
Сообщений: 15
11.09.2021, 18:36
anomal Тогда получается мы можем использовать 1 символ только 1 раз. Немного изменив пример на (20, [21, 3, 13, 3, 3, 3, 3, 4, 5]) можно считать 976542 ответом (но это не точно)
0
0 / 0 / 0
Регистрация: 12.09.2021
Сообщений: 11
12.09.2021, 01:40
Получилось реализовать следующее решение. К сожалению, всё равно недостаточно хорошее - два теста всё равно не проходит. Идея с разнообразием символов скорее всего не совсем корректная - это уже похоже на область МО.

Может кому-то пригодится. Если будут идеи по улучшению, не стесняйтесь, пишите

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function tele(amount, costsArray) {
    let combos = [];
 
    if (costsArray.length < 1 || amount === 0 || !costsArray.find(element => element < amount)) {
        return "";
    }
 
    var combinationSum = function(candidates, target, combos, currCombo, index) {
 
        if (target === 0) combos.push([...currCombo]);
      
        for (let i = index; i < candidates.length; i++) {
 
          if (candidates[i] <= target) {
 
            currCombo.push(candidates.indexOf(candidates[i]) + 1);
 
            combinationSum(candidates, target - candidates[i], combos, currCombo, i);
 
            currCombo.pop();
          }
        }
    }
 
    combinationSum(costsArray, amount, combos, [], 0);
 
    for (let i = 0; i < combos.length; i++) {
        combos[i] = Number(combos[i].sort().reverse().join(''));   
    }
    
    let result = Math.max(...combos).toString();
 
    return result;
}
console.log(tele(7, [4, 5, 5, 5, 5, 5, 5, 5, 5])); //"9"
console.log(tele(2, [5,4,3,2,1,2,3,4,5])); //"55"
console.log(tele(0, [1,1,1,1,1,1,1,1,1])); // ""
console.log(tele(2,[9,11,1,12,5,8,9,10,6])); // "33"
console.log(tele(20, [21, 3, 13, 3, 17, 3, 3, 4, 5])); // "977777"
console.log(tele(5,[5,4,3,2,1,2,3,4,5])); // "55555"
0
3 / 3 / 0
Регистрация: 11.09.2021
Сообщений: 15
12.09.2021, 03:27
BigDDD

два теста всё равно не проходит
Какие конкретно номера? И как именно не проходит - неверный ответ или превышение лимита на память?
0
0 / 0 / 0
Регистрация: 12.09.2021
Сообщений: 11
12.09.2021, 03:38
t1mmz, не проходит 8 и 9 тест. На девятом тратится много ресурсов, но тест помечается как «неверное решение», а не тайм-аут или чиже оверфлоу.
0
3 / 3 / 0
Регистрация: 11.09.2021
Сообщений: 15
12.09.2021, 09:10
BigDDD

Ваш код выдает:
JavaScript
1
2
[7, [5,5,5,5,5,5,5,5,5]]; // -Infinity | 9 expected
[20, [21,3,13,3,17,3,3,4,5]]; // 922222 | 977777 expected
А вот на этом происходит "JavaScript heap out of memory"
JavaScript
1
[1002, [11,7,13,7,7,7,7,11,13]]
Правильный вывод последнего примера зависит от того, что собственно считать правильным. Если нужно потратить больше всего денег, то в выводе будет строка длиной 142 - "8877......" Но если нужен самый длинный ответ - то строка длиной 143 - "777...."

Еще есть нюанс - точность вычислений. Где-то в арифметике с большими числами можно получить фокус уровня "0 + 9 = 10" что в итоге приводит к неверному ответу, т.к. 0 в ответе встречаться нигде не должен (в тексте задания это пояснение отсутствует, но оно есть в примечаниях ко всему набору заданий)

Добавлено через 5 часов 3 минуты
Кол-во проваленных тестов сократилось на 1 (остался только 8-й) когда я добавил код на определение "разнообразия"

JavaScript
1
2
3
4
5
6
7
8
function calcDiff(a, b) {
      // Whit Set I remove duplicates from strings
      return new Set(a).size - new Set(b).size
}
 
...
 
[20, [21,3,13,3,17,3,3,4,5]];  // "977642" instead of old "977777"
Видимо, разнообразие символов действительно учитывается.
0
0 / 0 / 0
Регистрация: 12.09.2021
Сообщений: 11
12.09.2021, 13:35
t1mmz, когда именно нужно вызывать calcDiff? Можно поподробнее про его использование? Я не знаю, как тут писать в личку, хотел бы связаться с вами.
0
3 / 3 / 0
Регистрация: 11.09.2021
Сообщений: 15
12.09.2021, 14:26
BigDDD

Когда идет сравнение между двумя промежуточными ответами, чтобы определить, какой ответ пойдет дальше в решение. Допустим, чтобы потратить n денег у меня уже есть индексы 9776, но приходит новое значение 9777. Здесь и нужно сравнение на разнообразие. Для вашего решения с рекурсией это нужно добавлять в конец - группировать все решения по длинам, выбирать самое самую длинную группу и уже в этой группе смотреть, кто "разнообразнее". Подход к решению этой задачи (не рекурсией) можно посмотреть
здесь

Ссылка с таймкодом.
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
12.09.2021, 15:30
Цитата Сообщение от t1mmz Посмотреть сообщение
Ваш вариант выдает 777777 -> 3 * 6 = 18 ; 977777 -> 5 + 3*5 = 20
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function telegraph(money, costs) {
  const o = costs.reduce((acc, n, i, a) => (
    (this.tmp = +(i+1).toString().repeat(Math.trunc(money / n))),
    acc.max <= this.tmp && n <= money && (acc.iMax = i, acc.max = this.tmp),
    i === a.length-1 && acc.max < 0 && (acc.max = ''),
    i === a.length-1 && (acc.max += '', acc.diff = money % acc.max.length),
    acc
  ), {max: -Infinity, iMax: -1, diff: -1});
  
  if (o.diff) { 
    for (let i = o.iMax; i < costs.length; i++) {
      if (costs[o.iMax] === costs[i]-o.diff) {
        return (o.max[0] = i+1) + o.max.substring(1, costs.length);
      }
    }
  }
  
  return o.max;
}
Добавлено через 11 минут
Цитата Сообщение от t1mmz Посмотреть сообщение
Немного изменив пример на (20, [21, 3, 13, 3, 3, 3, 3, 4, 5]) можно считать 976542 ответом (но это не точно)
Так все-таки, какой в данном примере будет правильный ответ? Учитывается сначала стоимость => разнообразие => индексы?
0
3 / 3 / 0
Регистрация: 11.09.2021
Сообщений: 15
12.09.2021, 16:51
Цитата Сообщение от Tavashi Посмотреть сообщение
Так все-таки, какой в данном примере будет правильный ответ? Учитывается сначала стоимость => разнообразие => индексы?
Tavashi , не могу сказать потому, что не знаю. Я прогонял свой код с вариантами "потратить больше денег" и "найти самое длинное решение" - результат проверочных тестов не изменился.

Добавлено через 27 минут
Собрал сорт-оф тестовый стенд для удобства

Кликните здесь для просмотра всего текста
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// !!!!!!!!!!!!!!!!!!!!
//
// add your functions to array
//
// !!!!!!!!!!!!!!!!!!!!
const funcs = [ ]
 
// please note expected values other than 
// for the first 3 examples
// are just supposed answers !!!
const data = [
    // strong answers
    [ 5, [5,4,3,2,1,2,3,4,5], "55555" ],
    [ 2, [9,11,1,12,5,8,9,10,6], "33" ],
    [ 0, [1,1,1,1,1,1,1,1,1], ""],
 
    // grey area...
    [ 7, [5, 5, 5, 5, 5, 5, 5, 5, 5], "9"],
    [ 7, [4, 5, 5, 5, 5, 5, 5, 5, 5], "9"],
    [ 19, [15, 16, 16, 10, 17, 11, 19, 15, 11], "9"],
    
    [ 2, [21, 3, 13, 3, 17, 3, 3, 4, 5], ""],
 
    [20, [21, 3, 13, 3, 17, 3, 3, 4, 5], "977642"],
    // almost the same as above
    [20, [21, 3, 13, 3, 3, 3, 3, 4, 5], "976542"],
 
    // stack overflow, possibly
    // (expected value is HUGE, so it is missed to not break logging)
    [ 1002, [11, 7, 13, 7, 7, 7, 7, 11, 13], ">_<"],
    
    // stack overflow, possibly
    // [ 386, [11, 7, 11, 7, 11, 7, 11, 7, 5], ">_<],
]
 
function memoryReport() {
    // if you are curious about it ...
    const memory = process.memoryUsage()
    console.log('---------------------------');
    console.log('\tMemory report:');
    console.log('---------------------------');
    for (let key in memory)
        console.log(`${key}: ${Math.round(memory[key] / 1024 / 1024 * 100) / 100} MB`);
}
 
function printSingeResult(func, m, c, expected) {
    let result;
    try {
        result = func(m, c);
    } catch(e) {
        result = String(e)
    }
    const status = result == expected ? 'OK' : `FAIL: ${expected} is expected`
    console.log(`Result: ${result} (${func.name}) (${status})`);
}
 
function printAll(funcs, data) {
    console.log('----- TESTING -----');
    data.forEach(dataset => {
        const [money, costs, expected] = dataset
        console.log(`\nInput: [${money}, [${costs}]]\n`);
 
        funcs.forEach(f => printSingeResult(f, money, costs, expected))
        console.log('-----');
    })
    console.log();
    console.log('----- DONE -----');
}
 
printAll(funcs, data)
memoryReport()


Добавлено через 15 минут
Внимание, в задаче обновилось условие (уведомлений не было, почему-то)

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

Передача каждого символа Ксеноморфов не бесплатна и стоит сколько-то динаров. Количество динаров у Коли и стоимость передачи каждого символа будут известны в межпланетном телеграфном пункте. Не в каждом телеграфном пункте доступны все символы, иногда их меньше.

Коля не сильно понимает значения символов Ксеноморфов, но почему-то считает, что чем большим будет кол-во и разнообразие отправленных символов — тем быстрее Вася получит сигнал.

Помогите Коле найти такие индексы символов, соединив которые конкатенацией мы получим максимальное число, при этом потратив максимальное кол-во динар. Индекс — число от 1 до 9. Ответ ожидается в виде строки с индексами, которые могут повторяться.

Формат ввода

Первый аргумент — целое число dinars (0 ≤ dinars ≤ 1e6). Второй аргумент — массив положительных целых чисел a1, a2, ..., an (1 ≤ ai ≤ 1e5, 3 ≤ n ≤ 9).

Формат вывода

Строка с индексами. Если динаров у Коли не хватает ни на один символ, верните пустую строку.

2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2021, 16:51
Помогаю со студенческими работами здесь

Телеграф - исправить ошибку в коде
Program_telegraph; Uses Crt Const Morse: array of = ( '.-` , `-...' , '.---` , `--/.` , {А, Б, В, Г} '-.. ` , `. `, '...-' ,...

Как написать программу-телеграф?
Помогите плиз Написать программу-телеграф,которая принимает от пользователей сообщение и выводит его на экран в виде последовательности...

Азбука Морзе, программа-телеграф
программа-телеграф, которая принимает от пользователя сообщение и выводит его на экран в виде последова-тельности точек и тире. Вывод точек...

Программа телеграф на турбо паскале можно на фри
Написать программу – телеграф, который принимает от пользователя сообщения и выводит его на экран в виде последовательности точек и тире....

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru