У меня есть близнец с переставленными остатками?

17

Определим как список остатков евклидова деления на , , 5 и 7 .Rnn2357

Учитывая целое число n0 , вы должны выяснить, существует ли целое число 0<k<210 такое, что Rn+k является перестановкой Rn .

Примеры

Критерий выполняется для n=8 , потому что:

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

Критерий не соответствует n=48 , потому что:

  • имеемR48=(0,0,3,6)
  • наименьшее целое число такое, что является перестановкой равно (что также приводит к )k>0Rn+kR48k=210R258=(0,0,3,6)

правила

  • Вы можете либо вывести истинное значение, если существует, и ложное значение в противном случае, либо два различных и непротиворечивых значения по вашему выбору.k
  • Это .

намек

Вам действительно нужно вычислить k ? Что же, может быть. А может и нет.

Контрольные примеры

Некоторые значения n для которых существует :k

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

Некоторые значения для которых не существует:nk

0, 1, 2, 13, 19, 48, 210, 1999
Arnauld
источник

Ответы:

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 будет списком остатков. Обратите внимание на ограничение, что s [1] <2, s [2] <3, s [3] <5 и s [4] <7. По теореме об остатках в Китае существует k если существует перестановка s , отличная от s , которая проверяет ограничение. На практике это будет проверено, если будет выполнено одно из следующих условий:

  • s [2] <2 и s [2]! = s [1]
  • s [3] <3 и s [3]! = s [2]
  • s [4] <5 и s [4]! = s [3]
Робин Райдер
источник
Не могли бы вы объяснить, почему перестановка обязательно отличается от ? s
19
1
@dfeuer Это следствие китайской теоремы об остатках; Я добавил ссылку. Если два целых числа имеют одинаковые остатки по модулю 2, 3, 5 и 7 (без перестановки), то эти два целых числа равны по модулю 2 * 3 * 5 * 7 = 210.
Робин Райдер
8

Haskell , 69 байт

На основании китайской теоремы об остатках

m=[2,3,5,7]
f x|s<-mod x<$>m=or[m!!a>b|a<-[0..2],b<-drop a s,s!!a/=b]

Попробуйте онлайн!

H.PWiz
источник
4
На самом деле, мое рабочее название для этого конкурса было "У меня есть китайский близнец?" :)
Арно
5

Haskell , 47 байтов

g.mod
g r|let p?q=r p/=r q&&r q<p=2?3||3?5||5?7

Попробуйте онлайн!

XNOR
источник
Вы можете объяснить?
dfeuer
1
@dfeuer Он использует метод Робина Райдера.
Орджан Йохансен
5

C # (интерактивный компилятор Visual C #) , 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 байт
Орджан Йохансен,
1
Не -~n%6/4>0просто -~n%6>3?
Арно
Кстати, это полиглот JavaScript .
Арно
2

Wolfram Language (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 Ryder . Ввод через 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;}

Попробуйте онлайн!

640 КБ
источник
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Ḷ+%Ṣ¥€®ċḢ$

Попробуйте онлайн!

Я уверен, что есть ответ гольфиста. Я истолковал истинное значение как что-либо, что не равно нулю, так что здесь это число возможных значений 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
Все хорошо относительно истины против фальси. Используя мета-согласованное определение truey и falsey (фактически, «что делает конструкция if-else языка, если она есть), ноль - это false, а ненулевые значения - truey ( ?это конструкция if-else в Jelly; для некоторых языков это сложный вопрос).
Джонатан Аллан
О, и вы могли бы получить различные значения без затрат, Ḣe$если бы вы хотели :)
Джонатан Аллан
@JonathanAllan да, конечно, спасибо. :)
Ник Кеннеди