Ilustrar el mínimo común múltiplo


50

Dados dos enteros positivos, A y B, ilustran su mínimo común múltiplo generando dos líneas de guiones ( -) con LCM de longitud (A, B) después de reemplazar cada guión Ath en la primera línea y cada guión Bth en la segunda línea con barras verticales ( |)

De esta manera, el final de cada línea será el único lugar donde se |alinean dos.

Por ejemplo, si A = 6 y B = 4, LCM (6, 4) = 12, entonces:

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:
-----|-----|
---|---|---|

Por lo tanto, el resultado final sería

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

El orden de los números de entrada debe corresponder al orden de las líneas.

El código más corto en bytes gana.

Casos de prueba

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 Ampliar una respuesta desde codegolf.stackexchange.com/q/94999 parece más fácil que desde esa. De cualquier manera, la gente se divertirá haciendo esto, lo cual es una buena razón.
Aficiones de Calvin

1
¿Puedo generar una matriz con dos cadenas, una para cada línea?
BlackCap

@BlackCap No. Imprima las cadenas en stdout o en un archivo o devuelva la cadena completa de varias líneas.
Aficiones de Calvin

2
¿Bonificación por manejar un número arbitrario de entradas?
Adám

1
@HelkaHomba Ok, gracias; guardado 1 byte más. :) (Como si hubiera alguna otra razón para hacer tales preguntas sobre los desafíos de codegolf.; P)
Kevin Cruijssen

Respuestas:


11

Python 3, 80 bytes

Ahorré 1 byte gracias a Halvard Hummel y 1 byte gracias a Jonathan Allan.

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

¡Pruébalo en línea!

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

¡Pruébalo en línea! (82 bytes - respuesta inicial)

Esto es lo mejor que podría hacer en Python 2 (81 bytes). Parece que no puedo comentar sobre esa respuesta, solo publicaré esto aquí:

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

¡Pruébalo en línea!

¡Primer intento aquí, probablemente subóptimo!


2
Bienvenido a PPCG!
Laikoni

3
@Laikoni ¡Gracias! Esto parece una comunidad divertida :-)


@HalvardHummel Gracias, publicaremos como una alternativa!

Mientras intentaba un enfoque completamente diferente, me di cuenta de que su versión se podía hacer en 80 .
Jonathan Allan

10

Haskell , 57 bytes

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

Pruébalo en línea!


Nunca he visto ese 0^0=1truco antes - inteligente
BlackCap

@BlackCap No puedo reclamarlo porque lo he visto varias veces antes, aunque no recuerdo dónde vi el truco primero.
Laikoni


6

MATL , 16 15 bytes

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

La entrada es un vector de columna con los dos números. Pruébalo en línea!

Como beneficio adicional, la entrada puede contener más de dos números . Pruébalo en línea!

Explicación

'-|'   % 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

Creo que te fuiste en un callejón He?
Sanchises

@Sanchises Gracias! Sí, estaba en la versión anterior, pero no es necesario
Luis Mendo

Además, ¿esto parece funcionar bien sin la transposición? Has estado pensando demasiado ...;)
Sanchises

@Sanchises Sin la transposición no funciona para la entrada [1; 1], debido a cómo MATL (AB) maneja la forma de la matriz con la indexación. (Alternativamente, la transposición podría reemplazarse Heal final, por lo que inicialmente estaba allí)
Luis Mendo

Ah sí, pensé que estaba allí debido al comportamiento de la fila, pero no pensé en este caso extremo.
Sanchises

5

R , 109105 bytes

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,,"")}

Pruébalo en línea!

Función anónima. Calcula l=lcm(a,b), a continuación, genera un intervalo de 0a lpor a, a continuación, a partir lde 2*lpor b, el establecimiento de los índices para |impresión y como una matriz con lcolumnas.



4

C, 72 bytes

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

4

Casco , 12 bytes

†?'-'|TUṪ`%N

Pruébalo en línea!

Sí, hay un mcm incorporado en Husk. No, no lo necesito.

Bonificación: funciona con cualquier cantidad de valores de entrada

Explicación

†?'-'|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 bytes

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

Pruébalo en línea!

y otra versión que user202729 realmente quiere ver publicada

Mathematica, 59 bytes

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

este usa un caracter especial \[Divides]


Si esto es Mathematica, probablemente pueda usarlo en \[Divides]lugar del Modoperador para representar la divisibilidad, lo que ahorra 4 bytes. También Mathics TIO no debe imprimir el {Null, Null}.
user202729

@ user202729 Arregle la impresión de Mathics.
J42161217

3
Creo que tu primer comentario fue lo suficientemente claro. Por favor, deja de presionarme para hacer los cambios que deseas, la hora exacta que deseas. Dé a los usuarios algunas horas para responder. Algunos de nosotros tenemos una vida fuera de este lugar
J42161217


3

APL (Dyalog) , 22 bytes

Asume ⎕IO←0. Toma A, B como argumento correcto. Bonificación: maneja la lista de entrada de cualquier longitud.

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

Pruébalo en línea!

{... } lambda anónimo donde representa el argumento correcto

'|-'[... ] indexe la cadena con:

  ∧/ LCM a través de la entrada

   primero que muchos dedos (0 a N-1)

  ⍵∘.| tabla de resto de división con la entrada vertical y horizontalmente

  × signum

   voltear horizontalmente


¿Qué significa esa primera suposición?
Aficiones de Calvin

@HelkaHomba Significa que el índice de matrices comienza en 0, un valor predeterminado en los intérpretes APL, creo.
Conor O'Brien

@HelkaHomba Dado que los sistemas APL vienen en sabores basados ​​en 0 y en 1, simplemente escribo la suposición. De lo contrario, uno tendría que tener dos APL. Por ejemplo, ngn / apl puede ejecutar este mismo código sin especificar ⎕IO←0, ya que ese es el valor predeterminado allí.
Adám


3

JavaScript (ES6), 69 bytes

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

Se ejecuta recursivamente hasta que Asea ​​divisible por ambos ay b, generando un guión o una tubería en función de ala divisibilidad por A.

La función se llama a sí misma, intercambiando ay b.

La Svariable evita que la función se llame a sí misma infinitamente.

Casos de prueba:


Respuestas anteriores:

JavaScript (ES8), 91 bytes

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):''

Utiliza los algoritmos:

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

Se llama recursivamente solo una vez para generar la segunda línea.

Casos de prueba:

JavaScript (ES6), 93 bytes

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):''

Mismo algoritmo que antes, usando en repeatlugar de padStart.


1
Pensé que padStartera 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, apenas puedo entender el código que escribí hace un año, pero parece que el tuyo elimina algunos bytes, ¡gracias!
Rick Hitchcock

3

Scala, 98 bytes

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

Pruébalo en línea


Hola, bienvenido a PPCG! Esto parece una gran primera respuesta, por lo que +1 de mi parte. No estoy seguro, ya que nunca he programado en Scala, pero puedo *(a-1)estar Jugamos al golf a *~-ay *(b-1)a *~-b? Además, ¿podría agregar un enlace TIO con el código de prueba? (Ah, y ese avatar no me parece muy cúbico.; P)
Kevin Cruijssen

2
¡Gracias! El truco con *~-aes grande, pero por desgracia Scala requiere más soportes: *(~(-a))dejar claro que las concatenaciones *~-, *~, ~-no son nombres de funciones de fantasía. Agregué un enlace TIO.
lechuga cúbica

Ah sí, ~-pueden ser nombres de funciones en Scala. Recuerdo que alguien mencionó eso antes hace bastante tiempo. Eso es lamentable con respecto al golf. Nuevamente bienvenido, y buena primera respuesta.
Kevin Cruijssen


3

Java 8, 125 118 117 bytes

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 bytes gracias a @Nevay .
-1 byte comenzando con una nueva línea final ( A="",B="\n"reemplazada por A="\n",B=A).

Explicación:

Pruébalo aquí.

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 bytes: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

@Nevay Gracias. No puedo creer que me perdí lo más obvio !A.endsWith(t)|!B.endsWith(t)cuando estaba buscando una forma corta de verificar si ambos terminan con |... Y comenzar B con una nueva línea en lugar de ponerla entre ellos en el regreso también es inteligente.
Kevin Cruijssen


2

Python 2 , 89 bytes

No es la entrada más corta de Python 2, sino un enfoque diferente al gcd que aún puede ser golfable.

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)):]

Pruébalo en línea!


2

Haskell , 66 60 bytes

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

Pruébalo en línea!


Mismo largo:

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

Vieja solución:

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

1
Puede guardar un byte con '\n':.
Laikoni

@Laikoni Cuidado, me estoy acercando a ti
BlackCap



1

SOGL V0.12 , 19 16 bytes

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

Pruébalo aquí!

Explicación:

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

¿Documentaste antes de implementar? o0
totalmente humano

1
@icrieverytim SOGL tiene muchas, muchas cosas documentadas que no se implementan. : p La documentación es básicamente mi lista TODO (lo cual rara vez hago: p)
dzaima

1

Apilado , 42 38 bytes

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

Pruébalo en línea!

Entrada en forma de un par de números. Todos los casos de prueba juntos se parecen a los edificios.

Explicación

Este primero toma el lcmde los dos números de entrada z. Luego, para cada número k, generamos z / kcadenas de -longitud k - 1, agregando |al final de cada una y generando cada una.

Intentos contados anteriores

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

Otros intentos

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

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

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

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

54 bytes: [:...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

Evaluación de la LCM con adicciones repetidas.

Menos 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
}

Prueba

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 bytes

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 bytes. gracias Sir Washington Guedes.


Sí, gracias @WashingtonGuedes. :)
remoel

1

Ruby , 64 57 bytes

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

-7 bytes gracias a G B.

Pruébalo en línea!


No es necesario incluir los 'put', si la función devuelve 2 cadenas está bien. Y puede acortarlo utilizando el operador array * (array * '' es equivalente a array.join)
GB

@GB gracias por tu ayuda!
Merienda

1

Carbón , 32 30 29 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: guardado 1 byte gracias a @ ASCII-only.



@ Solo ASCII ¡Algo nuevo para documentar!
Neil

Gracias por documentar! (lo siento, realmente no tengo ganas de documentar cosas, aunque realmente debería hacerlo), si no le importa, hay algo más que documentar chat.stackexchange.com/transcript/240?m=40270513#40270513 chat.stackexchange. com / transcript / 240? m = 40270838 # 40270838 (no estoy seguro de dónde deben ir los lanzamientos direccionales, no son comandos ni operadores)
Solo ASCII

1

Hojas de cálculo de Google, 77 bytes

Fórmula de hoja de trabajo anónima que toma entradas del rango A1:B1y salidas a la celda que llama

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

-4 Bytes gracias a @EngineerToast


1
¿Se puede suponer que nada más se ingresa en la fila 1? Si es así, puede acortar LCM(A1,B1)a solo LCM(1:1)para guardar 4 bytes. Creo que es razonable suponer una hoja de inicio en blanco y especificar dónde están las entradas y la fórmula.
Ingeniero Brindis

1

Excel VBA, 79 bytes

Función de ventana inmediata anónima de VBE que toma la entrada del rango [A1:B1]y emite una visualización de su LCM a la ventana inmediata de VBE.

Este es un puerto de mi respuesta de Google Sheets .

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

1

Japt , 12 bytes

£×/Ury)î|ù-X

Intérprete Japt

Entradas como una matriz de números. Salidas como un conjunto de cadenas. El indicador -R mejora ligeramente el aspecto de la salida, pero no es necesario para la lógica.

Explicación:

£              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

Gracias adicionales a Shaggy por encontrar algunos bytes para guardar.



@ Shaggy Interesante, nunca pensé usar esa parte de Japt de esa manera exacta.
Kamil Drakari

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.