Habe ich einen Zwilling mit permutierten Resten?


17

Wir definieren als die Liste der Reste der euklidischen Division von durch , , und .Rnn2357

Bei einer gegebenen Ganzzahl müssen Sie herausfinden, ob eine Ganzzahl so dass eine Permutation von .n00<k<210Rn+kRn

Beispiele

Das Kriterium ist für erfüllt , weil:n=8

  • wir habenR8=(0,2,3,1)
  • für haben wir , was eine Permutation vonk=44Rn+k=R52=(0,1,2,3)R8

Das Kriterium ist für nicht erfüllt , weil:n=48

  • wir habenR48=(0,0,3,6)
  • die kleinste ganze Zahl so dass eine Permutation von ist, ist (was auch zu )k>0Rn+kR48k=210R258=(0,0,3,6)

Regeln

  • Sie können entweder einen Wahrheitswert ausgeben, wenn existiert, und einen falschen Wert, oder zwei unterschiedliche und konsistente Werte Ihrer Wahl.k
  • Das ist .

Hinweis

Müssen Sie wirklich berechnen ? Vielleicht. Oder vielleicht nicht.k

Testfälle

Einige Werte von für die existiert:nk

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

Einige Werte von für die nicht existiert:nk

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

Antworten:


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

Probieren Sie es online!

-4 Bytes dank Giuseppe

(Die Erklärung enthält einen Spoiler, wie man das Problem löst, ohne k zu berechnen .)

Erläuterung: Let s die Liste der Reste sein. Beachten Sie die Einschränkung, dass s [1] <2, s [2] <3, s [3] <5 und s [4] <7. Durch den chinesischen Restsatz existiert ein k iff eine Permutation ist s , die sich von s , die die Bedingung überprüft. In der Praxis wird dies überprüft, wenn eine der folgenden Bedingungen überprüft wird:

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

Können Sie erklären, warum sich die Permutation notwendigerweise von ? s
Dfeuer

1
@dfeuer Es ist eine Konsequenz des chinesischen Restsatzes; Ich habe einen Link hinzugefügt. Wenn zwei Ganzzahlen die gleichen Reste Modulo 2, 3, 5 und 7 (ohne Permutation) haben, sind die beiden Ganzzahlen gleich Modulo 2 * 3 * 5 * 7 = 210.
Robin Ryder

8

Haskell , 69 Bytes

Basierend auf dem chinesischen Restsatz

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]

Probieren Sie es online!


4
Eigentlich war mein Arbeitstitel für diese Herausforderung "Habe ich einen chinesischen Zwilling?" :)
Arnauld



5

C # (Visual C # Interactive Compiler) , 125 42 38 36 Byte

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

Direkter Port von @ xnors Antwort, die auf der @ RobinRyder-Lösung basiert.

4 Bytes gespart dank @ Ørjan Johansen!

2 weitere dank @Arnauld gespart!

Probieren Sie es online!


1
Ich habe eine Variante gefunden, die nur für xnors Sprachen passt, aber dabei hilft: 38 Bytes
Ørjan Johansen

1
Nicht -~n%6/4>0nur -~n%6>3?
Arnauld

Übrigens ist dies ein JavaScript-Polyglot .
Arnauld







1

PHP ,81 78 72 Bytes

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

Ein Riff über die Antwort von @Robin Ryder . Die Eingabe erfolgt über STDIN, die Ausgabe ist 'T'wahr und leer, ''wenn sie falsch ist.

$ 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

Probieren Sie es online!

Oder 73 Bytes mit 1oder 0Antwort

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

Probieren Sie es online aus (alle Testfälle)!

Ursprüngliche Antwort, 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;}

Probieren Sie es online!



1

05AB1E , 16 Bytes

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

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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

Sehen Sie sich meinen Tipp 05AB1E (Abschnitt Wie komprimiere ich große ganze Zahlen? ) An, um zu verstehen, warum dies so Ƶ.ist 209.



1

Gelee , 15 Bytes

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

Probieren Sie es online!

Ich bin sicher, es gibt eine golferische Antwort. Ich habe einen Wahrheitswert als etwas interpretiert, das nicht Null ist, also ist es hier die Anzahl der möglichen Werte von k. Wenn es zwei unterschiedliche Werte sein müssen, kostet mich das ein weiteres Byte.

Erläuterung

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
Alles Gute in Bezug auf Wahrheit gegen Falsch. Unter Verwendung der meta-vereinbarten Definition von Wahrhaftigkeit und Falschheit (effektiv: "Was macht das if-else-Konstrukt der Sprache, wenn es eins gibt?") Ist Null falsch und Nicht-Nullen sind wahr ( ?ist das if-else-Konstrukt in Jelly; für einige Sprachen ist es a schwierigere Frage)
Jonathan Allan

Oh, und Sie könnten eindeutige Werte für keine Kosten erhalten, Ḣe$wenn Sie wollten :)
Jonathan Allan

@ JonathanAllan ja natürlich danke. :)
Nick Kennedy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.