Đa giác GCD / LCM!


26

Thách thức của bạn là tạo ra một chương trình hoặc chức năng tạo ra GCD của các đầu vào của nó bằng một ngôn ngữ và LCM của các đầu vào của nó bằng ngôn ngữ khác. Nội dung cho GCD hoặc LCM (Tôi đang nhìn bạn, Mathicala) được cho phép nhưng không được khuyến khích. Sẽ có 2 đầu vào, sẽ luôn là số nguyên dương, không bao giờ lớn hơn 1000.

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

Mỗi dòng là một trường hợp thử nghiệm ở định dạng x y => GCD(x,y) LCM(x,y):

1 1 => 1 1
1 2 => 1 2
4 1 => 1 4
3 4 => 1 12
7 5 => 1 35
18 15 => 3 90
23 23 => 23 23
999 1000 => 1 999000
1000 999 => 1 999000
1000 1000 => 1000 1000

Xem pastebin này cho tất cả các đầu vào có thể với 0 < x, y < 31. Lưu ý rằng các phiên bản khác nhau của cùng một ngôn ngữ được tính là các ngôn ngữ khác nhau.


Vậy ... ifdựa trên một phiên bản của ngôn ngữ, nếu được lưu trữ trong một biến, có được phép không?
IllidanS4 muốn Monica trở lại vào

@ illidanS4 mà ổn.
lập trình

Câu trả lời:


24

Jelly / Trên thực tế , 2 byte

00000000: 1e 67                                            .g

Đây là một hexdump (xxd) của chương trình được gửi. Không thể kiểm tra trực tuyến vì TIO không hỗ trợ mã hóa CP437. @Mego đã đủ tốt bụng để xác minh rằng điều này hoạt động trên Cygwin, thực hiện CP437 như dự định cho Thực tế.

Thạch: GCD

Jelly sử dụng trang mã Jelly , vì vậy nó nhìn thấy các ký tự sau.

œg

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

Làm thế nào nó hoạt động

œlà một mã thông báo không đầy đủ và do đó bỏ qua. glà GCD tích hợp.

Trên thực tế: LCM

Trên thực tế sử dụng CP 437 , vì vậy nó nhìn thấy các ký tự sau.

▲g

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

Làm thế nào nó hoạt động

là đầu vào LCM. Vì g(GCD) yêu cầu hai đầu vào số nguyên, nên nó không được thực thi.


27

C / C ++, 79 78 73 byte

Cảm ơn @ETHproductions đã lưu một byte!

int f(int a,int b){int c,d=a*b;for(;a;b=c)c=a,a=b%a;auto e=.5;c=e?d/b:b;}

C tính toán GCD: Hãy thử trực tuyến!

C ++ tính toán LCM: Dùng thử trực tuyến!

Trong C, auto e=.5khai báo một biến số nguyên với lớp lưu trữ tự động (là mặc định), sau đó được khởi tạo thành 0, trong khi trong C ++ 11, nó khai báo gấp đôi, được khởi tạo là 0,5. Vì vậy, giá trị của biến sẽ là trung thực trong C ++ và sai lệch trong C.

Hàm tính toán GCD với thuật toán của Euclid và LCM bằng cách chia tích của a và b cho GCD.

Bỏ qua tuyên bố trả lại hoạt động ít nhất trên GCC. Giải pháp 78 byte dưới đây sẽ hoạt động với bất kỳ trình biên dịch nào:

int f(int a,int b){int c,d=a*b;for(;a;b=c)c=a,a=b%a;auto e=.5;return e?d/b:b;}

1
một lời giải thích sẽ rất tuyệt, nếu bạn có thể
con mèo

@cat Giải thích thêm.
Steadybox

1
Nếu tôi không nhầm, bạn có thể lưu một byte bằngfor(;a;b=c)c=a,a=b%a;
ETHproductions

@ETHproductions Cảm ơn! Tôi biết có một lý do để sử dụng forthay vì while;)
Steadybox

18

Trên thực tế / Jelly , 3 byte

00000000: 11 1c 67                                         ..g

Đây là một hexdump (xxd) của chương trình được gửi.

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

Trên thực tế: GCD

Trên thực tế sử dụng CP 437 , vì vậy nó nhìn thấy các ký tự sau.

◄∟g

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

Làm thế nào nó hoạt động

     (implicit) Read a and b from STDIN and push them on the stack.
◄    Unassigned. Does nothing.
 ∟   Unassigned. Does nothing.
  g  Pop a and b and push gcd(a,b).
     (implicit) Write the result to STDOUT.

Thạch: LCM

Jelly sử dụng trang mã Jelly , vì vậy nó nhìn thấy các ký tự sau.

×÷g    

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

Làm thế nào nó hoạt động

×÷g  Main link. Left argument: a. Right argument: b

×      Multiply; yield ab.
  g    GCD; yield gcd(a,b).
 ÷     Division; yield ab/gcd(a,b) = lcm(a,b).

Lưu ý: Công thức gcd (a, b) lcm (a, b) = ab giữ vì ab là dương.


1 TIO thực sự sử dụng UTF-8 cho thực tế. Vì cả ký tự ASCII và ký tự CP437 0x110x1c đều không được gán, tuy nhiên chương trình vẫn hoạt động.


9

AliceJelly , 9 byte

Alice tính LCM:

//L
oi@g

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

Những gì trông giống như một không gian thực sự 0x7F, DELnhân vật điều khiển.

Jelly tính toán GCD. Do Jelly sử dụng trang mã riêng chỉ tương thích với ASCII có thể in, nên ký tự linefeed và DEL lần lượt chuyển thành ½và linefeed:

//L½oi@
g

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

Giải thích

Jelly là tầm thường: dòng đầu tiên xác định một liên kết trợ giúp vô nghĩa, dòng thứ hai là chương trình thực tế và nó chỉ đơn giản chứa GCD tích hợp.

Alice phức tạp hơn một chút, nhưng nó cũng sử dụng tích hợp:

/   Reflect to SE. Switch to Ordinal.
    While in Ordinal mode, the IP bounces diagonally up and down through the grid.
i   Read all input as a single string.
L   Compute the shortest common superstring of an empty string and the input. That
    is simply the input itself, so this does nothing.
    After two more bounces, the IP hits the top right corner and turns
    around, continuing to bounce up and down while moving west.
L   Still does nothing.
i   Try to read more input, but this simply pushes an empty string.
/   Reflect to W. Switch to Cardinal.
    The IP wraps to the last column.
L   Implicitly discard the empty string and convert the input to two integers.
    Compute their LCM.
/   Reflect to NW. Switch to Ordinal.
    The IP immediately reflects off the top boundary to move SW instead.
o   Implicitly convert the LCM to a string and print it.
    Reflect off the bottom left corner and move back NE.
/   Reflect to S. Switch to Cardinal.
i   Try to read a byte, but we're at EOF, so this pushes -1 instead. Irrelevant.
    The IP wraps back to the first line.
/   Reflect to NE. Switch to Ordinal.
    The IP immediately reflects off the top boundary to move SE instead.
@   Terminate the program.

What looks like a spacekhông thực sự trông giống như một không gian.
Erik the Outgolfer

@EriktheOutgolfer phụ thuộc vào phông chữ, tôi đoán vậy.
Martin Ender

Đối với tôi 0x7F (duh mini-markdown) chưa bao giờ trông giống như một khoảng trắng trong bất kỳ phông chữ nào, ít nhất là theo kinh nghiệm của tôi. Nhưng nó luôn chèn khoảng cách dòng bổ sung bên dưới dòng nó nằm trong ...
Erik the Outgolfer

7

Octave / MATLAB, 66 61 byte

@(x,y)gcd(x,y)^(1-2*any(version==82))*(x*y)^any(version==82))

Đã lưu 5 byte nhờ Foon. (x*y)^any()Tất nhiên là ngắn hơn 1+(x*y-1)*any().


Chà, ít nhất là nó không sử dụng nội dung cho lcm.

Giải trình:

Điều này sử dụng nội dung gcdđể tính toán ước số chung lớn nhất.

Trong Octave, điều này được nâng lên thành sức mạnh của 1-2*any(version==82). any(version==82)0trong Octave, vì vậy điều này chỉ đơn giản gcd(x,y)^1. Nó được nhân với (x*y)^any(version==82), hoặc (x*y)^0 = 1.

Đối với MATLAB, gcdđược nâng lên thành sức mạnh của 1-2*any(version==82). any(version==82)1trong MATLAB, vì vậy đây là gcd(x,y)^-1. Nó nhân với (x*y)^any(version==82), hoặc (x*y)^1 = x*y. Điều này mang lại cho Least bội số chung, vì lcm(x,y) == x*y/gcd(x,y)đối với các số dương.


5

JellyMATL , 6 5 byte

ZmD
g

Đây là một chương trình đầy đủ bằng một trong hai ngôn ngữ. Nó tính toán GCD trong Jelly ( Dùng thử trực tuyến! ) Và LCM trong MATL ( Thử trực tuyến! ). Chương trình MATL thoát với một lỗi (được mặc định cho phép) sau khi tạo đầu ra chính xác.

Chỉ các ký tự ASCII được sử dụng, vì vậy chúng tương ứng với các byte được mã hóa giống nhau trong hai ngôn ngữ.

Giải thích về GCD trong Jelly

ZmD    Unused link
g      Main link (gets called automatically). Builtin GCD function (g)

Giải thích về LCM trong MATL

ZmD    Compute LCM (builtin function Zm) and display immediately (D)
g      Tries to implicitly take input to do something with it (depending
       on the type of the input). Since there is no input, it errors out

5

Julia 0,4 / Julia 0,5 , 18 byte

log.(1)==0?lcm:gcd

Đánh giá gcdtrong Julia 0,4 ( Thử trực tuyến! ) Và lcmtrong Julia 0,5 ( Thử trực tuyến! ).

Làm thế nào nó hoạt động

Trong Julia 0.4, log.(1)là một tốc ký getfield(log,1), trả về vị trí bộ nhớ của lognội dung, ví dụ: con trỏ Ptr{Void} @0x00007f2846cb6660. Do đó, kết quả là khác không, so sánh là sai và biểu thức ước lượng thành gcd.

Trong Julia 0.5, một cú pháp vector hóa chức năng mới đã được giới thiệu. log.(1)bây giờ là một tốc ký cho broadcast(log,1), mà - vì 1không thể lặp lại - chỉ đơn giản là đánh giá log(1). Do đó, kết quả là 0, so sánh là đúng và biểu thức ước lượng lcm.


3

Octave / MATLAB, 44 42 41 byte

eval(['@' 'lcm'-[5 0 9]*all(version-82)])

Điều này xác định một hàm ẩn danh cho GCD ( @gcd) trong Octave và cho LCM ( @lcm) trong MATLAB.

Ví dụ trong Octave (hoặc Dùng thử trực tuyến! ):

>> eval(['@' 'lcm'-[5 0 9]*all(version-82)])
warning: implicit conversion from numeric to char
ans = @gcd
>> ans(12,16)
ans =  4

Ví dụ trong MATLAB:

>> eval(['@' 'lcm'-[5 0 9]*all(version-82)])
ans =
    @lcm
>> ans(12,16)
ans =
    48

1

JS (ES6), CGL (CGL Golfing Language) , 31 byte (không cạnh tranh)

Tính năng LCM của CGL đã được thêm vào sau thử thách này.

 g=(a,b)=>b?g(b,a%b):a
//-LⓍ

Những gì trông giống như một không gian thực sự là một không gian không phá vỡ, một nhận xét cho CGL. JS tính toán GCD:

g=(a,b)=>b?g(b,a%b):a

Và CGL tính toán LCM:

//  does nothing
- decrements the current stack number, resulting in it pointing to input
L computes the LCM of the first and second stack items and pushes it to the stack
Ⓧ prints out the last stack item

Dùng thử:

Snippetify( g=(a,b)=>b?g(b,a%b):a
//-LⓍ
);
<script src="https://programmer5000.com/snippetify.min.js"></script>
<input type = "number">
<input type = "number">

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.