LINUX.ORG.RU

Подобрать длительность с помощью алгоритма

 , ,


0

2

Есть вектор состоящий из float'ов, они означают количество секунд каждого трека, как подобрать так чтобы выборка не повторялась от запуска к запуску и суммарная длительность была не больше часа?

std::vector<float> *vector = new std::vector<float>();



Последнее исправление: Gremlin_ (всего исправлений: 1)

Что ты имеешь ввиду под «чтобы выборка не повторялась»? Чтобы порядок отличался? А насколько? На сколько часов у тебя этих флоатов вообще? Может у тебя два трека всего - один 35 мин. Другой 40. И чо тогда?

Мало условий.

Suntechnic ★★★★★
()
Ответ на: комментарий от Suntechnic

Песен около ~1500 значений векторов, там есть самые разные от 1:30-15:00 и возможно дольше, есть джингл длина которого 12 секунд, он будет нужен если не будет хватать очень мало что ни один трек не вместиться , им можно разбавлять песни

Gremlin_
() автор топика
Ответ на: комментарий от Suntechnic

А не повторяемость то и значит,что нельзя одной песней забить весь отрезок и при каждом запуске программы отличалась подборка

Gremlin_
() автор топика

Ну шафл делай, причем с последей к первой и считай время общее.

anonymous
()

Никак. Лет через 100 обязательно всё повторится

deadplace
()

Псевдокод


float all_time ;
for(vector)
{
 all_time +=vector[i];
 if(all_time < 3600)
 {
    vector2[k]=music_vector[i];
 }else{
    break;
 }
}

randomise_positions(vector2)
{
 верчу кручу запутать хочу
}
Deleted
()

У тебя ошибка вот здесь:

std::vector<float> *vector = new std::vector<float>();
И здесь:

они означают количество секунд каждого трека

Задача решается составлением словаря имя файла-длительность и скрипт на 10 строчек из cat, sort и bc.
Я понимаю, что плюсы это прикольно, тебя в шараге этому учили, но не всё надо делать топором, есть куча других инструментов.

crutch_master ★★★★★
()
Ответ на: комментарий от i-rinat

А есть ли смысл? Вот например можно создать гистограмму отражающую длительность треков и знать допустим что треки около 4 минут самые популярные, отсюда делаем вывод что их можно добавлять в конец,когда рандомно набирем 56 минут суммарно и уже из этих 4х минутных будем брать также рандомно, но есть нюанс подойдет ли нам подборка длиной 60 минут и 1 секунда? Вроде как да, но не факт. Тут много условий и никто не может нормально сделать алгоритм желательно с кодом безо всяких там теоретеческого 3.14здежа

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

и никто не может нормально сделать алгоритм желательно с кодом

Это называется «работа», и она у нас уже есть. У кого-то кроме работы есть ещё свои проекты. Другими словами, всегда есть что делать, чем заняться.

Если ты не в состоянии заинтересовать публику своей задачей, представив её как что-то интересное, наиболее вероятно ты тут получишь клоунаду. Клоунада это весело. Твоя задача — нет.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

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

Gremlin_
() автор топика
Ответ на: комментарий от i-rinat

Время - это почти везде какое-то целое, прошедшее с 1970-01-01, какой смысл делать его float?

crutch_master ★★★★★
()
Ответ на: комментарий от i-rinat

Это называется «работа», и она у нас уже есть. У кого-то кроме работы есть ещё свои проекты. Другими словами, всегда есть что делать, чем заняться.

И только у тебя хобби - гнобление на ЛОРе

Einstok_Fair ★★☆
()
Ответ на: комментарий от Gremlin_

Подсчёт длительности в сек (avconv выдаёт hh:MM:ss, переводим в секунды)

#!/bin/bash
d=$(avconv -i "$1" |& grep Duration | cut -d , -f 1 | cut -d " " -f 4 | cut -b -8)
s=$(date -ud "1970-01-01 $d" +%s)
echo $s
Составление списка (~/sh/durations.sh - скрипт выше)
#!/bin/bash
sum=0;
dir=$1; #каталог с файлами
dur=$2; #общая длительность не менее сек
cd $dir;
IFS=$(echo -en "\n\b");
ls -1 --sort=t | tac | while read f; do 
	t=$(~/sh/duration.sh "$f");
	if [ $dur -ge $sum ]; then 
            echo $f
        fi
	sum=$(($sum+$t)); #длительность не менее $dur
done
Потом делаешь sort -R выхлопа и скармливаешь его твоему проигрывателю. Тут --sort=t, потому что я делал touch всех проигрываемых файлов. Работает так: берётся x файлов на y минут, которые давно не проигрывались, перемешивается и скармливается vlc.
inb4: по нескольким каталогам - прикрути find вместо ls.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)

А в чём вопрос-то? Выбирай случайные пока час не превысит.

Deleted
()

Язабан.

anonymous
()
Ответ на: комментарий от i-rinat

Пожалуйста, пример:

Ты что думаешь, что кто-то что-то тебе тут объяснять будет? У тебя свои мозги должны быть. Что такое гнобление - может понять любой человек с неатрофированными зеркальными нейронами. А то спрашивает, тут, понимаешь! Думает что ему кто-то что-то по-существу отвечать будет.

Einstok_Fair ★★☆
()
Ответ на: комментарий от Einstok_Fair

Может, валерьяночки выпьешь? Самоистязание негативно влияет на психическое здоровье.

i-rinat ★★★★★
()
Ответ на: комментарий от Gremlin_

Стрелочку можно и со смарт поинтерами использовать.

xpahos ★★★★★
()
Ответ на: комментарий от Gremlin_
vector<float> songs = {10,20,200, 400, 500};
    const int minutes = 60;
    const int seconds = 60;
    const int seconds_limit = minutes * seconds;
    vector< vector<int> > super_playlist;
    int number_of_songs=songs.size();
    int skoko_playlistov={1};
    for(int i=0; i<skoko_playlistov; i++) {
        vector<int> tracks_order;
        for(int pos=0; pos < number_of_songs; ++pos) {
            static float accumulator=0;
            accumulator += songs[pos];
            if (accumulator < seconds_limit) {
                tracks_order.push_back(pos);
                continue;
            }
            else{
                super_playlist.push_back(tracks_order);
            }
        }
        for_each( begin(tracks_order), end(tracks_order), [](int pos){ cout<<pos<<endl; });
    }
anonymous
()
Ответ на: комментарий от Gremlin_

Хорошая позиция! Не надо читать, нужно что-то рабочее.

turtle_bazon ★★★★★
()
Ответ на: комментарий от turtle_bazon

Он явно форум с профильным сайтом перепутал.

Какой там профильный сайт по подбиранию на определённое время треков в плейлист? +)

anonymous
()

Тебе про жадные алгоритмы и прочие укладки рюкзака с переборами с возвратом уже сказали или тебе опять все и сразу? P.S. а страничка вкалтакике говорит о твоем интеллектуальном уровне, да.

Makhno
()
Ответ на: комментарий от Makhno

Алгоритмы для быдла. Человек попросил ему помочь, надо написать как просит. Совместный труд, кооперация, он дает тебе общение, ты ему пишешь алгоритм (как ботан-задрот симпатичной однокласснице)

da17
()
Ответ на: комментарий от da17

надо

Кому надо?

Совместный труд, кооперация, он дает тебе общение, ты ему пишешь алгоритм

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

Makhno
()
Ответ на: комментарий от da17

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.