Gambarkan Multiple Least Common


50

Diberi dua bilangan bulat positif, A dan B, mengilustrasikan kelipatan paling umum mereka dengan mengeluarkan dua garis garis ( -) dengan panjang LCM (A, B) setelah mengganti setiap tanda hubung Ath di baris pertama dan setiap tanda ht B di baris kedua dengan garis vertikal ( |).

Dengan cara ini, akhir setiap baris akan menjadi satu-satunya tempat |baris dua.

Misalnya, jika A = 6 dan B = 4, LCM (6, 4) = 12, jadi:

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

Dengan demikian hasil akhir akan

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

Urutan nomor input harus sesuai dengan urutan garis.

Kode terpendek dalam byte menang.

Testcases

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 Memperluas jawaban dari codegolf.stackexchange.com/q/94999 tampaknya lebih mudah daripada dari yang itu. Either way, orang akan bersenang-senang melakukan ini yang merupakan alasan yang tepat imo.
Calvin Hobbies

1
Bisakah saya menampilkan array dengan dua string, satu untuk setiap baris?
BlackCap

@BlackCap No. Cetak string ke stdout atau file atau kembalikan seluruh string multiline.
Calvin Hobbies

2
Bonus untuk menangani jumlah input yang berubah-ubah?
Adám

1
@HelkaHomba Ok terima kasih; disimpan 1 byte lagi. :) (Seolah-olah ada alasan lain untuk mengajukan pertanyaan tentang tantangan codegolf.; P)
Kevin Cruijssen

Jawaban:


11

Python 3, 80 byte

Disimpan 1 byte berkat Halvard Hummel dan 1 byte terima kasih kepada Jonathan Allan.

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

Uji secara online!

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

Uji secara online! (82 byte - jawaban awal)

Ini adalah yang terbaik yang bisa saya lakukan dalam Python 2 (81 byte). Sepertinya saya tidak bisa mengomentari jawaban itu, saya hanya akan memposting ini di sini:

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

Uji secara online!

Upaya pertama di sini, mungkin kurang optimal!


2
Selamat datang di PPCG!
Laikoni

3
@Laikoni Terima kasih! Ini sepertinya komunitas yang menyenangkan :-)


@HalvardHummel Terima kasih, akan memposting sebagai alternatif!

Saat mencoba pendekatan yang berbeda, saya menyadari versi Anda dapat dilakukan di 80 .
Jonathan Allan

10

Haskell , 57 byte

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

Cobalah online!


Saya belum pernah melihat 0^0=1trik itu sebelumnya - pintar
BlackCap

@ BlackCap Saya tidak bisa mengklaimnya sendiri karena saya telah melihatnya beberapa kali sebelumnya, meskipun saya tidak ingat di mana saya melihat triknya terlebih dahulu.
Laikoni


6

MATL , 16 15 byte

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

Input adalah vektor kolom dengan dua angka. Cobalah online!

Sebagai bonus, input dapat berisi lebih dari dua angka . Cobalah online!

Penjelasan

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

Saya pikir Anda pergi dengan tersesat He?
Sanchises

@Sanchises Terima kasih! Ya, itu dalam versi sebelumnya, tapi itu tidak perlu
Luis Mendo

Juga, ini tampaknya berfungsi dengan baik tanpa transpos? Anda telah terlalu memikirkan hal-hal ...;)
Sanchises

@Sanchises Tanpa transpos itu tidak berfungsi untuk input [1; 1], karena cara MATL (AB) menangani bentuk array dengan pengindeksan. (Atau, transpos dapat digantikan oleh Hepada akhirnya, itulah sebabnya awalnya ada di sana)
Luis Mendo

Ah ya saya pikir itu ada di sana karena perilaku baris tetapi saya tidak memikirkan kasus tepi ini.
Sanchises

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

Cobalah online!

Fungsi anonim. Menghitung l=lcm(a,b), kemudian menghasilkan rentang dari 0ke loleh a, kemudian dari lke 2*loleh b, mengatur indeks ke |dan mencetak sebagai matriks dengan lkolom.



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

Sekam , 12 byte

†?'-'|TUṪ`%N

Cobalah online!

Ya, ada lcm bawaan di Husk. Tidak, saya tidak membutuhkannya.

Bonus: bekerja dengan sejumlah nilai input

Penjelasan

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

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

Cobalah online!

dan versi lain yang pengguna202729 benar-benar ingin melihat diposting

Mathematica, 59 byte

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

yang ini menggunakan karakter khusus \[Divides]


Jika ini adalah Mathematica, Anda mungkin dapat menggunakan \[Divides]alih-alih Modoperator untuk mewakili keterpisahan, yang menghemat 4 byte. Juga Matematika TIO tidak boleh mencetak {Null, Null}.
user202729

@ user202729 Saya memperbaiki cetakan Matematika.
J42161217

3
Saya pikir komentar pertamamu cukup jelas. Tolong berhenti menekan saya untuk membuat perubahan yang Anda inginkan, waktu yang tepat yang Anda inginkan. Berikan pengguna beberapa jam untuk merespons. Beberapa dari kita memiliki kehidupan di tempat ini
J42161217


3

APL (Dyalog) , 22 byte

Diasumsikan ⎕IO←0. Mengambil A, B sebagai argumen yang benar. Bonus: menangani daftar input dengan panjang berapa pun!

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

Cobalah online!

{... } lambda anonim di mana mewakili argumen yang tepat

'|-'[... ] mengindeks string dengan:

  ∧/ LCM di input

   pertama yang banyak ɩ ntegers (0 hingga N-1)

  ⍵∘.| tabel sisa pembagian dengan input secara vertikal dan horizontal

  × signum

   balik secara horizontal


Apa arti asumsi pertama itu?
Calvin Hobbies

@HelkaHomba Ini berarti bahwa indeks array mulai dari 0, default pada penerjemah APL, saya percaya.
Conor O'Brien

@HelkaHomba Karena sistem APL datang dalam rasa berbasis 0 dan 1, saya hanya menulis asumsi. Kalau tidak, kita harus memiliki dua APL. Misalnya ngn / apl dapat menjalankan kode yang sama ini tanpa menentukan ⎕IO←0, karena itu adalah default di sana.
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))

Berjalan secara rekursif sampai Ahabis oleh keduanya adan b- mengeluarkan tanda hubung atau pipa berdasarkan apembagian oleh A.

Fungsi ini kemudian memanggil dirinya sendiri, menukar adan b.

The Svariabel mencegah fungsi dari memanggil itu sendiri jauh.

Kasus uji:


Jawaban sebelumnya:

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

Menggunakan algoritma:

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

Secara rekursif menyebut dirinya hanya sekali untuk menampilkan baris kedua.

Kasus uji:

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

Algoritma yang sama seperti sebelumnya, menggunakan repeatbukan padStart.


1
Saya pikir padStartitu 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))
14m2

@ l4m2, saya hampir tidak bisa mengerti kode yang saya tulis setahun yang lalu, tetapi memang terlihat seperti milik Anda tidak mengurangi beberapa byte, terima kasih!
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)

Cobalah online


Hai, selamat datang di PPCG! Ini sepertinya jawaban pertama yang bagus, jadi beri +1 dari saya. Saya tidak yakin, karena saya belum pernah memprogram di Scala, tetapi dapatkah *(a-1)golf ke *~-adan *(b-1)ke *~-b? Juga, dapatkah Anda menambahkan tautan TIO dengan kode uji? (Oh, dan avatar itu sepertinya tidak kubik bagiku
;;

2
Terima kasih! Caranya dengan *~-abesar, tapi sayangnya Scala membutuhkan lebih kurung: *(~(-a))untuk membuat jelas bahwa concatenations *~-, *~, ~-tidak nama fungsi mewah. Saya menambahkan tautan TIO.
selada kubik

Ah ya, ~-bisa nama fungsi di Scala. Saya ingat seseorang menyebutkan itu sebelumnya beberapa waktu yang lalu. Sangat disayangkan tentang golf. Sekali lagi selamat datang, dan jawaban pertama yang bagus.
Kevin Cruijssen

3

Java (OpenJDK 8) , 103 byte

a->b->{String l="",r="|\n";for(int m=0;(++m%a|m%b)>0;r+=m%b<1?'|':'-')l+=m%a<1?'|':'-';return l+r+'|';}

Cobalah online!

110 byte, n nilai input

a->{String s="";for(int v:a){for(int i=1,z=1;z>(z=0);s+=i++%v<1?'|':'-')for(int k:a)z|=i%k;s+='\n';}return s;}

Cobalah online!


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 berkat @Nevay .
-1 byte dengan memulai dengan baris baru trailing ( A="",B="\n"diganti dengan A="\n",B=A).

Penjelasan:

Coba di sini.

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

@Tidak, Terima kasih. Tidak percaya saya melewatkan hal yang paling jelas !A.endsWith(t)|!B.endsWith(t)ketika saya mencari cara singkat untuk memeriksa apakah keduanya berakhir dengan |.. Dan memulai B dengan baris baru alih-alih menempatkannya di antara mereka di bagian belakang juga cerdas.
Kevin Cruijssen


2

Python 2 , 89 byte

Bukan entri Python 2 terpendek, tetapi pendekatan yang berbeda dari gcd yang mungkin masih golf.

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

Cobalah online!


2

Haskell , 66 60 byte

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

Cobalah online!


Sama panjang:

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

Solusi lama:

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

1
Anda dapat menyimpan byte dengan '\n':.
Laikoni

@Laikoni Hati-hati, saya mendekati Anda
BlackCap

1

C (gcc) , 121 99 93 92 89 byte

Ini harusnya jauh lebih pendek, hmmmm ....

#define L(x)for(j=-1,i=a;j<i;i+=i%b||i%a)putchar(++j?j%x?45:124:10);
i,j;f(a,b){L(a)L(b)}

Cobalah online!



1

SOGL V0.12 , 19 16 byte

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

Coba Di Sini!

Penjelasan:

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

Anda mendokumentasikan sebelum menerapkan? o0
totallyhuman

1
@icrieverytim SOGL memiliki banyak, banyak hal terdokumentasi yang tidak diterapkan. : p Dokumentasi pada dasarnya adalah daftar TODO saya (yang jarang saya lakukan: p)
dzaima

1

Ditumpuk , 42 38 byte

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

Cobalah online!

Masukan dalam bentuk sepasang angka. Semua test case disatukan terlihat seperti bangunan.

Penjelasan

Ini pertama-tama akan lcmmemasukkan dua nomor input z. Kemudian, untuk setiap angka k, kami menghasilkan z / kstring dengan -panjang k - 1, menambahkan |ke akhir masing-masing, dan menghasilkan masing-masing.

Upaya yang dihitung sebelumnya

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

Upaya lain

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

Mengevaluasi LCM dengan kecanduan berulang.

Kurang golf

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
}

Uji

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. Terima kasih, Sir Washington Guedes.


Ya Terima kasih @WashingtonGuedes. :)
remoel

1

Ruby , 64 57 byte

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

-7 byte berkat G B.

Cobalah online!


Anda tidak perlu memasukkan 'put', jika fungsi mengembalikan 2 string tidak apa-apa. Dan Anda dapat membuatnya lebih pendek dengan menggunakan operator * array (array * '' setara dengan array.join)
GB

@ GB terima kasih atas bantuan Anda!
Snack

1

Arang , 32 30 29 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 1 byte berkat hanya @ ASCII.



@ Hanya ASCII Sesuatu yang baru untuk didokumentasikan!
Neil

Terima kasih telah mendokumentasikan! (maaf, saya tidak benar-benar ingin mendokumentasikan hal-hal walaupun saya harus benar - benar melakukannya), jika Anda tidak keberatan ada lebih banyak lagi untuk mendokumentasikan chat.stackexchange.com/transcript/240?m=40270513#40270513 chat.stackexchange. com / transkrip / 240? m = 40270838 # 40270838 (tidak yakin ke mana arah directional seharusnya pergi, mereka bukan perintah dan bukan pula operator)
ASCII-satunya

1

Google Sheets, 77 Bytes

Rumus lembar kerja anonim yang mengambil input dari rentang A1:B1dan keluaran ke sel panggilan

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

-4 Bytes berkat @EngineerToast


1
Bisakah Anda menganggap bahwa tidak ada yang lain adalah input ke baris 1? Jika demikian, Anda dapat disingkat LCM(A1,B1)menjadi hanya LCM(1:1)untuk menghemat 4 byte. Saya pikir masuk akal untuk mengasumsikan lembar awal kosong dan menentukan di mana input dan formula berada.
Engineer Toast

1

Excel VBA, 79 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari kisaran [A1:B1]dan menampilkan visualisasi LCM mereka ke jendela langsung VBE.

Ini adalah port jawaban Google Sheets saya .

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

1

Japt , 12 byte

£×/Ury)î|ù-X

Japt Interpreter

Input sebagai array angka. Output sebagai array string. Bendera -R sedikit meningkatkan bagaimana output terlihat, tetapi tidak perlu untuk logika.

Penjelasan:

£              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

Terima kasih ekstra untuk Shaggy karena menemukan beberapa byte untuk disimpan.



@Shaggy Menarik, saya tidak pernah berpikir untuk menggunakan bagian Japt dengan cara yang tepat.
Kamil Drakari

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.