Oblicz moduł odwrotności


18

Zadanie:

Podaj wartość dla x, gdzie a mod x = bdla dwóch podanych wartości a,b.

Założenie

  • ai bzawsze będą dodatnimi liczbami całkowitymi
  • Nie zawsze będzie na to rozwiązanie x
  • Jeśli istnieje wiele rozwiązań, wypisz co najmniej jedno z nich.
  • Jeśli nie ma żadnych rozwiązań, nie wypisuj nic lub wskazuj, że nie ma żadnych rozwiązań.
  • Wbudowane są dozwolone (nie tak zabawne, jak inne podejścia matematyczne)
  • Dane wyjściowe są zawsze liczbami całkowitymi

Przykłady

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

To jest , więc wygrywa najmniej bajtów.


Czy może popełnić błąd, jeśli nie zostanie znalezione rozwiązanie?
klaskać

@ ConfusedMr_C Technicznie nie oznacza to rozwiązania, więc tak.
Graviton

Odpowiedzi:


11

JavaScript , 28 27 26 24 23 bajtów

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

Wypróbuj online!

false wskazuje brak rozwiązania.

-1 dzięki @Arnauld


Ładnie wykonane i ładnie zagrane w golfa.
Kudłaty

Aby więc to nazwać, musisz nadać funkcji zewnętrznej nazwę, powiedz f=..., a potem zadzwoń f(8)(3)? To wydaje się trochę podstępne? Normalnym sposobem wywoływania funkcji byłoby f(8,3)wydłużenie definicji funkcji?
Steve Bennett

3
@ SteveBennett To prawda, że ​​definicja jest curry , co oznacza, że ​​należy ją nazwać jak (8)(3), ale istnieje zgoda co do PPCG, co jest dozwolone . Nie musisz jednak nadawać mu nazwy.
eush77

1
@ SteveBennett To zabawne, jak myślisz, że 26 vs -15 to nic innego jak wyraźny konsensus. Powodzenia w sporze.
eush77

1
@ SteveBennett jak 55 do 1 to słaby konsensus?
Cyoce

6

MATL , 6 bajtów

tQ:\=f

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Rozważmy wejść 8, 2jako przykład.

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 bajtów (przy użyciu wbudowanego):

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

Eval.me(...+"g") - Umieszcza „g” na wejściu, co czyni go BigInteger.

modInverse(...) - Wykonuje odwrotną operację modulo.


Java 8, 70 bajtów

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

3

R , 33 28 bajtów

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

Wypróbuj online!

-4 bajty dzięki Jarko Dubbeldam.

-1 bajt dzięki Giuseppe.

Zwraca, NAjeśli nie ma rozwiązania. TIO nie ma zainstalowanej biblioteki pryr, więc function(a,b)zamiast tego używa kodu w tym linku .


pryr::f(which(a%%1:(a+1)==b)) jest o 4 bajty krótszy.
JAD

możesz także upuścić kolejny bajt, używając match(b,a%%1:(a+1)), co zwraca NAbrakującą wartość.
Giuseppe


1

Mathematica 36 bajtów

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

Wejście:

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

Wynik:

{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}

Podczas korzystania z tych rozszerzonych operatorów ASCII w formie binarnej, podczas definiowania potrzebują spacji z przodu, w przeciwnym razie parser generuje błąd. Tak musiało być a_ ±b_. Ale i tak jest krótszy w użyciu Caseszamiast Selectnienazwanej funkcji:Cases[Range[9#],x_/;#~Mod~x==#2]&
Martin Ender


1

C # (kompilator Mono C #) , 57 56 26 bajtów

Odpowiedź Port Pytona na Rod . Dzięki WW za -1 bajt.

Ogromne podziękowania dla Kevina Cruijssena za -30 bajtów.

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

Wypróbuj online!


1
Witamy na stronie! Wygląda na to, że możesz później usunąć spację return.
Post Rock Garf Hunter

Witamy w PPCG! W przypadku nierekurencyjnych odpowiedzi w języku C # zawsze najlepszym i najkrótszym jest użycie funkcji lambda ( i=>{/*code here*/}). W tym przypadku jednak, ponieważ masz 2 wejścia, może być funkcją curdowania lambda, aby zapisać dodatkowy bajt ( a=>b=>{/*code here*/}zamiast (a,b)=>{/*code here*/}). Możesz także usunąć nawias wokół swoich sprawdzeń if. W sumie, bez zmiany żadnej funkcjonalności, staje się a=>b=>a-b>b?a-b:a==b?a+1:0 26 bajtów
Kevin Cruijssen

Ponadto, jeśli jeszcze go nie widziałeś, Porady dotyczące gry w golfa we wszystkich językach i Porady dotyczące gry w golfa w języku C # mogą być interesujące do przeczytania. Miłego pobytu! :)
Kevin Cruijssen

Dziękuję wszystkim za wskazówki, będę o nich pamiętać podczas gry w golfa w przyszłości.
Epicness





0

Aksjomat, 147 128 bajtów

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])

rozkop go i przetestuj

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

To znalazłoby całe rozwiązanie, nawet rozwiązanie nieskończonego zestawu ...


0

Pip , 9 bajtów

a%,a+2@?b

Pobiera dwie liczby jako argumenty wiersza polecenia. Zwraca najmniejsze rozwiązanie lub zero, jeśli nie istnieje żadne rozwiązanie.Wypróbuj online!

Wyjaśnienie

           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)

Na przykład z danymi wejściowymi 8i 2:

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

Bazujący na 0 indeks pierwszego wystąpienia 2na tej liście 3to nasze rozwiązanie.


0

J , 14 bajtów

(->]){-,~=*1+]

Wypróbuj online!

Tłumaczenie rozwiązania Rod's Python 2 .

Jak to działa

Rzadkie przypadki, w których kod J można bezpośrednio przetłumaczyć na język Python.

(->]){-,~=*1+]  <=>  [(a==b)*(1+b),a-b][a-b>b]
         =*1+]        (a==b)*(1+b)
      -,~            [            ,a-b]
     {                                 [     ]
(->])                                   a-b>b





0

ORK , 566 bajtów

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

Wypróbuj online!

O bjects R K schłodzić. Na szczęście jednak nie musiałem używać żadnych (oprócz wbudowanych) do tego zadania.


0

F #, 40 bajtów

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

Wypróbuj online!

Całkiem proste. Zgłasza a, System.Collections.Generic.KeyNotFoundExceptionjeśli nie można znaleźć rozwiązania.

Możesz także zmodyfikować go do Seq.tryFind, który zwróci an int option, Nonejeśli nie można znaleźć rozwiązania.




0

> <> , 21 bajtów

Ta sama sztuczka, co większość opublikowanych rozwiązań. Najpierw przygotowujemy wszystkie niezbędne wartości na stosie, a następnie sprawdzamy porównania.

::r::{-:{)?nr=?!;1+n;

Wypróbuj online!


0

Whispers v2 , 128 bajtów

> 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

Wypróbuj online!

Zwraca zestaw wszystkich możliwych rozwiązań oraz pusty zestaw (tj ), gdy nie ma rozwiązania.

Jak to działa

Nic dziwnego, że działa prawie identycznie jak większość innych odpowiedzi: generuje listę liczb i sprawdza każdą z nich pod kątem modułu odwrotności z argumentem.

Jeśli znasz się na strukturze programu Szeptów, możesz przejść do linii poziomej. Jeśli nie: zasadniczo Szepty działają w systemie odniesienia linia po linii, zaczynając od ostatniej linii. Każda linia jest sklasyfikowana jako jedna z dwóch opcji. Albo jest to linia Nilad , albo linia operatora .

Linie Nilad zaczynają się od >, na przykład > Inputlub, > {0}i zwracają dokładną wartość przedstawioną w tym wierszu, tj. > {0}Zwraca zestaw{0}. > Inputzwraca następny wiersz STDIN, oceniany, jeśli to możliwe.

Linie operatora zaczynają się od >>, na przykład >> 1²lub >> (3]i oznaczają uruchomienie operatora na jednej lub więcej wartości. W tym przypadku użyte liczby nie odnoszą się do tych wyraźnych liczb, lecz odnoszą się do wartości w tym wierszu. Na przykład ²to polecenie kwadratowe (nn2)), więc >> 1²nie zwraca wartości12), zamiast tego zwraca kwadrat linii 1 , który w tym przypadku jest pierwszym wejściem.

Zazwyczaj linie operatora działają tylko przy użyciu liczb jako odniesień, ale być może zauważyłeś linie >> L=2i >> L⋅R. Te dwie wartości Li Rsą używane w połączeniu z Eachinstrukcjami. Eachinstrukcje działają na podstawie dwóch lub trzech argumentów, ponownie jako odniesień numerycznych. Pierwszy argument (np. 5) Jest odniesieniem do linii operatora używanej funkcji, a pozostałe argumenty są tablicami. Następnie iterujemy funkcję po tablicy, gdzie Li Rw funkcji reprezentują bieżący element (y) w tablicach, które są iterowane. Jako przykład:

Pozwolić ZA=[1,2),3),4], b=[4,3),2),1] i fa(x,y)=x+y. Zakładając, że uruchamiamy następujący kod:

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

Następnie otrzymujemy demonstrację działania Eachoświadczeń. Po pierwsze, pracując z dwiema tablicami, spakujemy je do postacido=[(1,4),(2),3)),(3),2)),(4,1)] następnie mapuj fa(x,y) nad każdą parą, tworząc naszą ostateczną tablicę re=[fa(1,4),fa(2),3)),fa(3),2)),fa(4,1)]=[5,5,5,5]

Wypróbuj online!


Jak działa ten kod

Pracując w sposób sprzeczny z intuicją, jak działa Szept, zaczynamy od dwóch pierwszych linii:

> Input
> Input

To zbiera nasze dwa wejścia, powiedzmy x i yi zapisuje je odpowiednio w wierszach 1 i 2 . Następnie przechowujemyx2)w linii 3 i utwórz zakresZA: =[1...x2)]na linii 4 . Następnie przeskakujemy do sekcji

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

Pierwszą rzeczą tutaj jest wykonywany linia 7 , >> Each 5 4, który iteracje linii 5 na linię 4 . To daje tablicęb: =[ja%x|jaZA], gdzie za%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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.