我的双胞胎有剩余的排列吗?


17

我们定义Rn作为欧几里得除法的余数的列表n2357

给定的整数n0,则必须找出是否存在一个整数0<k<210使得Rn+k是的置换Rn

例子

n=8满足标准,因为:

  • 我们有R8=(0,2,3,1)
  • 对于k=44,我们有Rn+k=R52=(0,1,2,3),这是一个排列R8

n = 48时不满足该标准n=48,因为:

  • 我们有R48=(0,0,3,6)
  • 的最小整数k>0,使得Rn+k是的置换R48k=210(导致R258=(0,0,3,6)为好)

规则

  • 如果存在k则可以输出真实值,否则可以输出假值,也可以选择两个不同且一致的值。
  • 这是

暗示

您真的需要计算k吗?也许。或者可能不是。

测试用例

的一些值n为其k存在:

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

一些值n针对k不存在:

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

Answers:


20

R63 59字节

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

在线尝试!

-4个字节,感谢Giuseppe

(说明中包含了如何在不计算k的情况下解决问题的扰流器k。)

说明:让s为余数列表。请注意s [1] <2,s [2] <3,s [3] <5和s [4] <7的约束。由中国剩余定理,存在k当且仅当有一个排列s,从不同的s,这验证了约束。实际上,如果满足以下条件之一,将对此进行验证:

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

您能解释一下为什么排列必须与不同吗?s
dfeuer

1
@dfeuer这是中国剩余定理的结果;我添加了一个链接。如果两个整数的模,2、3、5和7的余数相同(无置换),则这两个整数的模2 * 3 * 5 * 7 = 210相等。
罗宾·赖德




5

C#(Visual C#交互式编译器)125 42 38 36字节

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

@xnor答案的直接端口,它基于@RobinRyder的解决方案。

感谢@ØrjanJohansen,节省了4个字节!

多亏@Arnauld,保存了2个!

在线尝试!


1
我发现了一个变化,只有对同或各种语言的关系,而且有利于本:38个字节
与Orjan约翰森

1
是不是-~n%6/4>0-~n%6>3
Arnauld

顺便说一句,这是一个JavaScript polyglot
Arnauld

4

Python 2,41个字节

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

在线尝试!

使用与Robin Ryder相同的特征。支票n%2!=n%3<2缩短为-~n%6/4。写出这三个条件比写一个通用条件要短:

46个字节

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

在线尝试!







1

PHP81 78 72字节

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

@Robin Ryder的回答即兴演奏。输入是通过STDIN'T'如果为真,则输出,如果为真,''则为空。

$ 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

在线尝试!

或73个字节,带有10响应

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

在线尝试(所有测试用例)!

原始答案 133 127字节

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

在线尝试!



1

05AB1E,16 个字节

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

在线尝试验证所有测试用例

说明:

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

看到这个05AB1E尖矿(部分如何压缩大整数?理解为什么Ƶ.209



1

果冻,15字节

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

在线尝试!

我敢肯定有一个高尔夫球手的答案。我将真实值解释为不为零的任何值,因此这里是k的可能值的数量。如果需要两个不同的值,那又要花我一个字节。

说明

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
关于真理与虚假的一切都很好。使用对真和假的元约定定义(有效地是“如果有一个语言,该语言的if-else构造会做什么)”,零为假,非零为真(?在Jelly中为if-else构造;对于某些语言,它是一个难题)
乔纳森·艾伦

哦,Ḣe$如果您愿意的话,您可以免费获得独特的价值:)
Jonathan Allan

@JonathanAllan当然可以,谢谢。:)
尼克·肯尼迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.