Números triangulares

16

(não, não aqueles )

O desafio

Você receberá duas entradas. O primeiro é um número inteiro positivo n > 0, usado para gerar um n x ntriângulo retângulo dos números 1, 2, 3, ... n. Esse triângulo começa em um canto e aumenta horizontal e verticalmente em um e diagonalmente em dois. Veja os exemplos abaixo para esclarecimentos. Mantenha um espaço entre as colunas e mantenha todos os números alinhados à direita em suas colunas específicas. (Isso é afinal).

A segunda entrada,, xé um dos quatro caracteres ASCII únicos e distintos de sua escolha, que determina o canto inicial do triângulo (e, portanto, a orientação). Por exemplo, você pode usar 1,2,3,4or a,b,c,dou #,*,!,), etc. Especifique na sua resposta como a orientação funciona.

Para esclarecimentos neste desafio, usarei o 1,2,3,4que corresponderá à 1parte superior esquerda, 2à parte superior direita e assim por diante.

Os exemplos

Por exemplo, para n = 5, x = 1produza o seguinte:

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

Para entrada n = 11, digite x = 1o seguinte (observe os espaços extras para que os dígitos únicos estejam alinhados à direita):

 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

Com entrada n=6e x=2saída:

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

Com entrada n = 3e x = 4saída:

3
2 3
1 2 3

Com entrada n = 1e qualquer xsaída,

1

As regras

  • Novas linhas à esquerda / à direita ou outro espaço em branco são opcionais, desde que os números sejam alinhados adequadamente. (Por exemplo, espaço em branco à direita para gerar uma saída quadrada é aceitável).
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • A saída pode ser no console, salva como uma imagem, retornada como uma lista de cadeias, etc. Qualquer formato conveniente e permitido .
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
AdmBorkBork
fonte
Esta questão é apenas isso + isso . Ainda não sei, mas sinto que isso é uma bobagem de um deles.
Post Rock Garf Hunter
4
@WheatWizard Eu não acho que as respostas de qualquer um desses desafios possam ser trivialmente modificadas para serem competitivas aqui.
AdmBorkBork
Para ser honesto, sei que muitas pessoas dizem que é isso que faz uma duplicata, mas, tanto quanto posso dizer, não é uma regra. Para mim, uma duplicata é uma pergunta que não oferece nada em termos de desafio que não é fornecido pelas perguntas existentes.
Post Rock Garf Hunter
2
@WheatWizard Meta consenso .
AdmBorkBork
Eu li essa resposta. É uma recomendação em um contexto mais específico, não uma decisão universal.
Post Rock Garf Hunter

Respostas:

3

Gelatina , 13 bytes

Rṫ`z⁶ṚH}¡U⁹¡G

Experimente online!

Argumento à esquerda: Argumento à n
direita: x( 0= canto superior esquerdo, 1= canto superior direito, 2= canto inferior esquerdo, 3= canto inferior direito)

Erik, o Outgolfer
fonte
1

MATL , 18 bytes

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

A primeira entrada é n. A segunda entrada é x, que pode ser:

  • 0: canto superior esquerdo
  • 1: inferior esquerdo
  • 2: canto inferior direito
  • 3: canto superior direito

(Ou pode ser qualquer outro número inteiro, que é interpretado no módulo 4).

Experimente no MATL Online!

Luis Mendo
fonte
1

APL (Dyalog) , 29 bytes

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

Experimente online!

Quão?

¨⍳⍵- para cada um ina gama den

(⍳+⍵-⊢)- gama de produtos icom adição vetorizada den - i

↑⌽ - inverter e achatar

⌽∘⍉ - vire à direita

⍣⍺⊢- xvezes

' '@(=∘0) - remover zeros

Uriel
fonte
1

JavaScript 130 128 154 142 138 135 133 bytes

* problemas de preenchimento corrigidos

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
}
*/

DanielIndie
fonte
@AdmBorkBork eu acho que fixa-lo agora
DanielIndie
0

Python 2 , 124 120 bytes

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

Experimente online! ou Experimente todos os casos de teste

(r+[n]+['']*i)[-n:]adicionará algumas seqüências de caracteres vazias à lista de números e cortará no tamanho certo, zipcom [::1-x%4/2*2]e [::1-x/3*2]fará a rotação, e %%%ds'%len(`n`)*ngerará uma sequência de formatação (como ' %3s %3s %3s'...) a ser usada em cada número + lista de sequências vazia

Cajado
fonte
0

Mathematica, 89 bytes

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

aqui está outra solução que funciona no TIO

Mathematica, 122 bytes

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


Experimente online!

J42161217
fonte
0

Carvão , 39 bytes

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

Experimente online! Nota: Espaço à direita. Link é a versão detalhada do código. O segundo valor é o número de rotações no sentido anti-horário, de modo que 0 é superior esquerdo, 1 inferior esquerdo, 2 inferior direito, 3 superior direito. Explicação:

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
Neil
fonte
0

Javascript (ES6), 241 222 214 bytes

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>

Menos Golfe

(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
)

Nota sobre orientação.

O segundo parâmetro é um caractere de {'0', '1', '2', '3'} e digite automaticamente convertido em um número pelo & operador. Se o bit 0 (lsb) do número estiver definido, as linhas serão invertidas verticalmente. Se o bit 1 (nlsb) estiver definido, as colunas serão invertidas horizontalmente. Outros caracteres de dígitos decimais podem ser usados ​​com resultados previsíveis.

Espaços desnecessários à direita do texto

As entradas em branco na sequência de saída foram substituídas por espaços, o que significa que as linhas têm espaços à direita nas orientações '0' e '1'.

traktor53
fonte
0

Lua, 250 bytes

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

Toma os parâmetros [w] idth e [m] ode usando 1,2,3,4 para os modos, conforme descrito no exemplo.

Blab
fonte
0

05AB1E (61 bytes)

F¹N-LN+¹N-LN+Rõ¸N∍s«N>LN¹<--N>LN¹<--Rõ¸¹<N-∍s«)²èvy¹gyg-ú}ðý,

Experimente online

David Smith
fonte