Трикутні числа


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

Якщо чесно, я знаю, що багато людей кажуть, що це дублікат, але, наскільки я можу сказати, це не правило. Для мене дублікат - це питання, яке нічого не пропонує в частині виклику, що не передбачено існуючими питаннями.
Post Rock Garf Hunter


Я прочитав цю відповідь. Його рекомендація у більш конкретному контексті не є універсальним рішенням.
Опублікувати Rock Garf Hunter

Відповіді:



1

MATL , 18 байт

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

Перший вхід - n. Другий вхід - xце:

  • 0: вгорі зліва
  • 1: знизу зліва
  • 2: праворуч знизу
  • 3: праворуч угорі

(Або це може бути будь-яке інше ціле число, яке інтерпретується модулем 4).

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


1

APL (Діалог) , 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

Математика, 89 байт

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

ось ще одне рішення, яке працює в TIO

Математика, 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 (фунт) числа, рядки перевертаються вертикально. Якщо встановлено біт 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.