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.

Grawiton
źródło
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

eush77
źródło
Ł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]
Luis Mendo
źródło
4

Galaretka , 5 bajtów

‘R⁸%i

Zwraca minimalną prawidłową wartość x lub 0, jeśli jej nie ma.

Wypróbuj online!

Dennis
źródło
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));}
Urna Magicznej Ośmiornicy
źródło
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 .

Nitrodon
źródło
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

Galaretka , 11 10 bajtów

³%_⁴
r‘ÇÐḟ

Pełen program, biorąc dwie liczby całkowite dodatnie, ai b, i drukując listę rozwiązań całkowitą pomiędzy min(a,b)+1i max(a,b)+1włącznie.

Wypróbuj online!

Jonathan Allan
źródło
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}
Kelly Lowder
źródło
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

Haskell , 33 bajty

Występuje awaria, code.hs: out of memory (requested ??? bytes)jeśli nie ma rozwiązania (wcześniej limit czasu na TIO):

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

Wypróbuj online!

Dzięki dla Ørjan Johansen za wykrycie błędu!

ბიმო
źródło
Daje to błędne odpowiedzi dla przypadków testowych, w których występuje bpodział a.
Ørjan Johansen
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!

Epicness
źródło
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

Mathematica, 28 bajtów

Which[#>2#2,#-#2,#==#2,#+1]&
alephalpha
źródło
0

PHP> = 7,1, 51 bajtów

for([,$a,$b]=$argv;++$x<2*$a;)$a%$x!=$b?:print$x._;

Wersja online

Jörg Hülsermann
źródło
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 ...

RosLuP
źródło
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.

DLosc
źródło
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
Bubbler
źródło
0

Japt , 13 bajtów

UµV ?U>V©U:ÒV

Wypróbuj online!

Tłumaczenie rozwiązania JS eush77 .

Kod jest po (U-=V)?U>V&&U:-~Vprzeniesieniu do JS, gdzie Ui Vsą dwiema wartościami wejściowymi.

Bubbler
źródło
0

Japt , 7 bajtów

(Ostatecznie) Wyprowadza, undefinedjeśli nie ma rozwiązania.

@%X¥V}a

Wypróbuj tutaj

Kudłaty
źródło
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.

JosiahRyanW
źródło
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.

Ciaran_McCarthy
źródło
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!

PidgeyUsedGust
źródło
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.

caird coinheringaahing
źródło
-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.

Alex
źródło
5
Remove the unnecessary whitespace to save about 10 or more bytes
Mr. Xcoder