Script Perl, basé sur PHP

Daddy98

Membre actif
22 Juin 2009
140
5
Melun
www.trackmymac.fr
Bonjour,

J'ai transformé mon mac en super calculateur, je ne sais pas si vou connaissez cette suite :

1. 1
2. 11
3. 21
4. 1211
5. 111221
6. 312211
7. [...]


En gros, il suffit de lire la ligne précédente, pour générer la suivante.
Jusque a maintenant, j'utilisais PHP pour effectuer le calcul. Mais PHP devient vite lent (ce qui est normal, vu que c'est pas fais pour)

Quelques statistiques, Mon Mac a généré la 55éme ligne en 15 heures, elle compte près de 13000000 de chiffres. J'ai abandonné la 56 après plus de 24 heures de calcul intensif.

Voici le code PHP (c'est pas très propre...)

Bloc de code:
$tab=file($file);
	$var = $tab[0]; //On obtient la ligne précedente 
		while (strlen($var) > 0){ // tant qu'il reste de chiffre a compter, on continue
			if($var[0] == $var[1]){      // Début de la méthode : Si le premier chifffre est égal eu deuxieme
				if($var[0] == $var[2]){ // Le premier eu troisième
					$subnbr = '3';
					$var2 = $var2 . $subnbr . $var[0]; //On sauvgarde : Le nombre de fois que la lettre est présente + la lettre 
				}
				else
				{
					$subnbr = '2';
					$var2 = $var2 . $subnbr . $var[0];
				}
			}
			else
			{
				$subnbr = '1';
				$var2 = $var2 . $subnbr . $var[0];
			}
			$var = substr($var, $subnbr);
		}
		$var = $var2;
		$var2 = '';
		$line++;
//Et a la fin on sauvegarde dans un fichier .txt

Ce que j'aimerais faire, c'est convertir ce code PHP en Script Perl, pour essayer d'aller plus loin.

Merci pour votre aide,

Si quelqu'un peut m'aider... :up:
 
  • J’aime
Réactions: p4bl0
Bloc de code:
#include <stdio.h>
#include <string.h>

#define BUFSIZE_ 512

int
main (int argc, char *argv[])
{
  char current, buf[BUFSIZE_];
  int count, i;
  size_t l;

  current = fgetc(stdin);
  count = 1;
  while (fgets(buf, BUFSIZE_, stdin) != NULL) {
    l = strlen(buf);
    for (i = 0; i < l; ++i) {
      if (buf[i] == current) ++count;
      else {
        printf("%d%c", count, current);
        current = buf[i];
        count = 1;
      }
    }
  }
  printf("\n");
  
  return 0;
}
$ gcc werberseq.c -o werberseq

ça lit sur l'entrée standard une ligne et ça affiche sur la sortie standard la suivante. j'ai préféré faire comme ça pour ne pas avoir à gérer en mémoire les 13000000 caractère dont tu parles.
Mais même comme ça avec un peu de bash autour, (
Bloc de code:
$ l=11; for (( i = 0 ; i < 56 ; i++ )); do l=$(echo $l | werberseq); done; echo $l > WERBER56.txt
), ça prend environ une minute pour calculer la 56ème ligne mais je peux pas te la mettre ici c'est trop long :D


EDIT: je viens de jetter un oeil à ton PHP, IMO y a déjà moyen d'améliorer beaucoup la vitesse du code en le faisant plus à la façon dont je l'ai fait là que comme tu l'as fait.
 
La partie en shell t'évite de trop te compliquer la vie à gérer la mémoire sur les chaînes très longues de tailles variables, mais du coup je me demande si t'y perds pas un peu en perfs, ça te fait recopier des longues chaînes avec un langage interprété&#8230; À mon avis c'est loin d'être négligeable, ça me parait bizarre qu'on n'arrive pas plus loin que ça en c.
 
le php n'est pas propre quand c'est ecrit par un sale si tu scanf comme en C et recupere une valeur numerique... ici c'est pas un probleme de lang, c'est toi le probleme, il est aussi bon a rappeler qu'il existe des operateurs logique (ca vous ferait rien de travailler avec le mask de l'integer au lieu de laisser des copies stupides trainer par si par la...)... dans tous les languages..., c'est pas parce que un language est non fortement typé qu il faut s'epandre comme un gros pig il n'y a aucune justification ici a part celle de l'imbecilité, car on sentira la perf, + toute integer en php est unsigned...

tous les exemples donnes sont vilains, a vos meninges

ça me parait bizarre qu'on n'arrive pas plus loin que ça en c.

bien sur... jusqu'a neanmoins la capacite physique du hardware

si ici http://code.google.com/p/foundation-kit/source/browse/trunk/FKUUID.php
je m'amusais a empreinter le style de Monsieur en php on ne serait pas sortie de l'auberge
 
Bonjour, et merci a vous deux !

Petite parenthèse :

@tatouille : Je me fous complètement de la façon dont tu programme ! Si c'est pour tenir ce genre de propos dans touts les sujets, tu peut t'en aller et retourner sur des forum anglophone ou on te comprendra !!
Si vous entendez par 'copies stupides trainer...' mes cours que je ferais bien de relire et bien vous êtes un peu a coté de la plaque car je ne prend pas de cours !! J'ai tout appris en lisant des codes sources, Touts les scripts que je confectionne marche et sa me suffit ! Maintenant laissez nous travailler, Merci !


Fin de la parenthèse.

P4bl0, merci d'avoir fais ce script, mais j'ai quelques questions vue que je n'ai jamais utilisé autre chose comme langage que le PHP.

J'ai imaginé la démarche suivante :

- J'ai crée un nouveau fichier nommé werberseq.c dans le répertoire Maison;
- J'ai ensuite executer la commande 'GCC' dans le Terminal;
- Il ma créer un petit fichier 'werberseq' défini comme fichier 'UNIX';

Première question : ou dois-je mettre ce fichier ?
Car si j'ai bien compris : Tu a créer une nouvelle commande pour le Terminal,
Et le 'un peu de bash autour' fait appel a cette commande.

- Ne sachant pas quoi faire, j'ai quand même teste la ligne 'Bash' et elle me dit, sans grande surprise :
Bloc de code:
Last login: Tue Sep  1 20:14:09 on console

daddy98-2:~ Daddy98$ l=11; for (( i = 0 ; i < 56 ; i++ )); do l=$(echo $l | werberseq); done; echo $l > WERBER56.txt

-bash: werberseq: command not found
-bash: echo: write error: Broken pipe
-bash: werberseq: command not found
-bash: werberseq: command not found
-bash: echo: write error: Broken pipe
-bash: werberseq: command not found
-bash: werberseq: command not found

daddy98-2:~ Daddy98$

56 message d'erreurs, et un fichier nommé WERBER56.txt a été créer.

Si j'ai bien compris, le script ne fera que la 56 ligne (et toutes les précédentes) et stockera la 56 eme ?

Merci pour vos réponses futures !

Daddy
 
T'aurais pas oublié ce détail ? ;)
$ gcc werberseq.c -o werberseq

werberseq, que ton terminal ne trouve pas, c'est le programme en c qu'il fallait déjà compiler (à l'aide de la commande ci-dessus), puis placer dans le répertoire dans lequel tu te trouves. Sinon ton interprétation de ce que fait le programme semble juste. ;)
 
T'aurais pas oublié ce détail ? ;)
$ gcc werberseq.c -o werberseq

werberseq, que ton terminal ne trouve pas, c'est le programme en c qu'il fallait déjà compiler (à l'aide de la commande ci-dessus), puis placer dans le répertoire dans lequel tu te trouves. Sinon ton interprétation de ce que fait le programme semble juste. ;)
Nope son problème c'est que . est pas dans son $PATH je pense. @Daddy98 remplace chaque werberseq par ./werberseq


@grumff évidemment qu'on peut aller plus loin que ça en C et qu'on perd en perf en passant par du Bash autour, mais j'avais pas l'envie de me faire chier à gérer ça, ça me semble déjà coule d'avoir écrit le code pour lui (même si je l'ai fait pour m'amuser avant tout).

@Daddy98: ne crache pas sur ce que te dit tatouille parce que 1 il a raison (je l'ai déjà dis de manière plus polie dans mon "edit" de mon post), 2 ça te ferai un bon exo d'optimiser ton truc en php parce que tu t'y prends assez mal.
Déjà sur l'algorithme il y a moyen de faire bien mieux mais en plus au niveau de la gestion du fichier j'ai l'impression que tu réécris tout à chaque fois vu que la dernière ligne calculé est la première ligne du fichier : tu perds un temps fou ici. Et de relire le fichier en entier à chaque fois est inutile tu perds encore du temps là.

Et ne prends pas tout ça mal, parce que même si c'est pour te dire des trucs pas méga sympa, on prend le temps de te répondre et le but c'est de t'aider. Sinon on pourrai aussi passer sur la discussion et juste penser ce qu'on te dit dans notre tête, mais ça t'aiderai encore moins (ou alors dis moi comment tu lis dans la tête des gens ça m'intéresse sérieux :p).


:)
 
Bonjour,

je ne crache pas sur tatouille, je dit juste qu'il aurais pu ne pas utiliser ces propos :
ecrit par un sale,
c'est toi le probleme
copies stupides
comme un gros pig
celle de l'imbecilité,
le style de Monsieur

Après ce qu'il dit est correct, je n'ai jamais pris de cours, je fonctionne sur des tuto basique proposé sur internet et sur les dire de mon frère, mon script est bon mais pas optimisé, car tout simplement je ne peut pas ! Je n'ai pas les connaissance nécessaires, mais j'apprend !

Pour le bash, n'est-il pas possible de charger la précédente ligne d'un fichier texte ?

Au moins les dix premiers caractère de la ligne '55' sont les même que la ligne 52 en php, et la ligne 55 fait 3 200 000 chiffre alors que la ligne 52 (php) fais 1 500 000 chiffre.
Lequel fait une erreur ?

Merci,
 
Bonjour

Attention, le code donné dans le premier post n'est pas équivalent à celui donné par p4bl0. En effet, le premier génère des chaînes constituées uniquement des caractères '1', '2' et '3'.

Par exemple "11111112222" doit donner "3131113212" et non pas "7142".



Pour répondre à la question, j'obtiens 3369156 chiffres à la ligne 55 et 4391702 chiffres à la ligne 56.

Par ailleurs, au bout de 30" de calcul sur mon petit Mac Mini G4 à 1,25GHz, j'obtiens 234241786 chiffres à la ligne 71, et au bout d'une minute et demie j'obtiens 518891358 chiffres à la ligne 74.
 
Bonjour

Attention, le code donné dans le premier post n'est pas équivalent à celui donné par p4bl0. En effet, le premier génère des chaînes constituées uniquement des caractères '1', '2' et '3'.

Par exemple "11111112222" doit donner "3131113212" et non pas "7142".



Pour répondre à la question, j'obtiens 3369156 chiffres à la ligne 55 et 4391702 chiffres à la ligne 56.

Par ailleurs, au bout de 30" de calcul sur mon petit Mac Mini G4 à 1,25GHz, j'obtiens 234241786 chiffres à la ligne 71, et au bout d'une minute et demie j'obtiens 518891358 chiffres à la ligne 74.
Ouaipe mon code il compte juste mais normalement si on part de la ligne "1" il n'y aura jamais plus de 3 chiffre pareil d'affilé donc ça ne devrait rien changer.

Mais sinon ouais avec mon code si on part de "maaaaacgg" la ligne suivante sera "1m5a1c2g", mais ça empêche pas de l'utiliser pour la suite de Werber :).


@Daddy98 ah ouais mais ça faut t'habituer, c'est tatouille :D

pour tes autres question oui c'est possible de charger depuis un fichier texte, regarde la commande cat, mais à ce moment là vaut mieux gérer ça en C si tu veux mettre ça dans un fichier.
 
Je croyais que c'était la suite de Conway.
Ah, ben sûrement, je l'appel suite de Werber non pas parce que c'est le nom que je pense qu'elle porte mais parce que je n'en ai entendu parler que par son "encyclopédie du savoir relatif et absolue" (le vrai bouquin, pas celui des Fourmis) et chaque fois que j'ai vu la suite, la source était ce bouquin là.


Merci pour le lien :)

EDIT: Han! mais c'est le même Conway que Le Jeu de le Vie etc?! La claaasse ^^