L'algorithme euclidien est un algorithme largement connu pour calculer le plus grand diviseur commun (GCD) de deux entiers positifs.
L'algorithme
Aux fins de ce défi, l'algorithme est décrit ci-dessous:
Affichez les deux entrées sous forme de lignes adjacentes d'un certain caractère,
par exemple une entrée de3,4
peut être représentée par les lignes adjacentes000
et0000
Transformez les premiers
length(short_line)
caractères de la ligne la plus longue en un autre personnage, dites-
maintenant à quoi il ressemble000
et---0
Éliminez les premiers
length(short_line)
caractères de la ligne la plus longue.
maintenant000
,0
Répétez l' étape 2 et 3 jusqu'à ce que les deux ont une longueur égale, en utilisant les lignes courtes et plus longues après chaque itération, par exemple
000
,0
-00
,0
00
,0
-0
,0
0
,0
- Vous pouvez choisir de vous arrêter ici ou de continuer l'itération et de transformer l'une des lignes en ligne vide.
Chacune de ces étapes doit être séparée par un intervalle compris entre 0,3 s et 1,5 s.
Le défi
Écrivez un programme qui, étant donné deux nombres naturels en entrée, crée une sortie qui ressemble exactement à la sortie de l'algorithme ci-dessus. Vous pouvez utiliser d'autres caractères ASCII imprimables non blancs que 0
et -
, mais soyez cohérent et n'utilisez que deux caractères. Vous pouvez également utiliser des algorithmes alternatifs à condition que la sortie, y compris la synchronisation, soit exactement la même que celle produite par l'algorithme ci-dessus.
Exemples
Ceci est un exemple avec entrée 24,35
, qui sont des nombres premiers, donc leur GCD est 1.
Ceci est un exemple avec entrée 16,42
, qui ont le GCD 2.
Règles
- C'est un code-golf , donc les octets les plus courts gagnent
- Failles standard s'appliquent
- Vous pouvez supposer que l'entrée est un entier décimal positif
Clarifications
- Les lignes qui représentent les nombres doivent rester dans leur ordre d'origine, c'est-à-dire que les première et deuxième lignes de la première "trame" affichée doivent être respectivement la première et la deuxième lignes, dans toutes les trames suivantes.
- Une fois l'algorithme terminé, aucune entité visible supplémentaire ne doit apparaître. Cependant, cela signifie également qu'il est correct de vider les lignes, si vous vous assurez que la dernière "trame" est affichée pendant au moins la même durée que toutes les autres trames avant la suppression.
:-)
Réponses:
Gelée , 29 octets
Essayez-le en ligne!
Cela définit une fonction
2Ŀ
(pas un programme complet; le lien TIO contient un pied de page qui convertit une fonction en programme) qui prend une liste de deux éléments en entrée et affiche la sortie à l'écran (l'une de nos méthodes légales d'E / S , et qui est en quelque sorte nécessaire pour ce défi car il parle de l'apparence à l'écran). Cela suppose que le programme est exécuté dans un terminal qui est conforme à la norme ANSI (j'ai utiliségnome-terminal
mais la plupart fonctionnera) et que le terminal est initialement vide (ce qui semble être le défaut le plus judicieux); notez que Essayez-le en ligne! n'est pas conforme à ces hypothèses, et donc la sortie y est déformée (j'ai exécuté le programme localement pour vérifier qu'il s'anime comme prévu). J'utilise1
où la question utilise0
, et2
à la place de-
.Explication
Fonction d'assistance
1Ŀ
(étant donné une liste de deux listes de chiffres, les affiche sur les première et deuxième lignes de l'écran, puis attend 0,5 seconde; renvoie son entrée)La chaîne "\ x1bc", lorsqu'elle est envoyée à un terminal compatible ANSI, est interprétée comme un code de contrôle pour réinitialiser le terminal; cela efface l'écran et déplace le curseur dans le coin supérieur gauche (réinitialisant ainsi le terminal prêt pour la sortie suivante).
La fonction d'assistance est nommée
1Ŀ
(Jelly génère automatiquement les noms de cette forme pour les fonctions, et en fait il n'y a pas d'autre moyen de les nommer), mais elle peut être désignée simplement comme àÇ
partir du programme principal (car le langage a un raccourci pour les fonctions avec des nombres à proximité ).Fonction principale
2Ŀ
(implémente la tâche demandée dans la question)la source
JavaScript (ES6),
128124 octetsla source
Python 2 ,
152146 octetsEssayez-le en ligne!
Prend deux entiers séparés par des virgules comme entrée
la source
Javascript (ES6),
215 194...135 129127 octetsUsage
Cela prend en compte une variation sur le curry. Pour l'utiliser, affectez d'abord la fonction à une variable (par exemple
G
), puis appelez-la comme ceci:Explication
Fonction quelque peu récursive qui s'appelle après 1 seconde tant que l'algorithme n'est pas terminé. Il garde une troisième variable
c
qui détermine sia
etb
doit être modifié (sic
est1
, il est temps de changer).Tout d'abord, la fonction écrit quelque chose sur la console. Si
c
c'est le0
, il écrit deux chaînes de zéros avec une nouvelle ligne entre les deux. Puisquec
est initialisé à0
, nous pouvons en profiter, et configurer des variables globalesf
etg
qui contiennent souvent certaines chaînes dont nous avons besoin (comme0
etrepeat
).Sinon, il crée une chaîne avec des zéros et des inconvénients. Toutes ces chaînes se composent de deux parties: d'abord certains (appelez ce montant
A
) moins, puis certains (appelez ce montantB
) zéros, puis une nouvelle ligne, puis certains (appelez ce montantD
) moins et enfin certains (appelez ce montant)E
) zéros.Si la première entrée est plus petite que la deuxième entrée, nous devons supprimer les zéros de la deuxième entrée, donc
A
zéro,B
égal à la première entrée,D
égal à la première entrée etE
égal à la deuxième entrée moins la première entrée. Si la première entrée n'est pas inférieure à la deuxième entrée, l'inverse s'applique (A
est la deuxième entrée,B
est la première entrée moins la deuxième entrée, etc.).Avec ces nouvelles valeurs pour l'entrée et une variable commutée
c
, il est prévu de rappeler la fonction dans1e3
millisecondes, ce qui équivaut à une seconde.Remarques
alert
pour la sortie0
et-
, comme dans les exemplesEssayez-le en ligne
Essayez-le ici!
la source
Python 2 ,
208204194 octets-4 avec merci à @math_junkie pour l'astuce sournoise avec
time.sleep
-10 avec merci à @busukxuan pour avoir clarifié la règle "écran clair".
Essayez-le en ligne!
Je suis sûr que cela pourrait être plus joué. Cela me fait mal de dupliquer le
print
et lafor
boucle pour créer la pause mais je ne trouve pas de solution pour le moment.Remarques
la source
import time
,s=time.sleep
ets(1)
au lieu d'une boucle pour le délaitime.sleep
mais j'ai manqué celle-là. Je vais essayer.perl,
161149 octets... sans indentations ni nouvelles lignes:
Mettez-le dans un fichier gcd.pl et exécutez comme ceci:
la source
-M5.010
drapeau de perl est gratuit, vous pouvez donc économiser quelques octets en utilisantsay
overprint…\n
. De plus, je suis presque sûr qu'il est plus simple de donner un nom à votre sous-programme anonyme, plutôt que de le stocker dans une variable.GNU Sed (avec
e
extension xec), 88Le score inclut +3 pour les
-zrf
optionssed
.L'entrée est donnée sous la forme de deux entiers unaires séparés par une nouvelle ligne, en utilisant les majuscules
O
comme chiffres.Par exemple, l'exemple 16, 42 peut être exécuté comme:
Selon les derniers commentaires, je n'efface pas l'écran entre les itérations.
la source
V ,
4744 octetsEssayez-le en ligne!
L'en-tête et le pied de page sur TIO se modifient simplement
gs
pour copier les deux lignes actuelles au bas de l'écran, puis supprimez les deux premières à la fin. Cela visualise l'opération pour TIO, mais si vous l'exécutiez en V (sans l'en-tête et le pied de page), il attendrait juste une seconde entre chaque opération.la source
ò
?