Apakah saya memiliki saudara kembar dengan sisa-sisa permutasi?

17

Kami mendefinisikan Rn sebagai daftar sisa-sisa divisi Euclidean n oleh 2 , 3 , 5 dan 7 .

Diberikan bilangan bulat n0 , Anda harus mencari tahu apakah ada bilangan bulat 0<k<210 sehingga Rn+k adalah permutasi .Rn

Contohnya

Kriteria dipenuhi untuk , karena:n=8

  • kami memilikiR8=(0,2,3,1)
  • untukk=44 , kita memilikiRn+k=R52=(0,1,2,3) , yang merupakan permutasi dariR8

Kriteria tidak terpenuhi untuk n=48 , karena:

  • kami memiliki R48=(0,0,3,6)
  • bilangan bulat terkecil k>0 sehingga Rn+k adalah permutasi R48 adalah k=210 (mengarah ke R258=(0,0,3,6) juga)

Aturan

  • Anda bisa mengeluarkan nilai kebenaran jika k ada dan nilai palsu sebaliknya, atau dua nilai yang berbeda dan konsisten pilihan Anda.
  • Ini adalah .

Petunjuk

Apakah Anda benar-benar perlu menghitung k ? Ya, mungkin. Atau mungkin tidak.

Uji kasus

Beberapa nilai n yang k ada:

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

Beberapa nilai n yang k tidak ada:

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

Jawaban:

20

R , 63 59 byte

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

Cobalah online!

-4 byte terima kasih kepada Giuseppe

(Penjelasan berisi spoiler tentang bagaimana menyelesaikan masalah tanpa menghitung k .)

Penjelasan: Let s menjadi daftar sisanya. Perhatikan batasannya yaitu s [1] <2, s [2] <3, s [3] <5 dan s [4] <7. Oleh Teorema Sisa Cina , ada k if jika ada permutasi dari s , berbeda dari s , yang memverifikasi kendala. Dalam praktiknya, ini akan diverifikasi jika salah satu dari kondisi berikut diverifikasi:

  • s [2] <2 dan s [2]! = s [1]
  • s [3] <3 dan s [3]! = s [2]
  • s [4] <5 dan s [4]! = s [3]
Robin Ryder
sumber
Bisakah Anda menjelaskan mengapa permutasi berbeda dari ? s
dfeuer
1
@ PDFeuer Ini adalah konsekuensi dari Teorema Sisa Tiongkok; Saya menambahkan tautan. Jika dua bilangan bulat memiliki modulo 2, 3, 5 dan 7 sisa yang sama (tanpa permutasi), maka kedua bilangan bulat tersebut adalah modulo 2 * 3 * 5 * 7 = 210 yang sama.
Robin Ryder
8

Haskell , 69 bytes

Berdasarkan teorema sisa Cina

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]

Cobalah online!

H.Piz
sumber
4
Sebenarnya, judul pekerjaan saya untuk tantangan ini adalah "Apakah saya punya saudara kembar Cina?" :)
Arnauld
5

Haskell , 47 byte

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

Cobalah online!

Tidak
sumber
Bisakah Anda jelaskan?
dfeuer
1
@ PDFeuer Menggunakan metode Robin Ryder.
Ørjan Johansen
5

Perl 6 , 64 61 59 43 byte

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

Cobalah online!

-16 Terima kasih kepada @Jo King

Yang Mulia
sumber
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

Port langsung jawaban @ xnor, yang didasarkan pada solusi @ RobinRyder.

Disimpan 4 byte berkat @ Ørjan Johansen!

Disimpan 2 lagi berkat @Arnauld!

Cobalah online!

Perwujudan Ketidaktahuan
sumber
1
Saya menemukan variasi yang hanya terkait dengan bahasa xnor tetapi membantu untuk ini: 38 byte
Ørjan Johansen
1
Bukan -~n%6/4>0adil -~n%6>3?
Arnauld
BTW, ini adalah polyglot JavaScript .
Arnauld
4

Python 2 , 41 byte

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

Cobalah online!

Menggunakan karakterisasi yang sama dengan Robin Ryder . Cek n%2!=n%3<2disingkat menjadi-~n%6/4 . Menulis tiga kondisi ternyata lebih pendek daripada menulis yang umum:

46 byte

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

Cobalah online!

Tidak
sumber
2

Ruby , 54 byte

->n{[2,3,5,7].each_cons(2).any?{|l,h|n%l!=n%h&&n%h<l}}

Cobalah online!

Menggunakan solusi pintar Robin Ryder .

histokrat
sumber
2

Bahasa Wolfram (Mathematica) , 56 byte

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

Cobalah online!

Temukan semua permutasi non-identitas dari sisa modulo input 2, 3, 5, 7, dan periksa apakah ada {2,3,5,7}di bawah dalam setiap koordinat. Perhatikan bahwa Or@@{}adalah False.

Misha Lavrov
sumber
2

Java (JDK) , 36 byte

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

Cobalah online!

Kredit

  • Solusi Port of xnor, ditingkatkan oleh Ørjan Johansen.
Olivier Grégoire
sumber
1

R , 72 byte

n=scan();b=c(2,3,5,7);for(i in n+1:209)F=F|all(sort(n%%b)==sort(i%%b));F

Cobalah online!

Aaron Hayman
sumber
1

PHP ,81 78 72 byte

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

Riff pada jawaban @Robin Ryder . Input melalui STDIN, output adalah 'T'jika benar, dan kosong ''jika salah.

$ 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

Cobalah online!

Atau 73 byte dengan 1atau 0respons

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

Cobalah secara online (semua test case)!

Jawaban asli, 133 127 byte

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

Cobalah online!

640KB
sumber
1

05AB1E , 16 byte

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

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Lihat ini 05AB1E ujung tambang (bagian Cara kompres bilangan bulat besar? ) Untuk memahami mengapa Ƶ.adalah 209.

Kevin Cruijssen
sumber
1

Jelly , 15 byte

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

Cobalah online!

Saya yakin ada jawaban golf. Saya telah menafsirkan nilai kebenaran sebagai sesuatu yang bukan nol, jadi di sini adalah jumlah nilai yang mungkin dari k. Jika perlu dua nilai berbeda yang membuat saya byte lebih lanjut.

Penjelasan

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
sumber
1
Semua baik tentang kebenaran vs falsey. Menggunakan meta yang disepakati definisi kebenaran dan falsey (efektif "apa yang dilakukan jika-jika dikonstruksi bahasa jika ada satu) nol adalah falsey dan non-nol adalah benar ( ?adalah konstruksi if-else di Jelly; untuk beberapa bahasa itu adalah pertanyaan yang lebih sulit).
Jonathan Allan
Oh, dan Anda bisa mendapatkan nilai berbeda tanpa biaya Ḣe$jika Anda mau :)
Jonathan Allan
@ Jonathan Allan ya tentu saja, terima kasih. :)
Nick Kennedy