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
-
-
-
-
1499 Messaggi
-
Administrator has disabled public posting
Administrator has disabled public posting
- Statistiche Forum:
-
- Totale Discussioni:
- 5832
- Totale Sondaggi:
- 100
- Totale Messaggi:
- 154748
- Totale Messaggi Oggi:
- 2
- Info Utenti:
-
- Totale Utenti:
- 10406
- Ultimo Utente Registrato:
- Nicko
|