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

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]

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!


4
Sebenarnya, judul pekerjaan saya untuk tantangan ini adalah "Apakah saya punya saudara kembar Cina?" :)
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

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

Disimpan 4 byte berkat @ Ørjan Johansen!

Disimpan 2 lagi berkat @Arnauld!

Cobalah online!


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!







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!



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.



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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.