Misez p'tit Optimisez en version APL
Modérateur : Politburo
Re: Misez p'tit Optimisez en version APL
Dans le livre "Modèles et algorithmes Markoviens", Bernard Ycart écrit "La construction des générateurs pseudo-aléatoires, ou comment coder efficacement une fonction Random. C'est un pb que nous considérons arbitrairement comme résolu par Margasalia et Zaman bien qu'une littérature importante continue à se développer sur la question".
Sinon, oui, en ayant les résultats de simulations on peut effectuer des tests pour savoir s'il est acceptable de les comparer à une distribution théorique.
Misez rikiki, optimisez : le PGCD
Comme en APL il y a déjà la fonction PGCDEntrée : deux entiers naturels en mémoire ou sur la pile. On a le droit de les écraser.
Sortie : le PGCD !
Code : Tout sélectionner
208 ∨ 351
13
Version 1 : Je n'arrive à trouver qu'une version utilisant modulo mais l'idée des affectations successives est bien là :C.Ret a écrit :
J'ai aussi une question, est-ce que le code suivant est valide sur une CASIO :
Lbl 1:
A-BInt(A/B->A)->B:
B!=0=>Goto 1:
A
Réponse : non.
Ce genre de chose n'est possible que sur un langage à ma connaissance et c'est l'APL.
Code : Tout sélectionner
[0] A PGCD B
[1] → (B← (A← B) | A) / 1 ⍝ On boucle sur la ligne tant que B n'est pas nul
[2] A
351 PGCD 208
13
Code : Tout sélectionner
B A
208 351
143 208
65 143
13 65
0 13
Code : Tout sélectionner
A PGCD B
→⍳×B← (A← B) | A ⍝ On aura ⍳1 =1 si B est >0 et ⍳0 = vecteur vide quand B = 0, on passe alors à la ligne suivante
A
Code : Tout sélectionner
PGCD← {⍵ = 0:⍺ ⋄ ⍵ PGCD ⍵|⍺}
351 PGCD 208
13
Code : Tout sélectionner
div← {(0 = (⍳⍵) | ⍵) / ⍳⍵} ⍝ On filtre les entiers 1,2... N en ne gardant que les diviseurs de N
div 208
1 2 4 8 13 16 26 52 104 208 ⍝ Diviseurs de 208
Code : Tout sélectionner
div← {∪ ⍵ ∨ ⍳⍵}
div 351
1 3 9 13 27 39 117 351
div← ∪ ⊢ ∨ ⍳ ⍝ Ou même cette version...
div 351
1 3 9 13 27 39 117 351
Code : Tout sélectionner
(div 208) ∩ div 351
1 13
Code : Tout sélectionner
pgcd← {⌈/ (div ⍺) ∩ div ⍵}
208 pgcd 351
13
Ordinateur central Burroughs B5500 et notations simplifiées
Vous pouvez voir d'autres très belles photos ici : http://www.retrocomputingtasmania.com/h ... 00_gallery
En savoir plus sur la société Burroughs : https://fr.wikipedia.org/wiki/Burroughs_Corporation
Les notations symboliques d'Iverson ont été traduites pour être compatibles avec les claviers classiques des terminaux :
Toute la table page 9 de ce document : https://dada.cs.washington.edu/research ... -09-04.PDF
Et comme nous sommes dans la rubrique "Emulateurs", il en existe un : https://retro-b5500.blogspot.com/
-
- Fonctionne à 2400 bauds
- Messages : 2143
- Enregistré le : 30 août 2011 12:23
- Localisation : Vous êtes ici -> .
Re: Misez p'tit Optimisez en version APL
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Micro-ordinateur TRS-80 et l'APL80
Photo Wikipédia :
Ils sont programmables nativement en BASIC mais il existait également au moins 3 adaptations d'APL (disons un sous-ensemble des fonctionnalités) pour ces machines : APL-80 par Softside Inc, APL-80 (même nom !) pour le TRS-80 Model III par Phelps Gates (vers 1982-1983) et APL*PLUS/80 par STSC.
Publicité de STSC https://archive.org/details/80-microcom ... page/n153/
Photos du floppy disk et de la carte de référence du APL*PLUS/80 de STSC en bas de cette page : https://www.dyalog.com/50-years-of-apl/ ... allery.htm
Bien sûr il a fallu adapter les positions des symboles APL pour un clavier classique, voici ceux choisis par Phelps Gates :
Et redéfinir les codes :
Le manuel complet ici : https://archive.org/details/APL80_19xx_ ... es-Ramware
Il est possible de tester ce programme en ligne sur l'émulateur de Peter Phillips : https://willus.com/trs80/?-a+-10+-p+518+q=Apl
Et si vous avez un émulateur local, vous trouverez le fichier APL-80 v3.0 (518) ici : https://willus.com/trs80/?q=Apl
Les exemples sont :
Code : Tout sélectionner
1 2 3 +.× 4 5 6 ⍝ Produit interne 1*4 + 2*5 + 3*6. On tape "x" minuscule pour "×"
32
!10 ⍝ 10*9*...*2*1
3628800
?2 2 ⍴ 6 ⍝ Matrice de nb aléatoires. "p" minuscule pour "⍴"
3 1
5 3
2 ⊥ 1 1 0 1 ⍝ Conversion du nombre binaire 1101 en base 10. "b" minuscule pour "⊥"
13
∇ IMP N ⍝ Définition d'une fonction
[1] 1 + 2×⍳N
[2] ∇
IMP 10
3 5 7 9 11 13 15 17 19 21
- Marge
- Fonctionne à 14400 bauds
- Messages : 6186
- Enregistré le : 01 oct. 2008 14:39
- Localisation : En bas, tout au fond à gauche.
Re: Misez p'tit Optimisez en version APL
Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67__: A L I E N .
♣ ♦ « Boris », c'était juste Maurice enrhumé. ♥ ♠
Re: Misez p'tit Optimisez en version APL
IBM 5110 - Très bon émulateur en ligne
Description Wikipédia de la machine :
En savoir plus : https://fr.wikipedia.org/wiki/IBM_5100_et_5110L'IBM 5100, lancé en 1975 - donc deux ans avant l'Apple II - est le premier ordinateur personnel commercialisé par IBM. Transportable, il était muni d'un écran texte monochrome cathodique de très petite taille (diagonale de 5 pouces)
Photo d'origine : https://www.facebook.com/31411232194892 ... =3&theater
Une vraie machine était en vente 8000 $ il y a quelques temps sur ebay... d'où ma suggestion :
Utilisation de l'émulateur de Norbert Kehrer : http://members.aon.at/nkehrer/ibm_5110/emu5110.html
- Cliquez sur APL puis RESTART pour passer du BASIC à l'APL
- Vous pouvez en partie utiliser votre clavier physique (par exemple SHIFT+Q donnera le "?", SHIFT+R le "⍴" etc.)
Là où ça devient (assez) génial, c'est pour obtenir des symboles composéscomme ⍋⍒⌹⌽!⍟ :
- Tapez A puis Backspace pour avoir la flèche d'affectation et tapez quelques nombres : A←5 8 1 3 17 6
- Pour obtenir ⍋ vous faites : SHIFT+M pour afficher "|" ensuite flèche vers la gauche pour revenir sur le caractère et SHIFT+H pour ajouter le triangle par-dessus !!
- Même technique avec SHIFT+K et le point pour avoir "!". SHIFT+M avec SHIFT+O donnent le ⌽
Le code
Code : Tout sélectionner
26 9 ⌹ 2 2 ⍴ 3 5 1 2
7 1
Pour terminer, exemples de 2 programmes, le premier très simple affiche les N premiers nombres impairs
Et le second était un exercice du concours APL organisé par DYALOG : https://www.dyalog.com/student-competit ... viousYears
Il fallait créer une fonction qui rassemble en début du vecteur le nombre mis à gauche, par exemple 3 MOVE 5 3 1 6 3 3 2 2 9 doit amener tous les 3 au début et garder les autres dans le même ordre, ce qui donne 3 3 3 5 1 6 2 2 9
On peut par exemple créer un vecteur logique avec les éléments du vecteur V qui sont différents du nombre N : ~R←V=N
On ne garde que ceux-là pour la fin : (~R←V=N) / V
Et au début on met autant de fois N qu'il y a de 1 dans R (d'où la somme +/)
J'imagine le candidat arrivant au concours avec son IBM 5110 sous le bras !
Une vidéo promotionnelle : https://youtu.be/6LUYDWYGUS0
L'IBM 5100 en fonctionnement (sans APL), juste pour le bruit : https://youtu.be/dBrwuRweBR0
Manuel APL de l'IBM 5110 : http://www.mirrorservice.org/sites/www. ... ec1977.pdf
- gege
- Fonctionne à 14400 bauds
- Messages : 7147
- Enregistré le : 31 janv. 2008 14:24
- Localisation : Banlieue Paârisienne
- Contact :
Re: Misez p'tit Optimisez en version APL
Machine légendaire que le 5100 !!
(rien à voir avec ces bouses de PC... )
J'ai un 5120, son petit(*) frère, mais malheureusement avec seulement le Basic... snif
Faut que je fabrique un APL sur pocket...
Sympa ta rubrique nostalgie / machines sur ce fil (aussi) !
G.E.
(*) petit ouais, il est bien plus gros et lourd : 45 kg !!!
Prêt pour les vacances...
Pour ma part, j'ai adapté le code HTML de l'émulateur de l'IBM 5110 pour que ce soit plus lisible sur une tablette, ça rend pas mal !
Je découvre aussi qu'en ajoutant des TΔ ou des SΔ on pouvait aussi suivre pas à pas le déroulement des programmes ! On se demande ce qu'on a inventé de plus depuis 50 ans
Version 1.0 pour mobile de l'émulateur IBM 5110
Rien de très compliqué si vous voulez tenter l'expérience :
- Dessin du clavier fait dans PowerPoint et export en image
- J'utilise (comme l'original) une carte pour définir les actions sur les touches, comme c'est pénible à faire, quelques formules Excel pour générer automatiquement les codes HTML donnant les coordonnées des touches en fonction de la ligne et de la colonne.
- Il ne reste plus qu'à remplacer les nouvelles coordonnées dans le code HTML d'origine
- Comme je me fiche du BASIC , j'ai ajouté set_language(1); juste avant le run(); dans le fichier JavaScript, de sorte que maintenant c'est APL qui se lance au démarrage
Code : Tout sélectionner
set_language(1);
run();
Bien entendu l'ensemble (1 page web + 1 fichier JavaScript) fonctionne hors-ligne. Après, l'idéal serait de rentre tout ça "Responsive web design" mais bon ça peut être suffisant quand on se casse les pieds dans une salle d'attente !
Émulateur IBM 5110 : Vidéo spéciale pour forum Silicium
Finalement j'ai réussi à refaire une version simplifiée des graphiques de @C.Ret et je vous propose une petite vidéo (elle fait moins de 2 minutes, accélérée à 125%) qui est intéressante pour voir comment les caractères pouvaient se superposer pour obtenir par exemple ⍟ ou ⌹.
Je vous mets le code qui est tapé automatiquement (avec un petit script JavaScript ) et qui sera lancé avec les nombres 27, 16 et 837799 :
Code : Tout sélectionner
S←SYR N
S←N
S←S,N←(0 1+0.5 3×N)[1+2|N]
→(N>1)/2
S←DEC V
T←⌈1⌈(⍴V)÷14
N←⌈(⍴V)÷T
S←0⍴1
V←V,N⍴0
LOOP:→(0>N←N-1)/0
S←S,⌈/T↑V
V←T↓V
→LOOP
PLTS N;S;V;M
N←DEC SYR N
S←2×(⌊60×(M←⌈/N)⍟N)∘.=V←0,⍳60
S←S+1+(N÷M÷60)∘.≥V
' ⎕∘⌹⌹'[S]
Re: Misez p'tit Optimisez en version APL
Code : Tout sélectionner
∇BONBONS B;T
[1] T←0 ⍝ Compteur de tour
[2] →(∧/B=B[1])/6 ⍝ Si tous les termes de B sont égaux au premier terme, aller en [6]
[3] B←(¯1⌽B)+B←⌈B÷2 ⍝ Division des bonbons par 2 avec valeur plafond puis somme avec sa rotation vers la droite
[4] T←1+T ⍝ Compteur + 1
[5] →2 ⍝ Retourner en [2]
[6] ⎕←T,B[1]∇ ⍝ Afficher les résultats
Code : Tout sélectionner
BONBONS 1 2 3 4 5
1 1 2 2 3 ⍝ Division du nombre de bonbons avec valeur plafond ⌈B÷2
3 1 1 2 2 ⍝ Rotation à droite ¯1⌽B du vecteur précédent
4 2 3 4 5 ⍝ Somme des 2 vecteurs
2 1 2 2 3 ⍝ On recommence ⌈B÷2
3 2 1 2 2 ⍝ Rotation à droite
5 3 3 4 5 ⍝ Somme des 2 vecteurs
...
3 3 3 2 3
3 3 3 3 2
6 6 6 5 5
3 3 3 3 3
3 3 3 3 3
6 6 6 6 6
6 6 ⍝ Résultat final
Exemple avec 5 enfants : le premier a 1 bonbon, le 2e 2 bonbons... Au bout de 6 échanges, ils auront chacun 6 bonbons.
Exemple avec 100 enfants : le premier a 10 bonbons et les autres aucun. Au bout de 104 échanges, ils auront chacun 6 bonbons (et les mains collantes)
Quelques idées pour tester si tous les éléments d'un vecteur sont identiques :
Code : Tout sélectionner
B ← 6 6 6 6 6 ⍝ Notre vecteur pour les tests
(⌈/B) = ⌊/B ⍝ Le plus grand élément est égal au plus petit
1
∧/ B = B[1] ⍝ Tous les termes sont égaux au premier (Càd B[1]==B[1] ET B[2]==B[1] ET...)
1
(⍋B) ≡ ⍒B ⍝ Les rangs des tris par ordre croissant ou décroissant sont identiques = 1 2 3 4 5 6
1
1 = ⍴∪B ⍝ L'ensemble B n'a qu'un seul élément
1
Re: Misez p'tit Optimisez en version APL
Pour résumer, il s'agit de trouver l'union et l'intersection de 2 nombres représentant des ensembles de chiffres. Zéro symbolisera l'ensemble vide. Exemples :
Code : Tout sélectionner
1232112 UNION 44551
12345
1232112 INTER 44551
1
Code : Tout sélectionner
∪ '122221132221'
123
∪ 2 3 4 2 3
2 3 4
'32123' ∩ '45261'
212 ⍝ Avec répétitions
Code : Tout sélectionner
n ← '4544682'
n⍳n ⍝ '4' est trouvé à la position 1 dans n, le '5' trouvé à la position 2, les deux '4' à la position 1 etc
1 2 1 1 5 6 7
⍳⍴n ⍝ Entiers de 1 jusqu'à la taille de n
1 2 3 4 5 6 7
(n⍳n) = ⍳⍴n ⍝ On repère les éléments de façon unique
1 1 0 0 1 1 1
((n⍳n) = ⍳⍴n) / n ⍝ Et il ne reste plus qu'à faire une sélection (filtrer)
45682
Code : Tout sélectionner
UNION ← {∪⊃,/⍕¨⍺⍵}
1232112 UNION 44551
12345
1232112 UNION 0
1230
Code : Tout sélectionner
123 {,/⍕¨⍺⍵} 456
┌──────┐
│123456│
└──────┘
Voici une suggestion pour gérer l'ensemble vide :
Code : Tout sélectionner
UNION ← {⍎'0', ('0' ≠ a) / a ← ∪⊃,/⍕¨⍺⍵}
Et pour l'intersection :
Code : Tout sélectionner
INTER ← {0 UNION (⍕⍺) ∩ ⍕⍵}