Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Exercices] Venez vous entraîner !

Ce mois: Parseur de fonctions mathématiques

Anonyme
20 juin 2011 à 14:18:52

Euh... ben rien qu'à voir les exemples, oui... Mais sinon, correction complète postée dans trois jours, MPez moi vos codes !
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 14:42:13

20/06 14:41
Niveau 1 terminé :)
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 16:04:43

Mon journal de bord :
20/06 16:04:30
Début de la lecture du sujet.

20/06 16:27:50
Pause. Plus qu'à tester niveau 1.

20/06 16:46:35
Fin de la pause. Goûter, petit frère, tout ça.

20/06 16:48:40
Test du programme wikipédia hello world #1. Segfault.

20/06 16:51:00
Gros fail. Forcément que ça segfault, je n'ai pas encore implémenté les chaînes de caractères ... Je me fais un petit programme perso, du coup.

20/06 16:57:43
J'avais un bug, fixé. J'utilisais pop(s) - pop(s) ; sans penser à l'ordre d'évaluation. Apparemment, le deuxième était évalué avant, du coup ça faisait un fail.
Maintenant, ">12-.@" renvoie bien "-1" sur la sortie. (oui, j'ai bien pensé à gérer le haut-bas, le vrai programme est en fait plus compliqué, c'est pour l'explication que je mets ça).
Programme testé :
>         1    v|
v     2        <|
-               |
> .  @    ....  |

Opérateurs fonctionnels :
<>^v
,.
+-*/%
0123456789

+ gestion de la sortie de l'espace défini (programe ">" qui ferait tout planter), gestion de l'absence de flèche en haut à gauche, mais pas de gestion des caractères inconnus : Ich love commentaires.

20/06 17:03:15
Lecture du niveau 2

20/06 17:09:15
Les chaînes de caractères sont gérées. Lecture de la suite du niveau 2.
Programme testé :
>              v
v  ,,,,,"Hello"<
>48*,          v
v,,,,,,"World!"<
>25*,@


20/06 17:12:27
Ajout de $ : \
Programme testé :
>12..12\\..@

Renvoie bien 2112.
Lecture de ce que sont les trampolines.

20/06 17:14:10
Ajout du trampoline.
Pas encore de lecture depuis un fichier.
Lecture du niveau 3.

20/06 17:19:19
Ajout de l'aléatoire.
Programme testé : programme de nombres aléatoires wikipédien.

20/06 17:20:10
Passage en mode balisé-secret du journal de bord.

20/06 17:22:10
Ajout d'une sécurité en cas de programme dont toutes les lignes n'ont pas la même taille.

20/06 17:28:57
Ajout de la gestion des fichiers.
Lecture du niveau 4.

20/06 17:30:04
J'ai déjà géré la taille de carte variable (thx vector<string>). De même pour sortie de carte et pile vide.
Il manque quelques opérateurs dans la liste de ceux à faire : _ | [...]. Je les fais tout de suite.

20/06 17:34:14
J'ai implémenté ! ` _ et |.
Maintenant, les & ~ ; puis les p g.

20/06 17:37:13
J'ai implémenté & et ~.
Maintenant, put et get.

20/06 17:41:17
Niveau 4 terminé ! (sauf la boucle infinie, mais c'est presque impossible ; et comme de toutes façons certaines fois une boucle infinie est intéressante, je ne le ferai pas)

Résumé du journal de bord :
20/06 16:04:30 : Lecture du sujet
20/06 17:03:15 : Niveau 1 terminé
20/06 17:14:10 : Niveau 2 terminé
20/06 17:28:57 : Niveau 3 terminé
20/06 17:41:17 : Exercice terminé !
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 17:22:57

20/06 17:22
Niveau 2 terminé !

20/06 17:42
Niveau 3 terminé !
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 17:47:14

ça va vous vous amuser ^^ aller maintenant faut allez faire le compilateur (ben quoi tout le monde est partie ? )
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 17:59:27

Je suis en train de tester avec les exemples sur cette page : http://www.esolangs.org/wiki/Befunge

Actuellement, tous les programmes fonctionnent, sauf l'équivalent de cat : en respectant cet exercice, il semblerait qu'il manque la boucle. Ou bien befunge demande normalement d'enrouler le monde (quand on dépasse à droite, on revient à gauche) ?

Edit : Je les ai tous testé, ils marchent tous. Sauf le cat program.
Du coup, j'ai bel et bien fini l'exercice, quand la solution sera postée je mettrai la mienne (si vous me le rappellez, sinon j'oublierai ^^ ).
Ne reste plus qu'à voir l'au-delà, mais tout ne me tente pas.

Re-Edit : Je vais faire les piles et les téléporteurs. :)

Re-Re-Edit : Les abcdef piles sont faites, maintenant les téléporteurs.

Re-Re-Re-Edit : Les téléporteurs A-Z sont faits ; un programme utile pour vérifier chez vous :
vB
B>2.@
> 1.@
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 18:18:48

Citation : Equinoxe

Ou bien befunge demande normalement d'enrouler le monde (quand on dépasse à droite, on revient à gauche) ?

Je crois que oui d'après le wiki.
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 18:22:07

Ah, merci, j'implémente ça tout de suite (mais ça va m'obliger à imposer une forme rectangulaire ... Tant pis, je gèrerai comme ça. :) )

Edit : Implémenté ; maintenant, on gère tout joliment avec des exceptions - au passage, le programme de cat marche ! :)

Re-Edit : Les exceptions sont implémentées, et même la terrible BefungWtfException (BefungWhatATerribleFailureException - qui me comprendra ?). ^^
La gestion des get/put hors des bornes aussi. Bref, je crois que j'ai tout. Les téléporteurs sans autre téléporteur sont, eux, l'équivalent d'un espace.
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 18:57:16

20/06 18:57
Niveau 4 terminé !
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 19:00:56

Ajout au sujet



Opérateurs [ et ] ; tourner vers la gauche/droite ; selon la documentation de funge-98 : http://catseye.tc/projects/funge98/doc/funge98.html

Opérateur r : faire demi-tour.

Opérateur x : Pop y ; pop x ; se déplacer de x vers la droite et de y vers le bas.

Edit : Nouvel ajout au sujet : l'opérateur j ; qui saute pop() espaces vers l'avant (si j < 0 ; vers l'arrière).
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 21:42:26

ajout au sujet : possibilité d'une quatrième dimension :p !
c'est pas des ânneries, c'est tout à fait possible :-° ... mais j'ai peur que les programmeurs Befunge ne s'y perdent :D
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 21:44:02

ah la quatrième dimension.... mon profs de math nous a passer un film sur toute les dimension y compris la quatrième on été un peu "choqué" ^^
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 21:50:14

En fait je rectifie : je viens de trouver la possibilité d'interpréter (et d'écrire !) le befunge en un nombre infini de dimensions de taille finies (27) sauf la 1 et 2 de taille infinie. Attention les prises de tête !

edit : enfin dans la limite matérielle de votre carte mémoire ^^
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 22:08:09

lol faudra que tu montre ca :p
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2011 à 23:06:31

Et tu mets quoi, comme caractère, pour indiquer d'aller de x vers la droite, y vers le bas, z vers le fond, et [...] à l'infini ? Il risque d'être long ton programme. :D
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 8:06:12

ben c'est pas possible de mettre x1 x2 etc ?
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 9:28:26

Citation : Equinoxe

Et tu mets quoi, comme caractère, pour indiquer d'aller de x vers la droite, y vers le bas, z vers le fond, et [...] à l'infini ? Il risque d'être long ton programme. :D


J'ai mieux : une commande universelle :
O dépile n et descend dans la n ième dimension.
H dépile n et monte dans la n ième dimension.

edit : je vais me lancer, je vous montrerais le résultat ;)

edit 2: à l'attention de tout le monde : c'est pas la peine d'implémenter les variables, elles existent déjà en befunge (utilisez les commandes p et g)
edit 3: par exemple pour faire les puissances :
>&&v
v  <
>\:05p\#v:# _$$1.@
      > >1-:#v_$.@
      ^\*g50\<
x
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
21 juin 2011 à 13:14:07

Perso, niveau 4 fini, les variables sont ajoutées, les piles c'est en cours... (j'ai pas pu programmer hier soir)
C'est vrai que les variables sont "inutiles", mais ça permet quand même d'avoir une certaine facilité des codage... c'est plus simple de faire 'z' pour dépiler la seconde troisième opérande que de se creuser la tête pour savoir quel est l'ordre dans lequel ma pile va remplir les variables, pour finalement trouver qu'il faut faire '\:\\$\', surtout si on veut pouvoir le prendre dans plusieurs sens...
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 14:05:14

PITETRE > Non, puisqu'une commande ne peut être que d'un caractère en Befunge. Exemple : x1, c'est x puis empiler 1, ou bien x1 ?

germino > Sauf que là, ce que tu fait, c'est simplement un befunge en 3D. "monter dans la N-ième dimension" le prouve. Tu as en fait une infinité de plans superposés, ce qui équivaut finalement à un espace 3D. Et, ça, il y a moyen de le faire avec un espace de dimensions potentiellement infini.

Sinon, pour tous, j'ai un souci sur p et g. En effet, je n'autorise pour le moment à les placer que dans l'espace défini par le fichier. C'est relativement une sécurité, car sinon un simple programme comme :
>9999999999999999***************v        ; Ici, on a 9 ^ 16
v                               < -*2  < ; Et on reprend au negatif
> : 4 p                                ^ ; On duplique

ferait probablement planter par manque de mémoire ; car on demanderait d'aggrandir trop le programme. Qu'avez-vos comme idée pour résoudre ceci ?

Par ailleurs, germino, tu commets une imprécision sur le 'p' | 'g' qui servirait de variable : elles stockent directement dans le programme, donc risque de modifier un caractère important du programme, et de détériorer son fonctionnement.

Autre ajout au sujet



Enfin, je propose une autre fonctionnalité (que cette fois-ci je ne ferai pas, j'ai fermé le fichier source de l'interpréteur et je n'y toucherai probablement plus) : les fonctions. Explication :
120"sulp"!.@
;plus
+@

Le code va mettre 1 et 2 sur la stack, puis 0"sulp". Ensuite, l'opérateur ! va dépiler la stack jusqu'à tomber sur 0. Il va donc récupérer "plus".
Ensuite, il va sauter à la fonction "plus" ; indiquée par ";plus". Il ira donc placer le pointeur exactement sur la première case de la ligne en-dessous. Lorsqu'il tombera sur "@" ; ça signifiera que la fonction est terminée, il remettra donc le pointeur sur le "!" ; et continuera à avancer.
Il faut bien évidemment noter que :
- La pile est conservée : ceci permet d'appeler '+' ; donc + va dépiler les deux valeurs déjà empilées
- Un nouveau pointeur d'instrctions est en fait créé, pointant vers la case de départ de la fonction ; ça implique donc une pile de pointeurs.
Ceci permet de conserver les caractéristiques du pointeur (direction, position) tout en autorisant la modification de la pile.

Qu'en pensez-vous ?
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 14:31:05

@Equinoxe :
Une dimension n'a que deux direction : avancer/reculer. Après chaque dimension contient la dimension qui lui est immédiatement inférieure ;) Il ne faut pas essayer de se représenter ces dimensions : tu n'y arriveras tout simplement pas.
Si je fais :
5O5H je suis revenu à ma position de départ.
Si je fais :
5O6H je ne revient absolument pas là où j'étais.
Si je fais :
5O6H6O5H je suis revenu à ma position de départ.
Si je fais :
5O6H5H6O je suis revenu à ma position de départ.

Dis-toi que de cette façon tu n'est pas limité par le nombres de directions différentes possibles. Après c'est vrai que les dimensions supérieures à 3 sont un peu superflues pour programmer un logiciel normal, c'est juste intéressant du point de vue mathématiques.
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 14:46:04

Pour la dimension qui n'a que deux directions, je veux bien.
Mais le souci, c'est qu'il devient impossible de le faire en respectant le funge. En effet, celui-ci implique que les quatre flèches soient implémentées.
Est-ce que, pour qu'on se comprenne bien, tu pourrais me montrer n'importe quel programme de ton langage fait avec tes opérateurs, en au moins 4 dimensions ?
Par ailleurs, les mots induisant que tu ne gères que les 3 dimensions sont "monter" et "descendre", typiques de la 3D.

Bref, si tu me montres *comment* tu ferais un programme qui utilise 4 dimensions, je te l'accorderai - et, au passage, je comprendrai aussi ce que tu signifiais par O et H.

Parce que, si O et H servent bien à faire ce que tu dis, alors 5O6H te fait déjà revenir dans ta position initial ; puisqu'ils changent uniquement le sens dans lequel tu te déplaces.
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 14:57:29

Citation : Hugooguh


Niveau 4 :
Interpréter les appels "put" et "get". Taille de la carte (mère) variable. Gestion des bugs possibles dans la carte-programme (boucle infinie, sortie de carte, pile vide) obligatoire.



Y'a quand même un soucis là...

>Taille de la carte (mère) variable

Sa s'appelle plus du befunge là (et d'ailleusr j'en vois pas l'intérêt).

>sortie de carte
C'est un tore donc bon...

>pile vide
D'un c'est pas de niveau 4 c'est un truc qui doit être gérer dès le début, et de deux c'est un comportement spécifié par la norme donc c'est pas sujet à interprétation.
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 15:12:58

Pour la taille de la carte variable, je pense que ça signifie que la carte doit être allouée dynamiquement, comme le demande le funge-98.
Mais, après, c'est vrai que le sujet est étrange par rapport à la norme (il faut aller chercher pour comprendre que normalement c'est un tore, justement).

J'ai comme l'impression de me fâcher avec tout le monde ces temps-ci ... C'est moi ou ... ?
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 15:19:07

Citation : Equinoxe

Pour la taille de la carte variable, je pense que ça signifie que la carte doit être allouée dynamiquement, comme le demande le funge-98.



Ok j'ai pas lu le 98, je "connais" que celle du 93 c'est pour ça, et j'aimais bien avoir une taille limité à 2000 caractères, ça reste plus dans l'esprit du language mais ça concerne que moi.

Citation : Equinoxe


Mais, après, c'est vrai que le sujet est étrange par rapport à la norme (il faut aller chercher pour comprendre que normalement c'est un tore, justement).



C'est une des premières choses expliquées exagérons pas :p.

Citation


J'ai comme l'impression de me fâcher avec tout le monde ces temps-ci ... C'est moi ou ... ?



Si tu fais allusion à moi alors pas du tout non. (fin, c'est une mauvaise impression de ton côté quoi).
Je voulais juste clarifier quelques points qui me semblaient mal définies, pour ceux qui veulent faire l'exo perdent pas 40 ans à interpréter le truc..
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 15:53:32

En fait, cet exercice c'est un mélange entre le 93 et le 98. :D
Parce que la map de taille dynamique, c'est du 98 ; que la map en tore, c'est du 93 (le 98 demande une sorte de backtracking pour le retour en arrière ... Et c'est censé être implémenteur-friendly ???).

Et, pour ma phrase en tout petit, j'avais l'impression que c'était moi qui aggressais, sans me rendre compte du pourquoi. Bon, si ça va, tant mieux. :)
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 16:04:09

Citation : Equinoxe

Pour la dimension qui n'a que deux directions, je veux bien.
Mais le souci, c'est qu'il devient impossible de le faire en respectant le funge. En effet, celui-ci implique que les quatre flèches soient implémentées.
Est-ce que, pour qu'on se comprenne bien, tu pourrais me montrer n'importe quel programme de ton langage fait avec tes opérateurs, en au moins 4 dimensions ?
Par ailleurs, les mots induisant que tu ne gères que les 3 dimensions sont "monter" et "descendre", typiques de la 3D.

Bref, si tu me montres *comment* tu ferais un programme qui utilise 4 dimensions, je te l'accorderai - et, au passage, je comprendrai aussi ce que tu signifiais par O et H.

Parce que, si O et H servent bien à faire ce que tu dis, alors 5O6H te fait déjà revenir dans ta position initial ; puisqu'ils changent uniquement le sens dans lequel tu te déplaces.


Me suis peut-être un peu mal exprimé :
considérons que chaque dimension D possède 2 directions : aD et bD qui sont des vecteurs de sens opposés
(les termes des opérations ci-dessous sont des vecteurs)
a5 + b5 = 0
a5 + b6 != 0
a5 + b6 + a6 + b5 = 0
a5 + b6 + b5 + a6 = 0

Un exemple de code (les dimensions 3, 4, 5, etc, s'organisent en fichiers):
> 1v>.@
   >5H//cette ligne permet de se déplacer dans la direction H de la 5e dimension

>
  H+2<//cette ligne permet de se déplacer dans la direction H de la 3e dimension

> 
  >5O//cette ligne permet de se déplacer dans la direction O de la 5e dimension

>  3O//cette ligne permet de se déplacer dans la direction O de la 3e dimension
^"?"<


Ce code affiche bien :
?


@Goten : c'est un exercice. A partir du moment où on a géré correctement le langage, on a bien le droit de s'amuser à l'améliorer, non ?
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 17:16:25

D'accord, j'ai compris. Le souci venait des mots "monter" et "descendre".

Maintenant, le souci est simplement l'organisation des fichiers. Que signifient aaa ; aab ; etc ?

Edit : J'ai compris ; en relisant "de taille finie : 27" dans ton premier post.

Mais il y a moyen de faire mieux :
;DIM:3=1;4=1;5=1
> 1v>.@
   >5H  // Les 3=1 // etc indiquent : dim3 : pos = 1 // dim4 : pos = 1 // dim5 : pos = 1
;DIM:3=1;4=1;5=2
>
  H+2
;DIM:3=2;4=1;5=2
> 
  >5O
;DIM:3=2;4=1;5=1
>  3O
^"?"<

Maintenant, le seul souci restant vient du choix des lettres 'O' et 'H' ; qui font conflit avec les téléporteurs. Peut-être utiliser uniquement les téléporteurs de A à F ; ou bien choisir d'autres lettres pour les + ou - de la dimension N ?
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 17:20:56

aaa.bef est le nom du premier fichier exécuté.
on change les lettres selon la dimension dans laquelle on se déplace ;)
  • Partager sur Facebook
  • Partager sur Twitter
21 juin 2011 à 17:24:06

Ah. Tu as répondu pendant que j'éditais. :'(
  • Partager sur Facebook
  • Partager sur Twitter