Maratón Código Fuente

R/a: Ecotor utiliza un código fuente en PHP, que una vez se inicial la maratón, toma todos los participantes de la maratón y les asigna una posición de forma aleatoria. Ese código no es nisiquiera de Ecotor, ni es un secreto, es algo genérico que se consigue libremente en internet y aquí te compartimos la fuente, del código que estamos usando para hacer la repartición aleatoria.

Ver: https://www.php.net/manual/es/function.shuffle.php

Si tienes conocimientos de programación o conoces alguien que los tenga, también te compartimos nuestro código, para que en transparencia, puedas comprobar como es implementado ese código en nuestro software de maratón, para hacer las distribuciones en cada maratón de forma aleatoria y sin ninguna manipulación manual.

/**
     * @access public
     * @static
     * Metodo que setea la distribcion de las distribuciones
     * @param int $id
     * Id de la maratón
     */
    public static function SetDistribution(int $id)
    {
        //Marathon a setear distribución
        $marathon = ModelsMarathon::where("id", $id)->first();
        //Usuarios de la maratón
        $users = $marathon->Users()->orderBy("creator", "desc")->get()->pluck("user_id")->toArray();
        //Creador de la maratón
        $creator = array_slice($users, 0, 1);
        //Demás usuarios
        $else = array_slice($users, 1, sizeof($users));
        //Pone al azar los demás usuarios menos el creador
        shuffle($else);
        //Valida que sean tramos de 10 o más sino mezcla los usuarios
        $set = [];
        for ($i = 0; $i <  ceil((sizeof($else) / 10)); $i++) {
            array_push($set, array_slice($else, $i * 10, 10));
        }
        if (count($set[count($set) - 1]) < 10) {
            $set[count($set) - 2] = array_merge($set[count($set) - 2], $set[count($set) - 1]);
            unset($set[count($set) - 1]);
        }
        //Se unen los creadores y los demás usuarios
        $users = array_merge($creator, $set);
        $dist = [];
        //Primera donación al al creador de la maratón
        $dist[0] = [
            [
                "reveiver_id" => $users[0],
                "donant_id" => $users[1][0],
            ]
        ];
        //Se setea la posicion para guardarlas
        MarathonDist::create([
            "marathon_id" => $marathon->id,
            "team" => 0,
            "position" => 0,
            "user_id" => $users[0],
            "head" => true
        ]);
        MarathonDist::create([
            "marathon_id" => $marathon->id,
            "team" => 0,
            "user_id" =>  $users[1][0],
            "ref_id" => $users[0]
        ]);
        $users[0] = [];
        //seteo de donaciones entre usuarios
        $count = 1;
        for ($i = 0; $i < intval(count($users)); $i++) {
            if ($i > 0) {
                foreach ($users[$i] as $key => $value) {
                    $counted = false;
                    if ($key == 0 && $i > 1) {
                        $dist[$count] =  [
                            [
                                "reveiver_id" => $users[$i - 1][4],
                                "donant_id" => $value,
                            ]
                        ];
                        //Guardar posiciones aleatorias
                        $marDist = MarathonDist::where("user_id", $users[$i - 1][4])->where("head", true)->first();
                        if (is_null($marDist)) {
                            MarathonDist::create([
                                "marathon_id" => $marathon->id,
                                "team" => $count,
                                "position" => null,
                                "head" => true,
                                "user_id" => $value,
                                "ref_id" => $users[$i - 1][4]
                            ]);
                        }
                        MarathonDist::create([
                            "marathon_id" => $marathon->id,
                            "team" => ($marDist->team ?? $count),
                            "position" => null,
                            "user_id" =>  $value,
                            "ref_id" => $users[$i - 1][4]
                        ]);
                        $counted = true;
                    }
                    if ($key + 1 > 0) {
                        if ($counted) $count++;
                        $donant1 = $users[$i][(($key + 1) * 2) - 1] ?? null;
                        $donant2 = $users[$i][(($key + 1) * 2)] ?? null;
                        $dist[$count] = [
                            [
                                "reveiver_id" => $value,
                                "donant_id" => $donant1,
                            ],
                            [
                                "reveiver_id" => $value,
                                "donant_id" => $donant2,
                            ]
                        ];
                        //Guardar posiciones aleatorias
                        $marDist1 = MarathonDist::where("user_id", $value)->where("head", true)->first();
                        if (is_null($marDist1)) {
                            MarathonDist::create([
                                "marathon_id" => $marathon->id,
                                "team" => $count,
                                "position" => ((($i - 1) * 10) + ($key + 1)),
                                "user_id" => $value,
                                "head" => true
                            ]);
                        }
                        if (!is_null($donant1)) {
                            MarathonDist::create([
                                "marathon_id" => $marathon->id,
                                "team" => ($marDist1->team ??  $count),
                                "user_id" => $donant1,
                                "ref_id" => $value
                            ]);
                        }
                        if (!is_null($donant2)) {
                            MarathonDist::create([
                                "marathon_id" => $marathon->id,
                                "team" => ($marDist1->team ??  $count),
                                "user_id" => $donant2,
                                "ref_id" => $value
                            ]);
                        }
                    }
                    $count++;
                }
            }
        }
        return $dist;
    }