Basic Casio Golf
Posté le 11/05/2021 00:03
Ce topic est motivé par une courte discussion survenue sur la shout à propos d'un plus ou moins Basic. Le code, bien que simple, était bien marrant à optimiser. Je propose de commencer une « activité » de golf Basic Casio, où l'objectif est d'écrire une solution à un problème en utilisant le moins d'octets possible.
Plus ou moins [23 octets] [11/05/2021]
Auteur : Lephénixnoir
Plus ou moins solo, avec nombre tiré au sort parmis 100 choix.
Int ᴇ2Ran# →R
Do
?→G
R<G◢
LpWhile R-G
Dark Storm [24 octets] [10/05/2021]
Dark Storm [24 octets] [10/05/2021]
Int 100Ran# →R
Do
?→G
R<G◢
LpWhile G≠R
Pendu [228 octets] [10/05/2021]
Auteur : KikooDX
Pendu deux joueurs complet.
8 essais avant de perdre.
Empêcher la triche softlock-tier.
PENDU.g3m
?→Str 1
"-"→Str 5
StrSrc(Str 1,Str 5)⇒÷
""→Str 2
StrLen(Str 1)→L
For 1→A To L
Str 2+Str 5→Str 2
Next
8→T
Do
ClrText
Locate 1,6,T
Locate 1,7,Str 2
?→Str 9
StrSrc(Str 9,Str 5)+(1≠StrLen(Str 9)⇒÷
StrSrc(Str 1,Str 9
Not Ans⇒Dsz T
If Ans
Then For 1→A To L
StrMid(Str 1,A,1→Str 3
StrSrc(Str 3,Str 9)⇒StrLeft(Str 2,A-1)+Str 3+StrRight(Str 2,L-A→Str 2
Next
IfEnd
LpWhile TStrSrc(Str 2,Str 5
Test de primalité [26 octets] [11/05/2021]
Auteur : Lephénixnoir
?→N
N Rmdr Seq(X,X,2,N-1,1
Min(List Ans
Liste des diviseurs [24 octets] [11/05/2021]
Auteur : Lephénixnoir
?→A
For 1→B To A
A Rmdr B=0⇒B◢
Next
FlamingKite [29 octets]
FlamingKite [29 octets]
?→A
For 1→B To A
Frac (A÷B)=0⇒B◢
Next
""
Tours de Hanoï [16 + 57 = 73 octets] [11/05/2021]
Auteur : Lephénixnoir
Chaque déplacement est indiqué par deux ◢ :d'abord la colonne où saisir un disque, et ensuite la colonne où lâcher ce disque.
Programme principal
?→N
1→A
3→B
Prog "H"
Programme "H"
Dsz N
6-A-B→B
N⇒Prog "H"
N⇒6-A-B→B
A◢
B◢
6-A-B→A
N⇒Prog "H"
6-A-B→A
Isz N
Un sujet à proposer ?
Proposez un programme de moins de 256 octets (sous forme de fichier
.g*m), et une description de son comportement ou objectif. Le sujet sera simplifié avant d'être ajouté au topic.
Citer : Posté le 11/05/2021 09:04 | #
J'ai du mal à penser que le programme de Darks marche étant donné qu'il ne spécifie jamais la valeur de R !
Ton décompte n'est pas tout à fait exact d'ailleurs. Sur ma Graph 35+E II un programme vide commence à 34 octets, et avec le code je suis à 58 octets, donc ça fait 24 (en comptant un →R après le Ran#). J'obtiens le même résultat en comptant manuellement.
Du reste, je gagne un octet en utilisant ᴇ2 au lieu de 100 (23 octets).
Do
?→G
R<G◢
LpWhile R-G
Citer : Posté le 11/05/2021 09:22 | #
Merci, j'avais oublié →R lors de la recopie du code de DS et ne m'en étais pas rendu compte >_< J'ai aussi raté le comptage, je suis vraiment pas dégourdi.
Je vais mettre à jour le topic avec ta solution
Je mettrai probablement l'historique dans un spoiler.
Citer : Posté le 11/05/2021 09:24 | #
Comment est-ce que le comptage se passe si on a plusieurs sous-programmes ? (Est-ce que c'est autorisé déjà ?)
Ajouté le 11/05/2021 à 09:33 :
Test de primalité (26 octets)
N Rmdr Seq(X,X,2,N-1,1
Min(List Ans
Citer : Posté le 11/05/2021 09:35 | #
Cela te convient-il d'ajouter 32 octets au score par sous-programme supplémentaire ? Ou une autre valeur, j'écoute là-dessus. Je n'ai pas pensé aux sous-programmes.
Citer : Posté le 11/05/2021 09:50 | #
Liste de diviseurs d'un entier (60 octets)
For 1→B To A
Frac (A÷B)=0⇒B◢
Next
""
Les 2 guillemets de fin ne rajoutent rien au poids du programme, et ça évite de doubler le dernier diviseur (A lui même) xD.
Tester jusqu'à √A suffirait, mais ça rajoute 4 octets, donc là on gagne 4 octets et on a la liste complète des diviseurs.
Ca pourrait s'optimiser encore plus ?
Citer : Posté le 11/05/2021 10:00 | #
Honnêtement je serais tenté de ne compter que le poids du code sans la partie fixe ; surtout que Prog prend 5 octets plus la longueur du nom du programme, donc même sans malus particulier ce sera rarement rentable. En gros c'est toujours plus simple d'insérer le code du sous-programme, sauf dans le cas que j'ai en tête, où le programme est récursif. Du coup je vois pas trop d'abus possible.
(Edit : Il y a le cas où on appelle le code plusieurs fois, mais ça me parait legit aussi.)
Le programme de FK fait 29 octets d'ailleurs.
Pour info FK, il y a deux détails à prendre en compte pour trouver la taille du programme : d'abord il y a une taille fixe quand tu commences et que le programme est vide, et ensuite PRGM affiche que les mutiples de 4. Du coup, pour trouver la taille d'un programme, il faut rajouter entre 1 et 4 caractères et regarder quand PRGM passe au multiple de 4 suivant. Chez moi avec un seul caractère je passe de 60 à 64 donc ton programme fait 63 octets. Ensuite tu fais pareil avec un programme vide, chez moi il fait 34 octets ; donc ton code fait 29.
Et sinon voilà une version de 27. x3
For 1→B To A
A Rmdr B=0⇒B◢
Next
""
Citer : Posté le 11/05/2021 10:07 | #
Ah d'accord merci pour les explications sur le poids du programme, je m'étais pas foulé, j'avais simplement pris le poids affiché
Sinon, merci pour Rmdr, je ne connaissais pas
Citer : Posté le 11/05/2021 10:13 | #
Niveau technique je ne trouve pas les sous-programmes sans poids très cohérents, mais ça créera des solutions intéressantes alors OK, ils sont autorisés
Je vais ajouter vos codes, Lephé je me permet de retirer les deux guillemets et le saut à la ligne ─ ça fait trois octets en moins, et le dernier nombre affiché n'est pas faux bien que redondant.
Citer : Posté le 11/05/2021 10:29 | #
Ok, merci ! Voilà pour le programme que j'avais en tête du coup.
Tours de Hanoï (16 + 51 = 67 octets)
Chaque déplacement est indiqué par deux ◢ :d'abord la colonne où saisir un disque, et ensuite la colonne où lâcher ce disque.
1→A
3→B
Prog "H"
# Programme "H"
6-A-B→B
Dsz N
Prog "H"
A◢
6-A-B→B◢
6-A-B→A
N⇒Prog "H"
6-A-B→A
Isz N
Ajouté le 11/05/2021 à 16:24 :
J'ai trouvé une astuce pour réduire le programme ci-dessus donc je l'ai mis à jour.
Citer : Posté le 25/11/2022 10:00 | #
je ne suis pas d'accord avec tout le monde, il y a beaucoup d'erreurs que vous avez
Citer : Posté le 08/12/2022 21:56 | #
Snake.
Size: 195 bytes
{7, 21 -> Dim Mat A
Mat A -> Mat B
Do
If X = Q(Y = R :Then
RanInt#(1, 7 -> R
RanInt#(1, 21 -> Q
Else
Mat A[W, V
0 -> Mat A[W, V
Locate V, W, " "
Mat B[W, V -> W
Ans -> V
IfEnd
Locate Q, R, 8
GetKey => 2MOD(GetKey, 4 -> U
X
Y -> T
U < 3 => Y + U - 1 -> Y
U > 3 => X + U - 5 -> X
Locate X, Y, 0
X -> Mat A[T, Ans
Y -> Mat B[T, Ans
LpWhile 0 = Mat A[Y, X