¿Tengo un gemelo con restos permutados?


17

Definimos como la lista de restos de la división euclidiana de por , , y .Rnortenorte235 57 7

Dado un número entero , debe averiguar si existe un número entero modo que sea ​​una permutación de .norte0 00 0<k<210Rnorte+kRnorte

Ejemplos

El criterio se cumple para , porque:norte=8

  • tenemosR8=(0 0,2,3,1)
  • para , tenemos , que es una permutación dek=44Rnorte+k=R52=(0 0,1,2,3)R8

El criterio no se cumple para , porque:norte=48

  • tenemosR48=(0 0,0 0,3,6 6)
  • el entero más pequeño tal que es una permutación de es (lo que lleva a también)k>0 0Rnorte+kR48k=210R258=(0 0,0 0,3,6 6)

Reglas

  • Puede generar un valor verdadero si existe y un valor falso de lo contrario, o dos valores distintos y consistentes de su elección.k
  • Este es el .

Insinuación

¿Realmente necesitas calcular ? Bien quizás. O tal vez no.k

Casos de prueba

Algunos valores de para los cuales existe:nortek

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

Algunos valores de para los cuales no existe:nortek

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

Respuestas:


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

Pruébalo en línea!

-4 bytes gracias a Giuseppe

(La explicación contiene un spoiler sobre cómo resolver el problema sin calcular k ).

Explicación: Let s sea la lista de residuos. Tenga en cuenta la restricción de que s [1] <2, s [2] <3, s [3] <5 y s [4] <7. Según el teorema del resto chino , existe una k si hay una permutación de s , distinta de s , que verifica la restricción. En la práctica, esto se verificará si se verifica una de las siguientes condiciones:

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

¿Podría explicar por qué la permutación es necesariamente distinta de ? s
dfeuer 05 de

1
@dfeuer Es una consecuencia del Teorema del resto chino; Agregué un enlace. Si dos enteros tienen los mismos restos módulo 2, 3, 5 y 7 (sin permutación), entonces los dos enteros son iguales módulo 2 * 3 * 5 * 7 = 210.
Robin Ryder

8

Haskell , 69 bytes

Basado en el teorema del resto chino

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]

Pruébalo en línea!


44
En realidad, mi título de trabajo para este desafío fue "¿Tengo un gemelo chino?" :)
Arnauld



5

C # (compilador interactivo de Visual C #) , 125 42 38 36 bytes

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

Puerto directo de la respuesta de @ xnor, que se basa en la solución de @ RobinRyder.

¡Guardado 4 bytes gracias a @ Ørjan Johansen!

¡Ahorré 2 más gracias a @Arnauld!

Pruébalo en línea!


1
Encontré una variación que solo se vincula con los lenguajes de xnor pero que ayuda para esto: 38 bytes
Ørjan Johansen

1
No es -~n%6/4>0solo -~n%6>3?
Arnauld

Por cierto, este es un políglota de JavaScript .
Arnauld




2

Wolfram Language (Mathematica) , 56 bytes

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

Pruébalo en línea!

Encuentra todas las permutaciones sin identidad de los restos del módulo de entrada 2, 3, 5, 7 y comprueba si alguno de ellos está debajo {2,3,5,7}en cada coordenada. Tenga en cuenta que Or@@{}es False.




1

PHP ,81 78 72 bytes

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

Un riff sobre la respuesta de @Robin Ryder . La entrada es vía STDIN, la salida es 'T'si es verdadera y vacía ''si es 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

Pruébalo en línea!

O 73 bytes con 1o 0respuesta

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

¡Pruébelo en línea (todos los casos de prueba)!

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

Pruébalo en línea!



1

05AB1E , 16 bytes

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

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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

Ver este consejo 05AB1E mío (sección Cómo comprimir grandes números enteros? ) Para entender por qué Ƶ.es 209.



1

Jalea , 15 bytes

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

Pruébalo en línea!

Estoy seguro de que hay una respuesta más golfista. He interpretado un valor verdadero como algo que no es cero, así que aquí está el número de valores posibles de k. Si necesita ser dos valores distintos, eso me cuesta un byte adicional.

Explicación

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
Todo bien con respecto a la verdad contra Falsey. Usando la definición meta-acordada de verdad y falsey (efectivamente "qué hace la construcción if-else del lenguaje si hay una) cero es falsey y no ceros son veraces ( ?es la construcción if-else en Jelly; para algunos idiomas es un pregunta difícil)
Jonathan Allan

Ah, y podrías obtener valores distintos sin costo Ḣe$si quisieras :)
Jonathan Allan

@ JonathanAllan sí, por supuesto, gracias. :)
Nick Kennedy el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.