Minh họa bội số chung nhỏ nhất


50

Cho hai số nguyên dương A và B, minh họa bội số chung nhỏ nhất của chúng bằng cách xuất ra hai dòng dấu gạch ngang ( -) với chiều dài LCM (A, B) sau khi thay thế mỗi dấu gạch ngang Ath trong dòng đầu tiên và mỗi dấu gạch ngang Bth trong dòng thứ hai bằng các thanh dọc ( |).

Theo cách này, cuối mỗi dòng sẽ là nơi duy nhất xếp hàng hai |hàng.

Ví dụ: nếu A = 6 và B = 4, LCM (6, 4) = 12, thì:

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

Do đó, đầu ra cuối cùng sẽ là

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

Thứ tự của các số đầu vào phải tương ứng với thứ tự của các dòng.

Mã ngắn nhất tính bằng byte thắng.

Tủ thử

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 Mở rộng câu trả lời từ codegolf.stackexchange.com/q/94999 có vẻ dễ hơn từ đó. Dù bằng cách nào, mọi người sẽ có niềm vui khi làm điều này đó là một lý do khá imo.
Sở thích của Calvin

1
Tôi có thể xuất một mảng có hai chuỗi, một chuỗi cho mỗi dòng không?
BlackCap

@BlackCap Không. In các chuỗi thành thiết bị xuất chuẩn hoặc một tệp hoặc trả về toàn bộ chuỗi đa dòng.
Sở thích của Calvin

2
Tiền thưởng cho việc xử lý số lượng đầu vào tùy ý?
Adám

1
@HelkaHomba Ok cảm ơn; lưu thêm 1 byte. :) (Như thể có bất kỳ lý do nào khác để đặt câu hỏi như vậy về các thách thức của codegolf .; P)
Kevin Cruijssen

Câu trả lời:


11

Python 3, 80 byte

Đã lưu 1 byte nhờ Halvard Hummel và 1 byte nhờ Jonathan Allan.

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

Kiểm tra nó trực tuyến!

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

Kiểm tra nó trực tuyến! (82 byte - câu trả lời ban đầu)

Đây là điều tốt nhất tôi có thể làm trong Python 2 (81 byte). Có vẻ như tôi không thể bình luận về câu trả lời đó, thay vào đó tôi sẽ chỉ đăng bài này ở đây:

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

Kiểm tra nó trực tuyến!

Nỗ lực đầu tiên ở đây, có lẽ là tối ưu phụ!


2
Chào mừng đến với PPCG!
Laikoni

3
@Laikoni Cảm ơn bạn! Đây có vẻ như là một cộng đồng vui vẻ :-)


@HalvardHummel Cảm ơn, sẽ đăng thay thế!

Trong khi thử một cách tiếp cận hoàn toàn khác, tôi nhận ra phiên bản của bạn có thể được thực hiện vào năm 80 .
Jonathan Allan

10

Haskell , 57 byte

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

Hãy thử trực tuyến!


Tôi chưa bao giờ thấy 0^0=1mẹo đó trước đây - thông minh
BlackCap

@BlackCap Tôi không thể tự nhận nó vì tôi đã nhìn thấy nó một vài lần trước đây, mặc dù tôi không nhớ là tôi đã nhìn thấy mánh khóe đầu tiên ở đâu.
Laikoni


6

MATL , 16 15 byte

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

Đầu vào là một vectơ cột với hai số. Hãy thử trực tuyến!

Là một phần thưởng, đầu vào có thể chứa nhiều hơn hai số . Hãy thử trực tuyến!

Giải trình

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

Tôi nghĩ bạn đã đi lạc He?
Sanchise

@Sanchise Cảm ơn! Vâng, đó là phiên bản trước, nhưng không cần thiết
Luis Mendo

Ngoài ra, điều này dường như chỉ hoạt động tốt mà không cần chuyển đổi? Bạn đã suy nghĩ quá nhiều thứ ...;)
Sanchise

@Sanchise Nếu không có chuyển đổi, nó không hoạt động cho đầu vào [1; 1], do cách MATL (AB) xử lý hình dạng mảng với lập chỉ mục. (Ngoài ra, chuyển đổi có thể được thay thế bằng Heở cuối, đó là lý do tại sao nó ban đầu ở đó)
Luis Mendo

À vâng tôi đoán rằng nó ở đó vì hành vi hàng nhưng tôi không nghĩ đến trường hợp cạnh này.
Sanchise

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

Hãy thử trực tuyến!

Chức năng ẩn danh. Tính l=lcm(a,b), sau đó tạo một loạt từ 0để lbằng a, sau đó từ lđể 2*lbằng b, thiết lập các chỉ số để |và in ấn như một ma trận với lcột.



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

Husk , 12 byte

†?'-'|TUṪ`%N

Hãy thử trực tuyến!

Vâng, có một lcm dựng sẵn trong Husk. Không, tôi không cần nó.

Phần thưởng: hoạt động với bất kỳ số lượng giá trị đầu vào nào

Giải trình

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

Toán học, 63 byte

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

Hãy thử trực tuyến!

và một phiên bản khác mà user202729 thực sự, thực sự, thực sự muốn xem được đăng

Toán học, 59 byte

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

cái này sử dụng ký tự đặc biệt \[Divides]


Nếu đây là Mathicala, có lẽ bạn có thể sử dụng \[Divides]thay cho Modtoán tử để biểu thị mức chia hết, giúp tiết kiệm 4 byte. Ngoài ra Toán học TIO không nên in {Null, Null}.
dùng202729

@ user202729 Tôi đã sửa lỗi in Mathics.
J42161217

3
Tôi nghĩ rằng nhận xét đầu tiên của bạn là đủ rõ ràng. Hãy ngừng nhấn tôi để thực hiện các thay đổi mà bạn muốn, thời gian chính xác mà bạn muốn. Cung cấp cho người dùng một số giờ để trả lời. Một số người trong chúng ta có một cuộc sống ở nơi này
J42161217


3

APL (Dyalog) , 22 byte

Giả định ⎕IO←0. Đưa A, B làm đối số đúng. Tiền thưởng: xử lý danh sách đầu vào có độ dài bất kỳ!

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

Hãy thử trực tuyến!

{... } lambda anonymous nơi đại diện cho lập luận đúng

'|-'[... ] chỉ số chuỗi với:

  ∧/ LCM trên đầu vào

   đầu tiên là nhiều ntegers (0 đến N-1)

  ⍵∘.| phân chia bảng còn lại với đầu vào theo chiều dọc và theo chiều ngang

  × dấu hiệu

   lật theo chiều ngang


Giả định đầu tiên đó có nghĩa là gì?
Sở thích của Calvin

@HelkaHomba Điều đó có nghĩa là chỉ số mảng bắt đầu từ 0, mặc định trên các thông dịch viên APL, tôi tin.
Conor O'Brien

@HelkaHomba Vì các hệ thống APL có cả hương vị dựa trên 0 và 1, nên tôi chỉ viết giả định. Nếu không, người ta sẽ phải có hai APL. Ví dụ: ngn / apl có thể chạy mã này rất giống nhau mà không chỉ định ⎕IO←0, vì đó là mặc định ở đó.
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))

Chạy đệ quy cho đến khi Achia hết cho cả hai ab- xuất ra một dấu gạch ngang hoặc đường ống dựa trên tính aphân chia của A.

Các chức năng sau đó gọi chính nó, trao đổi ab.

Các Sbiến ngăn chặn chức năng từ tự xưng là vô hạn.

Các trường hợp thử nghiệm:


Câu trả lời trước:

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

Sử dụng các thuật toán:

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

Đệ quy gọi chính nó chỉ một lần để đầu ra dòng thứ hai.

Các trường hợp thử nghiệm:

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

Thuật toán tương tự như trước, sử dụng repeatthay vì padStart.


1
Tôi nghĩ padStartlà 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, tôi hầu như không thể hiểu được mã mà tôi đã viết một năm trước, nhưng có vẻ như mã của bạn đã loại bỏ một số byte, cảm ơn!
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)

Dùng thử trực tuyến


Xin chào, chào mừng đến với PPCG! Đây trông giống như một câu trả lời đầu tiên tuyệt vời, vì vậy +1 từ tôi. Tôi không chắc chắn, vì tôi chưa bao giờ được lập trình trong Scala, nhưng có thể *(a-1)được golfed đến *~-a*(b-1)để *~-b? Ngoài ra, có lẽ bạn có thể thêm một liên kết TIO với mã kiểm tra? (Ồ, và hình đại diện đó dường như không phải là khối đối với tôi .; P)
Kevin Cruijssen

2
Cảm ơn! Thách thức đối với *~-alà rất tốt, nhưng tiếc là Scala đòi hỏi nhiều dấu ngoặc: *(~(-a))để làm cho rõ ràng rằng concatenations *~-, *~, ~-không ưa thích tên hàm. Tôi đã thêm một liên kết TIO.
rau diếp khối

À đúng rồi, ~-có thể là tên hàm trong Scala. Tôi nhớ ai đó đã đề cập đến điều đó trước đây khá lâu. Điều đó thật đáng tiếc liên quan đến việc chơi golf. Một lần nữa chào mừng, và câu trả lời đầu tiên tốt đẹp.
Kevin Cruijssen


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 nhờ @Nevay .
-1 byte bằng cách bắt đầu bằng một dòng mới (được A="",B="\n"thay thế bằng A="\n",B=A).

Giải trình:

Hãy thử nó ở đây.

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 Cảm ơn. Không thể tin rằng tôi đã bỏ lỡ điều rõ ràng nhất !A.endsWith(t)|!B.endsWith(t)khi tôi đang tìm kiếm một cách ngắn gọn để kiểm tra xem cả hai có kết thúc hay không |.. Và bắt đầu B bằng một dòng mới thay vì đặt nó giữa chúng khi trở về cũng rất thông minh.
Kevin Cruijssen

2

Python 2 , 96 88 byte

Chỉnh sửa: Đã lưu 4 byte nhờ @Leaky Nun

Chỉnh sửa: Đã lưu 4 byte nhờ @Rod

lambda a,b:b/gcd(a,b)*("-"*~-a+"|")+"\n"+a/gcd(a,b)*("-"*~-b+"|")
from fractions import*

Hãy thử trực tuyến!


88 byte hoặc 77 byte cho đầu ra linh hoạt hơn
Rod


1
Rõ ràng xuất ra một danh sách các chuỗi không được chấp nhận. : Tôi Replace [...]với '\n'.join(...)để sửa chữa.
hoàn toàn là

2

Python 2 , 89 byte

Không phải là mục nhập Python 2 ngắn nhất, nhưng một cách tiếp cận khác gcd có thể vẫn có thể chơi được.

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

Hãy thử trực tuyến!


2

Haskell , 66 60 byte

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

Hãy thử trực tuyến!


Cùng chiều dài:

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

Giải pháp cũ:

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

1
Bạn có thể lưu một byte với '\n':.
Laikoni

@Laikoni Cẩn thận, tôi sẽ tiếp cận bạn
BlackCap



1

SOGL V0.12 , 19 16 byte

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

Hãy thử nó ở đây!

Giải trình:

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

Bạn có tài liệu trước khi thực hiện? o0
hoàn toàn là

1
@icrieverytim SOGL có nhiều, rất nhiều tài liệu không được thực hiện. : p Tài liệu về cơ bản là danh sách TODO của tôi (điều mà tôi hiếm khi làm: p)
dzaima

1

Xếp chồng lên nhau , 42 38 byte

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

Hãy thử trực tuyến!

Đầu vào dưới dạng một cặp số. Tất cả các trường hợp thử nghiệm đặt cùng nhau trông giống như các tòa nhà.

Giải trình

Điều này đầu tiên đưa lcmhai số đầu vào z. Sau đó, với mỗi số k, chúng tôi tạo ra các z / kchuỗi -có độ dài k - 1, thêm |vào cuối mỗi số và xuất ra từng chuỗi .

Những lần thử trước

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

Những nỗ lực khác

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

Đánh giá LCM với chứng nghiện lặp đi lặp lại.

Ít chơi gôn

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
}

Kiểm tra

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. cảm ơn ngài Washington Guedes.


Có, cảm ơn bạn @WashingtonGuedes. :)
làm lại

1

Ruby , 64 57 byte

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

-7 byte nhờ G B.

Hãy thử trực tuyến!


Bạn không cần bao gồm 'đặt', nếu hàm trả về 2 chuỗi thì không sao. Và bạn có thể làm cho nó ngắn hơn bằng cách sử dụng toán tử mảng * (mảng * '' tương đương với mảng.join)
GB

@GB cảm ơn sự giúp đỡ của bạn!
Ăn nhẹ

1

Than , 32 30 29 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 1 byte nhờ chỉ @ ASCII.



@ ASCII-only Một cái gì đó mới cho tài liệu!
Neil

Cảm ơn tài liệu! (xin lỗi, tôi không thực sự cảm thấy thích làm tài liệu mặc dù tôi thực sự nên làm điều đó), nếu bạn không phiền có thêm tài liệu trò chuyện.stackexchange.com/transcript/240?m=40270513#40270513 chat.stackexchange. com / transcript / 240? m = 40270838 # 40270838 (không chắc chắn các diễn viên định hướng sẽ đi đâu, chúng không phải là lệnh cũng không phải là toán tử)
ASCII - chỉ

1

Google Sheets, 77 byte

Công thức bảng tính ẩn danh nhận đầu vào từ phạm vi A1:B1và đầu ra cho ô gọi

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

-4 byte nhờ vào @EngineerToast


1
Bạn có thể cho rằng không có gì khác là đầu vào hàng 1 không? Nếu vậy, bạn có thể rút ngắn LCM(A1,B1)chỉ LCM(1:1)để lưu 4 byte. Tôi nghĩ thật hợp lý khi giả định một bảng bắt đầu trống và chỉ định vị trí của cả đầu vào và công thức.
Kỹ sư Toast

1

VBA Excel, 79 byte

Hàm cửa sổ ngay lập tức VBE ẩn danh nhận đầu vào từ phạm vi [A1:B1]và xuất trực quan hóa LCM của chúng sang cửa sổ ngay lập tức VBE.

Đây là một cổng của câu trả lời Google Sheets của tôi .

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

1

Japt , 12 byte

£×/Ury)î|ù-X

Thông dịch viên Japt

Đầu vào như một mảng số. Đầu ra là một chuỗi các chuỗi. Cờ -R cải thiện một chút hình thức đầu ra, nhưng không cần thiết cho logic.

Giải trình:

£              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

Cảm ơn thêm cho Shaggy vì đã tìm thấy một số byte để lưu.



@Shaggy Thú vị, tôi chưa bao giờ nghĩ sẽ sử dụng phần đó của Japt theo cách chính xác đó.
Kamil Drakari

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.