三角数


16

(不,不是那些

挑战

您将获得两个输入。第一个是正整数n > 0,用于输出n x n数字的直角三角形1, 2, 3, ... n。这个三角形从一个角开始,然后在水平和垂直方向上增加一个,在对角线上增加两个。请参阅以下示例以进行澄清。在各列之间保持一个空格,并使所有数字在其特定的列中正确对齐。(毕竟这是)。

第二个输入,x是您选择的四个不同的单个ASCII字符之一,它确定三角形的起始角(并因此确定方向)。例如,您可以使用1,2,3,4a,b,c,d#,*,!,)等。请在答案中指定方向的工作方式。

为了澄清该挑战,我将使用1,2,3,4对应于1左上角,2右上角,依此类推。

例子

例如,对于n = 5x = 1输出以下内容:

1 2 3 4 5
2 3 4 5
3 4 5
4 5
5

对于input n = 11x = 1输出以下内容(请注意多余的空格,以便使单个数字右对齐):

 1  2  3  4  5  6  7  8  9 10 11
 2  3  4  5  6  7  8  9 10 11
 3  4  5  6  7  8  9 10 11
 4  5  6  7  8  9 10 11
 5  6  7  8  9 10 11
 6  7  8  9 10 11
 7  8  9 10 11
 8  9 10 11
 9 10 11
10 11
11

具有输入n=6x=2输出:

6 5 4 3 2 1
  6 5 4 3 2
    6 5 4 3
      6 5 4
        6 5
          6

使用输入n = 3x = 4输出:

3
2 3
1 2 3

使用input n = 1和any x,输出:

1

规则

  • 前导/尾随换行符或其他空格是可选的,但前提是这些数字必须适当对齐。(例如,尾随空白以生成平方输出是可以接受的)。
  • 完整的程序或功能都是可以接受的。如果是函数,则可以返回输出而不是打印输出。
  • 可以将输出输出到控制台,另存为图像,以字符串列表形式返回,等等。任何方便且允许的格式
  • 禁止出现标准漏洞
  • 这是因此所有常见的高​​尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

这个问题就是这个 + 这个。我还不知道,但是我觉得这是其中之一的骗子。
发布Rock Garf Hunter,

4
@WheatWizard我不认为可以轻易修改这些挑战中的任何一个以使其具有竞争力。
AdmBorkBork

老实说,我知道很多人都说这就是重复的原因,但据我所知,这不是规则。对我来说,重复是一个问题,就现有问题没有提供的挑战而言,它什么也没有提供。
发布Rock Garf Hunter,

2
@WheatWizard Meta共识
AdmBorkBork

我已经看过答案了。它是在更具体的情况下提出的建议,而不是普遍的裁决。
发布Rock Garf Hunter,

Answers:



1

MATL,18字节

:&YhiX!VZ{' 0'2:YX

第一个输入是n。第二个输入是x,可以是:

  • 0: 左上方
  • 1: 左下方
  • 2:右下
  • 3: 右上

(或者可以是任何其他整数,以4为模)。

MATL在线上尝试一下


1

APL(Dyalog),29个字节

{' '@(=∘0)⌽∘⍉⍣⍺⊢↑⌽(⍳+⍵-⊢)¨⍳⍵}

在线尝试!

怎么样?

¨⍳⍵-对于i范围内的每个n

(⍳+⍵-⊢)- i通过的矢量化相加产生的范围n - i

↑⌽ -反转并展平

⌽∘⍉ - 右旋

⍣⍺⊢- x

' '@(=∘0) -删除零


1

的JavaScript 130 128 154 142 138 135 133字节的

*修复了填充问题

A=(n,x)=>(j=>{for(;n--;s=x<3?S+`
`+s:s+S+`
`)
for(S=O,i=j;i;S=i-->n^~-x%3?X+S:S+X)
X=(i>n?i+O:O).padStart(j.length+1)})(n+=s=O="")||s

console.log(A(6,1))
console.log(A(6,2))
console.log(A(6,3))
console.log(A(6,4))

console.log(A(12,1))
console.log(A(12,2))
console.log(A(12,3))
console.log(A(12,4))

/* 154 solution
A=(n,x)=>{s=""
for(j=n;n--;s=x<3?S+`
`+s:s+S+`
`)
for(S="",i=j;i;S=i-->n?~-x%3?S+X:X+S:~-x%3?X+S:S+X)
X=(i>n?i+"":"").padStart((j+"").length+1)
return s
}

142 solution
A=(n,x)=>{s=""
for(j=n;n--;s=x<3?S+`
`+s:s+S+`
`)
for(S="",i=j;i;S=i-->n ^ ~-x%3?X+S:S+X)
X=(i>n?i+"":"").padStart((j+"").length+1)
return s
}

138 solution
A=(n,x)=>{s=""
for(j=n+" ";n--;s=x<3?S+`
`+s:s+S+`
`)
for(S="",i=+j;i;S=i-->n^~-x%3?X+S:S+X)
X=(i>n?i+"":"").padStart(j.length)
return s
}

135 solution
A=(n,x)=>{for(j=n+=s=O="";n--;s=x<3?S+`
`+s:s+S+`
`)
for(S=O,i=j;i;S=i-->n^~-x%3?X+S:S+X)
X=(i>n?i+O:O).padStart(j.length+1)
return s
}
*/


@AdmBorkBork我想我现在已解决它
DanielIndie

0

Python 2中124 120个字节

n,x=input()
r=range(n)
for l in zip(*[(r+[n]+['']*i)[-n:]for i in r][::1-x%4/2*2])[::1-x/3*2]:print' %%%ds'%len(`n`)*n%l

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

(r+[n]+['']*i)[-n:]将一些空字符串添加到号码列表,剁到合适的大小,zip[::1-x%4/2*2][::1-x/3*2]将旋转,并%%%ds'%len(`n`)*n将生成一个字符串fomating(像' %3s %3s %3s'...),以在每个号码使用+空字符串列表


0

Mathematica,89个字节

(R=Reverse;Grid[{#&,R/@#&,R[R/@#]&,R@#&}[[#2]]@PadRight@Array[Range[#,s]&,s=#]/. 0->""])&   

这是在TIO中有效的另一种解决方案

Mathematica,122个字节

(R=Reverse;StringRiffle[""<>ToString/@#&/@({#&,R/@#&,R[R/@#]&,R@#&}[[#2]]@PadRight@Array[#~Range~s&,s=#]/. 0->" "),"\n"])&


在线尝试!


0

木炭,39字节

Nτ≔EτEτ◧׋⁺ιλτI⊕⁺ιλLθσFN≔⮌EσEσ§μλσEσ⪫ι 

在线尝试!注意:尾随空格。链接是详细版本的代码。第二个值是逆时针旋转数,因此0左上,1左下,2右下,3右上。说明:

Nτ                                      Assign the first input as an integer
   EτEτ                                 Map in two dimensions
               ⊕⁺ιλ                     Sum of zero-indexed coordinates plus 1
              I                         Cast to string
         ‹⁺ιλτ                          Is this the upper left triangle?
        ×                               Repeat the string once if so
       ◧           Lθ                   Pad to length of first input
  ≔                  σ                  Assign to variable
                          EσEσ§μλ       Transpose the array
                         ⮌              Reflect the array, giving a rotation
                        ≔        σ      Reassign to variable
                       N                Second input as an integer
                      F                 Repeat that many times
                                  Eσ    Map over array
                                    ⪫ι  Join with spaces and implicitly print

0

使用Javascript(ES6),241个 222 214字节

let f = 

    (n,x)=>(L=x=>(''+x).length,M=b=>x&b?(c,i,a)=>a[n-1-i]:c=>c,Array(n).fill(b=' ').map((c,i)=>b.repeat(L(n)-L(++i))+i).map((c,i,a)=>a.map((v,j)=>j>i?b.repeat(L(n)):v)).map(M(1)).map(c=>c.map(M(2))).map(c=>c.join(b)))


function printTriangle() {  // display array of strings returned by f
    o.innerText = f(
       +Length.value, // number
       Rotate.value[0] // ASCII char
    ).join('\n');
}
Length: <input type="text" value="11" id="Length"><br>
Rotate: <input type="text" value="0" id="Rotate"> 0,1,2,3<br>
<button type="button" onclick="printTriangle()">
  OK
</button>
<br>
<pre id="o"></pre>

少打高尔夫球

(n,x)=>(
    L= x=> (''+x).length,                // strlen(x)
    M= b=> x&b ? (c,i,a)=>a[n-1-i] : c=>c, // reverse or identity map
    Array(n).fill(b=' ')
   .map((c,i)=>b.repeat(L(n)-L(++i))+i)  // a complete line of numbers
   .map((c,i,a)=>a.map((v,j)=>j>i?b.repeat(L(n)):v)) // to 2-d array
                                         // with spaces for blank numbers
   .map(M(1))                            // flip vertically?
   .map(c=>c.map(M(2)))                  // flip horizontally?
   .map(c=>c.join(b))                    // convert lines to strings
)

注意方向。

第二个参数是{'0','1','2','3'}中的字符,并由类型自动转换为数字 &操作员。如果设置了数字的位0(lsb),则将垂直翻转行。如果设置了位1(nlsb),则水平翻转列。其他十进制数字字符可以与可预测的结果一起使用。

尾随空格

输出字符串中的空白条目已替换为空格,这意味着行在方向'0'和'1'处具有尾随空格。


0

Lua,250个字节

function f(w,m)d=""for y=1,w do for x=1,w do d=string.format("%s%"..tostring(w):len().."s ",d,m<2 and(y+x-1<=w and x+y-1 or"")or(m<3 and(x>=y and w-x+y or"")or(m<4 and(y+x-1>=w and w+w-x-y+1 or"")or(y>=x and w-y+x or""))))end;d=d.."\n"end;print(d)end

如示例中所述,对于模式使用1,2,3,4来获取参数[w] idth和[m] ode。


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.