GCD / LCM Polyglots!


26

Buradaki zorluk, girişlerinin GCD'sini bir dilde ve girişlerinin LCM'sini başka bir dilde veren bir program veya işlev yapmaktır . GCD veya LCM için yerleşiklere (sana bakıyorum, Mathematica) izin verilir, ancak teşvik edilmez. Asla 1000'den büyük olmayan, her zaman pozitif tamsayılar olacak 2 giriş olacaktır.

Test Kılıfları

Her satır formatta bir test durumudur 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

İle mümkün olan tüm girişler için bu pastebin bakın0 < x, y < 31 . Aynı dillerin farklı sürümlerinin farklı diller olarak sayıldığını unutmayın.


Yani ... bir ifdilin sürümüne dayanarak, eğer bir değişkende saklanırsa izin verilir?
IllidanS4, Monica'yı

@ illidanS4 bu iyi.
programmer5000

Yanıtlar:


24

Jöle / Aslında , 2 bayt

00000000: 1e 67                                            .g

Bu sunulan programın bir hexdump (xxd) 'dir. Çevrimiçi olarak test edilemez çünkü TIO, CP437 kodlamasını desteklemez. @Mego, CP437'yi aslında amaçlandığı gibi uygulayan Cygwin üzerinde çalıştığını doğrulamak için kibardı.

Jöle: GCD

Jelly, Jelly kodu sayfasını kullanır , bu yüzden aşağıdaki karakterleri görür.

œg

Çevrimiçi deneyin!

Nasıl çalışır

œeksik bir simgedir ve bu nedenle göz ardı edilir. gGCD yerleşiktir.

Aslında: LCM

Aslında CP 437 kullanır , bu yüzden aşağıdaki karakterleri görür.

▲g

Çevrimiçi deneyin!

Nasıl çalışır

LCM girişidir. Yana g(GCD) gerektirir iki tamsayı girişi, bu çalıştırılmaz.


27

C / C ++, 79 78 73 bayt

Bir bayt tasarrufu için @ETHproductions teşekkürler!

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'yi hesaplar: Çevrimiçi deneyin!

C ++, LCM'yi hesaplar: Çevrimiçi deneyin!

C'de, auto e=.5otomatik saklama sınıfına sahip (varsayılan olan) bir tamsayı değişkeni bildirilir, bu daha sonra 0 olarak başlatılır, oysa C ++ 11'de 0.5 olarak başlatılan bir çift bildirir. Yani değişkenin değeri C ++ 'da truthy ve C' de falsy olacaktır.

İşlev, Euclid algoritmasıyla GCD'yi ve a ve b'nin ürününü GCD'ye bölerek LCM'yi hesaplar.

İade ifadesinin çıkarılması en azından GCC'de çalışır. Aşağıdaki 78 baytlık çözüm herhangi bir derleyici ile çalışmalıdır:

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
eğer bir açıklama-ebilmek var olmak serin olurdu,
kedi

@ cat Açıklama eklendi.
Steadybox

1
Yanılmıyorsam, bir byte ile kaydedebilirsinizfor(;a;b=c)c=a,a=b%a;
ETHproductions

@ETHproductions Teşekkürler! Bunun foryerine kullanmak için bir neden olduğunu biliyordum while;)
Steadybox

18

Aslında / Jelly , 3 bayt

00000000: 11 1c 67                                         ..g

Bu sunulan programın bir hexdump (xxd) 'dir.

Çevrimiçi deneyin! 1

Aslında: GCD

Aslında CP 437 kullanır , bu yüzden aşağıdaki karakterleri görür.

◄∟g

Çevrimiçi deneyin!

Nasıl çalışır

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

Jöle: LCM

Jelly, Jelly kodu sayfasını kullanır , bu yüzden aşağıdaki karakterleri görür.

×÷g    

Çevrimiçi deneyin!

Nasıl çalışır

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

Not: gcd (a, b) lcm (a, b) = ab formülü tutar, çünkü a ve b pozitifdir.


1 TIO aslında Aslında UTF-8 kullanır. Hem ASCII karakterleri hem de CP437 karakterleri 0x11 ve 0x1c atanmamış olduğundan, program yine de çalışır.


9

Alice ve Jöle , 9 bayt

Alice, LCM'yi hesaplar:

//L
oi@g

Çevrimiçi deneyin!

Bir boşluk gibi ne görünüyor gerçekten 0x7F, DELdenetim karakteri.

Jelly GCD'yi hesaplar. Jelly, yalnızca yazdırılabilir ASCII ile uyumlu olan kendi kod sayfasını kullandığından, satır beslemesi ve DEL karakteri sırasıyla şu duruma dönüşür ½ve satır beslenir:

//L½oi@
g

Çevrimiçi deneyin!

açıklamalar

Jöle önemsizdir: ilk satır saçma bir yardımcı bağlantıyı tanımlar, ikinci satır gerçek programdır ve basitçe GCD yerleşikini içerir.

Alice biraz daha hileli, ama aynı zamanda bir yerleşik kullanır:

/   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 spacegerçekten bir boşluk gibi görünmüyor.
Outgolfer Erik

@EriktheOutgolfer, yazı tipine bağlıdır sanırım.
Martin Ender

Benim için 0x7F (duh mini-markdown) hiç bir yazı tipinde, en azından deneyimimde bir boşluk gibi görünmedi. Ama her zaman içinde bulunduğu çizginin altına fazladan bir boşluk
bırakıyor

7

Octave / MATLAB, 66 61 bayt

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

Foon sayesinde 5 byte kurtarıldı. (x*y)^any()elbette daha kısa idi 1+(x*y-1)*any().


En azından, yerleşik olanı kullanmıyor lcm.

Açıklama:

Bu, en gcdbüyük ortak böleni hesaplamak için yerleşimi kullanır .

Octave'da, bu gücün gücüne yükseltilir 1-2*any(version==82). any(version==82)olan 0bu basitçe böylece, Octave gcd(x,y)^1. (x*y)^any(version==82)Veya ile çarpılır (x*y)^0 = 1.

MATLAB gcdiçin, gücüne yükseltilir 1-2*any(version==82). any(version==82)olan 1bu yüzden MATLAB'da gcd(x,y)^-1. (x*y)^any(version==82), Veya ile çarpılır (x*y)^1 = x*y. Bu, lcm(x,y) == x*y/gcd(x,y)pozitif sayılardan bu yana en az ortak katları verir .


5

Jöle ve MATL , 6 5 bayt

ZmD
g

Bu iki dilden birinde tam bir programdır. Bu Jelly içinde GCD'yı (hesaplar çevrimiçi deneyin! ) Ve Matl içinde LCM ( çevrimiçi deneyin! ). Doğru çıktı üretildikten sonra MATL programı bir hatayla (varsayılan olarak izin verilir) çıkar.

Yalnızca ASCII karakterleri kullanılır, bu nedenle iki dilde aynı kodlanmış baytlara karşılık gelirler.

Jöle içerisindeki GCD'nin açıklaması

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

LCM'nin MATL'deki açıklaması

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 bayt

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

İçin değerlendirir gcdJulia 0.4 (içinde çevrimiçi deneyin! ) Ve lcmJulia 0.5 içinde ( çevrimiçi deneyin! ).

Nasıl çalışır

Julia 0.4'te, örneğin işaretçi gibi, yerleşimin hafıza yerini gösteren log.(1)bir kısa getfield(log,1)yol vardır . Sonuç olarak sıfır değil, karşılaştırma yanlıştır ve ifade değerlendirir .logPtr{Void} @0x00007f2846cb6660gcd

Julia 0.5'te, yeni bir fonksiyon vektörizasyonu sözdizimi tanıtıldı. log.(1)şimdi kısaca broadcast(log,1), bu - 1yinelemeli olmadığından - basitçe değerlendirir log(1). Sonuç sıfırdır, karşılaştırma doğrudur ve ifade değerlendirir lcm.


3

Octave / MATLAB, 44 42 41 bayt

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

Bu, Octave'deki GCD ( @gcd) ve @lcmMATLAB'deki LCM ( ) için isimsiz bir fonksiyon tanımlar .

Octave'deki örnek (veya çevrimiçi deneyin! ):

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

MATLAB'deki örnek:

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

1

JS (ES6), CGL (CGL Golf Dili) , 31 bayt (yarışmacı olmayan)

CGL'nin LCM özelliği bu zorluğun ardından eklenmiştir.

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

Bir uzaya benzeyen, aslında ayrılmaz bir alandır, CGL için bir yorum. JS, GCD'yi hesaplar:

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

CGL, LCM'yi hesaplar:

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

Denemek:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.