Eu tenho um irmão gêmeo com restos permutados?


17

Definimos Rn como a lista de remanescentes da divisão euclidiana de n por 2 , 3 , 5 e 7 .

Dado um número inteiro n0 0 , você deve descobrir se existe um número inteiro 0 0<k<210. modo que Rn+k seja uma permutação de Rn .

Exemplos

O critério é atendido para n=8 , porque:

  • temos R8=(0 0,2,3,1)
  • para k=44 , temos Rn+k=R52=(0 0,1,2,3) , que é uma permutação de R8

O critério não é atendido para n=48. , porque:

  • temos R48.=(0 0,0 0,3,6)
  • o menor número inteiro k>0 0 modo que Rn+k é uma permutação de R48. é k=210. (levando a R258=(0 0,0 0,3,6) )

Regras

  • Você pode emitir um valor verdadeiro se k existir e um valor falso, caso contrário, ou dois valores distintos e consistentes de sua escolha.
  • Isso é .

Sugestão

Você realmente precisa calcular k ? Bem, talvez. Ou talvez não.

Casos de teste

Alguns valores de n para os quais existe k :

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

Alguns valores de n para os quais k não existe:

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

Respostas:


20

R , 63 59 bytes

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

Experimente online!

-4 bytes graças a Giuseppe

(A explicação contém um spoiler sobre como resolver o problema sem calcular k .)

Explicação: Let s ser a lista de remanescentes. Observe a restrição que s [1] <2, s [2] <3, s [3] <5 es [4] <7. Pelo teorema do restante chinês , existe um k se houver uma permutação de s , distinta de s , que verifica a restrição. Na prática, isso será verificado se uma das seguintes condições for verificada:

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

Você poderia explicar por que a permutação é necessariamente distinta de ? s
dfeuer 5/04

1
@dfeuer É uma consequência do Teorema do Restante Chinês; Eu adicionei um link. Se dois números inteiros tiverem o mesmo módulo 2, 3, 5 e 7 (sem uma permutação), então os dois inteiros são iguais módulo 2 * 3 * 5 * 7 = 210.
Robin Ryder

8

Haskell , 69 bytes

Baseado no teorema chinês do restante

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]

Experimente online!


4
Na verdade, meu título de trabalho para este desafio foi "Eu tenho um irmão gêmeo chinês?" :)
Arnauld



5

C # (compilador interativo do Visual C #) , 125 42 38 36 bytes

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

Porta direta da resposta do @ xnor, baseada na solução do @ RobinRyder.

Guardado 4 bytes graças a @ Ørjan Johansen!

Economizou mais 2 graças a @Arnauld!

Experimente online!


1
Eu encontrei uma variação que apenas vincula os idiomas do xnor, mas ajuda a isso: 38 bytes
Ørjan Johansen

1
Não é -~n%6/4>0-~n%6>3?
Arnauld

BTW, este é um poliglota JavaScript .
Arnauld

4

Python 2 , 41 bytes

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

Experimente online!

Usa a mesma caracterização que Robin Ryder . A verificação n%2!=n%3<2é encurtada para -~n%6/4. Escrever as três condições ficou mais curto do que escrever uma geral:

46 bytes

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

Experimente online!







1

PHP ,81 78 72 bytes

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

Um riff na resposta de @Robin Ryder . A entrada é via STDIN, a saída é verdadeira 'T'e vazia ''se for falsa.

$ 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

Experimente online!

Ou 73 bytes com 1ou 0resposta

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

Experimente online (todos os casos de teste)!

Resposta original, 133 127 bytes

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

Experimente online!



1

05AB1E , 16 bytes

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

Experimente online ou verifique todos os casos de teste .

Explicação:

Ƶ.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)

Veja este 05AB1E ponta do meu (seção Como comprimir grandes inteiros? ) Para entender por que Ƶ.é 209.



1

Gelatina , 15 bytes

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

Experimente online!

Tenho certeza de que há uma resposta para o golfista. Eu interpretei um valor verdadeiro como sendo qualquer coisa que não seja zero, então aqui está o número de valores possíveis de k. Se precisar ser dois valores distintos que me custam mais um byte.

Explicação

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
Tudo de bom em relação à verdade vs falsey. Usando a definição meta-acordada de truthy e falsey (efetivamente "o que a construção if-else da linguagem faz se houver uma) zero é falsey e não-zeros são truthy ( ?é a construção if-else no Jelly; para alguns idiomas é uma pergunta mais difícil.)
Jonathan Allan

Ah, e você pode obter valores distintos sem nenhum custo Ḣe$se quiser :)
Jonathan Allan

@ JonathanAllan sim, claro, obrigado. :)
Nick Kennedy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.