数字三角形


11

信用

我感谢Rand Al'Thor提出的基于字母的问题,感谢他提出了此代码高尔夫挑战赛的灵感。

背景

挑战的本质基于兰德在他的“由三个字母组成的三角形”中提到的算法:

  • 以10个字母开头,每个字母分别是X,Y或Z。
  • 在每一行的下面,构造下一行,如下所示。如果两个相邻的字母相同,请在它们下面写下相同的字母;如果它们不同,则在它们下面写下第三个字母。

然后,您将重复上一步,直到第十行中有一个字母为止。

挑战

我们将对上述算法进行数学上的旋转:

  • 让我们从一个10位数字的序列开始,每个数字用空格隔开,每个数字分别为1、2或3。
  • 在每一行的下面,构造下一行,如下所示。如果两个相邻的数字相同,请在它们下面写下相同的数字;如果它们不同,则在它们下面写下第三位数字。
  • 重复上一步,直到获得一个最终编号。

因此,遵循此算法,1 2 3 3 1 3 1 3 1 2例如,如果从row开始,则会生成以下三角形:

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1 2 3 3 1 3 1 3 1 2
 3 1 3 2 2 2 2 2 3 
  2 2 1 2 2 2 2 1  
   2 3 3 2 2 2 3   
    1 3 1 2 2 1    
     2 2 3 2 3     
      2 1 1 1      
       3 1 1       
        2 1        
         3         

我也很好奇知道三角形中所有数字的总和,因此将所有这些数字相加,然后将总数放在第11行中,右对齐到第一行的最后一位。因此,我们的数字三角形将类似于以下内容(示例中的空格在下面用.字符表示,以显示格式)。

Input: 1 2 3 3 1 3 1 3 1 2

Output:

1.2.3.3.1.3.1.3.1.2
.3.1.3.2.2.2.2.2.3.
..2.2.1.2.2.2.2.1..
...2.3.3.2.2.2.3...
....1.3.1.2.2.1....
.....2.2.3.2.3.....
......2.1.1.1......
.......3.1.1.......
........2.1........
.........3.........
................109

您的挑战是编写可以以输入的字符串/数组/等开头的代码。按照我的示例,选择十位数字,然后应用该算法生成将创建数字三角形的十行,然后是第11行,该行将显示所有带有右对齐的数字的总数。

测试中

可以使用您选择的十位数的随机生成的字符串或从下面的代码片段生成的字符串来执行此字符串的测试...

c1=()=>('1331123221'+(Math.random()*(1<<24)|0).toString(4)).replace(/0/g, "").slice(-10).split("").join(" ");

$("#btn").click(function(){
  $("#str").val(c1());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="str"><button id="btn">Get numbers</button>
<br>
Please use this snippet to generate a starting row for testing your code. Alternatively, you can also use a string of your choice, so long as it's ten digits (ranging from 1 to 3), separated by single spaces.

规则

  1. 应用代码高尔夫球规则,因此最少的字节数将赢得挑战。如果有两项得分相同且得分较低,则优胜者将根据投票数获得奖励。
  2. 我们基本上需要的是11行,19个字符的长度...渲染最终输出的方式完全取决于您:数组,控制台,文件输出,STDOUT等,因此请使用您喜欢的任何输出方法发挥您的优势。输出中的唯一规则是我们有11行,每行19个字符,格式与上面类似。
  3. 如果对您的代码有帮助,请为数字使用任何分隔符...请记住,易读性可能是一个因素。
  4. 没有愚蠢的漏洞
  5. 不允许对输入进行硬编码。该代码的目的是使每次输入变化时都可用于产生不同的结果。1 1 1 1 1 1 1 1 1 1例如,硬编码完全否定了算法的全部要点。

期待看到大家都可以提出!



1
如果三角形居中对齐(这样清晰易读),是否需要分隔符?
JungHwan Min

1
它看起来像这样没有空间(我的回答有空间,这需要10个字节)。
JungHwan Min

2
授予权限
WallyWest'9

1
请注意,对于10位(或大于3的幂的任何数字1)的字符串,最后一位是从字符串的第一位和最后一位算来的;其他数字没有区别。
尼尔

Answers:


1

05AB1E32 26字节

DvÐOˆðýðN×.ø,ü+3%3^}\¯O19j

说明

D                 # duplicate input
v                 # for y,N in input,len(input): (10 times do)
 Ð                # triplicate current list
 Oˆ               # sum one copy and add it to global array
 ðý               # merge one copy on spaces
   ðN×.ø          # surround it with N spaces
        ,         # and print it
 ü+               # reduce one copy by addition
   3%             # modulus 3
     3^           # XOR 3
                  # this is the list sent to the next iteration
}                 # end loop
\                 # drop empty list left over from last iteration of loop
 ¯O               # sum the global array giving the triangles total sum
   19j            # join with spaces up to 19 chars

在线尝试!


7

Mathematica,104 97 90 94字节

{Grid[List@*Row/@#],#~Total~2}~Column~Right&[NestList[3-Mod[+##,3]&@@@Partition[#,2,1]&,#,9]]&

说明

Partition[#,2,1]

将输入划分为长度2,偏移为1。

3-Mod[+##,3]&@@@

取得每个分区,并计算相应的输出。

这里涉及一个技巧。我将两个数字加起来,取模3,然后从3中减去结果。得出所需的数字。(例如3-(((2 + 1)mod 3)= 3)

NestList[ ... ,9]

重复上述过程九次,将所有迭代作为输出。

Grid[List@*Row/@#]

将每次迭代的格式设置为行,然后将整个对象放入一列(居中对齐),创建一个三角形。

#~Total~2

取所有数字的总和。

{...}~Column~Right

合并三角形和总数,然后右对齐整个对象(三角形已经对齐,因此其对齐方式不受影响)。


1
具有单个功能的启发性方法,可以同时处理相同和不同的父类型...我喜欢它!
WallyWest'9

3

JavaScript(ES6),143 142字节

@Neil节省了1个字节

a=>a.map((_,i)=>(q=" ".repeat(i))+(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+q,x=0).join`
`+`
`+(" ".repeat(18)+x).slice(-19)

我尝试合并各个部分,但最终又增加了5个字节:

a=>[...a.map((_,i)=>(a=a.map(c=>(x+=r=i&&p^(p=c)||c,r),p=i&&a.shift())).join` `+" ".repeat(i),x=0),x].map(q=>(" ".repeat(18)+q).slice(-19)).join`
`

做得好!JHM的技巧对3-((x+y)%3)减少这段代码有帮助吗?
WallyWest'9

2
不。p^c||p已经短了很多:-)
ETHproductions's

现在,我到底是怎么想念的?当然!XOR函数在这里效果很好!
WallyWest'9

1
XOR ?!我没想到这一点。话虽这么说,可悲的是,使用XOR会使我的代码更长:P
JungHwan Min

对于i?p^(p=c)||p:c可以使用i&&p^(p=c)||c
尼尔

2

红宝石134字节

使用JHM的模数技巧。

->a{b=*a
(0..8).map{|i|[" "*i,a=a.each_cons(2).map{|x,y|b<<n=3-(x+y)%3
n}]*" "}<<"%19d"%b.reduce(:+)}

在eval.in上查看:https://eval.in/649993


2

果酱 44  40字节

l~{S*\_S*\2ew{:+3%3^}%2$N@}A%_s:~:+sJSe[

在线尝试!

说明

l~       e# Read and evaluate input.
{        e# Map this block over i in the range [0 1 ... 9].
  S*     e#   Get a string of i spaces (the indentation).
  \_     e#   Swap with the current line of trits and duplicate it.
  S*     e#   Join the trits with spaces.
  \2ew   e#   Swap with the other copy of the trits and get all consecutive pairs.
  {      e#   Map this block over the pairs...
    :+   e#     Sum the pair.
    3%   e#     Modulo 3.
    3^   e#     XOR 3.
         e#     This expression (x+y)%3 ^ 3 computes the required mapping.
  }%     e#   Now this is the next line.
  2$     e#   Copy the indentation (to pad the lines to equal length).
  N      e#   Push a linefeed.
  @      e#   Pull up the next line.
}A%      e# The result of this is a nested array whose string representation is
         e# the required triangle.
_s       e# Duplicate and flatten into a string.
:~       e# Eval each character which gives a list of all the trits.
:+       e# Sum that.
s        e# Turn the sum into a string.
JSe[     e# Left-pad it with spaces to width 19.

一如既往,非常令人印象深刻!到目前为止,您处于领先地位!
WallyWest'9

1
@WallyWest谢谢。:)只需等待Pyth,Jelly和MATL。;)
Martin Ender

其实,我很想知道GolfScript解决方案的样子...;)
WallyWest 2016年

哦,有人要发布SQL解决方案吗?;)
WallyWest

1

Python 2,164字节

相对简单的迭代解决方案。

L=input()
s=0
for i in range(len(L)):
    print" "*-~i+" ".join(`L`[1::3]);s+=sum(L);N=L;L=[]
    for a,b in zip(N,N[1:]):L+=[list({1,2,3}-{a,b}),[a]][a==b]
print"%19s"%s

在线尝试


1

PHP,143字节

<?for($t=$_GET[t];$i<181;$s+=$v,$i+=2)$t[$i+20]=($v=$t[$i])*($z=$t[$i+2])>0&$i!=18?($v+$z)%3^3:" ";echo chunk_split($t.str_pad($s,8," ",0),19);

0

的JavaScript(ES6),112 100 96字节

将数组作为输入并递归构建一个逗号分隔的三角形。

f=(s,p=`
`,S=0)=>p+(s[0]?s+f(s.map((v,i)=>(S+=v,v^s[i-1]||v)).slice(1),p+' ',S):(p+S).slice(-9))

console.log(f([1,2,3,3,1,3,1,3,1,2])); // reference example
console.log(f([3,3,2,1,3,1,2,1,2,1])); // random example
console.log(f([1,1,1,1,1,1,1,1,1,1])); // all ones (test case for sum < 100)

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.