Uyum İlişkileri


11

3 pozitif tamsayılar Verilen a, bve nçıkış bir truthy değeri ise, (kimin maksimum değerler kendi dilinizde maksimum Temsil tamsayı değeri vardır) a ≡ b (mod n)ve Falsey aksi. Uyum ilişkilerine aşina olmayanlar a ≡ b (mod n)için doğrudur a mod n = b mod n(ya da eşdeğer olarak (a - b) mod n = 0).

Kısıtlamalar

  • Yerleşik uyum testi yöntemleri yasaktır
  • Dahili modulo işlemleri yasaktır (bu, divmodhem bölümü hem de geri kalanını döndüren Python işlevi, bölünebilirlik işlevleri, kalıntı sistemi işlevleri ve benzerleri gibi işlemleri içerir)

Test Durumları

(1, 2, 3) -> False
(2, 4, 2) -> True
(3, 9, 10) -> False
(25, 45, 20) -> True
(4, 5, 1) -> True
(83, 73, 59) -> False
(70, 79, 29) -> False
(16, 44, 86) -> False
(28, 78, 5) -> True
(73, 31, 14) -> True
(9, 9, 88) -> True
(20, 7, 82) -> False

Bu , en kısa kod (bayt cinsinden) kazanır ve en erken gönderim bir tiebreaker olarak gönderilir.


Bölünebilirlik fonksiyonları nasıl olur?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Kalanları test ederek çalışır, bu yüzden de yasaktır. Açıklığa kavuşacağım.
Mego

Python 2'nin tamsayı kat bölümüne ne dersiniz /?
xnor

Kayan nokta bölümü?
El'endia Starman

1
Temel dönüşüm?
Dennis

Yanıtlar:



4

Python 2, 27 bayt

lambda a,b,n:(a-b)/n*n==a-b

Tarafından bölünerek , otomatik olarak katlanarak ve geri çarparak aynı sonucu verip vermediğini kontrol a-bederek katları olup olmadığını kontrol eder .nnn


4

Julia, 24 bayt

f(a,b,n,t=a-b)=t÷n==t/n

Bu, üç tamsayıyı kabul eden ve bir boole döndüren bir işlevdir.

Olup Biz sadece deney , bir - b ile divded tam sayı n eşittir bir - b bölünür şamandıra n . Bu, bölünmeden geriye kalan bir şey olmadığında geçerli olacaktır, yani a - b | n , a - b (mod n ) = 0 anlamına gelir .


4

Pyth, 7 bayt

!@UQ-FE

Pyth'in döngüsel indekslemesini kullanır.

  UQ         range(first line). [0,...,Q-1]
    -FE      Fold subtraction over the second line.
 @           Cyclic index UQ at -FE
!            Logical NOT


3

Minkolang 0.15 , 14 11 bayt

nn-n$d:*=N.

Burada deneyin! Girdi olarak bekleniyor a b n.

Açıklama:

n              Take number from input -> a
 n             Take number from input -> a, b
  -            Subtract               -> a-b
   n           Take number from input -> a-b, n
    $d         Duplicate stack        -> a-b, n, a-b, n
      :        Integer division       -> a-b, n, (a-b)//n
       *       Multiply               -> a-b, (a-b)//n*n
        =      1 if equal, 0 otherwise
         N.    Output as number and stop.

3

MATL , 9 bayt

Sdt:i*0hm

Girdi biçimi:

[a b]
n

Çevrimiçi deneyin!

S     % implicitly input [a, b]. Sort this array
d     % compute difference. Gives abs(a-b)
t:    % duplicate and generate vector [1,2,...,abs(a-b)]; or [] if a==b
i*    % input n and multiply to obtain [n,2*n,...,abs(a-b)*n]; or []
0h    % concatenate element 0
m     % ismember function. Implicitly display


2

APL, 15 bayt

{(⌊d)=d←⍺÷⍨-/⍵}

Bu, solda n ve a ve b'yi sağda dizi olarak kabul eden ikili bir işlevdir .

Burada yaklaşım temelde benim Julia aynıdır cevap . A - b / n değerinin kendi tabanına eşit olup olmadığını test ediyoruz ; bu, a - b (mod n ) = 0 olduğunda geçerli olacaktır .


Dört d=⌊d←⎕÷⍨-/⎕
kişiyi kurtarın

2

JavaScript (ES6), 27 bayt

@ CᴏɴᴏʀO'Bʀɪᴇɴ çalışmayan bir sürüm yayınladı; İşte insanların "çalışan" bir biçimde kullandıkları "ortak algoritma":

(a,b,n)=>n*(0|(a-b)/n)==a-b

"Çalışır" kelimesi korkutucu tırnak işaretleri içermekte, çünkü kullandığımız kısayol Math.floor(), imzalı 32 bit aralığında olmak üzere bir sayıyı dolaylı olarak kısaltmaktadır ; tanımlamak.


Bu yanıt, dilde temsil edilebilir tüm pozitif tamsayıları işleyemiyorsa, geçerli değildir.
Mego

1
@Mego: Bazı dillerin 32 bit tamsayıları kullanacağı göz önüne alındığında, tamsayıların bit genişliğini veya dilin bignum içermesi gerektiğini belirtmedikçe, kısıtlamanın zahmetli bir şekilde keyfi olduğunu düşünüyorum.
CR Drost

1
Hiç keyfi değil. Zorluk, girdilerin seçilen dilde maksimum temsil edilebilir tamsayı değerine kadar herhangi bir 3 pozitif tamsayı olabileceğini açıkça belirtir. Gönderme, bu aralıktaki bir dizi girdi için başarısız olursa, geçerli değildir. İlgili meta yayın .
Mego

@Mego: Size boş bir soru sorayım: Haskell çözümüne aynı kriterde itiraz edecek misiniz? (Haskell çözümü polimorfiktir, çünkü imzası yoktur ve Korkunç Monomorfizm Kısıtlamasını çağıracak şekilde yazılmaz. Normal imzalı türler için tüm aralıkta mükemmel çalışır; ancak yapabileceğiniz bir dizi girdi vardır. koymak - bir test seti (2, 150, 3) :: (Word8, Word8, Word8); belirttiğiniz kriter açıkça "teorik olarak cevabı geçersiz kılan bir girdi varsa, cevabın geçersiz kabul edilmesi gerekir.")
CR Drost

1
@Mego: Bundan neden önemli bir şey yaptığımı merak ediyorsanız, JavaScript numarası türü, 2 ^ 52-ish saçaklarının çevresinde sürekli olmayan tamsayılar içerir, böylece (a - b) == abelirli değerlerin mümkün olması mümkün olur a. Bu sınır bölgelerinde geçerli olması gereken bir cevap, bayt cezasını alıp (0|...)onunla değiştirsem bile neredeyse imkansızdırMath.floor(...).
CR Drost

2

CJam, 7 bayt

l~-\,=!

Giriş sırası n a b.

Burada test edin.

açıklama

l~  e# Read input and evaluate to push n, a and b onto the stack.
-   e# Subtract b from a.
\,  e# Swap with n and turn into range [0 1 ... n-1].
=   e# Get (a-b)th element from that range, which uses cyclic indexing. This is
    e# equivalent to modulo, and as opposed to the built-in % it also works correctly
    e# for negative (a-b).
!   e# Negate, because a 0 result from the previous computation means they are congruent.

1

Python 3, 27 bayt

lambda a,b,n:pow(a-b,1,n)<1

pow(x,y,n)hesaplar (x**y)%n, bu yüzden bu sadece (a-b)**1%n.


1

ES6, 28 bayt

(a,b,n)=>!/\./.test((a-b)/n)

(Ab) / n içinde izin verildiği bir ondalık nokta arayarak çalışır.


1

Ciddi, 10 bayt

,,,-A│\)/=

Girdi olarak alır N\nA\nB\n(yeni satırlardan ayırmak için kullanılan büyük harfler).

Çevrimiçi deneyin

Bu, @ AlexA'nın cevabı ile aynı yöntemi kullanır

Açıklama (açıklayıcı amaçlar için değişken isimleri olarak kullanılan büyük harfler):

,,,-A│\)/=
,,,         push N, A, B
   -A       push C = abs(A-B)
     │      duplicate entire stack (result is [N, C, N, C])
      \)/=  1 if C//N == C/N (floored division equals float division)

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.