Ters modülü hesapla


18

Görev:

İki değer için xburada a mod x = bdeğer girin a,b.

Varsayım

  • ave bher zaman pozitif tamsayılar olacak
  • Her zaman için bir çözüm olmayacak x
  • Birden fazla çözüm varsa, bunlardan en az birini üretin.
  • Çözüm bulunmuyorsa, hiçbir çözüm bulunmadığına dair hiçbir şey veya bazı göstergeler sunmayın.
  • Yerleşiklere izin verilir (diğer matematiksel yaklaşımlar kadar eğlenceli değildir)
  • Çıktılar her zaman tamsayıdır

Örnekler

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

Bu , bu yüzden en düşük bayt kazanır.


Herhangi bir çözüm bulunamazsa hata verebilir mi?
alkış

@ConfusedMr_C Teknik olarak çözüm olmadığını gösterir, bu yüzden evet.
Graviton

Yanıtlar:


11

JavaScript , 28 27 26 24 23 bayt

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

Çevrimiçi deneyin!

false çözelti olmadığını gösterir.

-1 teşekkürler @Arnauld


Güzel yapılır ve güzel golf.
Shaggy

Yani, onu çağırmak için, dış fonksiyona bir isim vermelisiniz, söyle f=..., sonra ara f(8)(3)? Biraz daha ucuz gözüküyor mu? Bir işlevi çağırmanın normal yolu f(8,3), işlev tanımınızı daha uzun hale getirmektir?
Steve Bennett

3
@SteveBennett Doğru, tanım curried , yani böyle adlandırılmalıdır (8)(3), ancak PPCG'de izin verilen bir fikir birliği var . Yine de bir isim vermek zorunda değilsiniz.
eush77

1
@SteveBennett 26 vs -15'in net bir fikir birliği dışında bir şey olduğunu düşünmek eğlenceli . Tartışmaya çalışırken iyi şanslar.
eush77

1
@SteveBennett 55 ile 1 arasında nasıl zayıf bir fikir birliği var?
Cyoce

6

MATL , 6 bayt

tQ:\=f

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

Giriş göz önünde 8, 2bir örnek olarak.

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 bayt (dahili kullanarak):

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

Eval.me(...+"g") - Girişe "g" eki yaparak onu BigInteger yapar.

modInverse(...) - Ters modulo işlemini gerçekleştirir.


Java 8, 70 bayt

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

3

R , 33 28 bayt

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

Çevrimiçi deneyin!

-Jarko Dubbeldam sayesinde 4 byte.

Giuseppe sayesinde -1 bayt.

NAÇözüm yoksa döndürür . TIO'da pryr kütüphanesi kurulu olmadığından, bu bağlantıdaki kod function(a,b)bunun yerine kullanılır.


pryr::f(which(a%%1:(a+1)==b)) 4 bayt daha kısadır.
JAD

kullanarak eksik bir değer match(b,a%%1:(a+1))döndüren başka bir bayt bırakabilirsiniz NA.
Giuseppe


1

Mathematica 36 Bayt

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

Giriş:

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

Çıktı:

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

Bu genişletilmiş ASCII işleçlerini ikili biçimde kullanırken, tanımlanırken önde bir boşluk olması gerekir, aksi takdirde ayrıştırıcı bir hata atar. Bu yüzden olmalı a_ ±b_. Ancak adsız bir işlev Casesyerine kullanmak daha kısadır Select:Cases[Range[9#],x_/;#~Mod~x==#2]&
Martin Ender


1

C # (Mono C # derleyici) , 57 56 26 bayt

Port of Rod'un Python cevabı. -1 bayt için WW'ye teşekkürler.

Kevin Cruijssen'e -30 bayt için çok teşekkürler.

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

Çevrimiçi deneyin!


1
Siteye Hoşgeldiniz! Daha sonra alanı kaldırabileceğiniz anlaşılıyor return.
Post Rock Garf Avcısı

PPCG'ye Hoşgeldiniz! Özyinelemesiz C # yanıtları için lambda işlevini ( i=>{/*code here*/}) kullanmak her zaman en iyisidir . Bununla birlikte, bu durumda, 2 girişiniz olduğundan, ek bir bayt ( a=>b=>{/*code here*/}yerine (a,b)=>{/*code here*/}) kaydetmek için bir curried lambda işlevi olabilir . Ayrıca, if denetimlerinizin etrafındaki parantezleri kaldırabilirsiniz. Toplamda, işlevlerinizi değiştirmeden a=>b=>a-b>b?a-b:a==b?a+1:0 26 bayt
Kevin Cruijssen

Eğer henüz görmediyseniz Ayrıca, içinde golf <tüm dillere> için ipuçları ve C # içinde golf için ipuçları kudretini hem okumak ilginç olabilir. Keyfini çıkarın! :)
Kevin Cruijssen

İpuçları için hepinize teşekkür ederim, gelecekte golf yaparken bunları aklımda tutacağım.
Epicness





0

Aksiyom, 147 128 bayt

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

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

Bu sonsuz çözüm bile tüm çözümü bulur ...


0

Pip , 9 bayt

a%,a+2@?b

İki sayıyı komut satırı bağımsız değişkenleri olarak alır. En küçük çözümü veya hiçbir çözüm yoksa nil çıktısını verir.Çevrimiçi deneyin!

açıklama

           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)

Örneğin, 8ve ile 2:

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

2Bu listedeki ilk oluşumun 0 tabanlı dizini 3bizim çözümümüzdür.







0

ORK , 566 bayt

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

Çevrimiçi deneyin!

O bjects R K Ool. Neyse ki, bu görev için herhangi bir (yerleşik olanların yanı sıra) kullanmama gerek yoktu.


0

F #, 40 bayt

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

Çevrimiçi deneyin!

Oldukça basit. AtarSystem.Collections.Generic.KeyNotFoundExceptionÇözüm bulunamazsa .

Ayrıca herhangi bir çözüm bulunamazsa , Seq.tryFindbir döndürecek şekilde de değiştirebilirsiniz .int optionNone




0

> <> , 21 bayt

En çok yayınlanan çözümlerle aynı numara. İlk olarak, yığın üzerinde gerekli tüm değerleri hazırlarız ve ardından karşılaştırmaları kontrol ederiz.

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

Çevrimiçi deneyin!


0

Fısıltılar v2 , 128 bayt

> 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

Çevrimiçi deneyin!

Olası tüm çözümler kümesini ve boş kümeyi (ör. ) çözüm bulunmadığında.

Nasıl çalışır

Şaşırtıcı olmayan bir şekilde, diğer birçok cevapla neredeyse aynı şekilde çalışır: bir sayı listesi oluşturur ve her birini argümanla ters modül için kontrol eder.

Whispers'in program yapısının nasıl çalıştığını biliyorsanız, yatay çizgiye atlamaktan çekinmeyin. Değilse: esasen, Whispers son satırdan başlayarak satır satır referans sisteminde çalışır. Her satır iki seçenekten biri olarak sınıflandırılır. Ya bir nilad hattı ya da bir operatör hattı .

Nilad satırları >, > Inputveya ile başlar > {0}ve bu satırda temsil edilen tam değeri > {0}döndürür;{0}. > Inputmümkünse değerlendirilen bir sonraki STDIN satırını döndürür.

Operatör hatları >>, >> 1²veya ile başlar >> (3]ve bir veya daha fazla değer üzerinde bir operatörün çalıştırılmasını gösterir. Burada, kullanılan sayılar bu açık sayılara başvurmaz, bunun yerine o satırdaki değere başvurur. Örneğin ², kare komut (nn2), bu nedenle >> 1²değeri döndürmez12bunun yerine , bu durumda ilk giriş olan satır 1'in karesini döndürür .

Genellikle, operatör satırları yalnızca referans olarak sayıları kullanarak çalışır, ancak satırları >> L=2ve >> L⋅R. Bu iki değer Lve ifadeleriyle Rbirlikte kullanılır Each. Eachifadeleri, yine sayısal başvurular olarak iki veya üç bağımsız değişken alarak çalışır. İlk argüman (örn. 5), Bir işlev kullanılan bir operatör satırına bir referanstır ve diğer argümanlar dizilerdir. Daha sonra işlevi dizi üzerinde yineliyoruz; burada Lve Rişlevindeki yinelenen dizilerdeki geçerli öğeleri temsil eder. Örnek olarak:

İzin Vermek bir=[1,2,3,4], B=[4,3,2,1] ve f(x,y)=x+y. Aşağıdaki kodu çalıştırdığımızı varsayarsak:

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

Daha sonra Eachifadelerin nasıl çalıştığına dair bir gösteri elde ederiz . İlk olarak, iki diziyle çalışırken, bunları oluşturmak için sıkıştırıyoruzC=[(1,4),(2,3),(3,2),(4,1)] sonra harita f(x,y) her bir çiftin üzerinde D=[f(1,4),f(2,3),f(3,2),f(4,1)]=[5,5,5,5]

Çevrimiçi deneyin!


Bu kod nasıl çalışır?

Whispers'ın nasıl çalıştığına sezgisel olarak çalışarak, ilk iki satırdan başlıyoruz:

> Input
> Input

Bu iki girdimizi toplar, diyelim ki x ve yve bunları sırasıyla 1. ve 2. satırlarda depolar . Sonra depolarızx23. satırda bir aralık oluşturun ve bir aralık oluşturunbir: =[1...x2]satır 4 . Sonra bölüme atlıyoruz

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

Burada yürütülen ilk şey çizgidir 7 , >> Each 5 4çizgi yinelediğinden 5 hattı üzerinden 4 . Bu dizi verirB: =[ben%x|benbir], nerede bir%b'nin modülü olarak tanımlanır .bir ve b.

Daha sonra çizgiyi yürütmek 8 , >> Each 6 7çizgi yinelediğinden 6 overB, bir dizi verir C: =[(ben%x)=y|benbir].

Girişler için x=5,y=2, sahibiz bir=[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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.