Illustrer le plus petit commun


50

Étant donné deux entiers positifs, A et B, illustrent leur plus petit multiple commun en générant deux lignes de tirets ( -) de longueur LCM (A, B) après avoir remplacé chaque tiret Ath de la première ligne et chaque tiret de la deuxième ligne par des barres verticales ( |)

De cette façon, la fin de chaque ligne sera le seul endroit où deux |sont alignés.

Par exemple, si A = 6 et B = 4, LCM (6, 4) = 12, ainsi:

two lines of 12 dashes:
------------
------------

replace every 6th dash in the first line with a vertical bar:
-----|-----|
------------

replace every 4th dash in the second line with a vertical bar:
-----|-----|
---|---|---|

Ainsi, le résultat final serait

-----|-----|
---|---|---|

L'ordre des nombres entrés doit correspondre à l'ordre des lignes.

Le code le plus court en octets gagne.

Testcases

A B
line for A
line for B

1 1
|
|

1 2
||
-|

2 1
-|
||

2 2
-|
-|

6 4
-----|-----|
---|---|---|

4 6
---|---|---|
-----|-----|

2 3
-|-|-|
--|--|

3 2
--|--|
-|-|-|

3 6
--|--|
-----|

2 5
-|-|-|-|-|
----|----|

4 3
---|---|---|
--|--|--|--|

10 10
---------|
---------|

10 5
---------|
----|----|

10 6
---------|---------|---------|
-----|-----|-----|-----|-----|

24 8
-----------------------|
-------|-------|-------|

7 8
------|------|------|------|------|------|------|------|
-------|-------|-------|-------|-------|-------|-------|

6 8
-----|-----|-----|-----|
-------|-------|-------|

13 11
------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|------------|
----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|

3
@LeakyNun Il semble plus facile d' étendre une réponse à partir de codegolf.stackexchange.com/q/94999 . Quoi qu’il en soit, les gens s’amuseront à faire celui-ci, qui est une raison décente.
Les passe-temps de Calvin

1
Puis-je sortir un tableau avec deux chaînes, une pour chaque ligne?
BlackCap

@BlackCap No. Imprimez les chaînes sur stdout ou un fichier ou renvoyez la chaîne multiligne complète.
Les passe-temps de Calvin

2
Bonus pour le traitement d'un nombre arbitraire d'entrées?
Adám

1
@ HelkaHomba Ok merci; enregistré 1 octet supplémentaire. :) (Comme s'il y avait une autre raison de poser de telles questions sur les défis CodeGolf.; P)
Kevin Cruijssen Le

Réponses:


11

Python 3, 80 octets

Enregistré 1 octet grâce à Halvard Hummel et 1 octet à Jonathan Allan.

import math
def f(*l):
 for k in 0,1:print(l[~k]//math.gcd(*l)*(~-l[k]*"-"+"|"))

Testez-le en ligne!

lambda*l:"\n".join(l[0]*l[1]//math.gcd(*l)//k*(~-k*"-"+"|")for k in l)
import math

Testez-le en ligne! (82 octets - réponse initiale)

C'est le mieux que j'ai pu faire dans Python 2 (81 octets). Il semble que je ne puisse pas commenter cette réponse, je vais simplement poster ceci ici:

from fractions import*
l=a,b=input()
for k in l:print a*b/gcd(*l)/k*(~-k*"-"+"|")

Testez-le en ligne!

Première tentative ici, probablement sous-optimale!


2
Bienvenue chez PPCG!
Laikoni

3
@Laikoni Merci! Cela semble être une communauté amusante :-)


@HalvardHummel Merci, affichera comme alternative!

En essayant une approche complètement différente, je me suis rendu compte que votre version pourrait être réalisée en 80 .
Jonathan Allan

10

Haskell , 57 octets

x%y=unlines[["-|"!!(0^mod a b)|a<-[1..lcm x y]]|b<-[x,y]]

Essayez-le en ligne!


Je n'ai jamais vu ce 0^0=1tour auparavant - malin
BlackCap

@BlackCap Je ne peux pas le dire moi-même parce que je l'ai déjà vu plusieurs fois, bien que je ne me souvienne pas où j'ai vu le tour en premier.
Laikoni


6

MATL , 16 15 octets

'-|'!i&Zm:G\go)

L'entrée est un vecteur de colonne avec les deux nombres. Essayez-le en ligne!

En prime, l'entrée peut contenir plus de deux nombres. . Essayez-le en ligne!

Explication

'-|'   % Push this string
!      % Transpose. This is needed because of input [1; 1]
i      % Input column vector of 2 (or N) numbers
&Zm    % LCM of the 2 (or N) numbers, say L
:      % Range
G      % Push input again
\      % Modulus, element-wise with broadcast. Gives a 2×L (or N×L) matrix
g      % Convert to logical: gives false for zeros, true for nonzeros
o      % Convert to double: gives 0 for false, 1 for true
)      % Index into string (modular, 1-based). Implicitly display

Je pense que tu es parti errant He?
Sanchises

@Sanchises Merci! Oui, c'était dans la version précédente, mais ce n'est pas nécessaire
Luis Mendo le

En outre, cela semble bien fonctionner sans la transposition? Vous avez trop réfléchi ...;)
Sanchises Le

@Sanchises Sans la transposition, cela ne fonctionne pas en entrée [1; 1], à cause de la façon dont MATL (AB) gère la forme d'un tableau avec indexation. (Alternativement, la transposition pourrait être remplacée par Hela fin, c'est pourquoi elle était initialement là)
Luis Mendo

Ah oui, je pensais que c'était là à cause du comportement des lignes, mais je ne pensais pas à ce cas.
Sanchises

5

R , 109 105 octets

function(a,b){q=1:a*b
l=min(q[!q%%a])
x=rep("-",l*2)
x[c(seq(0,l,a),l+seq(0,l,b))]="|"
write(x,"",l,,"")}

Essayez-le en ligne!

Fonction anonyme. Calcule l=lcm(a,b), génère ensuite un intervalle de 0à lpar a, puis à partir lde 2*lpar b, l' établissement des indices à |et l' impression en tant que matrice avec des lcolonnes.



4

C, 72 octets

i;f(x,y){for(i=1;i%y|i%x;)putchar(i++%x?45:124);puts("|");y>0&&f(y,-x);}

4

Husk , 12 octets

†?'-'|TUṪ`%N

Essayez-le en ligne!

Oui, il y a un lcm intégré dans Husk. Non, je n'en ai pas besoin

Bonus: fonctionne avec n'importe quel nombre de valeurs d'entrée

Explication

†?'-'|TUṪ`%N    input:[2,3]
        Ṫ`%N    table of all remainders of positive naturals divided by
                input numbers:
                             [[1,1],[0,2],[1,0],[0,1],[1,2],[0,0],[1,1],[0,2],...
       U        get all elements before the first repeated one:
                             [[1,1],[0,2],[1,0],[0,1],[1,2],[0,0]]
      T         transpose:   
                             [[1,0,1,0,1,0],[1,2,0,1,2,0]]
†?'-'|          replace all truthy elements with '-' and all falsy elements
                with '|': 
                             ["-|-|-|","--|--|"]
                implicit: since this is a full program, join the resulting array
                of strings with newlines, and print to stdout

4

Mathematica, 63 octets

(s=LCM@##;Print[""<>If[i~Mod~#<1,"|","-"]~Table~{i,s}]&/@{##})&

Essayez-le en ligne!

et une autre version qui user202729 veut vraiment voir vraiment posté

Mathematica, 59 octets

(s=LCM@##;Print[""<>If[#∣i,"|","-"]~Table~{i,s}]&/@{##})&  

celui-ci utilise un caractère spécial \[Divides]


S'il s'agit de Mathematica, vous pouvez probablement utiliser à la \[Divides]place d' Modopérateur pour représenter la divisibilité, ce qui économise 4 octets. Mathics TIO ne doit pas non plus imprimer le fichier {Null, Null}.
user202729

@ user202729 J'ai corrigé l'impression en mathématiques.
J42161217

3
Je pense que votre premier commentaire était assez clair. S'il vous plaît, arrêtez de me presser pour apporter les modifications souhaitées, l'heure exacte que vous souhaitez. Donnez aux utilisateurs quelques heures pour répondre. Certains d'entre nous ont une vie hors de cet endroit
J42161217


3

APL (Dyalog) , 22 octets

Suppose ⎕IO←0. Prend A, B comme bon argument. Prime: gère la liste de saisie de n'importe quelle longueur!

{'|-'[⌽×⍵∘.|⍳∧/⍵]}

Essayez-le en ligne!

{} Lambda anonyme où représente le bon argument

'|-'[]  Indexez la chaîne avec:

  ∧/ LCM à travers l'entrée

   d' abord que beaucoup ɩ ntegers (0 à N-1)

  ⍵∘.| division reste table avec l'entrée verticalement et horizontalement

  × signum

   retourner horizontalement


Que signifie cette première hypothèse?
Calvin's Hobbies

@ HelkaHomba Cela signifie que les tableaux commencent à 0, valeur par défaut sur les interpréteurs APL, je crois.
Conor O'Brien

@ HelkaHomba Comme les systèmes APL sont proposés en versions à la fois 0 et 1, je rédige simplement l'hypothèse. Sinon, il faudrait avoir deux APL. Par exemple, ngn / apl peut exécuter ce même code sans spécifier ⎕IO←0, car il s'agit du code par défaut.
Adám


3

JavaScript (ES6), 69 octets

f=(a,b,S,A=1)=>(A%a?'-':'|')+(A%a|A%b?f(a,b,S,A+1):S?'':`
`+f(b,a,1))

Récursivement s'exécute jusqu'à ce qu'il Asoit divisible par les deux aet b- produisant un tiret ou un tuyau en fonction de ala divisibilité de A.

La fonction s’appelle alors elle-même, swapping aet b.

La Svariable empêche la fonction de s’appeler infiniment.

Cas de test:


Réponses précédentes:

JavaScript (ES8), 91 octets

f=(a,b,i=2,g=(c,d)=>d?g(d,c%d):c)=>i?'|'.padStart(a,'-').repeat(b/g(a,b))+`
`+f(b,a,i-1):''

Utilise les algorithmes:

lcm(a, b) = ab / gcd(a, b)
gcd(c, d) = d ? gcd(d, c%d) : c

S'appelle de manière récursive une seule fois pour sortir la deuxième ligne.

Cas de test:

JavaScript (ES6), 93 octets

f=(a,b,i=2,g=(c,d)=>!d=>d?c:g(d,c%d):c)=>i?('-'.repeat(a-1)+'|').repeat(a*bb/g(a,b)/a)+`
`+f(b,a,i-1):''

Même algorithme que précédemment, en utilisant repeatau lieu de padStart.


1
Je pensais padStartêtre ES8?
Neil

1
f=(a,b,A=1)=>(A%a?'-':'|')+(A%a|A%b?f(a,b,A+1):a<0?'':`\n`+f(-b,a))
l4m2

@ l4m2, je peux à peine comprendre le code que j'ai écrit il y a un an, mais il semblerait que le vôtre efface quelques octets, merci!
Rick Hitchcock

3

Scala, 98 octets

print((a to a*b).find(l=>l%a+l%b==0).map(l=>("-"*(a-1)+"|")*(l/a)+"\n"+("-"*(b-1)+"|")*(l/b)).get)

Essayez-le en ligne


Bonjour, bienvenue sur PPCG! Cela ressemble à une excellente première réponse, donc +1 de ma part. Je ne sais pas, puisque je ne l' ai jamais programmé à Scala, mais peut - *(a-1)être à joué au golf *~-aet *(b-1)à *~-b? Aussi, pourriez-vous peut-être ajouter un lien TIO avec le code de test? (Oh, et cet avatar ne me semble pas très cubique.; P)
Kevin Cruijssen le

2
Merci! Le truc avec *~-aest grande, mais malheureusement Scala nécessite plus de crochets: *(~(-a))pour préciser que les concaténations *~-, *~, ~-ne sont pas des noms de fonction de fantaisie. J'ai ajouté un lien TIO.
laitue en cubes

Ah oui, ~-peuvent être des noms de fonctions dans Scala. Je me souviens de quelqu'un qui a mentionné cela il y a longtemps. C'est dommage en ce qui concerne le golf. Encore une fois, bienvenue et bonne première réponse.
Kevin Cruijssen


3

Java 8, 125 118 117 octets

a->b->{String A="\n",B=A,t="|";for(int i=1;!A.endsWith(t)|!B.endsWith(t);B+=i++%b<1?t:"-")A+=i%a<1?t:"-";return A+B;}

-7 octets grâce à @Nevay .
-1 octet en commençant par un retour à la ligne (A="",B="\n" remplacée par A="\n",B=A).

Explication:

Essayez ici.

a->b->{             // Method with two integer parameters and String return-type
  String A="\n",    //  String top line (starting with a trailing new-line)
         B=A,       //  String bottom-line (starting with a new-line)
         t="|";     //  Temp String "|" which is used multiple times
  for(int i=1;      //  Index-integer, starting at 1
      !A.endsWith(t)|!B.endsWith(t);
                    //  Loop as long as both Strings aren't ending with "|"
      B+=           //    After every iteration: append `B` with:
         i++%b<1?   //     If `i` is divisible by `b`:
                    //     (and increase `i` by 1 in the process)
          t         //      `t` (holding "|")
         :          //     Else:
          "-")      //      A literal "-"
    A+=             //   Append `A` with:
       i%a<1?       //    If `i` is divisible by `a`
        t           //     `t` (holding "|")
       :            //    Else:
        "-";        //     A literal "-"
                    //  End of loop (implicit / single-line body)
  return A+B;       //  Return both lines, separated by the new-line `B` started with
}                   // End of method

1
118 octets:a->b->{String A="",B="\n",k="|";for(int i=0;!A.endsWith(k)|!B.endsWith(k);B+=i%b<1?k:"-")A+=++i%a<1?k:"-";return A+B;}
Nevay

@ Merci Merci. Je ne peux pas croire que j'ai manqué la chose la plus évidente !A.endsWith(t)|!B.endsWith(t)lorsque je cherchais un moyen court de vérifier si les deux se terminaient par |.. Et commencer par B avec une nouvelle ligne au lieu de la placer entre eux au retour est également intelligent.
Kevin Cruijssen


2

Python 2 , 89 octets

Pas l’entrée Python 2 la plus courte, mais une approche différente de celle gcd qui peut encore être jouable au golf.

a,b=input()
h,p='-|'
x=b*(h*~-a+p),a*(h*~-b+p)
for v in x:print v[~zip(*x).index((p,p)):]

Essayez-le en ligne!


2

Haskell , 66 60 octets

a#b=do x<-[a,b];lcm a b`take`cycle(([2..x]>>"-")++"|")++"\n"

Essayez-le en ligne!


Même longueur:

a#b=unlines[take(lcm a b)$cycle$([2..x]>>"-")++"|"|x<-[a,b]]

Ancienne solution:

l!x=[1..div l x]>>([2..x]>>"-")++"|"
a#b|l<-lcm a b=l!a++'\n':l!b

1
Vous pouvez enregistrer un octet avec '\n':.
Laikoni

@Laikoni Attention, je me rapproche de toi
BlackCap le

1

C (gcc) , 121 99 93 92 89 octets

Cela devrait être beaucoup plus court, hmmmm ....

#define L(x)for(j=-1,i=a;j<i;i+=i%b||i%a)putchar(++j?j%x?45:124:10);
i,j;f(a,b){L(a)L(b)}

Essayez-le en ligne!



1

SOGL V0.12 , 19 16 octets

2{H┌*┐+..*..g/mP

Essayez-le ici!

Explication:

2{                two times do
  H                 decreate ToS - input - by 1
   ┌*               get that many dashes
     ┐+             append a vertical bar
       ..*          push both inputs multiplied           \
          ..g       push gcd(input1, input2)              | LCM - 7 bytes :/
             /      divide the multiblication by the GCD  /
              m     mold the string to that length
               P    print that in a new line

Vous avez documenté avant la mise en œuvre? o0
totallyhuman

1
@icrieverytim SOGL a beaucoup, beaucoup de choses documentées qui ne sont pas implémentées. : p La documentation est essentiellement ma liste TODO (ce que je fais rarement: p)
dzaima

1

Empilés , 42 38 octets

[:...lcm@z:[:z\/\#-'-'*\rep'|'+out]"!]

Essayez-le en ligne!

Entrez sous la forme d'une paire de nombres. Tous les tests mis en place ressemblent un peu à des bâtiments.

Explication

Cette première prend en compte le nombre lcmde deux entrées z. Ensuite, pour chaque numéro k, nous généronsz / k chaînes -de longueur k - 1, en ajoutant| à la fin de chaque nombre et en sortie.

Tentatives précédentes comptées

42 octets: [:...lcm@z:[:z\/\#-'-'*\rep'|'+''#`out]"!]

Autres tentatives

43 octets: [:...lcm@z:[:z\/\#-'-'*\rep'|'#`'|'+out]"!]

45 octets: ['@lcm'!#~@z,[:z\/\#-'-'*\rep'|'#`'|'+out]"!]

45 octets: [:...lcm@x[x'-'*\#<$betailmap'|'#`'|'+out]"!]

53 octets: [:...lcm'-'*@z#-'.'*'('\+')'+'.'+[z\'$1|'repl out]"!]

54 octets: [:...lcm@x{!x'-'*('('n#-'.'*').')''#`'$1|'repl out}"!]


1

JavaScript (ES6), 89

f=(a,b,t=`
`,l=0,R=n=>'-'.repeat(n-1)+'|')=>l||1/t?f(a,b,l<0?t+R(b,l+=b):R(a,l-=a)+t,l):t

Évaluer le LCM avec des addictions répétées.

Moins joué au golf

F=(a,b, sa='', sb='', la=0, lb=0)=>
{
    var R=n=>'-'.repeat(n-1)+'|'
    if (la != lb || la == 0)
    {
        if (la < lb) {
            sa += R(a)
            la += a
        }
        else
        {
            sb += R(b)
            lb += b
        }
        return F(a, b, sa, sb, la, lb)
    }
    else
        return sa+'\n'+sb
}

Tester

f=(a,b,t=`
`,l=0,R=n=>'-'.repeat(n-1)+'|')=>l||1/t?f(a,b,l<0?t+R(b,l+=b):R(a,l-=a)+t,l):t

function update()
{
  var [a,b]=I.value.match(/\d+/g)
  R.textContent = f(+a,+b)
}  

update()
<input id=I oninput='update()' value='4 6'>
<pre id=R></pre>


1

VBA (Excel), 144 142 octets

Sub q()
a=[a1]
b=[a2]
Do Until c=d And d="|"
e=e+1
c=IIf(e Mod a,"-","|")
d=IIf(e Mod b,"-","|")
f=f& c
g=g& d
Loop
Debug.? f& vbCr& g
End Sub

-2 octets. merci Sir Washington Guedes.


Oui, merci @WashingtonGuedes. :)
remuer

1

Ruby , 64 57 octets

->a,b{[a,b].map{|n|(1..a.lcm(b)).map{|x|x%n>0??-:?|}*''}}

-7 octets grâce à G B.

Essayez-le en ligne!


Vous n'avez pas besoin d'inclure les 'options', si la fonction renvoie 2 chaînes, c'est bon. Et vous pouvez le raccourcir en utilisant l'opérateur array * (array * '' est équivalent à array.join)
GB

@GB merci pour votre aide!
Snack

1

Charbon de bois , 32 30 29 octets

NθNη≔θζW﹪ζη≦⁺θζE⟦θη⟧…⁺×-⁻ι¹|ζ

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Edit: 1 octet enregistré grâce à @ ASCII uniquement.



@ ASCII-only Quelque chose de nouveau à documenter!
Neil

Merci de documenter! (désolé, je n'ai pas vraiment envie de documenter des choses même si je devrais vraiment le faire), si cela ne vous dérange pas, il y en a d'autres à documenter. chat.stackexchange.com/transcript/240?m=40270513#40270513 chat.stackexchange. com / transcript / 240? m = 40270838 # 40270838 (vous ne savez pas exactement où les distributions directionnelles doivent aller, ce ne sont ni des commandes ni des opérateurs)
ASCII uniquement

1

Feuilles de Google, 77 octets

Formule anonyme de feuille de calcul qui prend des entrées A1:B1et des sorties dans la cellule appelante

=REPT(REPT("-",A1-1)&"|",LCM(1:1)/A1)&"
"&REPT(REPT("-",B1-1)&"|",LCM(1:1)/B1

-4 octets grâce à @EngineerToast


1
Pouvez-vous présumer que rien d'autre n'est entré dans la rangée 1? Si c'est le cas, vous pouvez mettre en court-circuit LCM(A1,B1)juste LCM(1:1)pour économiser 4 octets. Je pense qu'il est raisonnable de supposer une feuille de départ vierge et de spécifier où se trouvent les entrées et la formule.
Ingénieur Toast

1

Excel VBA, 79 octets

Fonction de fenêtre immédiate VBE anonyme qui prend une entrée de la plage [A1:B1] et affiche une visualisation de leur LCM dans la fenêtre immédiate VBE.

Ceci est un portage de ma réponse Google Sheets .

?[Rept(Rept("-",A1-1)&"|",LCM(1:1)/A1)]:?[Rept(Rept("-",B1-1)&"|",LCM(1:1)/B1)]

1

Japt , 12 octets

£×/Ury)î|ù-X

Japt Interpreter

Entrées sous forme de tableau de nombres. Sort en tant que tableau de chaînes. L'indicateur -R améliore légèrement l'apparence de la sortie, mais n'est pas nécessaire pour la logique.

Explication:

£              For each of the two inputs as X, print...
        |           The string "|"
         ù-X        Left-padded with "-" until it is X characters long
       î            Repeated until its length is
 ×/Ury)             The Least Common Multiple

Un merci supplémentaire à Shaggy pour avoir trouvé quelques octets à sauvegarder.



@ Shaggy Intéressant, je n'ai jamais pensé à utiliser cette partie de Japt de cette manière.
Kamil Drakari

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.