최소 공배수의 예


50

두 개의 양의 정수 A와 B가 주어지면 첫 번째 줄의 모든 Ath 대시와 두 번째 줄의 모든 Bth 대시를 세로 막대로 바꾼 후 두 줄의 대시 ( )를 길이 LCM (A, B) 으로 출력 하여 최소 공통 배수 를 나타냅니다. ( ).-|

이런 식으로, 각 라인의 끝은 2 |의 라인업 만됩니다.

예를 들어 A = 6이고 B = 4이면 LCM (6, 4) = 12이므로

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

따라서 최종 출력은

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

입력 번호의 순서는 행의 순서와 일치해야합니다.

바이트 단위의 가장 짧은 코드가 이깁니다.

테스트 케이스

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에서 답을 확장 codegolf.stackexchange.com/q/94999 것은 하나에서 더 쉽게 보인다. 어느 쪽이든, 사람들은이 일을하는 것이 즐거운 이유입니다.
Calvin 's Hobbies

1
각 줄에 하나씩 두 개의 문자열로 배열을 출력 할 수 있습니까?
BlackCap

@BlackCap No. 문자열을 stdout 또는 파일로 인쇄하거나 전체 여러 줄 문자열을 반환합니다.
Calvin 's Hobbies

2
임의의 수의 입력을 처리하기위한 보너스?
Adám

1
@HelkaHomba Ok 감사합니다; 1 바이트를 더 절약했습니다. :) (codegolf 문제에 같은 질문을 어떤 다른 이유가있는 경우로서,. P)
케빈 Cruijssen

답변:


11

파이썬 3, 80 바이트

Halvard Hummel 덕분에 1 바이트를 절약하고 Jonathan Allan 덕분에 1 바이트를 절약했습니다.

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

온라인으로 테스트하십시오!

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

온라인으로 테스트하십시오! (82 바이트-초기 답변)

이것이 파이썬 2 (81 바이트)에서 할 수있는 최선입니다. 그 답변에 대해 언급 할 수없는 것 같습니다. 대신 여기에 게시 할 것입니다.

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

온라인으로 테스트하십시오!

첫 번째 시도는 아마도 차선책 일 것입니다!


2
PPCG에 오신 것을 환영합니다!
Laikoni

3
@Laikoni 감사합니다! 이것은 재미있는 커뮤니티처럼 보입니다 :-)


@HalvardHummel 감사합니다, 대안으로 게시합니다!

다른 접근법을 완전히 시도하는 동안 귀하의 버전이 80에서 완료 될 수 있음을 깨달았습니다 .
Jonathan Allan



6

MATL , 16 15 바이트

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

입력 값은 두 숫자가 포함 된 열 벡터입니다. 온라인으로 사용해보십시오!

보너스로, 입력 값은 두 개 이상의 숫자를 포함 할 수 있습니다 . 온라인으로 사용해보십시오!

설명

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

네가 길을 잃은 것 같아 He?
Sanchises

@Sanchises 감사합니다! 네, 이전 버전에 있었다, 그러나 필요는 없습니다
루이스 Mendo

또한 이것은 조옮김없이 잘 작동하는 것 같습니다. 당신은 일을
너무 많이

@Sanchises 조옮김이 없으면 [1; 1]MATL (AB)이 색인을 사용하여 배열 모양을 처리하는 방식으로 인해 input 에 대해 작동하지 않습니다 . (또는 대안으로 조옮김을 He마지막에 교체 할 수 있습니다. 이것이 처음에 있었던 이유입니다)
Luis Mendo

아 네, 행 동작으로 인해 거기에 있다고 생각했지만이 경우를 생각하지 않았습니다.
Sanchises

5

R , 109105 바이트

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

온라인으로 사용해보십시오!

익명의 기능. 계산해은 l=lcm(a,b)다음의 범위를 발생 0l의한 a다음에서, l2*l의해 b상기 지표를 설정 |갖는 매트릭스 인쇄 l컬럼.



4

C, 72 바이트

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

4

껍질 , 12 바이트

†?'-'|TUṪ`%N

온라인으로 사용해보십시오!

예, Husk에는 lcm이 내장되어 있습니다. 아니요, 필요 없습니다.

보너스 : 여러 입력 값에서 작동

설명

†?'-'|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 바이트

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

온라인으로 사용해보십시오!

그리고 user202729가 실제로 실제로 게시하고 싶은 다른 버전

Mathematica, 59 바이트

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

이 특별한 문자를 사용 \[Divides]


이것이 Mathematica 인 경우 연산자 \[Divides]대신 Mod나누기를 사용 하여 4 바이트를 절약 할 수 있습니다 . 또한 Mathics TIO는를 인쇄하지 않아야합니다 {Null, Null}.
user202729

@ user202729 Mathics 인쇄를 수정했습니다.
J42161217

3
당신의 첫 의견은 충분히 명확했다고 생각합니다. 원하는 시간, 원하는 시간을 변경하려면 나를 누르지 마십시오. 사용자에게 응답 할 시간을줍니다. 우리 중 일부는 이곳에서 삶을 살고 있습니다.
J42161217


3

APL (Dyalog) , 22 바이트

가정 ⎕IO←0합니다. A, B를 올바른 인수로 취합니다. 보너스 : 모든 길이의 입력 목록을 처리합니다!

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

온라인으로 사용해보십시오!

{… 올바른 논증을 나타내는 } 익명의 람다

'|-'[… 다음을 사용 ] 하여 문자열을 색인화하십시오.

  ∧/ 입력에서 LCM

   먼저 많은 nt ntegers (0에서 N-1까지)

  ⍵∘.| 입력을 수직으로 수평으로 나누는 나머지 테이블

  × 부호

   수평으로 뒤집다


그 첫 번째 가정은 무엇을 의미합니까?
Calvin 's Hobbies

@HelkaHomba APL 인터프리터의 기본값 인 0부터 시작하는 배열 인덱스를 의미합니다.
Conor O'Brien

@HelkaHomba APL 시스템은 0 기반 및 1 기반 맛으로 제공되므로 가정을 작성합니다. 그렇지 않으면 두 개의 APL이 있어야합니다. 예를 들어, ngn / apl은⎕IO←0 기본값 이므로을 지정하지 않고이 동일한 코드실행할 수 있습니다 .
Adám


3

자바 스크립트 (ES6), 69 바이트

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

A둘 다 나눌 수 있을 때까지 재귀 적으로 실행 a하며 ba나누기 기준으로 대시 또는 파이프를 출력합니다 A.

이 함수는 교환, 자신을 호출 a하고 b.

S변수 무한히 자신을 호출하는 기능을 방지한다.

테스트 사례 :


이전 답변 :

자바 스크립트 (ES8), 91 바이트

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

알고리즘을 사용합니다.

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

한 번만 재귀 적으로 호출하여 두 번째 줄을 출력합니다.

테스트 사례 :

JavaScript (ES6), 93 바이트

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

repeat대신 사용 하는 이전과 동일한 알고리즘 입니다 padStart.


1
padStartES8 이라고 생각 했습니까?
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, 나는 1 년 전에 작성한 코드를 거의 이해할 수 없지만, 당신의 바이트가 약간 줄어드는 것처럼 보입니다.
Rick Hitchcock

3

스칼라, 98 바이트

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

온라인으로 사용해보십시오


안녕하세요, PPCG에 오신 것을 환영합니다! 이것은 훌륭한 첫 번째 답변처럼 보이므로 +1입니다. 나는 내가 스칼라 프로그래밍 적이 있기 때문에, 잘 모르겠지만, 수 *(a-1)에 golfed 수 *~-a*(b-1)*~-b? 또한 테스트 코드가 있는 TIO 링크 를 추가 할 수 있습니까? (아, 그리고 그 아바타는 나에게는 입방체가 아닌 것 같습니다.; p)
Kevin Cruijssen

2
감사! 와 트릭은 *~-a매우 중요하지만, 불행히도 스칼라 더 브라켓이 필요합니다 *(~(-a))연결 이름이 분명하게 *~-, *~, ~-화려한 함수 이름이 아니다. TIO 링크를 추가했습니다.
큐빅 양상추

아, ~-스칼라에서 함수 이름이 될 수 있습니다. 꽤 오래 전에 언급 한 사람이 기억납니다. 골프에 관해서는 불행합니다. 다시 한 번 환영하고 좋은 첫 답변.
Kevin Cruijssen


3

자바 (8) 125 118 117 바이트

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

@Nevay 덕분에 -7 바이트 .
후행 줄 바꿈으로 시작하여 -1 바이트입니다 ( A="",B="\n"로 대체 됨 A="\n",B=A).

설명:

여기에서 시도하십시오.

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 바이트 :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 감사합니다. !A.endsWith(t)|!B.endsWith(t)둘 다.로 끝나는 지 여부를 확인하는 짧은 방법을 찾고 있었을 때 가장 분명한 사실을 놓쳤다는 것을 믿을 수 없습니다 |.
Kevin Cruijssen

2

파이썬 2 , 96 88 바이트

편집 : @ Leaky Nun 덕분에 4 바이트가 절약되었습니다.

편집 : @Rod 덕분에 4 바이트가 절약되었습니다.

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

온라인으로 사용해보십시오!


보다 유연한 출력을위한 88 바이트 또는 77 바이트
Rod


1
문자열 목록을 출력하는 것은 허용되지 않습니다. : 나는 교체 [...]'\n'.join(...)해결하는.
완전 인간


2

하스켈 , 66 60 바이트

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

온라인으로 사용해보십시오!


같은 길이 :

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

오래된 해결책 :

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

1
로 바이트를 저장할 수 있습니다 '\n':.
Laikoni

@Laikoni 조심, 나는 당신을 닫습니다
BlackCap



1

SOGL V0.12 , 19 16 바이트

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

여기 사용해보십시오!

설명:

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

구현하기 전에 문서화 했습니까? o0
완전히 인간적인

1
@icrieverytim SOGL에는 구현되지 않은 많은 문서화 된 것들이 있습니다. : p이 문서는 기본적으로 TODO리스트입니다. (드물게 : p)
dzaima

1

스택 형 , 42 38 바이트

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

온라인으로 사용해보십시오!

한 쌍의 숫자로 입력하십시오. 모든 테스트 사례는 건물과 비슷하게 보입니다.

설명

먼저 lcm두 개의 입력 번호 중 하나를로 입력합니다 z. 그런 다음 각 숫자에 대해 length의 문자열을 k생성 하여 각 끝에 추가 하고 각각을 출력합니다.z / k-k - 1|

이전에 계산 된 시도

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

다른 시도

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

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

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

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

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


1

자바 스크립트 (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

반복되는 중독으로 LCM을 평가합니다.

덜 골프

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
}

테스트

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), 144142 바이트

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 바이트 워싱턴 Guedes 선생님 께 감사드립니다.


네 감사합니다. @WashingtonGuedes. :)
remoel

1

루비 , 64 57 바이트

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

G B 덕분에 -7 바이트

온라인으로 사용해보십시오!


함수가 2 개의 문자열을 반환하면 'puts'를 포함 할 필요가 없습니다. 그리고 array * 연산자를 사용하면 더 짧아 질 수 있습니다 (array * ''는 array.join과 같습니다)
GB

@GB 감사합니다!
스낵

1

, 32 30 29 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : @ASCII 전용 덕분에 1 바이트가 절약되었습니다.



@ ASCII-only 문서에 새로운 것!
Neil

기록해 주셔서 감사합니다! (미안 해요, 난 정말 내가해야하지만 일을 문서화 기분이 안 정말 당신이 문서에 좀 더 거기에 신경 쓰지 않는 경우에, 그것을 할) chat.stackexchange.com/transcript/240?m=40270513#40270513의 chat.stackexchange가. com / transcript / 240? m = 40270838 # 40270838 (지향성 캐스트가 어디로 가야하는지 확실하지 않으며 명령이 아니거나 연산자가 아님)
ASCII 전용

1

Google 스프레드 시트, 77 바이트

범위에서 입력 A1:B1을 받고 호출 셀로 출력 하는 익명 워크 시트 수식

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

@EngineerToast 덕분에 -4 바이트


1
행 1에 다른 것이 입력되지 않았다고 가정 할 수 있습니까? 그렇다면, 당신은 단락 수 있습니다 LCM(A1,B1)단지에 LCM(1:1)4 바이트를 저장합니다. 빈 시작 시트를 가정하고 입력과 수식의 위치를 ​​지정하는 것이 합리적이라고 생각합니다.
엔지니어 토스트

1

Excel VBA, 79 바이트

범위에서 입력을 받고 [A1:B1]LCM의 시각화를 VBE 즉시 창으로 출력하는 익명 VBE 즉시 창 기능 .

Google 스프레드 시트 답변 의 포트입니다 .

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

1

Japt , 12 바이트

£×/Ury)î|ù-X

apt 인터프리터

숫자 배열로 입력합니다. 문자열 배열로 출력합니다. -R 플래그는 출력 모양을 약간 향상 시키지만 논리에는 필요하지 않습니다.

설명:

£              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

저장할 바이트를 찾은 Shaggy에게 감사드립니다.



@Shaggy Interesting, 나는 Japt의 그 부분을 정확한 방식으로 사용하려고 생각하지 않았습니다.
Kamil Drakari

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.