Polyglots GCD / LCM!


26

ความท้าทายของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่ส่งออกGCDของอินพุตของมันในภาษาหนึ่งและLCMของอินพุตของมันในอีกภาษาหนึ่ง Builtins สำหรับ GCD หรือ LCM (ฉันกำลังดูคุณ Mathematica) ได้รับอนุญาต แต่ไม่ได้รับการสนับสนุน จะมี 2 อินพุตซึ่งจะเป็นจำนวนเต็มบวกเสมอไม่เกิน 1,000

กรณีทดสอบ

แต่ละบรรทัดเป็นหนึ่งกรณีทดสอบในรูปแบบ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

ดู Pastebin นี้0 < x, y < 31สำหรับปัจจัยการผลิตที่เป็นไปได้ทั้งหมดที่มี โปรดทราบว่าเวอร์ชันเดียวกันของภาษาเดียวกันจะนับเป็นภาษาอื่น


ดังนั้น ... การifอ้างอิงตามเวอร์ชันของภาษาหากเก็บไว้ในตัวแปรอนุญาตหรือไม่
IllidanS4 ต้องการโมนิก้ากลับเมื่อ

@ illidanS4 นั้นใช้ได้
programmer5000

คำตอบ:


24

Jelly / จริง 2 ไบต์

00000000: 1e 67                                            .g

นี่คือ hexdump (xxd) ของโปรแกรมที่ส่ง ไม่สามารถทดสอบทางออนไลน์ได้เนื่องจาก TIO ไม่รองรับการเข้ารหัส CP437 @Mego ใจดีพอที่จะตรวจสอบว่ามันใช้งานได้ใน Cygwin ซึ่งใช้ CP437 ตามที่ตั้งใจจริง

เยลลี่: GCD

เยลลี่ใช้หน้ารหัสเจลลี่จึงเห็นอักขระต่อไปนี้

œg

ลองออนไลน์!

มันทำงานอย่างไร

œเป็นโทเค็นที่ไม่สมบูรณ์และถูกเพิกเฉย gคือ GCD ในตัว

ที่จริง: LCM

ใช้CP 437จริง ๆ แล้วจะเห็นอักขระต่อไปนี้

▲g

ลองออนไลน์!

มันทำงานอย่างไร

คืออินพุต LCM เนื่องจากg(GCD) ต้องการอินพุตจำนวนเต็มสองรายการจึงไม่ได้ดำเนินการ


27

C / C ++, 79 78 73 ไบต์

ขอบคุณ @ETHproductions สำหรับการบันทึกไบต์!

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 คำนวณ GCD: ลองออนไลน์!

C ++ คำนวณ LCM: ลองออนไลน์!

ใน C auto e=.5ประกาศตัวแปรจำนวนเต็มด้วยคลาสหน่วยเก็บข้อมูลอัตโนมัติ (ซึ่งเป็นค่าเริ่มต้น) ซึ่งจะถูกกำหนดค่าเริ่มต้นเป็น 0 ในขณะที่ใน C ++ 11 จะประกาศคู่ซึ่งเริ่มต้นเป็น 0.5 ดังนั้นค่าของตัวแปรจะเป็นจริงใน C ++ และ falsy ใน C

ฟังก์ชั่นคำนวณ GCD ด้วยอัลกอริทึมของ Euclid และ LCM โดยการหารผลิตภัณฑ์ a และ b ด้วย GCD

การข้ามคำสั่ง return จะทำงานอย่างน้อยใน GCC โซลูชัน 78 ไบต์ด้านล่างควรทำงานกับคอมไพเลอร์ใด ๆ :

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
คำอธิบายจะเจ๋งถ้าคุณสามารถ
แมว

@cat คำอธิบายเพิ่ม
Steadybox

1
หากฉันไม่เข้าใจผิดคุณสามารถบันทึกไบต์ด้วยfor(;a;b=c)c=a,a=b%a;
ETHproductions

@ ETHproductions ขอบคุณ! ฉันรู้ว่ามีเหตุผลที่จะใช้forแทนwhile;)
Steadybox

18

จริง / Jelly , 3 ไบต์

00000000: 11 1c 67                                         ..g

นี่คือ hexdump (xxd) ของโปรแกรมที่ส่ง

ลองออนไลน์! 1

จริง: GCD

ใช้CP 437จริง ๆ แล้วจะเห็นอักขระต่อไปนี้

◄∟g

ลองออนไลน์!

มันทำงานอย่างไร

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

เยลลี่: LCM

เยลลี่ใช้หน้ารหัสเจลลี่จึงเห็นอักขระต่อไปนี้

×÷g    

ลองออนไลน์!

มันทำงานอย่างไร

×÷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).

หมายเหตุ:สูตรgcd (a, b) lcm (a, b) = abเก็บไว้เนื่องจากaและbเป็นค่าบวก


1 TIO ใช้ UTF-8 จริง ๆ เนื่องจากทั้งอักขระ ASCII และ CP437 ตัวอักษร0x11และ0x1cนั้นไม่ได้ถูกมอบหมายโปรแกรมจึงยังทำงานได้


9

AliceและJellyขนาด 9 ไบต์

อลิซคำนวณ LCM:

//L
oi@g

ลองออนไลน์!

สิ่งที่ดูเหมือนว่าพื้นที่ที่เป็นจริง0x7FของDELตัวละครที่ควบคุม

เยลลี่คำนวณ GCD เนื่องจาก Jelly ใช้หน้ารหัสของตัวเองซึ่งเข้ากันได้กับ ASCII ที่พิมพ์ได้เท่านั้นตัวอักษร linefeed และ DEL จะเปลี่ยนเป็น½และ linefeed ตามลำดับ:

//L½oi@
g

ลองออนไลน์!

คำอธิบาย

เจลลี่เป็นเรื่องเล็กน้อย: บรรทัดแรกกำหนดลิงค์ตัวช่วยแบบไร้สาระบรรทัดที่สองเป็นโปรแกรมจริงและมีเพียง GCD ในตัว

อลิซค่อนข้างมีเล่ห์เหลี่ยมนิดหน่อย แต่ก็ใช้งานในตัวด้วย:

/   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 spaceดูไม่เหมือนที่ว่างจริงๆ
Erik the Outgolfer

@EriktheOutgolfer ขึ้นอยู่กับตัวอักษรฉันว่า
Martin Ender

สำหรับฉัน 0x7F (duh mini-markdown) ไม่เคยดูเหมือนช่องว่างในแบบอักษรใด ๆ เลยอย่างน้อยก็ในประสบการณ์ของฉัน แต่มันมักจะแทรกที่ระยะห่างบรรทัดพิเศษด้านล่างบรรทัดมันอยู่ใน ...
Erik the Outgolfer

7

ระดับแปดเสียง / MATLAB, 66 61 ไบต์

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

บันทึก 5 ไบต์ด้วย Foon เป็นหลักสูตรที่สั้นกว่า(x*y)^any()1+(x*y-1)*any()


lcmดีอย่างน้อยก็ไม่ได้ใช้ในตัวสำหรับ

คำอธิบาย:

สิ่งนี้ใช้ builtin gcdเพื่อคำนวณตัวหารร่วมมาก

1-2*any(version==82)ในคู่นี้ถูกยกขึ้นสู่อำนาจของ any(version==82)คือในคู่นี้จึงเป็นเพียง0 gcd(x,y)^1มันคูณด้วยหรือ(x*y)^any(version==82)(x*y)^0 = 1

สำหรับ MATLAB, ถูกยกขึ้นสู่อำนาจของgcd คือใน MATLAB ดังนั้นนี่คือ มันคูณด้วยหรือ นี่จะทำให้ตัวคูณร่วมน้อยอย่างน้อยเพราะจำนวนบวก1-2*any(version==82)any(version==82)1gcd(x,y)^-1(x*y)^any(version==82)(x*y)^1 = x*ylcm(x,y) == x*y/gcd(x,y)


5

เยลลี่และMATLขนาด6 5 ไบต์

ZmD
g

นี่เป็นโปรแกรมเต็มรูปแบบในสองภาษาใดภาษาหนึ่ง มันคำนวณ GCD ในเยลลี่ ( ลองออนไลน์! ) และ LCM ใน MATL ( ลองออนไลน์! ) โปรแกรม MATL ออกโดยมีข้อผิดพลาด (อนุญาตโดยค่าเริ่มต้น) หลังจากสร้างเอาต์พุตที่ถูกต้อง

มีการใช้อักขระ ASCII เท่านั้นดังนั้นจึงสอดคล้องกับไบต์ที่เข้ารหัสเดียวกันในสองภาษา

คำอธิบายของ GCD ในเยลลี่

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

คำอธิบายของ LCM ใน 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 bytes

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

ประเมินเป็นgcdใน Julia 0.4 ( ลองออนไลน์! ) และไปที่lcmJulia 0.5 ( ลองออนไลน์! )

มันทำงานอย่างไร

ในจูเลีย 0.4 log.(1)เป็นชวเลขgetfield(log,1)ซึ่งจะส่งกลับที่ตั้งหน่วยความจำของlogbuiltin Ptr{Void} @0x00007f2846cb6660เช่นตัวชี้ gcdผลที่ได้จึงไม่ใช่ศูนย์การเปรียบเทียบเป็นเท็จและประเมินผลการแสดงออกไป

ใน Julia 0.5 ได้มีการแนะนำไวยากรณ์ของฟังก์ชัน vectorization ใหม่ log.(1)ตอนนี้เป็นการจดชวเลขสำหรับbroadcast(log,1)ซึ่ง - เนื่องจาก1มันไม่สามารถทำซ้ำlog(1)ได้ lcmผลที่ได้คือทำให้ศูนย์การเปรียบเทียบเป็นความจริงและประเมินการแสดงออกไป


3

ระดับแปดเสียง / MATLAB, 44 42 41 ไบต์

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

สิ่งนี้จะกำหนดฟังก์ชั่นที่ไม่ระบุชื่อสำหรับ GCD ( @gcd) ในระดับแปดเสียงและสำหรับ LCM ( @lcm) ใน MATLAB

ตัวอย่างใน Octave (หรือลองออนไลน์! ):

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

ตัวอย่างใน MATLAB:

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

1

JS (ES6), CGL (ภาษากอล์ฟ CGL) , 31 ไบต์ (ไม่ใช่การแข่งขัน)

เพิ่มฟีเจอร์ LCM ของ CGL หลังจากการท้าทายนี้

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

สิ่งที่ดูเหมือนว่าช่องว่างเป็นพื้นที่ที่ไม่ทำลายความคิดเห็นสำหรับ CGL JS คำนวณ GCD:

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

และ CGL คำนวณ 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

ลองดูสิ:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.