Обчисліть зворотний модуль


18

Завдання:

Виведіть значення для x, де a mod x = bдля двох заданих значень a,b.

Припущення

  • aі bзавжди будуть додатними цілими числами
  • Не завжди знайдеться рішення x
  • Якщо існує кілька рішень, виведіть принаймні одне з них.
  • Якщо немає жодних рішень, нічого не виведіть або вкажіть, що немає рішень.
  • Вбудовані дозволені (не так весело, як інші математичні підходи)
  • Вихідні дані - це цілі числа

Приклади

A, B >> POSSIBLE OUTPUTS

5, 2 >> 3
9, 4 >> 5
8, 2 >> 3, 6
6, 6 >> 7, (ANY NUMBER > 6)
8, 7 >> NO SOLUTION
2, 4 >> NO SOLUTION
8, 5 >> NO SOLUTION
10,1 >> 3, 9

Це , тому виграє найнижчий байт.


Чи може вона помилитися, якщо не знайдено рішення?
плескати

@ConfusedMr_C Технічно це не вказує на рішення, тому так.
Гравітон

Відповіді:


11

JavaScript , 28 27 26 24 23 байт

a=>b=>(a-=b)?a>b&&a:b+1

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

false не вказує на рішення.

-1 дякую @Arnauld


Приємно зроблено і гарно покатали.
Кудлатий

Отже, щоб його назвати, потрібно надати зовнішній функції ім'я, скажімо f=..., а потім зателефонувати f(8)(3)? Це здається трохи обманливим? Нормальним способом викликати функцію було б f(8,3), що зробило б визначення вашого функції довшим?
Стів Беннетт

3
@SteveBennett Щоправда, визначення є кривим , а це означає, що його потрібно називати так (8)(3), але існує консенсус щодо PPCG . Не потрібно давати йому ім'я.
eush77

1
@SteveBennett Забавно, як ти думаєш, 26 проти -15 - це не що інше, як явний консенсус. Удачі, намагаючись суперечити.
eush77

1
@SteveBennett як від 55 до 1 слабкий консенсус?
Кіос

6

MATL , 6 байт

tQ:\=f

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

Розглянемо вхідні дані 8, 2як приклад.

t    % Implicit input. Duplicate                STACK: 8, 8
Q    % Add 1                                    STACK: 8, 9
:    % Range                                    STACK: 8, [1 2 3 4 5 6 7 8 9]
\    % Modulo                                   STACK: [0 0 2 0 3 2 1 0 8]
=    % Implicit input. Equality comparison      STACK: [0 0 1 0 0 1 0 0 0]
f    % Indices of nonzeros. Implicit display    STACK: [3 6]



3

Groovy, 48 байт (за допомогою вбудованого):

{a,b->Eval.me(a+"g").modInverse(Eval.me(b+"g"))}

Eval.me(...+"g") - Приєднує "g" до входу, що робить його BigInteger.

modInverse(...) - Виконує операцію зворотного модуля.


Java 8, 70 байт

{a,b->return BigInteger.valueOf(a).modInverse(BigInteger.valueOf(b));}

3

R , 33 28 байт

pryr::f(match(b,a%%1:(a+1)))

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

-4 байти завдяки Джарко Дуббелдам.

-1 байт завдяки Джузеппе.

Повертається, NAякщо немає рішення. У TIO не встановлена ​​бібліотека pryr, тому function(a,b)замість цього використовується код у цьому посиланні .


pryr::f(which(a%%1:(a+1)==b)) на 4 байти коротше.
JAD

ви також можете скинути інший байт за допомогою match(b,a%%1:(a+1)), який повертає NAза відсутнім значенням.
Джузеппе


1

Математика 36 байт

a_±b_:=Select[Range[9a],a~Mod~#==b&]

Вхід:

5 ± 2
9 ± 4
8 ± 2
6 ± 6
8 ± 7
2 ± 4
8 ± 5
10 ± 1

Вихід:

{3}
{5}
{3, 6}
{7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, \
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, \
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54}
{}
{}
{}
{3, 9}

При використанні цих розширених операторів ASCII у двійковій формі їм потрібно визначити простір попереду при визначенні, інакше аналізатор видає помилку. Так і мало б бути a_ ±b_. Але все ж коротше використовувати Casesзамість Selectбезіменної функції:Cases[Range[9#],x_/;#~Mod~x==#2]&
Мартін Ендер

1

Haskell , 33 байти

Збій, code.hs: out of memory (requested ??? bytes)якщо немає рішення (час вичерпано на TIO до цього):

a!b=[x|x<-[b+1..],mod(a-b)x<1]!!0

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

Дякуємо Ørjan Johansen за те, що помітили помилку!


Це дає неправильні відповіді для тестових випадків, коли bділиться a.
Ørjan Johansen

1

C # (компілятор Mono C #) , 57 56 26 байт

Порт Рода відповідь Python. Завдяки WW за -1 байт.

Величезне спасибі Кевіну Крейсейну за -30 байт.

a=>b=>a-b>b?a-b:a==b?a+1:0

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


1
Ласкаво просимо на сайт! Схоже, ви можете видалити простір після return.
Опублікувати Rock Garf Hunter

Ласкаво просимо до PPCG! Для нерекурсивних відповідей на C # завжди найкраще і найкоротше використовувати функцію лямбда ( i=>{/*code here*/}). Однак у цьому випадку, оскільки у вас є два входи, це може бути функція currying лямбда, щоб зберегти додатковий байт ( a=>b=>{/*code here*/}замість (a,b)=>{/*code here*/}). Крім того, ви можете видалити дужки навколо своїх if-чеків. Загалом, не змінюючи жодної своєї функціональності, вона стає a=>b=>a-b>b?a-b:a==b?a+1:0 26 байтами
Кевін Круїйсен

Крім того, якщо ви цього ще не бачили, Поради щодо гольфу на всіх мовах та Поради щодо гольфу в C # можуть бути цікавими для перегляду. Насолодитися перебуванням! :)
Кевін Кройсейсен

Дякую всім за поради. Я буду пам’ятати про це, коли майбутні гри в гольф.
Епічність





0

Аксіома, 147 128 байт

g(a:PI,c:PI):Union(List PI,Stream INT)==(a<c=>[];r:=a-c;r=0=>expand((a+1..)::UniversalSegment INT);[b for b in divisors(r)|b>c])

ungolf це і тест

--a%b=c return all possible b
f(a:PI,c:PI):Union(List PI, Stream INT)==
    a<c=>[]
    r:=a-c
    r=0=>expand((a+1..)::UniversalSegment INT)
    [b  for b in divisors(r)|b>c]

(3) -> [[i,j,g(i,j)] for i in [5,9,8,6,8,2,8,10] for j in [2,4,2,6,7,4,5,1]]
   (3)
   [[5,2,[3]], [9,4,[5]], [8,2,[3,6]], [6,6,[7,8,9,10,11,12,13,14,15,16,...]],
    [8,7,[]], [2,4,[]], [8,5,[]], [10,1,[3,9]]]
                                                      Type: List List Any

Це знайде все рішення, навіть нескінченний набір рішення ...


0

Піп , 9 байт

a%,a+2@?b

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

Пояснення

           a, b are cmdline args (implicit)
  ,a+2     Range from 0 up to but not including a+2
a%         Take a mod each of those numbers
           (Note that a%0 returns nil; it emits a warning, but only if warnings are turned on)
      @?b  Find the index of the first occurrence of b in this list, or nil if it doesn't occur
           Autoprint (implicit)

Наприклад, із введенням 8та 2:

   a+2   10
  ,      [0 1 2 3 4 5 6 7 8 9]
a%       [() 0 0 2 0 3 2 1 0 8]

Індекс, що базується на 0, вперше 2в цьому списку - 3це наше рішення.







0

ORK , 566 байт

When this program starts:
I have a inputter called I
I have a number called a
I have a number called b
I is to read a
I is to read b
I have a mathematician called M
M's first operand is a
M's second operand is b
M is to subtract
I have a number called n
n is M's result
M's first operand is b
M's second operand is n
M is to compare
I have a scribe called W
If M says it's less then W is to write n
If M says it's less then W is to write "\n"
M's second operand is a
M is to compare
If M says it's equal then W is to write a
If M says it's equal then W is to write a

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

O bjects R K ool. На щастя, мені не потрібно було використовувати жодне (окрім вбудованих) для цього завдання.


0

F #, 40 байт

let m a b=Seq.find(fun x->a%x=b){1..a+1}

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

Досить прямо вперед. Викидає, System.Collections.Generic.KeyNotFoundExceptionякщо рішення не знайти.

Ви також можете змінити його, до Seq.tryFindякого повернеться int option, Noneякщо рішення не вдалося знайти.





0

Шепіт v2 , 128 байт

> Input
> Input
>> 1²
>> (3]
>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7
>> L⋅R
>> Each 9 4 8
> {0}
>> {10}
>> 12∖11
>> Output 13

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

Повертає набір усіх можливих рішень та порожній набір (тобто ) коли немає рішення.

Як це працює

Не дивно, що він працює майже однаково до більшості інших відповідей: генерує список чисел і перевіряє кожне на інверсійний модуль аргументом.

Якщо ви знайомі з тим, як працює структура програми Whispers, сміливо переходьте до горизонтальної лінії. Якщо ні: по суті, Whispers працює за системою відліку за лінією, починаючи з кінцевої лінії. Кожен рядок класифікується як один із двох варіантів. Або це лінія nilad , або це лінія оператора .

Рядки Nilad починаються з >, наприклад, > Inputабо > {0}повертають точне значення, представлене на цьому рядку, тобто > {0}повертає набір{0}. > Inputповертає наступний рядок STDIN, який оцінюється, якщо це можливо.

Рядки оператора починаються з >>, таких як >> 1²або >> (3]позначають запуску оператора на одному або декількох значеннях. Тут використовувані числа не посилаються на ці явні числа, натомість вони посилаються на значення в цьому рядку. Наприклад, ²це квадратна команда (нн2), тому >> 1²значення не повертає12, замість цього він повертає квадрат рядка 1 , який у цьому випадку є першим входом.

Зазвичай лінії операторів працюють лише з використанням номерів як посилань, але ви, можливо, помітили рядки >> L=2та >> L⋅R. Ці два значення Lі Rвикористовуються разом із Eachтвердженнями. Eachтвердження працюють, беручи два-три аргументи, знову ж таки як числові посилання. Перший аргумент (наприклад 5) - це посилання на рядок оператора, який використовується функцією, а решта аргументів - масиви. Потім ми повторюємо функцію над масивом, де Lі Rу функції представляють поточний елемент (и) в масивах, які перебираються на ітерацію . Як приклад:

Дозволяти А=[1,2,3,4], Б=[4,3,2,1] і f(х,у)=х+у. Якщо припустимо, що ми виконуємо такий код:

> [1, 2, 3, 4]
> [4, 3, 2, 1]
>> L+R
>> Each 3 1 2

Потім ми отримуємо демонстрацію того, як Eachпрацюють заяви. По-перше, працюючи з двома масивами, ми їх блискавки формуємоС=[(1,4),(2,3),(3,2),(4,1)] потім карта f(х,у) над кожною парою, утворюючи наш остаточний масив D=[f(1,4),f(2,3),f(3,2),f(4,1)]=[5,5,5,5]

Try it online!


How this code works

Working counter-intuitively to how Whispers works, we start from the first two lines:

> Input
> Input

This collects our two inputs, lets say x and y, and stores them in lines 1 and 2 respectively. We then store x2 on line 3 and create a range A:=[1...x2] on line 4. Next, we jump to the section

>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7

The first thing executed here is line 7, >> Each 5 4, which iterates line 5 over line 4. This yields the array B:=[i%x|iA], where a%b is defined as the modulus of a and b.

We then execute line 8, >> Each 6 7, which iterates line 6 over B, yielding an array C:=[(i%x)=y|iA].

For the inputs x=5,y=2, we have A=[1,2,3,...,23,24,25], B=[0,1,2,1,0,5,5,...,5,5] and C=[0,0,1,0,0,...,0,0]

We then jump down to

>> L⋅R
>> Each 9 4 8

which is our example of a dyadic Each statement. Here, our function is line 9 i.e >> L⋅R and our two arrays are A and C. We multiply each element in A with it's corresponding element in C, which yields an array, E, where each element works from the following relationship:

Ei={0Ci=0AiCi=1

We then end up with an array consisting of 0s and the inverse moduli of x and y. In order to remove the 0s, we convert this array to a set (>> {10}), then take the set difference between this set and {0}, yielding, then outputting, our final result.


-1

C#, 53 bytes (83 with function heading)

static int F(int a, int b){
    for(int i=1;i<=a+1;i++){if(a%i==b)return i;}return 0;
}

Try It Online

First try at codegolf. Probably not the best language to use, nor the most efficient coding.


5
Remove the unnecessary whitespace to save about 10 or more bytes
Mr. Xcoder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.