三元三角形


22

这个想法主要来自BIO 2017 q1。我从Binary Sequences挑战中提出了发布此挑战的想法,因为很多人似乎都喜欢它。

另外,这是我没有在沙箱上发布的第一个挑战。如果没人喜欢,我将其删除。

规则

取三进制数字序列(基数为3);这可以是字符串,数组或数值以及前面的零的数目。

对于三角形中的每一行,都会生成下面的一行,直到最后一行只有一位为止。要查找其他两个数字以下的数字,如果上面的其他两个数字相等,则该数字将与其上方的两个数字相同。否则,它将是不等于它们中任何一个的数字。这是一个例子:

0 0 1 2 0 1 2 2
 0 2 0 1 2 0 2
  1 1 2 0 1 1
   1 0 1 2 1
    2 2 0 0
     2 1 0
      0 2
       1

您只需要返回最后一行。

使您的代码简短。

测试用例

0 -> 0
11 -> 1
10 -> 2
000 -> 0
012 -> 1
21102 -> 2
201021 -> 1
111111 -> 1
1020202020 -> 2
0212121210 -> 0

Answers:


9

外壳,9个字节

%3←ΩεẊo_+

在线尝试!

说明

主要思想是计算两位数字到一位的映射,形式为f(a,b)=(-ab)%3。为了打高尔夫球,我们可以将模数延迟到最后。

   Ωε       Apply the following function until the list is only one
            element in length.
     Ẋo       Apply the following function to pairs of adjacent values.
       _+       Add the two values and negate the result.
  ←         Take the first (and only) element of this list.
%3          Take it modulo 3.

原则上,也可以通过将每个元素乘以相应的二项式系数,然后将和乘以-1来直接计算结果,以得到偶数长度的列表,但是我不知道用更少的字节来做到这一点的方法。


6

MATL,10字节

td"HYCEsI\

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

说明

对于每对数字,代码将计算总和模3的两倍。此过程重复的次数与输入的长度减去1相同。

t        % Implicit input: array of length n. Duplicate
d        % Consecutive differences. Gives an array of length n-1
"        % For each (that is, do n-1 times)
  HYC    %   2-column matrix where each column is a sliding block of length 2
  E      %   Times 2, element-wise
  s      %   Sum of each column
  I\     %   Modulo 3
         % Implicit end. Implicit display

3

Python 2,48个字节

f=lambda a,*l:-(f(*l)+f(a,*l[:-1]))%3if l else a

在线尝试!

在子列表上递归,分别删除第一个和最后一个元素。

如果实际上可以解压缩,这在Python 3中会更干净f=lambda a,*b,c:...


3

表情符号,242字节

🐋🍨🍇🐖🔢➡️🚂🍇🔂i⏩➖🐔🐕1 0🍇🔂j⏩0i🍇🍊❎😛🍺🔲🐽🐕j🚂🍺🔲🐽🐕➕1j🚂🍇🐷🐕j➖➖3🍺🔲🐽🐕j🚂🍺🔲🐽🐕➕1j🚂🍉🍉🍉🍎🍺🔲🐽🐕0🚂🍉🍉

使用与我的C答案 相同的算法在线尝试!



2

Haskell,36个字节

f[a]=a
f(h:t)=mod(-f t-f(h:init t))3

在线尝试!

在更对称的位置节省1个字节:

f[a]=a
f l=mod(-f(tail l)-f(init l))3

在线尝试!

这个想法很简单:在子列表上递归计算函数,分别删除第一个和最后一个元素,然后将它们与组合\a b -> mod(-a-b)3。这似乎比实现zipWith此功能要短。

Haskell,44个字节

f[a]=mod a 3
f l=f$zipWith((-).(0-))l$tail l

在线尝试!



2

J,23 15字节

3&(|2+/\-)~<:@#

感谢@miles

旧解决方案:

3|2&(-@+/\)^:(#>1:)^:_]

受到Martin Ender解决方案的启发:

说明

3|2&(-@+/\)^:(#>1:)^:_]    | Whole program
                      ]    | Seperates the argument from the _ (infinity)
           ^:(#>1:)^:_     | Do while the length is greater than one
  2&(-@+/\)                | Inverse of the sum of adjacent elements
3|                         | Modulo 3

2
15个字节,含3&(|2+/\-)~<:@#
英里

@miles,哈,我正打算将其发布19个字节3|((2<.#)-@+/\])^:_-您的确很好。
乔纳

0

批处理,122字节

@set/an=2,s=i=l=0
@for %%e in (%*)do @set/al+=1,n^^=3
@for %%e in (%*)do @set/as+=%%e*n,s%%=3,n*=l-=1,n/=i+=1
@echo %s%

使用二项式展开。正如@MartinEnder指出的,如果值的数量(在第一个循环中计数)是偶数,n则必须取和(取模3),因此将其设置为一个12相应地。然后,第二个循环通过二项式系数计算总和。


0

APL(Dyalog),17个字节

{3|3-2+/⍵}⍣{1=≢⍺}

在线尝试!

怎么样?

2+/⍵ -将每两个相邻项目相加

3- -从三个向量减

3| -三乘向量模

-重复直到...

1=≢⍺ -只剩一件


0

APL + WIN,30 28字节

2字节由Uriel节省。

n←⎕⋄¯1↑∊⍎¨(⍴n)⍴⊂'n←3|3-2+/n'

说明:

n←⎕ Prompt for screen input of the form: 0 0 1 2 0 1 2 2

'n←3|3-2+/n' Successive rows are 3 mod 3 minus successive digit pairs.

(⍴n)⍴⊂ Create a nested vector of the row code, one element per row. 

¯1↑∊⍎¨ Execute each element of row code, flatten result and take final value.

这是在一行中用APL编写循环代码的一种方法。


您不需要最右边3|
Uriel

@Uriel。谢谢。
格雷厄姆

0

Javascript(ES6),58个字节

f=s=>s[1]?f(s.replace(/.(?=(.?))/g,(a,b)=>b&&(6-a-b)%3)):s
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.