Zilustruj najmniejszą wspólną wielokrotność


50

Biorąc pod uwagę dwie dodatnie liczby całkowite, A i B, ilustrują ich najmniejszą wielokrotność , wyprowadzając dwie linie myślników ( -) o długości LCM (A, B) po zastąpieniu każdego myślnika Ath w pierwszej linii i każdego myślnika Bth w drugiej linii pionowymi kreskami ( |).

W ten sposób koniec każdej linii będzie jedynym miejscem, w którym linia będzie znajdować się dwa |.

Na przykład, jeśli A = 6 i B = 4, LCM (6, 4) = 12, więc:

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

Zatem końcowy wynik byłby

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

Kolejność liczb wejściowych powinna odpowiadać kolejności wierszy.

Najkrótszy kod w bajtach wygrywa.

Przypadki testowe

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 Rozszerzanie odpowiedzi z codegolf.stackexchange.com/q/94999 wydaje się łatwiejsze niż z tej. Tak czy inaczej, ludzie będą się dobrze bawić, robiąc to, co jest dobrym powodem imo.
Calvin's Hobbies

1
Czy mogę wyprowadzić tablicę z dwoma ciągami, po jednym dla każdej linii?
BlackCap

@ BlackCap Nie. Wydrukuj ciągi na standardowe wyjście lub plik albo zwróć cały ciąg multilinii.
Calvin's Hobbies

2
Premia za obsługę dowolnej liczby danych wejściowych?
Adám

1
@HelkaHomba Ok dzięki; zapisano jeszcze 1 bajt. :) (Jakby istniał jakiś inny powód, aby zadawać takie pytania na temat wyzwań związanych z codegolfem;; p)
Kevin Cruijssen

Odpowiedzi:


11

Python 3, 80 bajtów

Zaoszczędzono 1 bajt dzięki Halvardowi Hummelowi i 1 bajt dzięki Jonathanowi Allanowi.

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

Przetestuj online!

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

Przetestuj online! (82 bajty - wstępna odpowiedź)

To najlepsze, co mogłem zrobić w Pythonie 2 (81 bajtów). Wygląda na to, że nie mogę skomentować tej odpowiedzi, po prostu opublikuję to tutaj:

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

Przetestuj online!

Pierwsza próba tutaj, prawdopodobnie nieoptymalna!


2
Witamy w PPCG!
Laikoni

3
@Laikoni Dziękujemy! To wydaje się być zabawną społecznością :-)


@HalvardHummel Dzięki, opublikuje jako alternatywę!

Próbując całkowicie odmiennego podejścia, zdałem sobie sprawę, że twoja wersja może być wykonana w 80 .
Jonathan Allan,

10

Haskell , 57 bajtów

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

Wypróbuj online!


Nigdy wcześniej nie widziałem tej 0^0=1sztuczki - sprytne
BlackCap

@BlackCap Nie mogę się o to ubiegać, ponieważ widziałem to już kilka razy, chociaż nie pamiętam, gdzie pierwszy raz zobaczyłem lewę.
Laikoni,


6

MATL , 16 15 bajtów

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

Dane wejściowe to wektor kolumnowy z dwiema liczbami. Wypróbuj online!

Jako bonus, dane wejściowe mogą zawierać więcej niż dwie liczby . Wypróbuj online!

Wyjaśnienie

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

Myślę, że zbłądziłeś He?
Sanchises,

@Sanchises Thanks! Tak, było w poprzedniej wersji, ale nie jest to konieczne
Luis Mendo

Czy wydaje się to również działać bez transpozycji? Zastanawiałeś się nad rzeczami ...;)
Sanchises

@Sanchises Bez transpozycji nie działa na dane wejściowe [1; 1], ponieważ MATL (AB) obsługuje kształt tablicy z indeksowaniem. (Alternatywnie transpozycja może zostać zastąpiona Hena końcu, dlatego początkowo tam była)
Luis Mendo

Ach tak, pomyślałem, że to tam było z powodu zachowania w rzędzie, ale nie pomyślałem o tym przypadku krawędzi.
Sanchises,

5

R , 109 105 bajtów

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

Wypróbuj online!

Funkcja anonimowa. Oblicza l=lcm(a,b), a następnie generuje zakres od 0do lprzez a, a następnie od ldo 2*ldo b, ustawiając wskaźniki na |i drukując jako macierz z lkolumnami.



4

C, 72 bajty

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

4

Łuska , 12 bajtów

†?'-'|TUṪ`%N

Wypróbuj online!

Tak, w Husk jest wbudowany lcm. Nie potrzebuję tego.

Bonus: działa z dowolną liczbą wartości wejściowych

Wyjaśnienie

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

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

Wypróbuj online!

oraz kolejna wersja, którą użytkownik naprawdę chce naprawdę opublikować

Mathematica, 59 bajtów

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

ten używa znaku specjalnego \[Divides]


Jeśli jest to Mathematica, prawdopodobnie możesz użyć \[Divides]zamiast Modoperatora do reprezentowania podzielności, co oszczędza 4 bajty. Również matematyka TIO nie powinna drukować {Null, Null}.
user202729,

@ user202729 Naprawiłem wydruk Mathics.
J42161217,

3
Myślę, że twój pierwszy komentarz był wystarczająco jasny. Proszę, przestań mnie naciskać, aby dokonać żądanych zmian, dokładnie tego, czego chcesz. Daj użytkownikom kilka godzin na odpowiedź. Niektórzy z nas mają życie poza tym miejscem
J42161217,


3

APL (Dyalog) , 22 bajty

Zakłada ⎕IO←0. Uważa A, B za właściwy argument. Bonus: obsługuje listę wprowadzania dowolnej długości!

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

Wypróbuj online!

{} Anonimowa lambda gdzie reprezentuje właściwy argument

'|-'[] Indeksuj ciąg za pomocą:

  ∧/ LCM na wejściu

   najpierw tyle ɩ ntegerów (od 0 do N-1)

  ⍵∘.| podział pozostałej tabeli z danymi wejściowymi w pionie i poziomo

  × signum

   Obróć poziomo


Co oznacza to pierwsze założenie?
Calvin's Hobbies

@HelkaHomba Oznacza to, że indeks tablic zaczyna się od 0, domyślnie w interpretatorach APL, jak sądzę.
Conor O'Brien,

@HelkaHomba Ponieważ systemy APL występują zarówno w wersjach 0, jak i 1, po prostu piszę założenie. W przeciwnym razie należałoby mieć dwie APL-y. Na przykład ngn / apl może uruchamiać ten sam kod bez określania go ⎕IO←0, ponieważ jest to ustawienie domyślne.
Adám


3

JavaScript (ES6), 69 bajtów

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

Rekurencyjnie działa, dopóki nie Ajest podzielna przez jedno ai drugie b- generowanie myślnika lub potoku na podstawie apodzielności przez A.

Następnie funkcja wywołuje się, zamieniając ai b.

SZmienna zapobiega funkcji z wywołaniem się w nieskończoność.

Przypadki testowe:


Poprzednie odpowiedzi:

JavaScript (ES8), 91 bajtów

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

Wykorzystuje algorytmy:

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

Rekurencyjnie wywołuje się tylko raz, aby wyświetlić drugą linię.

Przypadki testowe:

JavaScript (ES6), 93 bajty

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

Ten sam algorytm jak poprzednio, używając repeatzamiast padStart.


1
Myślałem, że padStartto 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, ledwo rozumiem kod, który napisałem rok temu, ale wygląda na to, że twój goli trochę bajtów, dzięki!
Rick Hitchcock

3

Scala, 98 bajtów

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

Wypróbuj online


Cześć, witamy w PPCG! To wygląda na świetną pierwszą odpowiedź, więc daj +1 ode mnie. Nie jestem pewien, ponieważ nigdy nie programowałem w Scali, ale można *(a-1)grać w golfa do *~-ai *(b-1)do *~-b? A może mógłbyś dodać link TIO z kodem testowym? (Och, a ten awatar nie wydaje mi się zbyt sześcienny.; P)
Kevin Cruijssen

2
Dzięki! Sztuczka ze *~-ajest super, ale niestety wymaga więcej Scala wsporniki: *(~(-a))aby wyjaśnić, że powiązań, *~-, *~, ~-nie są fantazyjne nazwy funkcji. Dodałem link TIO.
sześcienna sałata

Ach tak, ~-mogą być nazwami funkcji w Scali. Pamiętam, że ktoś wspomniał o tym już dawno temu. To niefortunne w odniesieniu do gry w golfa. Znowu witamy i miła pierwsza odpowiedź.
Kevin Cruijssen


3

Java 8, 125 118 117 bajtów

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 bajtów dzięki @Nevay .
-1 bajt, zaczynając od końcowego nowego wiersza ( A="",B="\n"zastąpiony przez A="\n",B=A).

Wyjaśnienie:

Wypróbuj tutaj.

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 bajtów: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 Thanks. Nie mogę uwierzyć, że przegapiłem najbardziej oczywistą rzecz, !A.endsWith(t)|!B.endsWith(t)gdy szukałem krótkiego sposobu, aby sprawdzić, czy oba kończą się na |.. A rozpoczęcie B z nową linią zamiast umieszczania jej między nimi na powrocie jest również sprytne.
Kevin Cruijssen


2

Python 2 , 89 bajtów

Nie jest to najkrótsza pozycja w Pythonie 2, ale inne podejście niż to, gcd które może być jeszcze grywalne.

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

Wypróbuj online!


2

Haskell , 66 60 bajtów

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

Wypróbuj online!


Ta sama długość:

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

Stare rozwiązanie:

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

1
Możesz zapisać bajt za pomocą '\n':.
Laikoni,

@Laikoni Ostrożnie, zbliżam się do ciebie
BlackCap



1

SOGL V0.12 , 19 16 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie:

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

Udokumentowałeś przed wdrożeniem? o0
całkowicie ludzki,

1
@icrieverytim SOGL ma wiele, wiele documentated rzeczy, które nie są realizowane. : p Dokumentacja jest w zasadzie moją listą
DO

1

Skumulowane , 42 38 bajtów

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

Wypróbuj online!

Wprowadź w postaci pary liczb. Wszystkie połączone przypadki testowe wyglądają trochę jak budynki.

Wyjaśnienie

Najpierw pobiera się lcmz dwóch liczb wejściowych z. Następnie dla każdej liczby kgenerujemy z / kciągi -długości k - 1, dodając| do końca każdego i wyprowadzając każdy.

Poprzednie policzone próby

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

Inne próby

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

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

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

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

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

Ocena LCM z powtarzającymi się uzależnieniami.

Mniej golfa

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 bajty

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 bajty. dziękuję Sir Washington Guedes.


Tak Dziękuję @WashingtonGuedes. :)
remoel

1

Rubin , 64 57 bajtów

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

-7 bajtów dzięki G B.

Wypróbuj online!


Nie musisz dołączać „puts”, jeśli funkcja zwraca 2 ciągi, jest w porządku. I można zrobić to za pomocą krótszy tablicę * Operator (array * „” jest równoważne Array.join)
PL

@GB dzięki za pomoc!
Przekąska

1

Węgiel drzewny , 32 30 29 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 1 bajt dzięki tylko @ ASCII.



@ Tylko ASCII Coś nowego do udokumentowania!
Neil

Dzięki za dokumentację! (przepraszam, nie mam ochoty dokumentować rzeczy, chociaż powinienem naprawdę to zrobić), jeśli nie masz nic przeciwko dokumentowaniu chat.stackexchange.com/transcript/240?m=40270513#40270513 chat.stackexchange. com / trancript / 240? m = 40270838 # 40270838 (nie jestem pewien, dokąd powinny kierować rzutowania , nie są to polecenia ani operatory)
tylko ASCII,

1

Arkusze Google, 77 bajtów

Anonimowa formuła arkusza roboczego, która pobiera dane wejściowe z zakresu A1:B1i dane wyjściowe do komórki wywołującej

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

-4 Bajty dzięki @EngineerToast


1
Czy możesz założyć, że nic więcej nie jest wprowadzane do wiersza 1? Jeśli tak, możesz skrócić LCM(A1,B1)tylko LCM(1:1)do zapisania 4 bajtów. Myślę, że uzasadnione jest założenie pustego arkusza początkowego i określenie, gdzie znajdują się zarówno dane wejściowe, jak i formuła.
Engineer Toast,

1

Excel VBA, 79 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe z zakresu [A1:B1]i wysyła wizualizację LCM do bezpośredniego okna VBE.

To jest port odpowiedzi na moje Arkusze Google .

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

1

Japt , 12 bajtów

£×/Ury)î|ù-X

Japt Interpreter

Dane wejściowe jako tablica liczb. Dane wyjściowe jako tablica ciągów. Flaga -R nieznacznie poprawia wygląd danych wyjściowych, ale nie jest konieczna dla logiki.

Wyjaśnienie:

£              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

Dodatkowe podziękowania dla Shaggy za znalezienie bajtów do zapisania.



@Shaggy Interesujące, nigdy nie myślałem o użyciu tej części Japt w ten właśnie sposób.
Kamil Drakari

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.