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 (n→n2)), 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|ja∈ZA], 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|i∈A].

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.