Bücherplan-Ersteller (Book-Scheduler)
Fach
(Class)
Montag
(Monday)
Dienstag
(Tuesday)
Mittwoch
(Wednesday)
Donnerstag
(Thursday)
Freitag
(Friday)
Löschen
(Delete)

Effizienteste Kombinationen (Most efficient combinations):

Implementation

JavaScript

class Book {
    constructor(name, times) {
        this.name = name;
        this.times = times;
        this.toString = () => {
            return this.name;
        }
    }
}

function testBookScheduler() {
    const books = [
        new Book("Mathematics", [true, false, true, true, false]),
        new Book("Latin", [false, true, true, false, true]),
        new Book("Biology", [true, true, false, false, false]),
        new Book("History", [false, false, false, false, true]),
        new Book("English", [true, false, true, false, true]),
        new Book("German", [false, true, true, false, true]),
        new Book("Physics", [true, false, false, false, false]),
        new Book("Catholic-Religion", [false, true, false, false, true]),
        new Book("Chemistry", [false, false, true, true, false])
    ];

    const schedules = createBookSchedules(books);
    for(const schedule of schedules) {
        console.log("Person 1: "+schedule.person1);
        console.log("Person 2: "+schedule.person2);
        console.log()
    }
}

function createBookSchedules(books) {
    const maxCombinations = Math.pow(2, books.length);

    let booksPerson1 = [];
    let booksPerson2 = [];

    let bestAverage = -1;
    const bestCombinations = [];

    for(let combination = 0; combination < maxCombinations; combination++) {
        for(let i = 0; i < books.length; i++) {
            if((combination >> i) % 2 === 1) booksPerson1.push(books[i]);
            else booksPerson2.push(books[i]);
        }

        const avgDays = [0, 0, 0, 0, 0];
        booksPerson1.forEach(book => {
            for(let i = 0; i < book.times.length; i++)
                if(book.times[i]) avgDays[i] += 1;
        });
        booksPerson2.forEach(book => {
            for(let i = 0; i < book.times.length; i++)
                if(book.times[i]) avgDays[i] -= 1;
        });

        let average = 0;
        for(const avgDay of avgDays) average += Math.abs(avgDay);
        average /= 5;

        if(bestAverage === -1 || average < bestAverage) {
            bestAverage = average;
            bestCombinations.splice(0, bestCombinations.length);
            bestCombinations.push(combination);
        } else if(bestAverage === average) {
            bestCombinations.push(combination);
        }

        booksPerson1 = [];
        booksPerson2 = [];
    }

    const objects = [];
    bestCombinations.forEach(combination => {
        for(let i = 0; i < books.length; i++) {
            if((combination >> i) % 2 === 1) booksPerson1.push(books[i]);
            else booksPerson2.push(books[i]);
        }

        objects.push({
            combination: combination,
            average: bestAverage,
            person1: [...booksPerson1],
            person2: [...booksPerson2]
        });

        booksPerson1 = [];
        booksPerson2 = [];
    })
    return objects;
}

Java

import java.util.Arrays;
import java.util.LinkedList;

public class BookScheduler {
    record Book(String name, boolean[] times) {}

    public static final Book[] BOOKS = new Book[] {
            new Book("Mathematics", new boolean[] {true, false, true, true, false}),
            new Book("Latin", new boolean[] {false, true, true, false, true}),
            new Book("Biology", new boolean[] {true, true, false, false, false}),
            new Book("History", new boolean[] {false, false, false, false, true}),
            new Book("English", new boolean[] {true, false, true, false, true}),
            new Book("German", new boolean[] {false, true, true, false, true}),
            new Book("Physics", new boolean[] {true, false, false, false, false}),
            new Book("Catholic-Religion", new boolean[] {false, true, false, false, true}),
            new Book("Chemistry", new boolean[] {false, false, true, true, false})
    };

    public static void main(String[] args) {
        final int maxCombinations = 1 << BOOKS.length;

        final LinkedList<Book> booksPerson1 = new LinkedList<>();
        final LinkedList<Book> booksPerson2 = new LinkedList<>();

        double bestAverage = Double.NaN;
        final LinkedList<Integer> bestCombinations = new LinkedList<>();

        for(int combination = 0; combination < maxCombinations; combination++) {
            for(int i = 0; i < BOOKS.length; i++) {
                if((combination >>> i) % 2 == 1) booksPerson1.add(BOOKS[i]);
                else booksPerson2.add(BOOKS[i]);
            }

            int[] avgDays = {0, 0, 0, 0, 0};
            booksPerson1.forEach(book -> {
                for(int i = 0; i < book.times.length; i++)
                    if(book.times[i]) avgDays[i] += 1;
            });
            booksPerson2.forEach(book -> {
                for(int i = 0; i < book.times.length; i++)
                    if(book.times[i]) avgDays[i] -= 1;
            });

            double average = 0;
            for(int avgDay : avgDays) average += Math.abs(avgDay);
            average /= 5;

            if(Double.isNaN(bestAverage) || average < bestAverage) {
                bestAverage = average;
                bestCombinations.clear();
                bestCombinations.add(combination);
            } else if(average == bestAverage) {
                bestCombinations.add(combination);
            }

            booksPerson1.clear();
            booksPerson2.clear();
        }

        final double average = bestAverage;

        bestCombinations.forEach(combination -> {
            for(int i = 0; i < BOOKS.length; i++) {
                if((combination >>> i) % 2 == 1) booksPerson1.add(BOOKS[i]);
                else booksPerson2.add(BOOKS[i]);
            }

            String s = Integer.toBinaryString(combination);
            s = "0".repeat(BOOKS.length - s.length()) + s;

            System.out.println("Combination: [" + s + "], average difference: " + average);
            System.out.println("Books: [Monday, Tuesday, Wednesday, Thursday, Friday]");
            System.out.print("Person 1: ");
            booksPerson1.forEach(book -> System.out.print(book.name + " "));
            System.out.println();
            System.out.print("Person 2: ");
            booksPerson2.forEach(book -> System.out.print(book.name + " "));
            System.out.println("\n");

            booksPerson1.clear();
            booksPerson2.clear();
        });
    }
}