Поліглоти GCD / LCM!


26

Ваше завдання полягає в тому, щоб скласти програму або функцію, яка виводить GCD своїх входів однією мовою, а LCM своїх входів - іншою. Вбудовані для GCD або LCM (я дивлюсь на вас, Mathematica) дозволені, але не рекомендуються. Будуть 2 входи, які завжди будуть натуральними цілими числами, ніколи не перевищуючи 1000.

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

Кожен рядок - це один тестовий випадок у форматі 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

Дивіться цю пастину для всіх можливих входів з 0 < x, y < 31. Зауважте, що різні версії одних і тих же мов вважаються різними мовами.


Отже ... ifдозволена на основі версії мова, якщо вона зберігається в змінній?
IllidanS4 хоче, щоб Моніка повернулася

@ illidanS4 це добре.
програміст5000

Відповіді:


24

Желе / Власне , 2 байти

00000000: 1e 67                                            .g

Це шістнадцятковий (xxd) поданої програми. Його не можна перевірити в Інтернеті, оскільки TIO не підтримує кодування CP437. @Mego був добрим, щоб переконатися, що це працює на Cygwin, який реалізує CP437 як призначено насправді.

Желе: GCD

Jelly використовує кодову сторінку Jelly , тому вона бачить наступні символи.

œ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 ++ і хибне в C.

Функція обчислює GCD за алгоритмом Евкліда, а LCM шляхом ділення добутку на a і b на GCD.

Опущення заяви про повернення працює принаймні щодо 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

Насправді / желе , 3 байти

00000000: 11 1c 67                                         ..g

Це шістнадцятковий (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

Jelly використовує кодову сторінку Jelly , тому вона бачить наступні символи.

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

Еліс та Джелі , 9 байт

Аліса обчислює LCM:

//L
oi@g

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

Те, що схоже на пробіл, є насправді 0x7F, DELконтрольним символом.

Желе обчислює GCD. Оскільки Jelly використовує свою власну кодову сторінку, сумісну лише з друкованим ASCII, символи linefeed та DEL перетворюються відповідно на ½і передаються в рядку відповідно:

//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насправді не схожий на простір.
Ерік Аутгольфер

@EriktheOutgolfer, я думаю, залежить від шрифту.
Мартін Ендер

Для мене 0x7F (duh mini-markdown) ніколи не виглядав як пробіл у будь-якому шрифті, принаймні з мого досвіду. Але він завжди вставляє додатковий інтервал між рядком, в якому знаходиться ...
Ерік Атгольфер

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.

Пояснення:

Це використовує вбудований 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піднімається під силу 1-2*any(version==82). any(version==82)є 1в MATLAB, так це і є gcd(x,y)^-1. Помножено на (x*y)^any(version==82), або (x*y)^1 = x*y. Це дає найменше спільне множину, оскільки lcm(x,y) == x*y/gcd(x,y)для додатних чисел.


5

Желе і MATL , 6 5 байт

ZmD
g

Це повна програма на будь-якій з двох мов. Він обчислює GCD в Jelly ( Спробуйте в Інтернеті! ) І LCM в MATL ( Спробуйте в Інтернеті! ). Програма MATL закінчується помилкою (дозволено за замовчуванням) після отримання правильного виводу.

Використовуються лише символи ASCII, тому вони відповідають однаковим кодованим байтом на двох мовах.

Пояснення GCD в Jelly

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

Джулія 0,4 / Джулія 0,5 , 18 байт

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

Оцінюється gcdв Джулії 0,4 ( спробуйте в Інтернеті! ) Та до lcmДжулії 0,5 ( Спробуйте в Інтернеті! ).

Як це працює

У Джулії 0,4 log.(1)- це стенограма для getfield(log,1), яка повертає місце пам'яті logвбудованого, наприклад, вказівника Ptr{Void} @0x00007f2846cb6660. Таким чином, результат є не нульовим, порівняння хибним, а вираз оцінюється на gcd.

У Julia 0.5 було введено новий синтаксис векторизації функцій. log.(1)тепер це скорочення broadcast(log,1), яке - оскільки 1це не можна відшукати - просто оцінює log(1). Таким чином, результат дорівнює нулю, порівняння є істинним, і вираз оцінюється на lcm.


3

Октава / MATLAB, 44 42 41 байт

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

Це визначає анонімну функцію для GCD ( @gcd) в Octave, а для 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 Golfing Language) , 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">

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