Треугольные числа


16

(нет, не те )

Соревнование

Вам дадут два входа. Первый - это положительное целое число n > 0, которое используется для вывода n x nпрямоугольного треугольника чисел 1, 2, 3, ... n. Этот треугольник начинается в углу и увеличивается по горизонтали и вертикали на один, а по диагонали на два. Смотрите примеры ниже для пояснения. Оставьте один пробел между столбцами и выровняйте все числа по столбцам. (Это ведь ).

Второй вход x- один из четырех отдельных символов ASCII по вашему выбору, который определяет начальный угол треугольника (и, следовательно, ориентацию). Например, вы можете использовать 1,2,3,4или a,b,c,dили #,*,!,), и т. Д. Пожалуйста, укажите в своем ответе, как работает ориентация.

Для пояснения в этом задании я буду использовать, 1,2,3,4что будет соответствовать 1для левого верхнего, 2для правого верхнего и так далее по часовой стрелке.

Примеры

Например, для n = 5, x = 1выведите следующее:

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

Для ввода n = 11, x = 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=6и x=2выходом:

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

С входом n = 3и x = 4выходом:

3
2 3
1 2 3

С вводом n = 1и любым x, выводом:

1

Правила

  • Лидирующие / завершающие символы новой строки или другие пробелы являются необязательными, при условии, что числа выстраиваются соответствующим образом. (Например, конечный пробел для получения квадратного вывода приемлем).
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Выводится в консоль, сохраняется как изображение, возвращается как список строк и т. Д. Любой удобный и разрешенный формат .
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Этот вопрос только это + это . Я еще не знаю, но я чувствую, что это обман одного из них.
Пост Рок Гарф Хантер

4
@WheatWizard Я не думаю, что ответы на какие-либо из этих проблем могут быть тривиально изменены, чтобы быть конкурентоспособными здесь.
AdmBorkBork

Честно говоря, я знаю, что многие люди говорят, что это делает дубликат, но, насколько я могу судить, это не правило. Для меня дубликат - это вопрос, который не предлагает ничего с точки зрения проблемы, которая не обеспечивается существующими вопросами.
Пост Рок Гарф Хантер


Я прочитал этот ответ. Это рекомендация в более конкретном контексте, а не универсальное решение.
Пост Рок Гарф Хантер

Ответы:



1

MATL , 18 байт

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

Первый вход n. Второй вход x, который может быть:

  • 0: верхний левый
  • 1: Нижняя левая
  • 2: внизу справа
  • 3: в правом верхнем углу

(Или это может быть любое другое целое число, которое интерпретируется по модулю 4).

Попробуйте это в MATL Online!


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также сгенерирует строку для разбивания (например ' %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

Луа, 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

Принимает параметры [w] idth и [m] ode, используя 1,2,3,4 для режимов, как описано в примере.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.