Czy mam bliźniaka z permutowanymi resztkami?

17

Zdefiniować Rn w listy reszt euklidesowa podziału n o 2 , 3 , 5 i 7 .

Biorąc pod uwagę liczbę całkowitą n0 , musisz dowiedzieć się, czy istnieje liczba całkowita 0<k<210 tak że Rn+k jest permutacją Rn .

Przykłady

Kryterium jest spełnione dla n=8 , ponieważ:

  • mamy R8=(0,2,3,1)
  • dla k=44 mamy Rn+k=R52=(0,1,2,3) , co jest permutacją R8

Kryterium nie jest spełnione dla n=48 , ponieważ:

  • mamy R48=(0,0,3,6)
  • najmniejsza liczba całkowita k>0 taka, że Rn+k jest permutacją R48 wynosi k=210 (co prowadzi również do R258=(0,0,3,6) )

Zasady

  • Możesz albo podać prawdziwą wartość, jeśli k istnieje, lub wartość fałsz, w przeciwnym razie, lub dwie różne i spójne wybrane przez ciebie wartości.
  • To jest .

Wskazówka

Czy naprawdę potrzebujesz obliczyć k ? Być może. Albo może nie.

Przypadki testowe

Niektóre wartości n dla których istnieje k :

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

Niektóre wartości n dla których k nie istnieje:

0, 1, 2, 13, 19, 48, 210, 1999
Arnauld
źródło

Odpowiedzi:

20

R , 63 59 bajtów

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

Wypróbuj online!

-4 bajty dzięki Giuseppe

(Wyjaśnienie zawiera spoiler, jak rozwiązać problem bez obliczania k .)

Objaśnienie: Niech s będzie lista resztek. Zwróć uwagę na ograniczenie, że s [1] <2, s [2] <3, s [3] <5 is s [4] <7. Przez chińskiego resztach twierdzenia , istnieje k IFF jest permutacją s , różną od s , która weryfikuje ograniczenie. W praktyce zostanie to zweryfikowane, jeśli zostanie zweryfikowany jeden z następujących warunków:

  • s [2] <2 is s [2]! = s [1]
  • s [3] <3 is s [3]! = s [2]
  • s [4] <5 is s [4]! = s [3]
Robin Ryder
źródło
Czy możesz wyjaśnić, dlaczego permutacja niekoniecznie różni się od ? s
dfeuer
1
@dfeuer Jest to konsekwencja twierdzenia o chińskim reszcie; Dodałem link. Jeśli dwie liczby całkowite mają takie same reszty modulo 2, 3, 5 i 7 (bez permutacji), wówczas dwie liczby całkowite są równe modulo 2 * 3 * 5 * 7 = 210.
Robin Ryder,
8

Haskell , 69 bajtów

Na podstawie twierdzenia o chińskiej reszcie

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]

Wypróbuj online!

H.PWiz
źródło
4
Właściwie mój tytuł roboczy tego wyzwania brzmiał: „Czy mam chińskiego bliźniaka?” :)
Arnauld,
5

Haskell , 47 bajtów

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

Wypróbuj online!

xnor
źródło
Możesz wytłumaczyć?
dfeuer
1
@dfeuer Wykorzystuje metodę Robin Ryder.
Ørjan Johansen
5

Perl 6 , 64 61 59 43 bajtów

{map($!=(*X%2,3,5,7).Bag,^209+$_+1)∋.&$!}

Wypróbuj online!

-16 dzięki @Jo King

Ven
źródło
5

C # (interaktywny kompilator Visual C #) , 125 42 38 36 bajtów

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

Bezpośredni port odpowiedzi @ xnor, który jest oparty na rozwiązaniu @ RobinRyder.

Zaoszczędź 4 bajty dzięki @ Ørjan Johansen!

Zaoszczędzono jeszcze 2 dzięki @Arnauld!

Wypróbuj online!

Wcielenie ignorancji
źródło
1
Znalazłem odmianę, która wiąże się tylko z językami xnor, ale pomaga w tym: 38 bajtów
Ørjan Johansen
1
Nie jest -~n%6/4>0tak -~n%6>3?
Arnauld
BTW, to jest poliglota JavaScript .
Arnauld,
4

Python 2 , 41 bajtów

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

Wypróbuj online!

Używa tej samej charakterystyki co Robin Ryder . Czek n%2!=n%3<2jest skrócony do -~n%6/4. Spisanie trzech warunków okazało się krótsze niż napisanie ogólnego:

46 bajtów

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

Wypróbuj online!

xnor
źródło
2

Wolfram Language (Mathematica) , 56 bajtów

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

Wypróbuj online!

Znajduje wszystkie permutacje nieidentyfikacyjne pozostałych modułów wejściowych 2, 3, 5, 7 i sprawdza, czy któreś z nich znajduje się poniżej {2,3,5,7}każdej współrzędnej. Zauważ, że tak Or@@{}jest False.

Misza Ławrow
źródło
2

Java (JDK) , 36 bajtów

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

Wypróbuj online!

Kredyty

  • Rozwiązanie Port of xnor, ulepszone przez Ørjan Johansen.
Olivier Grégoire
źródło
1

PHP ,81 78 72 bajty

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

Riff na odpowiedzi @Robin Ryder . Dane wejściowe są STDINprzesyłane, dane wyjściowe są 'T'zgodne z prawdą, a puste w ''przypadku fałszowania.

$ 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

Wypróbuj online!

Lub 73 bajtów z 1lub 0odpowiedzi

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

Wypróbuj online (wszystkie przypadki testowe)!

Oryginalna odpowiedź, 133 127 bajtów

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

Wypróbuj online!

640 KB
źródło
1

05AB1E , 16 bajtów

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

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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

Zobacz moją wskazówkę 05AB1E (rozdział Jak kompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego tak Ƶ.jest 209.

Kevin Cruijssen
źródło
1

Galaretka , 15 bajtów

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

Wypróbuj online!

Jestem pewien, że jest odpowiedź golfisty. Zinterpretowałem prawdziwą wartość jako coś, co nie jest zerem, więc tutaj jest liczba możliwych wartości k. Jeśli muszą to być dwie odrębne wartości, to kosztuje mnie kolejny bajt.

Wyjaśnienie

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
Nick Kennedy
źródło
1
Wszystko dobrze w odniesieniu do prawdy vs falsey. Korzystanie z meta uzgodnionej definicji prawdy i falseya (skutecznie "co robi konstrukt języka jeśli-inny, jeśli taki istnieje) zero jest falsey, a niezerowe są prawdziwe ( ?to konstrukcja if-else w Jelly; dla niektórych języków jest to trudniejsze pytanie)
Jonathan Allan,
Aha, i można uzyskać odrębne wartości bez żadnych kosztów, Ḣe$jeśli chcesz :)
Jonathan Allan
@JonathanAllan tak, oczywiście, dzięki. :)
Nick Kennedy