Misez p'tit Optimisez n°53 : la suite de Syracuse

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par caloubugs »

Schraf a écrit : 16 mars 2020 09:40 Bonjour,

Sur certaines pages de Silicium on m'appelle "le gars" et sur d'autres "le type", vous pouvez aussi m'appeler Eric ou Schraf :D :P :P

Je suis en train de préparer une vidéo sur Syracuse en langage machine pour le ZX81(microprocesseur Z80A) et en discutant sur http://www.silicium.org/forum/viewtopic ... 65&t=45035 d'autres avaient dans l'idée de le programmer pour des processeurs différents. Comme j'avais fait 2 vidéos sur l'Altair 8800 (https://youtu.be/0tIUWQEq0-0 et https://youtu.be/GVICaX8MWIo) je me suis dit qu'il fallait aussi que je le tente pour cette mémorable machine. Bref, ça marche ! Le programme ne donne pour le moment que le temps de vol (et pas l'altitude max) mais bon.
Bonjour Schraf !

Je suis abonné à ta chaine YT (un grand bravo ! Quel travail !) depuis quelques temps et bim, je constate avec joie que tu es aussi ici... Et doublement, car c'est grâce à toi que j'ai découvert les chaînes de Markov... (je suis sur une rédaction d'un article dans la gazette qui y fait référence, référence aux chaînes de Markov mais aussi à ta chaîne YT, ce qui devrait te faire un peu de pub).

Sinon, concernant Syracuse en LM, j'avais bien galéré pour faire quelque chose sur le PC1500 (article dans la gazette n°7) ou j'avais dû jongler avec plusieurs octets pour pouvoir gérer des nombres supérieurs à 2^16. Mais bon, c'était du code d'un néophyte en la matière, il y a sûrement plus efficace et quand je vois ton code à 58 octets... J'avais aussi été confronté à la conversion décimal vers binaire entre le basic et le LM (que je n'avais pas résolu d'ailleurs).

Et quand je vois où nous mène cette simple conjecture...
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Bonjour tout le monde !

Ca faisait un bout de temps que je n'étais pas repassé ici, je vois que @C.Ret a fait de super programmes sur HP-28S et Ti92 ! 8O

Merci @caloubugs ton message est sympa, la gazette est prévue pour quand ?

Bon, comme j'étais plongé dans l'APL depuis quelques semaines (ça a du bon le confinement :mrgreen: ), je vous livre une version (piquée sur un site) de la suite de Syracuse dans ce langage :

Code : Tout sélectionner

SYR← {1=⍵:0 ⋄ 1+∇⊃⍵⌽0 1+0.5 3×⍵}

Code : Tout sélectionner

SYR 27
111
Explications du code
  • Si 1=⍵ renvoyer 0
  • Sinon faire 1+ SYR(prochain_nombre) (∇ pour l'appel récursif avec comme paramètre tout ce qui est droite)
  • Calcul du prochain nombre : 0.5 3×⍵ donne la liste [0.5⍵ , 3⍵], on y ajoute la liste [0 ,1] ce qui fait [0.5⍵, 3⍵+1]
  • Ensuite l'astuce est de faire tourner ⍵⌽ cette liste ⍵ fois, donc si ⍵ est pair la liste ne bouge pas sinon le 3⍵+1 se retrouve en 1ere position
  • On prend le premier élément ⊃ de la liste
  • Conclusion, si ⍵ est pair on récupère bien 0.5⍵ sinon 3⍵+1
Modifié en dernier par Schraf le 15 mai 2020 09:33, modifié 4 fois.
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par gege »

Bonjour,
Bizarre ce ⍵, clairement l'argument passé à la fonction.
Je suppose que c'est spécifique ou une extension sortie après que j'aie arrêté d'en faire professionnellement... il y a 25 ans…
A mon époque on ouvrait les définitions par ∇.
Tu "parles" le truc ?
C'est sympa
G.E.
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Oui le ⍵ est bien le paramètre mis à droite de la fonction (on utilise ⍺ pour celui de gauche). Le ∇ permet effectivement de définir des fonctions mais il est aussi utiliser pour la récursivité.

La notation avec les accolades (dfn) n'existait pas il y a 25 ans :D
A Direct Function (dfn) is a new function definition style, which bridges the gap between named function expressions such as and APL's traditional 'header' style definition
Je suis débutant en APL mais comme souvent j'apprends en faisant des vidéos, j'en ai fait 3 :
Partie 1- https://youtu.be/Nxq1BUUXobM
Partie 2- https://youtu.be/s-E7BsMg_Qc
Partie 3- https://youtu.be/csx2Z-GEGPw

Le script peut être testé ici : https://tryapl.org/

En tous cas, en tant que matheux de formation, j'adore ce langage ! :P
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par gege »

Bonjour,
Oui APL c'est cool mais attention on crée vite des bricoles très grosses !
J'ai programmé en APL2, qui permettait des vecteurs / matrices / hypermatrices contenant n'importe quoi.
Sur gros mainframe IBM en consoles 3270 sous GDDM...
Mon collègue polonais buvait du thé sans arrêt.
C'était dingue parfois.
Ca doit expliquer bien des choses :-)
Bon voyage
G.E.
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

@gege + un collègue qui a enseigné l'APL chez IBM pendant 10 ans, vous me faîtes rêver les gars !! :slime:
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par C.Ret »

Bien sympa Schraf tes vidéo sur l' APL.

Du coup avec les liens que tu donnes, je découvre le Truc. C'est pas mal, surtout avec les claviers virtuels et la feuille qui récapitule ce que font les primitives.

J'ai pondu ma propre fonction SYR n qui donne pour son argument n le temps de vol, l'altitude maximale et la liste complète des termes de la suite en vue de faire en APL des graphiques LIN/LOG

Code : Tout sélectionner

      ]DEFS
      SYR←{⊃⍵=1:(¯1+⍴⍵)(⌈/⍵)(⌽⍵) ⋄ 2|⊃⍵:∇∊(1+3×(⊃⍵))⍵ ⋄ ∇∊((⊃⍵)÷2)⍵}
      
      SYR 25
      ┌──┬──┬──────────────────────────────────────────────────────────────────┐
      │23│88│25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1│
      └──┴──┴──────────────────────────────────────────────────────────────────┘
      SYR 27
      ┌───┬────┬────────────────────────────────[...254 columns of output...]────┐
      │111│9232│27 82 41 124 62 31 94 47 142 71 [...254 columns of output...] 2 1│
      └───┴────┴────────────────────────────────[...254 columns of output...]────┘
Il me reste à trouver un truc pour calculer la longueur du vol en altitude et surtout de faire les graphiques LIN/LOG ! :)


P.S.: Je n'ai pas utiliser "l'astuce" de faire tourner la matrice. cette astuce me donne le tournis.
Je détecte la parité des éléments de la suite tout simplement avec l'opérateur magnitude qui dans sa version dyadique donne directement le reste de la division euclidienne. L'expression 2|⊃⍵: est équivalent à (n MOD 2). Cette expression est donc directement utilisée pour le test puisque son résultat binaire ne peut être que 0 ou 1.

P.S.2.: En écrivant ces lignes, je me rends compte que j'aurais pu tout aussi bien utiliser cette expression comme indice de la matrice

Code : Tout sélectionner

SYR←{⊃⍵=1:(¯1+⍴⍵)(⌈/⍵)(⌽⍵) ⋄ ∇∊(0 1+0.5 3×⊃⍵)[1+2|⊃⍵]⍵}
Cette dernière mouture me plait bien, elle ne comporte plus la répétition de l'appel récursif et de l'instruction d'enrôlement .
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par C.Ret »

Bon ben voilà:

Code : Tout sélectionner

      ]DEFS

PLTS←{r←⍺⌊⌈/⍵ ⋄ sc←(⌈/⍵)÷r ⋄ ' ⎕∘⌺⌺'[1+((⍵÷sc)∘.≥0,⍳r)+2×((⌊(r×(⌈/⍵)⍟⍵))∘.=0,⍳r)]}                                                                 
SYR←{⊃⍵=1:⌽⍵ ⋄ ∇∊(0 1+0.5 3×⊃⍵)[1+2|⊃⍵]⍵}                                         

      SYR 25

25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

      120 PLTS SYR 25

⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                     ∘                         
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕        ∘   
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                ∘                 
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                     ∘                               
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                    ∘         
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                    ∘                      
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⌺
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                             ∘              
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                     ∘                            
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                   ∘                                         
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                  ∘                   
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                     ∘                                 
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                        ∘           
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                     ∘                        
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                    ∘                                      
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                               ∘                
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                     ∘                              
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                  ∘                                           
⎕⎕⎕⎕⎕⎕                         ∘                                                         
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                     ∘                                  
⎕⎕⎕⎕⎕⎕⎕⎕⎕                               ∘                                                
⎕⎕⎕⎕⎕                      ∘                                                             
⎕⎕⎕          ∘                                                                           
⌺⎕
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Excellent @C.Ret !!!

Je me demandais pourquoi il y avait ce ∊ dans ta ligne, je l'ai enlevé pour voir et... j'ai compris pourquoi il y était !! :D :D

Ca permet effectivement de transformer les 2 vecteurs en un seul, bien vu !

Code : Tout sélectionner

SYR←{⊃⍵=1:(¯1+⍴⍵)(⌈/⍵)(⌽⍵) ⋄ ∇(0 1+0.5 3×⊃⍵)[1+2|⊃⍵]⍵}

      SYR 12

┌─┬────────────────────────────────────┬──────────────────────────────────────┐
│1│┌──────────────────────────────────┐│┌──────────────────────────────────┬─┐│
│ ││┌─┬──────────────────────────────┐│││┌─┬──────────────────────────────┐│1││
│ │││2│┌─┬──────────────────────────┐│││││2│┌─┬──────────────────────────┐││ ││
│ │││ ││4│┌─┬──────────────────────┐││││││ ││4│┌─┬──────────────────────┐│││ ││
│ │││ ││ ││8│┌──┬─────────────────┐│││││││ ││ ││8│┌──┬─────────────────┐││││ ││
│ │││ ││ ││ ││16│┌─┬─────────────┐││││││││ ││ ││ ││16│┌─┬─────────────┐│││││ ││
│ │││ ││ ││ ││  ││5│┌──┬────────┐│││││││││ ││ ││ ││  ││5│┌──┬────────┐││││││ ││
│ │││ ││ ││ ││  ││ ││10│┌─┬────┐││││││││││ ││ ││ ││  ││ ││10│┌─┬────┐│││││││ ││
│ │││ ││ ││ ││  ││ ││  ││3│6 12│││││││││││ ││ ││ ││  ││ ││  ││3│6 12││││││││ ││
│ │││ ││ ││ ││  ││ ││  │└─┴────┘││││││││││ ││ ││ ││  ││ ││  │└─┴────┘│││││││ ││
│ │││ ││ ││ ││  ││ │└──┴────────┘│││││││││ ││ ││ ││  ││ │└──┴────────┘││││││ ││
│ │││ ││ ││ ││  │└─┴─────────────┘││││││││ ││ ││ ││  │└─┴─────────────┘│││││ ││
│ │││ ││ ││ │└──┴─────────────────┘│││││││ ││ ││ │└──┴─────────────────┘││││ ││
│ │││ ││ │└─┴──────────────────────┘││││││ ││ │└─┴──────────────────────┘│││ ││
│ │││ │└─┴──────────────────────────┘│││││ │└─┴──────────────────────────┘││ ││
│ ││└─┴──────────────────────────────┘│││└─┴──────────────────────────────┘│ ││
│ │└──────────────────────────────────┘│└──────────────────────────────────┴─┘│
└─┴────────────────────────────────────┴──────────────────────────────────────┘
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Juste pour le fun, voici ta version avec quelques caractères en moins (j'ai mis 2⊃⍵ puisque le max est déjà dans le retour de SYR) :

Code : Tout sélectionner

PLTS←{' ⎕∘⌺⌺'[1+((⍵÷m÷r)∘.≥v)+2×(⌊r×m⍟⍵)∘.=v←0,⍳r←⍺⌊m←2⊃⍵]}
40 PLTS SYR 25
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                ∘            
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕   ∘  
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕              ∘        
⎕⎕⎕⎕⎕⎕⎕⎕⎕                 ∘              
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕         ∘    
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                ∘          
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⌺
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕            ∘       
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                ∘             
⎕⎕⎕⎕⎕⎕               ∘                   
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕               ∘         
⎕⎕⎕⎕⎕⎕⎕⎕                 ∘               
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕           ∘     
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                 ∘           
⎕⎕⎕⎕⎕⎕                ∘                  
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕             ∘        
⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                ∘              
⎕⎕⎕⎕⎕               ∘                    
⎕⎕⎕           ∘                          
⎕⎕⎕⎕⎕⎕⎕⎕                ∘                
⎕⎕⎕⎕              ∘                      
⎕⎕          ∘                            
⎕     ∘                                  
⌺                                        
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par C.Ret »

C'est une excellente idée, je ne savais pas que l'on pouvait affecter des variables à la volée. Les diamants ne servent plus le nombre m qui sert à limiter le nombre de caractères pour chaque ligne est capté 'à la volée'. Excellent !

Mais attention, j'ai changé ce que renvoie la fonction SYR, si c'est juste les termes de la suite, alors il faut prendre ⌈/⍵ et ⍴⍵.

Je sèche encore un peu, l'idée initiale était :
r c PLTS SYR nn
où:
r : limite le nombre de lignes (par exemple en compressant une suite comme celle de 27 pour qu'elle tienne en moins de 66 lignes (c'est à dire une page sur mon imprimante).
c : limite le nombre de colonnes par ligne (par exemple en utilisant que les 80 caractères par ligne de mon moniteur pour afficher SYR 2097152)
nn: initiale de la suite de Syracuse.

L'idée serait d'avoir quelque chose comme

Code : Tout sélectionner

    20 40 PLTS SYR 25    
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⌺⎕⎕⎕⎕⎕⎕⎕⎕⎕   ∘
⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕      ∘       ∘
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕ ∘       ∘
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⌺⎕⎕⎕⎕⎕⎕⎕⎕⌺
⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕         ∘      ∘
⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕       ∘       ∘
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕   ∘       ∘
⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕ ∘            ∘
⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕         ∘      ∘
⌸⌸⌸⎕⎕⎕⎕⎕     ∘          ∘
⌸⌸⎕⎕       ∘      ∘
⌺     ∘
Afin d'avoir quelque chose de lisible sur le télétype et ne pas gaspiller toute la ramette de papier à bandes picots ! :D :D
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Pour le moment pas d'idée mais je peux te dépanner en papier Caroll, j'en ai 2 caisses :P
Fichiers joints
Papier Caroll
Papier Caroll
IMG_20200520_195508_resized_20200520_083413893.jpg (87.01 Kio) Vu 14231 fois
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Si j'ai bien compris le graphique :
  • On divise la liste SYR 25 en r parties
  • Pour chacune de ces parties on ne garde que les 2 valeurs les + élevées
  • On représente ces 2 valeurs en LIN+LOG
Pour les 2 premières étapes (DECoupage) je pensais à un truc comme ça ce matin :

Code : Tout sélectionner

DEC←{{2↑⍵[⍒⍵]}¨(1=(⌈r÷⍺)|⍳r←⍴⍵)⊂⍵}
Par exemple découpage en 5 puis 12 lignes (A chaque fois il ne garde que les 2 plus grandes valeurs) :

Code : Tout sélectionner

      5 DEC SYR 25
 76 58  88 44  52 34  40 20  8 4 
      12 DEC SYR 25
 76 25  38 19  58 29  88 44  22 11  34 17  52 26  40 13  20 10  16 5  8 4  2 1 
L'idée est de générée le même vecteur 1 0 0 ... 0 (longueur r) plusieurs fois sur toute la taille du vecteur SYR et ⊂ pour faire la partition.
Ensuite, pour chaque élément de cette partition, triez par ordre décroissant et ne garder que les 2 premiers.

Mise à jour
Je pense qu'on doit pouvoir faire plus court (je ne connais pas assez APL) mais avec ça on a les 2 valeurs max par ligne avec la mise à l'échelle suivant le nb de colonnes voulues

Code : Tout sélectionner

 DEC←{+/(({2↑⍵[⍒⍵]}¨(1=(⌈r÷⍺[1])|⍳r←⍴⍵)⊂⍵)÷(⌈/⍵)÷⍺[2])∘.≥0,⍳⍺[2]}
On retrouve bien tes valeurs (35,12) pour la 1ere ligne, (18,9) pour la 2e etc.

Code : Tout sélectionner

      20 40 DEC SYR 25
 35 12  18 9  27 14  41 21  11 6  16 8  24 12  19 6  10 5  8 3  4 2  1 1
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Nouvelle amélioration...

Code : Tout sélectionner

DEC←{' ⎕⌸'[1++/¨(+/(({2↑⍵[⍒⍵]}¨(1=(⌈r÷¯1+r⌊⍺[1])|⍳r←⍴⍵)⊂⍵)×a÷⌈/⍵)∘.≥0,⍳a)∘.≥⍳a←⍺[2]]}
      20 40 DEC SYR 25
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕     
⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕                      
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕             
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕                             
⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕                        
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                
⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                     
⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕                              
⌸⌸⌸⎕⎕⎕⎕⎕                                
⌸⌸⎕⎕                                    
⌸
Explications
Si u est par exemple :

Code : Tout sélectionner

      u
(35 12)  (18 9)  (27 14)  (41 21)  (11 6)  (16 8)  (24 12)  (19 6)  (10 5)  (8 3)  (4 2)  (1 1)
Alors

Code : Tout sélectionner

+/¨u∘.≥⍳40
2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2 2 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
On peut désormais sauver des forêts

Code : Tout sélectionner

      5 10 DEC SYR 27
⌸         
⌸⌸        
⌸⌸⌸⌸⌸⌸⎕⎕  
⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕
⌸        

Code : Tout sélectionner

      66 80 DEC SYR 2097152
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                                           
⌸⌸⌸⎕⎕⎕                                                                          
⌸⎕                                                                              
⌸                                                                               
⌸                                                                               
⌸                                                                               
⌸                                                                               
⌸                                                                               
⌸                                                                               
⌸       
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

3e version de la journée... qui semble proche du résultat voulu :

Code : Tout sélectionner

SYR←{⊃⍵=1:⌽⍵ ⋄ ∇∊(0 1+0.5 3×⊃⍵)[1+2|⊃⍵]⍵}
SYR 25
25 76 38 19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
La fonction de découpage en r lignes et c colonnes (r c DEC SYR N) avec en sortie un vecteur du type (a1 b1 c1 d1) (a2 b2 c2 d2) ...
Les 4 valeurs correspondent aux LOG et LIN des 2 valeurs les plus élevées de la classe : LOG(MAXI1), LOG(MAXI2), MAXI1, MAXI2 en ayant normalisé l'ensemble par rapport au nombre de colonnes voulues.

Code : Tout sélectionner

DEC←{m←(⌈/⍵)⋄⍺[2]×{(m⍟a),(a←2↑⍵[⍒⍵])÷m}¨((1=(⌈r÷¯1+r⌊⍺[1])|⍳r←⍴⍵)⊂⍵)}
5 10 DEC SYR 25
┌───────────────────────────────┬───────────────┬─────────────────────────────┬───────────────────────────────┐
│9.67257 9.06888 8.63636 6.59091│10 8.45188 10 5│8.82499 8.239 5.90909 4.54545│6.1925 4.64437 1.81818 0.909091│
└───────────────────────────────┴───────────────┴─────────────────────────────┴───────────────────────────────┘
Traçage : On récupère les 2 valeurs des LOG (2↑¨) pour faire la comparaison avec le n° de colonne et les 2 LIN (2↓¨) pour l'histogramme.

Code : Tout sélectionner

PLTS←{'  ⎕⌸⌸∘⌺⌺⌺⌺'[+/¨1+(2↓¨w∘.≥v)+4×(⌊2↑¨w←⍺ DEC ⍵)∘.=v←0,⍳⍺[2]]} 
20 40 PLTS SYR 25 
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⌺⎕⎕⎕⎕⎕⎕   ∘  
⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕        ∘     ∘        
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕   ∘     ∘    
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⌺⎕⎕⎕⎕⎕⎕⌺
⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕          ∘     ∘             
⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕         ∘     ∘         
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕     ∘     ∘     
⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕   ∘         ∘        
⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕          ∘     ∘              
⌸⌸⌸⎕⎕⎕⎕⎕      ∘         ∘                
⌸⌸⎕⎕        ∘     ∘                      
⌺     ∘                                  
 

Code : Tout sélectionner

   66 80 PLTS SYR 2097152
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⌺⎕⎕⎕⌺
⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⌸⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                                               ∘   ∘        
⌸⌸⌸⎕⎕⎕                                                      ∘   ∘                
⌸⎕                                                   ∘   ∘                       
⌸                                            ∘   ∘                               
⌸                                     ∘  ∘                                       
⌸                             ∘   ∘                                              
⌸                     ∘   ∘                                                      
⌸              ∘   ∘                                                             
⌸      ∘   ∘                                                                     
⌺  ∘          
Répondre

Retourner vers « Tous les Pockets »