8768 sujets

Développement web côté serveur, CMS

Bien le bonjour amis codeur Smiley smile

Je bute sur un soucis et j'arrive pas à trouver de solution sur le net pour obtenir ce que je cherche à faire Smiley ohwell
je m'explique je cherche à obtenir une chaine de 65 535 caractère avec
- tout plein de "0"
- 1 "a"
- 2 "b"
- 30 "f"
- 76 "g"
- 127 "k"
- 764 "m"
et tout ça placer aléatoirement dans ma chaine et en étant sur de pas écraser les lettres précédemment incluse.

pourquoi me direz-vous ? Smiley biggrin
mes 65 535 caractère représente un grille de 256x256 dans la quelle je cherche a placer 1000 étoiles selon leur catégorie et leur représentation dans l'univers, cette grille ne représente qu'un "cadran" d'une galaxie qui comprend 242 cadrans (le nombre de cadrans peut changer selon la galaxie)

Alors niveau code voila ce que j'ai pondu c'est sans doute brutal (trop pour le serveur en tout cas Smiley lol )

function etoile() {
	$taille = 256*256;
	$etoile = '';
	for ($e=0;$e<$taille;$e++) {$etoile .= "0";}
	$etoile[rand(0, $taille-1)] = 'a';
	$ok = 0;
	while ($ok < 2) {
		$rand = rand(0, $taille-1);
		if ($etoile[$rand] == '0') {
			$etoile[$rand] = 'b';
			$ok ++;
		}
	}
	$ok = 0;
	while ($ok < 30) {
		$rand = rand(0, $taille-1);
		if ($etoile[$rand] == '0') {
			$etoile[$rand] = 'f';
			$ok ++;
		}
	}
	$ok = 0;
	while ($ok < 76) {
		$rand = rand(0, $taille-1);
		if ($etoile[$rand] == '0') {
			$etoile[$rand] = 'g';
			$ok ++;
		}
	}
	$ok = 0;
	while ($ok < 127) {
		$rand = rand(0, $taille-1);
		if ($etoile[$rand] == '0') {
			$etoile[$rand] = 'k';
			$ok ++;
		}
	}
	$ok = 0;
	while ($ok < 764) {
		$rand = rand(0, $taille-1);
		if ($etoile[$rand] == '0') {
			$etoile[$rand] = 'm';
			$ok ++;
		}
	}
	return $etoile;
}


Il doit y avoir une manière plus simple de le faire mais je vois pas de fonction qui me permettrais ce genre de chose et j'ai franchement pas la motive de placer 242 000 étoiles à la main Smiley sweatdrop

PS : quand j'affiche le résultat dans une page ça passe, ça fait bien ce que je veut mais quand je cherche a rentrer le résultat en BDD ça crashes
Modifié par Exter (11 May 2021 - 08:44)
Bonjour,

Pour la partie BDD, il faudrait voir plus de code pour te donner des pistes, mais pour le code php, j'ai fait ça vite fait :


class Cadran
{
    private $etoiles;

    public function __construct(Int $nbEtoiles)
    {
        $this->etoiles = array_fill(0, $nbEtoiles, 0);
    }

    public function getNbEtoiles(): int
    {
        return sizeof($this->etoiles);
    }

    public function addEtoiles(string $type, int $nb): void
    {
        $ok = 0;
        while ($ok < $nb) {
            $rand = rand(0, $this->getNbEtoiles() - 1);
            if ($this->etoiles[$rand] === 0) {
                $this->etoiles[$rand] = $type;
                $ok++;
            }
        }
    }

    public function getNbEtoilesByType(): array
    {
        return array_count_values($this->etoiles);
    }

    public function __toString()
    {
        return implode('', $this->etoiles);
    }
}


Pour l'utiliser, il suffit de créer un cadran comme ça :

$cadran = new Cadran(256 * 256);

Et de définir tes types d'étoiles et leur nombre :

$cadran->addEtoiles('a', 1);
$cadran->addEtoiles('b', 2);
$cadran->addEtoiles('f', 30);
$cadran->addEtoiles('g', 76);
$cadran->addEtoiles('k', 127);
$cadran->addEtoiles('m', 764);

Tu peux ensuite afficher ton cadran avec un echo :

echo $cadran;

ou l'enregistrer en BDD.
re Smiley smile
Merci, je vois que t'as gardé la partie avec le while c'est ce qui me plaisais pas trop mais apparemment doit pas y avoir d'autre moyen de faire plus propre... en fait ça marche pour la BDD c'était juste moi qu'avais fait une faute de frappe sur un nom de variable du coup ça bouclais à l'infini Smiley sweatdrop

je suis repassé sur le code pour le simplifier

function etoile() {
	$taille = 256*256;
	$type = explode(',','a,b,f,g,k,m');
	$pour1000 = explode(',','1,2,30,76,127,764');

	$etoile = '';
	for ($e=0;$e<$taille;$e++) {$etoile .= "0";}

	for ($e=0;$e<count($type);$e++) {
		$ok = 0;
		while ($ok < $pour1000[$e]) {
			$rand = rand(0, $taille-1);
			if ($etoile[$rand] == '0') {
				$etoile[$rand] = $type[$e];
				$ok ++;
			}
		}
	}
	return $etoile;
}


Ya tellement de partie que je comprends pas dans ton code (ma faute hein Smiley cligne )
mais de ce que je vois mis à part les variables qui sont typées et le fait que se soit programmer orienté objet (enfin je crois Smiley lol ) ça fait sensiblement la même chose ?

maintenant qu'est-ce qui sera le plus rapide niveau traitement des 2 codes ?

PS : désolé si j'ai l'air de pinaillé mais mon cerveau il marche en procédural la POO j'ai trop de mal Smiley confused
Modifié par Exter (11 May 2021 - 13:14)
Oui, si tu est plus à l'aise avec le procédural, il n'y a pas de problème, continue à l'utiliser.
L’intérêt de l'objet se voit surtout quand on a des modifs à faire régulièrement ou quand on commence à avoir beaucoup de code à gérer, dans ce cas, ça devient plus simple de découper en classes et la maintenance et la réutilisation sont facilitées.

Il y a moyen de limiter le nombre de tableaux, en faisant un tableau associatif pour les types, par exemple :

$types = [
        'a' => 1,
        'b' => 2,
        'f' => 30,
        'g' => 76,
        'k' => 127,
        'm' => 764
    ];


On peut aussi supprimer totalement les boucles en utilisant des array_map, array_fill, etc. mais après avoir testé, je ne crois pas que ce soit plus lisible et ça fait à peine gagner 2 lignes.