Illustrare il minimo comune multiplo


50

Dati due numeri interi positivi, A e B, illustrano il loro minimo comune multiplo emettendo due linee di trattini ( -) con lunghezza LCM (A, B) dopo aver sostituito ogni trattino Ath nella prima riga e ogni trattino Bth nella seconda riga con barre verticali ( |).

In questo modo, la fine di ogni riga sarà l'unico posto in cui si |allineano due .

Ad esempio, se A = 6 e B = 4, LCM (6, 4) = 12, quindi:

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

Quindi l'output finale sarebbe

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

L'ordine dei numeri di input deve corrispondere all'ordine delle righe.

Vince il codice più breve in byte.

Casi test

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 L'estensione di una risposta da codegolf.stackexchange.com/q/94999 sembra più facile di quella. Ad ogni modo, la gente si divertirà a fare questo, che è una buona ragione imo.
Hobby di Calvin il

1
Posso generare un array con due stringhe, una per ogni riga?
BlackCap

@BlackCap No. Stampa le stringhe su stdout o su un file o restituisce l'intera stringa multilinea.
Calvin's Hobbies,

2
Bonus per la gestione di un numero arbitrario di input?
Adám,

1
@HelkaHomba Ok grazie; salvato un altro byte. :) (Come se ci fossero altri motivi per porre tali domande sulle sfide di codegolf.; P)
Kevin Cruijssen,

Risposte:


11

Python 3, 80 byte

Salvato 1 byte grazie a Halvard Hummel e 1 byte grazie a Jonathan Allan.

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

Provalo online!

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

Provalo online! (82 byte - risposta iniziale)

Questo è il massimo che potrei fare in Python 2 (81 byte). Sembra che non posso commentare quella risposta, ma inserirò qui solo questo:

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

Provalo online!

Primo tentativo qui, probabilmente non ottimale!


2
Benvenuti in PPCG!
Laikoni,

3
@Laikoni Grazie! Sembra una comunità divertente :-)


@HalvardHummel Grazie, posterò in alternativa!

Mentre provavo un approccio completamente diverso, mi sono reso conto che la tua versione poteva essere realizzata in 80 .
Jonathan Allan,

10

Haskell , 57 byte

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

Provalo online!


Non ho mai visto quel 0^0=1trucco prima - intelligente
BlackCap il

@BlackCap Non posso reclamarlo da solo perché l'ho visto alcune volte prima, anche se non ricordo dove ho visto prima il trucco.
Laikoni,


6

MATL , 16 15 byte

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

L'input è un vettore di colonna con i due numeri. Provalo online!

Come bonus, l'input può contenere più di due numeri . Provalo online!

Spiegazione

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

Penso che sei partito in un randagio He?
Sanchises,

@Sanchising Grazie! Sì, era nella versione precedente, ma non è necessario
Luis Mendo,

Inoltre, questo sembra funzionare bene senza la trasposizione? Hai pensato troppo alle cose ...;)
Sanchises,

@Sanchises Senza la trasposizione non funziona per l'input [1; 1], a causa di come MATL (AB) gestisce la forma dell'array con l'indicizzazione. (In alternativa, il trasposizione potrebbe essere sostituito Healla fine, motivo per cui inizialmente era lì)
Luis Mendo,

Ah sì, ho pensato che fosse lì a causa del comportamento delle file, ma non ho pensato a questo caso limite.
Sanchises,

5

R , 109 105 byte

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

Provalo online!

Funzione anonima. Calcola l=lcm(a,b), genera quindi un intervallo da 0a lda a, poi da la 2*lda b, impostando gli indici a |e stampa come una matrice con lcolonne.



4

C, 72 byte

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

4

Buccia , 12 byte

†?'-'|TUṪ`%N

Provalo online!

Sì, c'è un mcm incorporato in Husk. No, non ne ho bisogno.

Bonus: funziona con qualsiasi numero di valori di input

Spiegazione

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

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

Provalo online!

e un'altra versione che user202729 vuole davvero vedere davvero postato

Mathematica, 59 byte

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

questo usa un carattere speciale \[Divides]


Se si tratta di Mathematica, probabilmente è possibile utilizzare \[Divides]invece Moddell'operatore per rappresentare la divisibilità, risparmiando 4 byte. Inoltre, Mathics TIO non dovrebbe stampare il file {Null, Null}.
user202729,

@ user202729 Ho corretto la stampa matematica.
J42161217,

3
Penso che il tuo primo commento sia stato abbastanza chiaro. Per favore, smetti di premermi per fare le modifiche che vuoi, l'ora esatta che desideri. Concedi agli utenti alcune ore per rispondere. Alcuni di noi hanno una vita fuori da questo posto
J42161217,


3

APL (Dyalog) , 22 byte

Assume ⎕IO←0. Prende A, B come argomento giusto. Bonus: gestisce l'elenco di input di qualsiasi lunghezza!

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

Provalo online!

{... } lambda anonima dove rappresenta l'argomento giusto

'|-'[... ] indicizza la stringa con:

  ∧/ LCM attraverso l'ingresso

   prima che molti tenteger (da 0 a N-1)

  ⍵∘.| tabella dei resti di divisione con l'input in verticale e quello in orizzontale

  × Signum

   capovolgi orizzontalmente


Cosa significa quella prima assunzione?
Calvin's Hobbies,

@HelkaHomba Significa che l'indice di array inizia da 0, un valore predefinito per gli interpreti APL, credo.
Conor O'Brien,

@HelkaHomba Dato che i sistemi APL sono disponibili in versioni basate su 0 e basate su 1, scrivo semplicemente il presupposto. Altrimenti si dovrebbero avere due APL. Ad esempio, ngn / apl può eseguire lo stesso codice senza specificare ⎕IO←0, poiché è quello predefinito lì.
Adám,


3

JavaScript (ES6), 69 byte

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

Funziona in modo ricorsivo fino a quando non Aè divisibile per entrambi ae b- emette un trattino o una pipe in base alla adivisibilità diA .

La funzione quindi chiama se stessa, scambiando a e b.

Il S variabile impedisce alla funzione di richiamarsi all'infinito.

Casi test:


Risposte precedenti:

JavaScript (ES8), 91 byte

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

Utilizza gli algoritmi:

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

Si chiama ricorsivamente solo una volta per produrre la seconda linea.

Casi test:

JavaScript (ES6), 93 byte

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

Stesso algoritmo di prima, usando repeatinvece di padStart.


1
Pensavo padStartfosse 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, riesco a malapena a capire il codice che ho scritto un anno fa, ma sembra che il tuo si sia rasato alcuni byte, grazie!
Rick Hitchcock,

3

Scala, 98 byte

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

Provalo online


Ciao, benvenuto in PPCG! Sembra un'ottima prima risposta, quindi +1 da parte mia. Non sono sicuro, dal momento che non ho mai programmato a Scala, ma può *(a-1)essere giocato a golf a *~-aed *(b-1)a *~-b? Inoltre, potresti forse aggiungere un link TIO con codice di test? (Oh, e quell'avatar non mi sembra molto cubico.; P)
Kevin Cruijssen,

2
Grazie! Il trucco con *~-aè grande, ma purtroppo Scala richiede più staffe: *(~(-a))per rendere chiaro che le concatenazioni *~-, *~, ~-non sono nomi di funzioni di fantasia. Ho aggiunto un collegamento TIO.
lattuga cubica,

Ah sì, ~-possono essere nomi di funzioni in Scala. Ricordo che qualcuno lo ha menzionato molto tempo fa. È un peccato per il golf. Di nuovo benvenuto e bella prima risposta.
Kevin Cruijssen,

3

Java (OpenJDK 8) , 103 byte

a->b->{String l="",r="|\n";for(int m=0;(++m%a|m%b)>0;r+=m%b<1?'|':'-')l+=m%a<1?'|':'-';return l+r+'|';}

Provalo online!

110 byte, n valori di input

a->{String s="";for(int v:a){for(int i=1,z=1;z>(z=0);s+=i++%v<1?'|':'-')for(int k:a)z|=i%k;s+='\n';}return s;}

Provalo online!


3

Java 8, 125 118 117 byte

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 byte grazie a @Nevay .
-1 byte iniziando con una nuova riga finale ( A="",B="\n"sostituita con A="\n",B=A).

Spiegazione:

Provalo qui.

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 byte: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 Grazie. Non riesco a credere di aver perso la cosa più ovvia !A.endsWith(t)|!B.endsWith(t)quando stavo cercando un modo breve per verificare se entrambi finiscono con |.. E anche iniziare B con una nuova linea invece di metterla tra di loro al ritorno è intelligente.
Kevin Cruijssen,


2

Python 2 , 89 byte

Non la voce più breve di Python 2, ma un approccio diverso da quello gcd che può essere ancora giocabile a 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)):]

Provalo online!


2

Haskell , 66 60 byte

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

Provalo online!


Stessa lunghezza:

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

Vecchia soluzione:

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

1
È possibile salvare un byte con '\n':.
Laikoni,

@Laikoni Attento, ti sto chiudendo su di te
BlackCap il

1

C (gcc) , 121 99 93 92 89 byte

Questo dovrebbe essere molto più breve, 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)}

Provalo online!



1

SOGL V0.12 , 19 16 byte

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

Provalo qui!

Spiegazione:

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

Hai documentato prima dell'implementazione? o0
totalmente umano il

1
@icrieverytim SOGL ha molte, molte cose documentate che non sono implementate. : p La documentazione è sostanzialmente la mia lista TODO (cosa che faccio raramente: p)
dzaima,

1

Impilato , 42 38 byte

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

Provalo online!

Inserire sotto forma di una coppia di numeri. Tutti i casi di test messi insieme sembrano un po 'come edifici.

Spiegazione

Questo per primo prende il lcmdei due numeri di input in z. Quindi, per ogni numero k, generiamo z / kstringhe di -lunghezza k - 1, aggiungendole |alla fine di ciascuna e producendo ciascuna.

Tentativi conteggiati in precedenza

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

Altri tentativi

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

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

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

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

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

Valutazione della LCM con dipendenze ripetute.

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

Test

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 byte

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 byte. grazie Sir Washington Guedes.


Sì, grazie @WashingtonGuedes. :)
rimodella il

1

Rubino , 64 57 byte

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

-7 byte grazie a G B.

Provalo online!


Non è necessario includere 'put', se la funzione restituisce 2 stringhe va bene. E puoi accorciarlo utilizzando l'operatore array * (array * '' equivale a array.join)
GB

@GB grazie per il tuo aiuto!
Spuntino

1

Carbone , 32 30 29 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Modifica: 1 byte salvato grazie solo a @ ASCII.



@ Solo ASCII Qualcosa di nuovo da documentare!
Neil,

Grazie per la documentazione! (scusate, non ho davvero voglia di documentare le cose, anche se dovrei davvero farlo), se non vi dispiace c'è qualcosa in più per documentare chat.stackexchange.com/transcript/240?m=40270513#40270513 chat.stackexchange. com / transcript / 240? m = 40270838 # 40270838 (non sei sicuro di dove dovrebbero andare i cast direzionali, non sono comandi né operatori)
ASCII

1

Fogli Google, 77 byte

Formula anonima del foglio di lavoro che accetta input dall'intervallo A1:B1e output nella cella chiamante

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

-4 byte grazie a @EngineerToast


1
Puoi presumere che nient'altro sia immesso nella riga 1? In tal caso, è possibile cortocircuitare LCM(A1,B1)solo LCM(1:1)per salvare 4 byte. Penso che sia ragionevole presumere un foglio di partenza vuoto e specificare dove sono sia gli input che la formula.
Ingegnere Toast,

1

Excel VBA, 79 byte

Funzione di finestra immediata VBE anonima che accetta input dall'intervallo [A1:B1]e genera una visualizzazione del loro LCM nella finestra immediata di VBE.

Questa è una porta della mia risposta su Fogli Google .

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

1

Japt , 12 byte

£×/Ury)î|ù-X

Interprete Japt

Input come una matrice di numeri. Output come una matrice di stringhe. Il flag -R migliora leggermente l'aspetto dell'output, ma non è necessario per la logica.

Spiegazione:

£              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 ringraziamento extra a Shaggy per aver trovato alcuni byte da salvare.



@Shaggy Interessante, non avrei mai pensato di usare quella parte di Japt in quel modo esatto.
Kamil Drakari,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.