没有同质邻居


33

给定一个正整数列表,输出其中每个相邻的整数对是否共享一个素数。换句话说,当且仅当列表中没有两个相邻的整数互时,才输出true

换句话说:给定正整数列表[a 1 a 2 …a n ],输出是否

       gcd(a 1,a 2)> 1 && gcd(a 2,a 3)> 1 &&…&& gcd(a n-1,a n)> 1。

该列表将始终包含至少两个元素(n≥2)。

然而…

这个挑战也是:在您的答案中的代码点(无论它在哪个代码页中)都必须满足程序检查的条件。

例如,print 2是一个有效程序。作为Unicode代码点的列表,它是[112 114 105 110 116 32 50],它满足以下条件:112114共享因子2;和114105的共用一个因子3,等

然而,main不能在一个有效的程序产生(对不起!),为的Unicode代码点ma,即10997,是互质。(非常感谢,您的提交不必是一个完整的程序!)

您的程序不允许包含代码点0。

测试用例

真相:

[6 21] -> 1
[502 230 524 618 996] -> 1
[314 112 938 792 309] -> 1
[666 642 658 642 849 675 910 328 320] -> 1
[922 614 530 660 438 854 861 357 477] -> 1

虚假:

[6 7] -> 0
[629 474 502 133 138] -> 0
[420 679 719 475 624] -> 0
[515 850 726 324 764 555 752 888 467] -> 0
[946 423 427 507 899 812 786 576 844] -> 0

这是:以字节为单位的最短代码获胜。


8
对于尝试使用常规编程语言进行此挑战的任何人,这是一个具有ASCII主要代码点的字符列表%)+/5;=CGIOSYaegkmq\DEL
克里斯蒂安·卢帕斯库

@Lynn Truthys必须保持一致吗?
H.PWiz

1
@ H.PWiz不!—
林恩

实际上,我原本打算对某些普通的(非高尔夫)langs做到这print 2一点,当我发现这是有效的时,我感到充满希望,但是);=ae成为素数真的很困难,我没有考虑……我想知道像Haskell这样的东西是否可以竞争?
林恩

此限制比该问题的反向要容易,假设没有人使用0x02字节。该问题在Mathematica,Logo,Haskell,Python,Perl,TI-BASIC中得到非高尔夫的有效答案。这个已经有了Haskell,我认为Mathematica是不可能的,但是Logo很有可能实现,尽管我尚未完成解决方案的构建。
user202729

Answers:


15

MATL,14个字节

!TM1*Zdl2$Xdl-

这会将非零数字的非空列向量输出为true,或者将至少包含零条目的向量输出为false。

说明

!     % Implicit input. Transpose
TM    % Push input to latest function again
1*    % Multiply by 1 (does nothing, but matches factors)
Zd    % Compute gcd with broadcast: matrix of gcd of all pairs
l     % Push 1
2$    % The next function will use 2 inputs
Xd    % Extract diagonal 1 (i.e. that below the main diagonal) from the matrix
l-    % Subtract 1 from each entry. Implicitly display

4
恭喜您的答案确实符合受限源要求!
暴民埃里克(Erik the Outgolfer)'17年

13

哈斯克尔103100字节

编辑:

  • -3个字节:使用了d<-fz后卫来合并和缩短最后两行。

f 是主要函数,它接受一个整数列表并返回一个 Bool

请注意,前两个ԁ(仅)是西里尔字母(Komi)Unicode字符,并且第一个前有一个制表符。

f	ԁ=zb[ԁ]id
zb[h:p:l]fz=z h p&&zb[p:l]fz
zb l fz=z 0 2
z 0z=z>z^0
z f fz|f<fz=z fz f|d<-fz=z d$f-d

在线尝试!对其进行测试。

怎么运行的

  • f是主要功能。它所做的只是将其参数包装ԁ在一个单例列表中(因为)比方括号更难使用),然后调用zb它和一个哑元参数(Haskell函数id恰好具有适合的字符)这里)。
    • =]对于纯ASCII,不可能同时使用相同的字符来匹配这两个字符,因此该参数使用2字节Unicode字符命名CYRILLIC SMALL LETTER KOMI DE (ԁ) codepoint value3*7*61=U+0501与所有and都适合[
      • 由于代码点不是偶数(最小的选项是合法标识符,甚至还使用三个字节),因此需要使用制表符而不是空格。
      • 长七个字节的纯ASCII选项是重命名参数:f fz|bf<-fz=zb[bf]fz
  • zb接受两个参数,一个单例列表,其元素是要递归的数字的真实列表,以及一个哑元参数fz,仅需要z在函数=s 之前获取a即可。
    • 当内部列表中至少有两个元素时,将z使用前两个元素(名为hp)调用该函数,如果返回Truezbp:l在列表的尾部递归。
    • 如果内部列表的元素少于两个,则zb返回True。由于=需要跟在字符后面z,因此最简单的方法是使用z已知返回的函数的调用True
  • z 接受两个参数,然后使用减法(每个其他相关的整数除法或gcd函数不可用)递归计算其最大公约数,返回 True如果大于1。
    • 当第一个参数为0,第二个参数为gcd 时,递归结束。在这行上,第二个参数也被命名为z。这里的角色1很尴尬z^0被用来获得第一名。
    • 否则,如果第一个参数f小于第二个参数fz,则将它们交换并z递归。
    • 否则,从较大的参数中减去较小的参数,然后z递归(也交换参数,尽管这只是为了避免括号)。

2
知道必须使用某些非高尔夫语言才能实现!
林恩

2
@Lynn它确实有帮助Haskell应对这种挑战,因为它具有仅包含单个字符标记的相当可表达的句法子集。我想这大约是高尔夫语言的一半。
与Orjan约翰森

由于西里尔字母,这真的是100个字节吗?该代码高尔夫毕业userscript报告102 UTF-8字节,但我不知道这是否是正确的/这是计数的正确途径此处字节。不管有多少字节,这确实令人印象深刻!
Mark S.

1
@分数。TIO报告100字节(和98个字符)。我怀疑您被制表符捕获了,SE显示为3个空格(然后将其复制为空格)。我想我已经看到有人使用前置标签来避免这种情况,让我尝试对其进行修复。
与Orjan约翰森

@分数。做完了 尽管我怀疑这可能会使该用户脚本更加混乱。
与Orjan约翰森

10

05AB1E,8个字节

ü‚ÒüÃP≠P

使用05AB1E编码,这为我们提供了以下代码点列表:

hex: [0xFC, 0x82, 0xD2, 0xFC, 0xC3, 0x50, 0x16, 0x50]
dec: [252,  130,  210,  252,  195,  80,   22,   80]

在线尝试!验证源代码!

说明

由于gcd运算符(¿)具有主要代码点,因此我不得不寻找其他方法来检查互素性:

ü‚          # Get an array of adjacent pairs of the input
  Ò         # Factorize both elements of each pair in the array
   üà       # For each pair, get the intersection of both prime factorization lists
     P      # Product of each intersection (this leaves 1 when there is no intersection)
      ≠     # Check for each element whether it does not equal 1
       P    # Product of the booleans

05AB1E的代码页中有哪些代码点?可以将它们添加到答案中吗?
Xcoder先生17年

@ Mr.Xcoder添加了
Adnan

Òf什么理由要结束吗?
Magic Octopus Urn's

10

外壳,8字节

对于Truthy输入,它返回一个正整数,对于Falsy输入,它返回0

←▼`Ṡt(ż⌋

在线尝试!在自己的代码点上进行了测试

使用Husk的代码页

Source -- [ ←  , ▼  , `  , Ṡ  , t  , (  , ż  , ⌋  ]
Hex    -- [0x06,0xbd,0x60,0xd0,0x74,0x28,0xeb,0x8d]
Dec    -- [6   ,189 ,96  ,208 ,116 ,40  ,235 ,141]

说明

          -- implicit input, e.g                                  [63,36,18,3]
  `       -- flip the args of the next function
   Ṡ      -- some combinator (Ṡ f g x = f (g x) x)
    t     -- tail                                                 [36,18,3]
      ż   -- zipWith (note, keeps trailing elems of longer list)  [(63,36),(36,18),(18,3),(3)]
       ⌋  -- gcd                                                  [9,9,3,3]
     (    -- used just to match restricted source criteria
 ▼        -- minimum of the list                                    3
←         -- minus 1                                                2

您在解释中使用的表示法是什么?我也在命令页面的“类型”列中的文档上也看到了它,并且无法理解,因此想要查找它,以便我可以学习它。
乔纳森·艾伦

@JonathanAllan这就是Haskell语法中函数的定义。它大致翻译成Ṡ(f,g,x) = f(g(x),x)更多主流语言。
Zgarb


尽管翻转时变成`Ṡ g f x = Ṡ f g x = f (g x) x
H.PWiz

1
@JonathanAllan如果您加入Husk聊天室,我们可以尝试在那里做更好的解释。
Zgarb

5

Japt8 7字节

äj d¹¥Z

在线测试!

代码点:

Char    ä   j       d   ¹   ¥   Z
Hex    e4  6a  20  64  b9  a5  5a
Dec   228 106  32 100 185 165  90

说明

 äj d¹ ¥ Z
Uäj d) ==Z
             Implicit: U = input array, Z = 0
Uä           For each pair of items in the array:
  j            Return whether the two items are coprime.
    d)       Return true if any items are truthy, false otherwise.
       ==Z   Return whether this is equal to 0 (false -> true, true -> false).
             Implicit: output result of last expression

5

果冻11 9字节

,Pnælð2\P

由于@ Jonathan Allan节省了2个字节。

在线尝试!

果冻有自己的代码页,每个字符的代码点是

Chr Hex Dec
,   2c   44
P   50   80
n   6e  110
æ   16   22
l   6c  108
ð   18   24
2   32   50
\   5c   92
P   50   80

通过检查是否测试非余数lcm(a, b) != a*b。可能会有一个更短的解决方案,因为我只是过滤了带有偶数代码点的字符。

说明

,Pnælð2\P  Input: array A
      2\   For each overlapping sublist of size 2
     ð       Reduce it using this dyad
,              Pair
 P             Product
  n            Not equals, 1 if true else 0
   æl          LCM
        P  Product

天才!这真是不可思议:O
Xcoder先生17年

,甚至可以æln,P¥ð2\减少两个工作量。编辑:我掉了尾随P,使那少一个:p)
乔纳森·艾伦

哦,是的,甚至交换参数:)
乔纳森·艾伦

5

TI-BASIC,38个字节

Input L1:ΔList(cumSum(L1:augment(Ans+V,V+{0:2>sum(AnsL1=lcm(Ans+V,V+L1

TI-BASIC被标记化成一维或两字节的标记,如列出这里

该解决方案最棘手的部分是:

  1. 逗号标记是质数(43),迫使我用43的倍数将其括起来(在本例中为V标记,即86)。

  2. gcd(令牌是一个很大的质数(47881),这意味着它根本无法使用。

该程序的令牌来自:

token     hex     dec
Input     0xDC    220
L1        0x5D00  23808
:         0x3E    62
ΔList(    0xBB2C  47916
cumSum(   0xBB29  47913
L1        0x5D00  23808
:         0x3E    62
augment(  0x14    20
Ans       0x72    114
+         0x70    112
V         0x56    86
,         0x2B    43
V         0x56    86
+         0x70    112
{         0x08    8
0         0x30    48
:         0x3E    62
2         0x32    50
>         0x6C    106
sum(      0xB6    182
Ans       0x72    114
L1        0x5D00  23808
=         0x6A    106
lcm(      0xBB08  47880
Ans       0x72    114
+         0x70    112
V         0x56    86
,         0x2B    43
V         0x56    86
+         0x70    112
L1        0x5D00  23808

说明

Input L1:                   Prompt the user to input L1.

ΔList(cumSum(L1:            Take the differences of the prefix sum of L1,
                            which in effect removes the first element (result in Ans).

augment(Ans+V,V+{0:         Append a 0 to the end of Ans.
                            V defaults to 0, so adding it is a no-op.
                            Ans now holds L1 shifted to the left by one element,
                            with a 0 shifted in.

      AnsL1=lcm(Ans+V,V+L1  Take the least common multiple of each corresponding element
                            of Ans and L1, and check if each is equal to their product.
                            This returns a list of booleans, each 1 corresponding to
                            a co-prime pair. The last element (having been paired with 0)
                            will always be 1.

2>sum(                      Returns 1 if there is at most one 1 in the list, else 0.
                            Since the last element is always 1, this means
                            we return 1 only if there are no co-prime pairs.

3

Pyth,15个字节

&F.bPiFNP.TtBQQ

在这里尝试查看Test Suite。

这是Outgolfer的Erik Xcoder先生。对于真理,返回不一致的值(非空列表),对于虚假,返回空白列表。


ASCII值

[38, 70, 46, 98, 80, 105, 70, 78, 80, 46, 84, 116, 66, 81, 81]

共享以下因素:

[2, 2, 2, 2, 5, 35, 2, 2, 2, 2, 4, 2, 3, 81]

说明

&F.bPiFNP.TtBQQ
           tBQ   Return [Q, Q[1:]] (Q = eval first line of input)
         .T      Transpose ^ without cropping absences
        P        Remove last element of ^
  .b          Q  Map in parallel on ^ (N) and Q (Y, ignored)
     iFN           GCD of N
    P              Prime factors of ^ (P(1) = [])
&F               Left fold (reduce) the result of the map with Logical AND (short-circuiting)

如果没有要求,这将是一个7个 5字节的版本,可以完成相同的任务(由于FryAmTheEggman而得2):

-1iVt

说明

-1iVtQQ  Implicit QQ at the end
    tQ   Return Q[1:]
  iV  Q  Vectorized GCD on ^ and Q
-1       Remove every element of ^ from [1] (implicit singleton)

出于好奇,为什么Q最后需要s?
ETHproductions

@ETHproductions因为.b具有可变的变量,并且使用隐式输入意味着它将选择最低的(1)而不是预期的(2)。
Erik the Outgolfer
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.