Números triangulares


16

(no, esos no )

El reto

Tendrás dos entradas. El primero es un número entero positivo n > 0, que se utiliza para generar un n x ntriángulo rectángulo de los números 1, 2, 3, ... n. Este triángulo comienza en una esquina y aumenta horizontal y verticalmente en uno y diagonalmente en dos. Vea los ejemplos a continuación para aclaraciones. Mantenga un espacio entre columnas y mantenga todos los números alineados a la derecha en sus columnas particulares. (Esto es después de todo).

La segunda entrada, xes uno de los cuatro caracteres ASCII únicos que usted elige que determina la esquina inicial del triángulo (y, por lo tanto, la orientación). Por ejemplo, podría usar 1,2,3,4or a,b,c,do #,*,!,), etc. Especifique en su respuesta cómo funciona la orientación.

Para aclarar este desafío, utilizaré el 1,2,3,4que corresponderá a 1la esquina superior izquierda, 2a la esquina superior derecha y así sucesivamente en el sentido de las agujas del reloj.

Los ejemplos

Por ejemplo, para n = 5, x = 1generar lo siguiente:

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

Para la entrada n = 11, x = 1envíe lo siguiente (tenga en cuenta los espacios adicionales para que los dígitos individuales estén alineados a la derecha):

 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

Con entrada n=6y x=2salida:

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

Con entrada n = 3y x = 4salida:

3
2 3
1 2 3

Con entrada n = 1y cualquiera x, salida:

1

Las normas

  • Las nuevas líneas iniciales / finales u otros espacios en blanco son opcionales, siempre que los números se alineen adecuadamente. (Por ejemplo, el espacio en blanco al final para hacer una salida cuadrada es aceptable).
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • La salida puede ser a la consola, guardada como una imagen, devuelta como una lista de cadenas, etc. Cualquier formato conveniente y permitido .
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).

Esta pregunta es solo esto + esto . Todavía no lo sé, pero siento que este es un engaño de uno de ellos.
Post Rock Garf Hunter

44
@WheatWizard No creo que las respuestas de ninguno de esos desafíos puedan modificarse trivialmente para ser competitivas aquí.
AdmBorkBork

Para ser honesto, sé que mucha gente dice que eso es lo que hace un duplicado, pero que yo sepa no es una regla. Para mí, un duplicado es una pregunta que no ofrece nada en términos de desafío que no sea proporcionada por las preguntas existentes.
Post Rock Garf Hunter

2
@WheatWizard Meta consenso .
AdmBorkBork

He leído esa respuesta. Es una recomendación en un contexto más específico, no una decisión universal.
Post Rock Garf Hunter

Respuestas:



1

MATL , 18 bytes

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

La primera entrada es n. La segunda entrada es x, que puede ser:

  • 0: arriba a la izquierda
  • 1: abajo a la izquierda
  • 2: abajo a la derecha
  • 3: parte superior derecha

(O puede ser cualquier otro número entero, que se interpreta módulo 4).

¡Pruébalo en MATL Online!


1

APL (Dyalog) , 29 bytes

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

Pruébalo en línea!

¿Cómo?

¨⍳⍵- para cada uno ien el rango den

(⍳+⍵-⊢)- gama de productos icon adición vectorizada den - i

↑⌽ - invertir y aplanar

⌽∘⍉ - Gira a la derecha

⍣⍺⊢- xtiempos

' '@(=∘0) - eliminar ceros


1

JavaScript 130 128 154 142 138 135 133 bytes

* problemas de relleno solucionados

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 creo que lo arreglé ahora
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

Pruébalo en línea! o Pruebe todos los casos de prueba

(r+[n]+['']*i)[-n:]agregará algunas cadenas vacías a la lista de números, y cortará al tamaño correcto, zipcon [::1-x%4/2*2]y [::1-x/3*2]hará la rotación, y %%%ds'%len(`n`)*ngenerará una cadena para fomar (como ' %3s %3s %3s'...) para usar en cada número + lista de cadenas vacía


0

Mathematica, 89 bytes

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

Aquí hay otra solución que funciona en TIO

Mathematica, 122 bytes

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


Pruébalo en línea!


0

Carbón , 39 bytes

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

Pruébalo en línea! Nota: espacio final. El enlace es a la versión detallada del código. El segundo valor es el número de rotaciones en sentido antihorario, por lo que 0 es superior izquierda, 1 inferior izquierda, 2 inferior derecha, 3 superior derecha. Explicación:

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 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 golf

(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 orientación.

El segundo parámetro es un carácter de {'0', '1', '2', '3'} y el &operador lo convierte automáticamente en un número . Si se establece el bit 0 (lsb) del número, las líneas se voltean verticalmente. Si se establece el bit 1 (nlsb), las columnas se voltean horizontalmente. Se pueden usar otros caracteres de dígitos decimales con resultados predecibles.

Espacios finales

Las entradas en blanco en la cadena de salida se han reemplazado con espacios, lo que significa que las líneas tienen espacios finales en las orientaciones '0' y '1'.


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 los parámetros [w] idth y [m] ode usando 1,2,3,4 para los modos como se describe en el ejemplo.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.