Contexte
Le plus grand diviseur commun ( gcd pour faire court) est une fonction mathématique pratique, car elle possède de nombreuses propriétés utiles. L'un d'eux est l'identité de Bézout : si d = gcd(a, b)
, alors il existe des entiers x
et y
tels que d = x*a + y*b
. Dans ce défi, votre tâche consiste à visualiser cette propriété avec un art ASCII simple.
Contribution
Vos entrées sont deux entiers positifs a
et b
, donnés dans n'importe quel format raisonnable. Vous pouvez également prendre des entrées unaires (répétitions d'un seul caractère ASCII imprimable de votre choix), mais vous devez être cohérent et utiliser le même format pour les deux entrées. Les entrées peuvent être dans n'importe quel ordre et elles peuvent être égales.
Sortie
Votre sortie est une chaîne s
de longueur lcm(a, b) + 1
( lcm représente le plus petit commun multiple). Les caractères de s
représentent des entiers de 0
à lcm(a, b)
. Le caractère s[i]
est en minuscule o
si i
est un multiple de a
ou b
, et un point .
sinon. Notez que zéro est un multiple de chaque nombre. Maintenant, en raison de l'identité de Bézout, il y aura au moins une paire de personnages o
à s
distance exacte gcd(a, b)
. La paire la plus à gauche doit être remplacée par des majuscules O
; c'est la sortie finale.
Exemple
Considérez les entrées a = 4
et b = 6
. Ensuite, nous avons gcd(a, b) = 2
et lcm(a, b) = 12
, donc la longueur de s
sera 13
. Les multiples de a
et b
sont mis en évidence comme suit:
0 1 2 3 4 5 6 7 8 9 10 11 12
o . . . o . o . o . . . o
Il y a deux paires de o
s avec une distance de deux, mais nous ne remplacerons que les plus à gauche par O
s, donc la sortie finale est
o...O.O.o...o
Règles et notation
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Cas de test
1 1 -> OO
2 2 -> O.O
1 3 -> OOoo
4 1 -> OOooo
2 6 -> O.O.o.o
2 3 -> o.OOo.o
10 2 -> O.O.o.o.o.o
4 5 -> o...OO..o.o.o..oo...o
8 6 -> o.....O.O...o...o.o.....o
12 15 -> o...........O..O........o.....o.....o........o..o...........o
19 15 -> o..............o...o..........o.......o......o...........o..o..............OO.............o....o.........o........o.....o............o.o..............o.o............o.....o........o.........o....o.............oo..............o..o...........o......o.......o..........o...o..............o
.
,o
ouO
.) Ou faut-il que ce soit1
? Ou0
?Réponses:
Jolf, 52 octets
Je vais diviser ce code en deux parties.
Essayez-le ici!
la source
Julia,
11111010710396 octetsIl s'agit d'une fonction qui accepte deux entiers et renvoie une chaîne.
Non golfé:
Un octet sauvé grâce à nimi!
la source
Retina ,
112109999491 octetsPas très compétitif, je pense, mais la théorie des nombres dans la rétine est toujours assez amusante. :)
Prend la saisie comme des nombres unaires en utilisant
.
comme chiffre unaire.Essayez-le en ligne.
Explication
Cela insère un
.
et un espace devant l'entrée. Cela deviendra finalement la sortie.Cela ajoute le LCM de
a
etb
à la chaîne. Puisque nous en avons déjà un.
, nous nous retrouverons aveclcm(a,b)+1
. Ceci est accompli en ajoutant plusieurs foisb
tant quea
ne divise pas ce nouveau préfixe. Nous capturonsa
dans un groupe puis vérifions si nous pouvons atteindre le début de la chaîne en faisant correspondre cette capture au moins une fois.b
est ensuite inséré dans la chaîne via le rarement utilisé$'
qui insère tout après la correspondance dans la substitution.Celui-ci fait correspondre les caractères à des positions divisées par
a
oub
. Il utilise le fait que le résultat est symétrique: puisquelcm(a,b)
est divisé par les deuxa
etb
va à gauche en soustrayant les instances dea
oub
donne le même motif que d'aller à droite0
en les ajoutant. Le premier lookahead capture simplementa
etb
. Le deuxième lookahead vérifie qu'il y a un multiple de chacuna
ou desb
caractères avant le premier espace.Comme indiqué sur Wikipédia, outre l'identité de Bézout, il est également vrai que
Cela implique que le GCD correspondra à l'écart le plus court entre deux
o
s dans la sortie. Nous n'avons donc pas du tout besoin de trouver le GCD. Au lieu de cela, nous recherchons simplement la première instance de l'écart le plus court.o(\.*)o
correspond à un espace candidat et capture sa largeur dans le groupe 1. Ensuite, nous essayons d'atteindre le premier espace en alternant entre une référence arrière au groupe 1 eto
s (avec des.
s supplémentaires facultatifs ). S'il y a un écart plus court plus à droite, cela ne correspondra pas, car nous ne pouvons pas dépasser cet écart avec la référence arrière. Dès que tous les autres écarts sont au moins aussi larges que l'actuel, cela correspond. Nous capturons la fin de la chaîne LCM dans le groupe 2 et faisons correspondre le reste de la chaîne avec.*
. Nous réécrivons les majusculesO
s (avec l'espace entre les deux) ainsi que le reste de la chaîne LCM, mais jetez tout à partir de l'espace, pour supprimera
etb
du résultat final.la source
(\.*)
=>(a*)
.
plus tard, ce qui coûte quatre octets (et se débarrasser des échappements n'en sauve que 3).𝔼𝕊𝕄𝕚𝕟, 50 caractères / 90 octets
Try it here (Firefox only).
Il doit y avoir un moyen de jouer au golf plus loin!
Explication
Il s'agit d'un algorithme de base à deux phases. C'est en fait assez simple.
La phase 1
Tout d'abord, nous créons une plage de 0 à LCM + 1. Ensuite, nous le cartographions, vérifiant si l'une des entrées est un facteur de l'élément actuel dans la plage. Si oui, nous remplaçons cet article par un
o
; sinon, nous le remplaçons par un.
. Le rejoindre nous donne une série de o et de points que nous pouvons passer à la phase deux.Phase 2
Ce n'est qu'une grande fonction de remplacement. Une expression régulière est créée en tant que
o[dots]o
, où la quantité de points est déterminée par le GCD-1. Puisque cette expression régulière n'est pas globale, elle ne correspondra qu'à la première occurrence. Après, la correspondance est remplacée à l'O[dots]O
aide d'une fonction toUpperCase.la source
MATL , 72 octets
Utilise la version 6.0.0 , antérieure à ce défi. Le code s'exécute dans Matlab et dans Octave.
Exemple
Explication
Je ne sais pas comment ça marche. Je viens de taper des caractères au hasard. Je pense qu'il y a une certaine convolution.
Edit: Essayez-le en ligne! Le code du lien a été légèrement modifié pour se conformer aux changements de langue (au 2 juin 2016).
la source
Japt , 83 octets
Pas encore entièrement golfé ... Et ne veut pas être golfé: /
la source
r
à la place de$.replace($
?Javascript,
170164161153145 145141136 octetsC'est tout à fait lonnnggggg ....
Démo , variables définies explicitement car l'interpréteur utilise le mode strict.
la source
i%a<1||i%b<1?'o':'.'
pari%a&&i%b?'.':'o'
[...Array((d=a*b/(c=(g=(a,b)=>b?g(b,a%b):a)(a,b)))+1).keys()].map(i=>i%a&&i%b?'.':'o')
vous sauve deux octets. (J'ai également essayé d'utiliser l'indexation de chaînes pour créer le '.' Et le 'o' mais cela coûte en fait deux octets.)Python 2,
217200191 octetsC'est un peu brutal, mais ça marche. Tous les conseils de golf sont appréciés,
surtout si vous savez comment résoudre le.s[i] = s[v] = "o"
problème que j'ai rencontré, où cela remplacerait "O"Non golfé:
la source