最小公倍数の説明


50

2つの正の整数AとBが与えられた場合、最初の行のすべてのAthダッシュと2番目の行のすべてのBthダッシュを垂直バーに置き換えた後、長さLCM(A、B)の2行のダッシュ()を出力することにより、最小公倍数を示します()。-|

このように、各行の終わりは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はその1からより簡単に思えます。いずれにせよ、人々はこれをやるのが楽しいでしょう。それはまともな理由です。
カルバンの趣味

1
各行に1つずつ、2つの文字列を持つ配列を出力できますか?
ブラックキャップ

@BlackCapいいえ。文字列を標準出力またはファイルに出力するか、複数行の文字列全体を返します。
カルバンの趣味

2
任意の数の入力を処理するためのボーナス?
アダム

1
@HelkaHomba OKありがとう。さらに1バイト節約しました。:)(codegolfチャレンジでこのような質問をする他の理由があるかのように。; p)
ケビンCruijssen

回答:


11

Python 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バイト-初期回答)

これは、Python 2(81バイト)でできる最善の方法です。私はその答えにコメントできないようです。代わりにここに投稿します。

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

オンラインでテストしてください!

ここでの最初の試みは、おそらく最適ではありません!


2
PPCGへようこそ!
ライコニ

3
@ライコニありがとうございます!これは楽しいコミュニティのようです:-)


@HalvardHummelありがとう、代わりとして投稿します!

全く異なるアプローチを試みている間、私はあなたのバージョンが80でできることを理解しまし
ジョナサンアラン



6

MATL16 15バイト

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

入力は、2つの数値を持つ列ベクトルです。オンラインでお試しください!

ボーナスとして、入力には3 つ以上の数字を含めることができます。オンラインでお試しください!

説明

'-|'   % 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ありがとう!はい、それは前のバージョンでしたが、それは必要ありません
ルイスメンドー

また、これは転置せずにうまく動作するようですか?あなたは物事を
考え直してい

@Sanchises転置なしでは、[1; 1]MATL(AB)がインデックス付きの配列形状を処理する方法のため、input では機能しません。(あるいは、転置Heは最後に置き換えることができます。それが最初にそこにあった理由です)
ルイスメンドー

ああ、そうです、行の振る舞いのためにそこにあると思いましたが、このエッジケースについては考えませんでした。
Sanchises

5

R109105バイト

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)、範囲from 0からlby a、次にfrom lから2*lby を生成します。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

   最初にその多くのɩ整数(0からN-1)

  ⍵∘.| 入力が垂直方向、水平方向が入力の除算剰余表

  × シグナム

   水平に反転


その最初の仮定はどういう意味ですか?
カルバンの趣味

@HelkaHombaこれは、APLインタープリターのデフォルトである0から始まる配列インデックスを意味します。
コナーオブライエン

@HelkaHomba APLシステムには0ベースと1ベースの両方のフレーバーが用意されているため、ここでは仮定を記述します。それ以外の場合は、2つのAPLが必要です。例えば、ngn / aplは⎕IO←0、を指定せずにこの同じコード実行できます。これがデフォルトであるためです。
アダム


3

JavaScript(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で割り切れるまで再帰的に実行されますb- aによる割り算に基づいてダッシュまたはパイプを出力しAます。

関数は、スワップ、自分自身を呼び出すab

S変数が無限に自分自身を呼び出してから機能を防ぎます。

テストケース:


以前の回答:

JavaScript(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

自身を1回だけ再帰的に呼び出して、2行目を出力します。

テストケース:

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 だと思った?
ニール

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年前に書いたコードはほとんど理解できませんが、あなたのコードは数バイト削り取っているようです、ありがとう!
リックヒッチコック

3

Scala、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。私はScalaでプログラムされたことがありませんから、わからないんだけど、可能*(a-1)にgolfedこと*~-a*(b-1)*~-b?また、テストコードでTIOリンクを追加できますか?(ああ、そのアバターは私にはあまりキュービックに見えません。; p)
ケビンクルーイッセン

2
ありがとう!トリックは*~-a素晴らしいですが、残念ながらScalaはより多くの括弧が必要です。*(~(-a))明確なの連結ことを確認するために*~-*~~-派手な関数名ではありません。TIOリンクを追加しました。
キュービックレタス

ああ~-、Scalaで関数名にすることができます。かなり前に誰かがそれについて言及したのを覚えています。それはゴルフに関して残念です。再び歓迎します、そして最初のいい答えです。
ケビンCruijssen


3

Java 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)両方が|..で終わっているかどうかを確認する簡単な方法を探していたときに、最も明白なことを見逃したとは信じられません。
ケビンCruijssen

2

パイソン296の 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(...)修正します。
完全に人間





1

SOGL V0.1219の 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
totallyhuman

1
@icrieverytim SOGLには、実装されていない多くの文書化されたものがあります。:pドキュメントは基本的に私のTODOリストです(めったに:pを行いません)
dzaima

1

積み上げ42 38バイト

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

オンラインでお試しください!

数値のペアの形式で入力します。組み立てられたすべてのテストケースは、建物のように見えます。

説明

これは、最初にlcm2つの入力数のを取得しzます。次に、各number について、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

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

中毒を繰り返して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)、144 142バイト

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バイト。ワシントン・ゲデスesに感謝します。


はい@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.joinと同等)を使用して短くすることができます
GB

@GB、ご協力ありがとうございます!
スナック

1

32 30 29バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:@ASCIIのみのおかげで1バイト保存されました。



@ASCIIのみドキュメントに新しいもの!
ニール

文書化してくれてありがとう!(申し訳ありませんが、私は本当に私はべきであるが、物事を文書化するような気がしない、本当にあなたは、ドキュメントにはいくつかのより多くあります気にしない場合は、それを行う)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に他に何も入力されていないと仮定できますか?その場合、4バイトを節約するために短絡LCM(A1,B1)することができLCM(1:1)ます。空白の開始シートを想定し、入力と数式の両方を指定するのが合理的だと思います。
エンジニアトースト


1

Japt、12バイト

£×/Ury)î|ù-X

ジャプト通訳

数値の配列として入力します。文字列の配列として出力します。-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興味深いことに、Japtのその部分をそのように正確に使用することは考えていませんでした。
カミルドラカリ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.