Home Forum General Librogame e dintorni Ottimizzatore paragrafi 1.0

Cerca nel sito

Il Sondaggione!!

Librogame Magnifico 2024, primo turno: vota il miglior LG dell'anno!

Ottimizzatore paragrafi 1.0

Ottimizzatore paragrafi 1.0

Stanotte avevo poco sonno e mi sono posto un problema.

Sappiamo tutti che spesso la fine del paragrafo non coincide con la fine pagina, e questo obbliga gli impaginatori a inserire piccole immagini tappabuchi, occupando spazio per niente. Non solo: nei casi in cui il paragrafo coincide perfettamente con la fine pagina, il paragrafo successivo non ha bisogno di saltare una riga e quindi si guadagna ulteriore spazio.

Chiariamoci: anche nel peggiore dei casi, non si va oltre un guadagno del 5%. E per un editore serio, non c'è un cambiamento vero fra pubblicare 400 pagine anziché 420. (o così mi pare di aver capito)

Tuttavia, almeno nei corti, ogni riga risparmiata può essere utile. E avere mezza/una pagina in più fa comodo.
Ecco quindi un codice javascript che calcola il modo più efficiente per rimescolare i paragrafi. Lo fa nel modo più stupido possibile: prova combinazioni a caso, finché non trova un risultato soddisfacente.

Non è il massimo, ma testato sul corto che sto scrivendo per "CortiInGioco", ha ridotto le righe da 700 a 679, portandole sotto il massimo.

La prossima volta che mi ubriaco diventerà una feature di Magebook.

Codice:



// Put here the length of each chapter, from the first to the last one
// ie, the first three chapters here are 11, 5 and 18 lines long
const chapters = [
    11,  5, 18, 16,  4, 25,  8, 12, 14,  2,
    16, 30,  9,  6, 26, 11, 12,  3,  9, 11,
    22, 11, 15, 11, 16,  5, 14,  9, 10, 12,
    14, 15,  6, 11, 12, 11,  2, 12, 11, 11,
     6, 17, 25, 15, 24,  9,  3,  5,  4,  5,
]

// length of each page
const pageLines = 29


// index of fixed chapters, ie chapters that won't be touched
const fixed = [1, 39, 17, 24, 50]

// number of times we should run the optimizer
const numberOfTries = 10000






// Pick random key of an object
const randomKey = (obj) => {
    const keys = Object.keys(obj);
    return keys[ keys.length * Math.random() << 0];
}


// Dumb optimizer
const dumbCalculator = (chapters, pageLines, fixed) => {

    let usedLines = 0
    let numberOfChapters = chapters.length

    // Create an object where entries are: chapter number: chapter length
    let c = {}
    chapters.forEach((cLength, i) => { c[i + 1] = cLength })


    let fixedLengths = fixed.map(key => c[key])
    fixed.forEach((chapter) => delete c[chapter]);

    let newChapters = {}


    for(let i = 1; i <= numberOfChapters; i++){

        // Handle fixed chapters
        const fixedIndex = fixed.indexOf(i)
        if(fixedIndex !== -1){
            usedLines += fixedLengths[fixedIndex]
            if((usedLines % pageLines) !== 0) usedLines += 1;
            continue;
        }


        // Handle non-fixed chapters
        const addChapter = (chapter) => {
            newChapters[i] = chapter
            usedLines += c[chapter]
            delete c[chapter]
            if((usedLines % pageLines) !== 0) usedLines += 1;
        }   

        // Check if exists
        const remainingLines = pageLines - (usedLines % pageLines)
        const indexOfPerfect = Object.values(c).indexOf(remainingLines)
        if(indexOfPerfect != -1){
            addChapter(Object.keys(c)[indexOfPerfect])
        }else{
            // choose the key to add completely random
            addChapter(randomKey(c))
        }


    }

    return [usedLines, newChapters]
}




// Try the algorith multiple times, keep best result
let bestLines = 99999999999
let bestChapters = {}

for(let i = 0; i < numberOfTries; i++){
    let [lines, newChapters] = dumbCalculator(chapters, pageLines, fixed)
    if(lines < bestLines){
        bestLines = lines
        bestChapters = newChapters
    }
}

console.log(bestChapters)
console.log(bestLines)

Ultima modifica di: FinalFabbiX
Ago-04-22 03:44:59

FinalFabbiX
Signore del Totoautori 2016
Cavaliere del Sole
ranks
useravatar
Offline
1476 Messaggi
Info utenti nei messaggi
Administrator has disabled public posting

Re: Ottimizzatore paragrafi 1.0

Mi pare una gran [commento non in linea con gli standard minimi del sito]

"La grammatica è tutto ciò che conta"

gabrieleud
Ssisaggi style
Principe del Sole
ranks
useravatar
Offline
6533 Messaggi
Info utenti nei messaggi
Administrator has disabled public posting

Info Forum

Statistiche Forum:
 
Totale Discussioni:
5737
Totale Sondaggi:
100
Totale Messaggi:
153859
Totale Messaggi Oggi:
4
Info Utenti:
 
Totale Utenti:
9757
Ultimo Utente Registrato:
EnderBlack89