Чи є у мене близнюк із перестановленими залишками?


17

Визначимо як перелік залишків евклідового поділу на , , та .Rnn2357

З огляду на ціле число , ви повинні з'ясувати, чи існує ціле число таким, що є перестановкою .n00<k<210Rn+kRn

Приклади

Критерій виконується для , оскільки:n=8

  • маємоR8=(0,2,3,1)
  • для маємо , що є перестановкоюk=44Rn+k=R52=(0,1,2,3)R8

Критерій не виконується для , оскільки:n=48

  • маємоR48=(0,0,3,6)
  • найменше ціле число таке, що R_ {n + k} є перестановкою R_ {48} є k = 210 (що веде до R_ {258} = (0,0,3,6) )k>0Rn+kR48k=210R258=(0,0,3,6)

Правила

  • Ви можете вивести цільове значення, якщо k існує, а в іншому - помилкове значення, або два чіткі та послідовні значення на ваш вибір.
  • Це .

Підказка

Вам справді потрібно обчислити k ? Ну, можливо. А може, ні.

Тестові справи

Деякі значення n для яких k існує:

3, 4, 5, 8, 30, 100, 200, 2019

Деякі значення n для яких k не існує:

0, 1, 2, 13, 19, 48, 210, 1999

Відповіді:


20

R , 63 59 байт

s=scan()%%c(2,3,5,7);i=which(s<c(0,2,3,5));any(s[i]-s[i-1])

Спробуйте в Інтернеті!

-4 байти завдяки Джузеппе

(Пояснення містить спойлер про те, як вирішити проблему без обчислення .)k

Пояснення: Нехай - список залишків. Зверніть увагу на обмеження, що s [1] <2, s [2] <3, s [3] <5 і s [4] <7. За китайською теоремою залишку , існує iff, є перестановка , відмінна від , яка підтверджує обмеження. На практиці це буде перевірено, якщо перевірено одну з наступних умов:skss

  • s [2] <2 і s [2]! = s [1]
  • s [3] <3 і s [3]! = s [2]
  • s [4] <5 і s [4]! = s [3]

Чи можете ви пояснити, чому перестановка обов'язково відрізняється від ? с
dfeuer

1
@dfeuer Це наслідок китайської теореми залишків; Я додав посилання. Якщо два цілих числа мають однакові залишки за модулем 2, 3, 5 і 7 (без перестановки), то цілі цілі рівні рівні за модулем 2 * 3 * 5 * 7 = 210.
Робін Райдер




5

C # (Visual C # Interactive Compiler) , 125 42 38 36 байт

n=>n%7<5&5<n%35|n%5<3&3<n%15|-~n%6>3

Прямий порт відповіді @ xnor, який базується на рішенні @ RobinRyder.

Збережено 4 байти завдяки @ Ørjan Johansen!

Збережено ще 2 завдяки @Arnauld!

Спробуйте в Інтернеті!


1
Я знайшов варіацію, яка стосується лише мов xnor, але допомагає для цього: 38 байт
Ørjan Johansen

1
Це не -~n%6/4>0просто -~n%6>3?
Арнольд


4

Python 2 , 41 байт

lambda n:n%5!=n%7<5or n%3!=n%5<3or-~n%6/4

Спробуйте в Інтернеті!

Використовується та ж характеристика, що і Робін Райдер . Чек n%2!=n%3<2скорочено до -~n%6/4. Виписування трьох умов виявилося коротшими, ніж написання загальної:

46 байт

lambda n:any(n%p!=n%(p+1|1)<p for p in[2,3,5])

Спробуйте в Інтернеті!




2

Мова Вольфрама (Mathematica) , 56 байт

Or@@(Min[s-#]>0&/@Rest@Permutations@Mod[#,s={2,3,5,7}])&

Спробуйте в Інтернеті!

Знаходить усі перестановки без ідентичності залишків вхідного модуля 2, 3, 5, 7 і перевіряє, чи будь-яка з них знаходиться нижче {2,3,5,7}в кожній координаті. Зауважимо, що Or@@{}є False.




1

PHP ,81 78 72 байти

while($y<3)if($argn%($u='235'[$y])!=($b=$argn%'357'[$y++])&$b<$u)die(T);

Риф на @Robin Райдера відповідь. Вхід є через STDIN, вихід - 'T'якщо неправдоподібний, а порожній - якщо хибний ''.

$ echo 3|php -nF euc.php
T
$ echo 5|php -nF euc.php
T
$ echo 2019|php -nF euc.php
T
$ echo 0|php -nF euc.php

$ echo 2|php -nF euc.php

$ echo 1999|php -nF euc.php

Спробуйте в Інтернеті!

Або 73 байт з 1або 0відповідь

while($y<3)$r|=$argn%($u='235'[$y])!=($b=$argn%'357'[$y++])&$b<$u;echo$r;

$ echo 2019|php -nF euc.php
1
$ echo 1999|php -nF euc.php
0

Спробуйте в Інтернеті (усі тестові випадки)!

Оригінальна відповідь, 133 127 байт

function($n){while(++$k<210)if(($r=function($n){foreach([2,3,5,7]as$d)$o[]=$n%$d;sort($o);return$o;})($n+$k)==$r($n))return 1;}

Спробуйте в Інтернеті!



1

05AB1E , 16 байт

Ƶ.L+ε‚ε4Åp%{}Ë}à

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Ƶ.L          # Create a list in the range [1,209] (which is k)
   +         # Add the (implicit) input to each (which is n+k)
    ε        # Map each value to:
            #  Pair it with the (implicit) input
      ε      #  Map both to:
       4Åp   #   Get the first 4 primes: [2,3,5,7]
          %  #   Modulo the current number by each of these four (now we have R_n and R_n+k)
           { #   Sort the list
           #  After the inner map: check if both sorted lists are equal
           # After the outer map: check if any are truthy by taking the maximum
             # (which is output implicitly as result)

Дивіться цей мінний наконечник 05AB1E (розділ Як стискати великі цілі числа? ), Щоб зрозуміти, чому Ƶ.це так 209.



1

Желе , 15 байт

8ÆR©PḶ+%Ṣ¥€®ċḢ$

Спробуйте в Інтернеті!

Я впевнений, що відповідь на гравця. Я трактував значення truthy як те, що не є нульовим, тому ось кількість можливих значень k. Якщо це повинні бути два різних значення, це коштує мені подальший байт.

Пояснення

8ÆR             | Primes less than 8 [2,3,5,7]
   ©            | Copy to register
    P           | Product [210]
     Ḷ          | Lowered range [0, 1, ..., 208, 209]
      +         | Add to input
         ¥€     | For each of these 210 numbers...
       %   ®    |   Modulo 2, 3, 5, 7
        Ṣ       |   And sort
            ċḢ$ | Count how many match the first (input) number’s remainders

1
Все добре, що стосується truthy vs falsey. Використовуючи мета-узгоджене визначення truthy та falsey (ефективно "що робить мовна конструкція if-else, якщо вона є) нуль - це falsey, а не нулі - truthy ( ?це конструкція if-else в Jelly; для деяких мов це складніше питання).
Джонатан Аллан

О, і ви могли б отримати чіткі цінності без витрат, Ḣe$якщо хочете :)
Джонатан Аллан

@JonathanAllan так, звичайно, дякую. :)
Нік Кеннеді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.