Повторно використовуйте свій код!


23

У цьому виклику ми намагаємось вирішити відразу дві важливі проблеми. Вони є:

  1. З огляду на цілі числа a і b , скажіть, чи a b -1 - просте число.
  2. Давши цілі числа a і b , поверніть nCr (a, b).

Зокрема, ви повинні написати дві програми, одну, яка виконує перше завдання, і одну, яка виконує другу. Оскільки ми хочемо вирішити обидві проблеми одночасно, рекомендується використовувати один і той же код у обох програмах.

Оцінка балів

Оцінка відповіді - відстань Левенштейна між двома програмами. Нижча оцінка - краща. У разі нерівності виграє відповідь із найкоротшим комбінованим кодом двох програм. Ви можете використовувати цей скрипт для обчислення результатів вашого рішення.

Правила

  1. Ви повинні написати дві програми однією мовою, які вирішують описані вище завдання. Ви можете використовувати будь-які потрібні вам способи вводу / виводу. Для завдання 1 ви можете повернути значення truthy / lažy або вибрати два значення для значення true та false та повернути їх відповідно. Напр. ви можете вибрати, що "prime"означає істинне і "not prime"означає неправдиве.
  2. Алгоритми, які ви використовуєте, повинні працювати для всіх можливих входів, але це нормально, якщо код виходить з ладу для великих чисел через обмеження використовуваного типу номера. Ви можете припустити, що вхід правильний.
  3. Жоден підмножина програми не повинен вирішити проблему, тобто. код не повинен працювати, якщо якісь символи видалено. Наприклад, наступний код недійсний, оскільки можна видалити невикористаний блок-блок, не порушивши програму:

    if (1) { /* change to 0 to get the second program*/
        ...
    } else {
        ...
    }
    
  4. Стандартні лазівки заборонені.

Тестові справи

a b -1 є простим?

a b
1 1 false
2 3 true
5 2 false
2 5 true
4 3 false
2 7 true

nCr

a b nCr(a,b)
1 1 1
5 2 10
4 3 4
10 7 120
12 5 792

1
Це може бути корисно для обчислення відстані Левенштейн
Луїс Мендо

3
Ідея приємна, але я думаю, що ви все одно отримаєте рішення з відстані 1 Левенштейна, яким вдасться запобігти модифікації невикористаних частин так чи інакше, а потім ефективно призвести до структури, яку ви хочете заборонити.
Мартін Ендер

6
@LuisMendo Проблема полягає в тому, що багато з цих рішень дійсно повільні. Ви можете використовувати цей скрипт Mathics замість цього.
Мартін Ендер

3
Я думаю, що кращою метрикою була б відстань Левенштейна, поділена на загальну тривалість двох програм.
Грег Мартін

1
@GregMartin Чи не призведе це до боулінгу коду? Можна штучно збільшити програми і все ще стверджувати, що у них немає зайвого коду.
fergusq

Відповіді:


7

MATLAB, відстань 10

Первинність:

function x=f(a,b);x=isprime(a^b-1);

nCr:

function x=f(a,b);x=nchoosek(a,b);

4
Ось вбудований я шукав!
Kritixi Lithos

7

PHP, відстань 29

a^b-1 друкує 0 для істинного та будь-яке ціле значення> 0 для помилкового

[,$a,$b]=$argv;for($c=-$i=1;$i<=$d=$a**$b-1;$d%++$i?:$c++);echo$c;

nCr(a,b)

[,$a,$b]=$argv;for($c=$i=1;$i<=$a;$c*=$i**(1-($i<=$a-$b)-($i<=$b)),$i++);echo$c;

PHP, відстань 36

a^b-1 друкує 1 для справжнього нічого для неправдивого

[,$a,$b]=$argv;for($c=-1,$i=1;$i<=$d=-1+$a**$b;)$d%++$i?:$c++;echo$c<1;

nCr(a,b)

[,$a,$b]=$argv;for($c=$d=$i=1;$i<=$a;$c*=$i++)$d*=$i**(($i<=$a-$b)+($i<=$b));echo$c/$d;

7

Ruby, відстань 1, комбінована довжина 194

Основна перевірка:

->a,b{s='[(a**b-1).prime?,(1..b).inject(1){|m,i|(a+1-i)/i*m}][0]';require'math'<<s.size*2;eval s}

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

nCr:

->a,b{s='[(a**b-1).prime?,(1..b).inject(1){|m,i|(a+1-i)/i*m}][1]';require'math'<<s.size*2;eval s}

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

Як прогнозується в коментарях, якийсь ривок завжди повинен іти проти духу проблеми. Це було весело знайти спосіб обійти його, хоча! Ось як це працює: У нас є два окремих рішення проблеми. Ми запускаємо обидва, вкладаємо їх у масив, а потім або вибираємо 0-й елемент або 1-й, для відстані редагування 1. Це, як правило, незаконно, оскільки ви можете просто видалити все, але потрібний обчислення, і воно все одно буде працювати . Однак кожен фрагмент коду написаний, щоб покладатися на завантаження однієї стандартної бібліотеки 'mathn':

  • Перший використовує його вбудований prime?
  • Другий покладається на mathnзміну того, як працює ділення - перед завантаженням його 3/4оцінює 0, а потім оцінює на дріб (3/4). Оскільки проміжний результат (a+1-i)/iне завжди є цілим числом, загальний результат неправильний без бібліотеки.

Тепер нам просто потрібно зробити завантаження бібліотечного контингенту на решту коду, що не змінюється. Ми робимо це, генеруючи ім'я mathn, використовуючи символьну довжину решти основного коду: комбінований обчислення має довжину 55, яка вдвічі перевищує 110 - це значення ASCII 'n'. Таким чином, поєднання цього з рядком "математика" дає потрібну бібліотеку.

Як бонус, введення залежностей від бібліотеки також змушує код працювати за розумну кількість часу. Зокрема, наївний підхід до nCr не призведе до отримання дрібних проміжних результатів.



4

Укладається , відстань 13

[([@.!]$/{%y!x y-!*})fork!]
[^#-:([]1/$%{!n 1-!})fork!=]

Спробуйте в Інтернеті! Перший обчислює nCr, другий первинність, використовуючи теорему Вілсона.

(f g h) fork!вискакує Nаргументи зі стека (називайте їх a0 ... aN) і застосовує a0 ... aN f a0 ... aN h g.

Для першої програми:

[([@.!]$/{%y!x y-!*})fork!]
[(                  )fork!]  apply the fork of:
  [@.!]                      equiv. { x y : x ! } => `x!`
       $/                    divided by
         {%        }         two-arg function
           y!                y!
             x y-                 (x - y)!
                 *              *

А для другого:

[^#-:([]1/$%{!n 1-!})fork!=]  
[^                         ]  exponentiate  (a^b)
  #-                          decrement     (a^b-1)
    :                         duplicate     (a^b-1 a^b-1)
     (              )fork!    apply the fork to:
      []1/                    1-arg identity function
          $%                  modulus by
            {!     }          1-arg with `n`:
              n 1-             (n-1)
                  !                 !
                          =   check for equality


3

Математика, відстань 10

Завдання 1: PrimeQ[#2^#-1]&

Завдання 2: Binomial[#2,#]&

Обидві функції приймають входи в порядку b,a.


3

Javascript ES7, відстань 14

Дякуємо @Conor O'Brien за скорочення відстані на 7

Первинність:

f=x=>y=>{t=x**y-1;s=1;for(i=2;i<t;i++){if(!t%i)s=i-i}return s}

Повертає 1, якщо прама повертає 0, якщо не проста.

Неймовірно неефективна проста перевірка, перевіряє кількість модулів на кожне число, менше за нього і більше 1 ...

nCr:

f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}

Помножує 1 на кожне число від y + 1 до x і ділить на кожне число від 1 до xy (x! / Y!) / (Xy)!


Зміна другої програми на f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}відстань редагування 14. Спробуйте в Інтернеті!
Конор О'Браєн




1

PHP, відстань 14

Написання програми з двома функціями та виклик лише однієї з них призведе до відстані 1, але це було б занадто кульгаво.

Найпростіший тест, 100 байт:

[,$a,$b]=$argv;function f($n){for($i=$n;--$i>0&&$n%$i;);return$i==1;}echo f($a**$b*-1)*(1|f($a-$b));

nCr, 98 байт:

[,$a,$b]=$argv;function f($n){for($i=$n;--$i>0&&$n*=$i;);return$n*=1;}echo f($a)/(f($b)*f($a-$b));


0

JavaScript, Оцінка: 1, Довжина: 144 142 126 117

function(a,b){s="a=Math.pow(a,b)-t;for(b=2;a%b++;);b>a1for(;b;)t=t*a--/b--";t=s.length-56;return eval(s.split(1)[0])}

функція (a, b) {s = "a = Math.pow (a, b) -slength + 79; for (b = 2; a% b ++;); b> a1for (t = s.length-79 ; b;) t = t * a - / b - "; return eval (s.split (1) [1])}

function A(a,b){a=Math.pow(a,b)-(B+0).length+63;for(b=2;a%b++;);return b>a;}
function B(a,b){for(t=(A+0).length-76;b;)t=t*a--/b--;return t;}
F=A

Обидві підпрограми використовують довжину іншої, щоб обчислити власну константу, тому жоден знак не може бути видалений

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