Проілюструйте найменше спільне множину


50

Дані два позитивних цілих числа, A і B, ілюструють їх найменше спільне кратне , виводячи два рядки тире ( -) довжиною LCM (A, B) після заміни кожного штриху Ath у першому рядку та кожного Bth тире у другому рядку вертикальними смугами ( |).

Таким чином, кінець кожного рядка буде єдиним місцем |у рядку двох.

Наприклад, якщо 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
Чи можу я вивести масив з двох рядків, по одному для кожного рядка?
BlackCap

@BlackCap Ні. Роздрукуйте рядки для stdout чи файлу або поверніть всю багаторядкову рядок.
Захоплення Кальвіна

2
Бонус за обробку довільної кількості входів?
Адам

1
@HelkaHomba Добре дякую; збережено ще 1 байт. :) (Начебто є якісь інші причини ставити такі запитання щодо кодогельгових викликів.; P)
Кевін Круїссен

Відповіді:


11

Python 3, 80 байт

Збережено 1 байт завдяки Halvard Hummel та 1 byte завдяки Джонатану Аллану.

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
@Laikoni Дякую! Це здається веселою спільнотою :-)


@HalvardHummel Спасибі, викладемо як альтернативу!

Повністю намагаючись інший підхід, я зрозумів, що вашу версію можна зробити за 80 років .
Джонатан Аллан

10

Haskell , 57 байт

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

Спробуйте в Інтернеті!


Я ніколи не бачив цього 0^0=1фокусу раніше - розумний
BlackCap

@BlackCap Я не можу цього стверджувати сам, тому що я його бачив кілька разів раніше, хоча я не пам’ятаю, де вперше побачив трюк.
Laikoni


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 Без транспонування він не працює для введення даних [1; 1]через те, як MATL (AB) обробляє форму масиву з індексуванням. (Як альтернативу, транспонування можна було замінити Heнаприкінці, тому він спочатку був там)
Луїс Мендо

Ага так, я зрозумів, що це було через поведінку між рядами, але я не думав про цей крайній випадок.
Санчіз

5

R , 109 105 байт

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), потім генерує діапазон від 0до lпо a, потім з lдо 2*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

Спробуйте в Інтернеті!

Так, у лушпинні є вбудований 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

Математика, 63 байти

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

Спробуйте в Інтернеті!

та інша версія, яку користувач202729 дуже, дійсно, хоче побачити в опублікованому

Математика, 59 байт

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

в цьому використовується особливий символ \[Divides]


Якщо це Mathematica, ви, ймовірно, можете використовувати \[Divides]замість Modоператора, щоб представити роздільність, що зберігає 4 байти. Також Mathics TIO не повинен друкувати {Null, Null}.
користувач202729

@ user202729 Я виправив друк Mathics.
J42161217

3
Я думаю, що ваш перший коментар був досить зрозумілим. Будь ласка, перестаньте натискати на мене, щоб внести потрібні вами зміни в точний час, який ви хочете. Дайте користувачам кілька годин для відповіді. Деяким із нас є життя з цього місця
J42161217


3

APL (Dyalog) , 22 байти

Припускає ⎕IO←0. Вважає A, B правильним аргументом. Бонус: обробляє список введення будь-якої довжини!

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

Спробуйте в Інтернеті!

{} Анонімна лямбда, де є правильним аргументом

'|-'[] Індексуйте рядок за допомогою:

  ∧/ LCM через вхід

   перше, що багато many ntegers (від 0 до N-1)

  ⍵∘.| таблиця залишків поділу з введенням вертикально і горизонтально

  × signum

   перевернути горизонтально


Що означає це перше припущення?
Захоплення Кальвіна

@HelkaHomba Це означає, що індекс масивів починається з 0, за замовчуванням для інтерпретаторів APL, я вважаю.
Conor O'Brien

@HelkaHomba Оскільки APL-системи випускаються як на 0, так і на 1-й смаках, я просто пишу припущення. В іншому випадку доведеться мати два 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 поділі 's на A.

Потім функція викликає себе, змінюючи місцями a і b.

The 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

Рекурсивно дзвонить собі лише один раз, щоб вивести другий рядок.

Випробування:

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
Я думав, що padStartце ES8?
Ніл

1
f=(a,b,A=1)=>(A%a?'-':'|')+(A%a|A%b?f(a,b,A+1):a<0?'':`\n`+f(-b,a))
l4м2

@ l4m2, я навряд чи можу зрозуміти код, який я написав рік тому, але він виглядає так, як ваш справді голить деякі байти, дякую!
Рік Хічкок

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 від мене. Я не впевнений, так як я ніколи не програмували в Scala, але може *(a-1)бути golfed до *~-aі *(b-1)до *~-b? Також ви могли б додати посилання TIO із тестовим кодом? (О, і цей аватар не здається мені дуже кубічним
;;

2
Дякую! Трюк з *~-aвеликим, але , до жаль , Scala вимагає більше дужок: *(~(-a))щоб зрозуміти , що конкатенації *~-, *~, ~-не є іменами функцій фантазії. Я додав посилання TIO.
кубічний салат

Так, ~-можуть бути імена функцій у Scala. Я пам'ятаю, як хтось згадував про це досить давно. Це прикро стосовно гольфу. Знову ласкаво просимо, і приємна перша відповідь.
Kevin 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;}

-7 байт завдяки @Nevay .
-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 Дякую Не можу повірити, що я пропустив найочевиднішу річ, !A.endsWith(t)|!B.endsWith(t)коли шукав короткий спосіб перевірити, чи закінчуються вони обоє |. І почати B з нового рядка, а не ставити його між ними при поверненні - також розумно.
Kevin Cruijssen

2

Python 2 , 96 88 байт

Редагувати: Збережено 4 байти завдяки монахині @Leaky

Редагувати: Збережено 4 байти завдяки @Rod

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

Спробуйте в Інтернеті!


88 байт або 77 байт для більш гнучкого виводу
стрижень


1
Очевидно виведення списку рядків неприйнятно. Я Замінити [...]з , '\n'.join(...)щоб виправити.
повністюлюдський


2

Haskell , 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 Обережно, я закриваюсь на вас
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. Потім для кожного числа 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 байти. дякую серу Вашингтону Гедесу.


Так, дякую @WashingtonGuedes :)
remoel

1

Рубі , 64 57 байт

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

-7 байт завдяки G B.

Спробуйте в Інтернеті!


Вам не потрібно включати "путівки", якщо функція повертає 2 рядки, це нормально. А можна скоротити його за допомогою оператора array * (масив * '' еквівалентно array.join)
GB

@GB дякую за допомогу!
Перекус

1

Вугілля деревне , 32 30 29 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Редагування: збережено 1 байт завдяки @ ASCII.



@ Лише для ASCII Щось нове для документування!
Ніл

Дякуємо за документування! (Вибачте, я не дуже люблю документувати речі, хоча я справді повинен це робити), якщо ви не заперечуєте, що є ще щось, щоб документувати chat.stackexchange.com/transcript/240?m=40270513#40270513 chat.stackexchange. com / стенограма / 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

-4 байти завдяки @EngineerToast


1
Чи можете ви припустити, що нічого іншого не вводиться в рядок 1? Якщо так, то ви можете замкнуті LCM(A1,B1)тільки LCM(1:1)для збереження 4 байта. Я думаю, що доцільно припустити порожній початковий аркуш і вказати, де знаходяться і вхідні дані, і формула.
Інженер Тост

1

Excel VBA, 79 байт

Анонімна функція негайного вікна VBE, яка приймає вхід з діапазону [A1:B1]і виводить візуалізацію їх LCM в безпосереднє вікно VBE.

Це порт відповіді на мої таблиці Google .

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

1

Japt , 12 байт

£×/Ury)î|ù-X

Перекладач Japt

Введення як масив чисел. Виводи у вигляді масиву рядків. Прапор -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 Цікаво, що я ніколи не думав використовувати цю частину Japt саме таким чином.
Каміль Дракарі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.