Трикутники цифр


26

Виклик:

Введення: додатне ціле число n

Вихід:

Створіть список у діапазоні [1,n] та з'єднайте його разом із рядком (тобто n=13 було б рядком 12345678910111213).

Тепер ми виводимо трикутник за допомогою префіксів або суфіксів цього рядка в одній з наступних чотирьох орієнтацій на основі вхідного цілого числа:

  • Якщо , виведіть його у формі трикутника ◣n0(mod4)
  • Якщо , виведіть його у формі трикутника ◤n1(mod4)
  • Якщо , виведіть його у формі трикутника ◥n2(mod4)
  • Якщо , виведіть його у формі трикутника ◢n3(mod4)

Приклад:

Вхід:n=13

Оскільки , форма буде ◤. Ось три можливі дійсні результати:131(mod4)

12345678910111213    11111111111111111    12345678910111213
1234567891011121     2222222222222222     2345678910111213
123456789101112      333333333333333      345678910111213
12345678910111       44444444444444       45678910111213
1234567891011        5555555555555        5678910111213
123456789101         666666666666         678910111213
12345678910          77777777777          78910111213
1234567891           8888888888           8910111213
123456789            999999999            910111213
12345678             11111111             10111213
1234567              0000000              0111213
123456               111111               111213
12345                11111                11213
1234                 1111                 1213
123                  222                  213
12                   11                   13
1                    3                    3

Правила виклику:

  • Як ви бачите на трьох дійсних результатах вище, важлива лише правильна форма та використання всіх цифр у правильному порядку . Крім того, ви можете використовувати префікси або суфікси; перевертає / відбиває; діагональний друк; тощо. Будь-який із шести можливих виходів для кожної фігури дозволений (див. тестовий випадок нижче, щоб побачити всі дійсні результати на основі форми). Це дозволяє мовам із вбудованими обертаннями використовувати його, але ті, хто не може, також можуть використовувати альтернативний підхід до використання префіксів правильного розміру зверху вниз, або використання префіксів для двох форм, але суфіксів для двох інших форм . Вибір найбільш відповідних варіантів виводу для вашої мови є частиною процесу гольфу. :)
  • Введення гарантується як натуральне число. Для ми просто виводимо .n=11
  • Дозволяється будь-яка кількість провідних / задніх рядків / пробілів, якщо вони друкують правильний трикутник (без вертикальних і горизонтальних роздільників!) Десь на екрані.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

Тестові приклади:

Вхід: n=5
Усі можливі дійсні виходи:

12345    54321    12345    54321    11111    55555
1234     5432     2345     4321     2222     4444
123      543      345      321      333      333
12       54       45       21       44       22
1        5        5        1        5        1

Вхід: n=6
Усі можливі виходи:

123456    654321    123456    654321    111111    666666
 12345     65432     23456     54321     22222     55555
  1234      6543      3456      4321      3333      4444
   123       654       456       321       444       333
    12        65        56        21        55        22
     1         6         6         1         6         1

Вхід: n=7
Усі можливі виходи:

      1          1          7          7          7          1
     12         21         67         76         66         22
    123        321        567        765        555        333
   1234       4321       4567       7654       4444       4444
  12345      54321      34567      76543      33333      55555
 123456     654321     234567     765432     222222     666666
1234567    7654321    1234567    7654321    1111111    7777777

Вхід: n=8
Усі можливі виходи:

1           1           8           8           8           1
12          21          78          87          77          22
123         321         678         876         666         333
1234        4321        5678        8765        5555        4444
12345       54321       45678       87654       44444       55555
123456      654321      345678      876543      333333      666666
1234567     7654321     2345678     8765432     2222222     7777777
12345678    87654321    12345678    87654321    11111111    88888888

Вхід: n=1
Тільки можливий вихід:

1

Вхід: n=2
Усі можливі виходи:

12    21    12    21    11    22
 1     2     2     1     2     1

Чи можемо ми використовувати інші значення для різних трикутників, наприклад 1 для ◤ тощо?
Втілення Невідомості

@EmbodimentofIgnorance Невдалий приклад, оскільки саме так говорить специфікація. Я думаю, ви хотіли запитати, чи можемо ми змінити порядок чотирьох домовленостей, якщо ми будемо дотримуватись цього (я думаю, що це було б ні).
Ерік Аутгольфер

1
Якщо n==13, може, найвищим рядом бути '33333333333333333'(або, що еквівалентно '31211101987654321')?
Час Браун

@EmbodimentofIgnorance Вибачте, але я б сказав, що ні в цьому випадку. Форми та їх відповідні mod 4суворі пари для цього завдання. Тому ви не можете перемикати чотири фігури для чотирьох mod 4випадків. Але все-таки гарне запитання.
Кевін Круїссен

@ChasBrown Так, і те й інше добре. Я дав лише три можливі приклади для , але всі шість варіантів (як тест n = 5 ) є дійсними результатами. н=13н=5
Кевін Круїссен

Відповіді:


9

JavaScript (ES6),  93  89 байт

Повертає матрицю символів.

n=>[...(g=n=>n?g(n-1)+n:'')(n)].map((d,y,a)=>a.map(_=>y-(n&2)*y--<0?' ':d)).sort(_=>-n%2)

Спробуйте в Інтернеті!

Альтернативний малюнок (однаковий розмір):

n=>[...(g=n=>n?g(n-1)+n:'')(n)].map((_,y,a)=>a.map(d=>y-(n&2)*y--<0?' ':d)).sort(_=>-n%2)

Спробуйте в Інтернеті!

Прокоментував

n =>                 // n = input
  [...               // split the result of ...
    ( g = n =>       //   ... a call to the recursive function g, taking n
      n ?            //     if n is not equal to 0:
        g(n - 1)     //       append the result of a recursive call with n - 1
        + n          //       append n
      :              //     else:
        ''           //       stop recursion and return an empty string
    )(n)             //   initial call to g
  ].map((d, y, a) => // for each digit d at position y in this array a[]:
    a.map(_ =>       //   for each character in a[]:
      y -            //     we test either y < 0 if (n AND 2) is not set
      (n & 2)        //     or -y < 0 (i.e. y > 0) if (n AND 2) is set
      * y-- < 0      //     and we decrement y afterwards
      ?              //     if the above condition is met:
        ' '          //       append a space
      :              //     else:
        d            //       append d
    )                //   end of inner map()
  )                  // end of outer map()
  .sort(_ => -n % 2) // reverse the rows if n is odd

Підсумок форми

Нижче наведено зведення основної форми (породженої вкладеними mapпетлями) та остаточної форми (після sort) для кожного нмод4 :

 n mod 4  | 0     | 1     | 2     | 3
----------+-------+-------+-------+-------
 n & 2    | 0     | 0     | 2     | 2
----------+-------+-------+-------+-------
 test     | y < 0 | y < 0 | y > 0 | y > 0
----------+-------+-------+-------+-------
 base     | #.... | #.... | ##### | #####
 shape    | ##... | ##... | .#### | .####
          | ###.. | ###.. | ..### | ..###
          | ####. | ####. | ...## | ...##
          | ##### | ##### | ....# | ....#
----------+-------+-------+-------+-------
 n % 2    | 0     | 1     | 0     | 1
----------+-------+-------+-------+-------
 reverse? | no    | yes   | no    | yes
----------+-------+-------+-------+-------
 final    | #.... | ##### | ##### | ....#
 shape    | ##... | ####. | .#### | ...##
          | ###.. | ###.. | ..### | ..###
          | ####. | ##... | ...## | .####
          | ##### | #.... | ....# | #####

1
дякую за пояснення деталей.
chau giang


7

Japt , 8 байт

Повертає масив рядків.

õ ¬å+ zU

Спробуй це

Збережено 2 байти завдяки Кевіну .

õ ¬å+ zU     :Implicit input of integer U
õ            :Range [1,U]
  ¬          :Join to a string
   å+        :Cumulatively reduce by concatenation
      zU     :Rotate clockwise by 90 degrees U times

1
Чи úпотрібне? Здається, обертання робить це неявно?
Кевін Круїссен

@KevinCruijssen, хм ... так це і робиться. Я завжди це забуваю; рідко приживаються z.
Кудлатий

1
Ну, я взагалі не знаю Джапта. Було просто цікаво, як виглядав вихід без прокладки для розваги, і побачив, що він працює точно так само ..;)
Кевін Круїссен



3

Вугілля деревне , 17 байт

Nθ≔⭆θ⊕ιηGLLηη⟲⊗θ‖

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Nθ

Вхідні дані n.

≔⭆θ⊕ιη

Створіть рядок, об'єднавши числа 1в n.

GLLηη

Заповніть трикутник такої довжини рядком.

⟲⊗θ

Поверніть трикутник проти годинникової стрілки на n*90градуси.

Відбийте все, таким чином закінчуючи трикутником, який обертається за годинниковою стрілкою на n*90градуси.




3

R , 152 139 137 134 байт

function(n,N=nchar(s<-Reduce(paste0,1:n,'')),A=!n%%4%%3)for(i in 1:N)cat(rep('',(M=c(N-i+1,i))[1+!A]*(n%%4>1)),substr(s,1,M[1+A]),'
')

Розкручений код:

function(n){
  s = Reduce(paste0,1:n,'')      # concat the digits from 1 to n into a string s

  N = nchar(s)                   # store the length of s

  A = !n%%4%%3                   # A = TRUE if n MOD 4 == 1 or 2 

  for(i in 1:N){                 # for 1 to N (length of s)

    M = c(N-i+1,i)               # store N-i+1 and i into a vector

    nSpaces = M[1+!A]*(n%%4>1)   # if n MOD 4 == 1 or 2 then nSpaces = i else nSpaces = N-i+1, 
                                 # but if n MOD 4 == 0 or 1, then force nSpaces = 0

    nDigits = M[1+A]             # if n MOD 4 == 1 or 2 then nDigits = N-i+1 else nDigits = i

    prfx = rep('',)              # create a character vector repeating '' nSpaces times

    sufx = substr(s,1,M[1+A])    # substring s by taking the first nDigits characters

    cat(pr,su,'\n')              # print prfx and sufx using space as separator for the values 
                                 # contatenation (cat function default) and append a newline
  }

Спробуйте в Інтернеті!


... це вже не день для гри в гольф.
Джузеппе

@Giuseppe: ага там ... і тоді ти зазвичай перевершив мене: P
digEmAll


2

PowerShell , 108 байт

param($n)0..($y=($x=-join(1..$n)).length-1)|%{' '*(0,0,$_,($z=$y-$_))[$n%4]+-join$x[0..($_,$z,$z,$_)[$n%4]]}

Спробуйте в Інтернеті!

Трохи шорсткий по краях, але працює. Приєднується цифри 1 до nрядка, після чого вона переходить від 0 до довжини рядка-1. Кожен раз, коли він використовує індексацію списку, щоб перейти на правильний метод інтервалу та діапазон чисел, який використовується для нарізки нашої нової рядки.



2

05AB1E (спадщина) , 14 12 10 байт

Використання застарілої версії як переписування є надзвичайно повільним для цього чомусь.

Збережено 2 байти завдяки Kevin Cruijssen

LSηsFRζ}J»

Спробуйте в Інтернеті!

Пояснення

L           # push range [1 ... input]
 S          # split to list of individual digits
  η         # calculate prefixes
   sF  }    # input times do:
     R      # reverse list
      ζ     # and transpose it
        J   # join to list of strings
         »  # and join on newlines

Ви можете зберегти 2 байти зміна LJη€Sдо LSη, так як Sпобічно згладжується.
Кевін Кройсейсен

@KevinCruijssen: О так, дякую! Я забув про це. Я спробував, €Sщо не вийшло дуже добре;)
Емінья



2

R , 175 172 154 байт

function(n)write(c(" ",0:9)[1+(x=utf8ToInt(Reduce(paste0,1:n,""))-47)*!upper.tri(diag(y<-sum(x|1)))["if"(n%%4>1,1:y,y:1),"if"(!n%%4%%3,y:1,1:y)]],1,y,,"")

Спробуйте в Інтернеті!

Жахливий черговий безлад!

-3 байти шляхом зміни умови обертання

-17 байт завдяки пропозиції digEmAll , і ще один байт після гри в гольф


Я як цей upper.triangle підхід і може бути скорочений до 155 байт ... може бути , навіть більше, я впевнений , що я що - то очевидне відсутня ...
digEmAll

@digEmAll ах, значно покращився, але все ще довго :-(
Джузеппе






1

Java (JDK) , 247 209 188 186 160 148 байт

i->{String s="";int l=0,w;for(;l<i;s+=++l);for(w=s.length(),l=0;l<w;)System.out.printf("%"+(1>i%4/2?1:w)+"s\n",s.substring(0,1>~-i%4/2?w-l++:++l));}

Спробуйте в Інтернеті!

-38 bytesзавдяки @KevinCruijssen
-21 bytesза те, що дозволяють printfобробляти прокладки.
-2 bytesроблячи підрядку перед заміною, дозволяючи нам збільшуватись lв одному місці, а не в двох.
-26 bytes- printfвиконуючи прокладку, рядок, повний пропусків, вже не був необхідний, і цифрові рядки могли бути генеровані коротшим чином.
-12 bytesне возившись з однозначними цифрами замість того, щоб друкувати підрядки ідеально сервісного цифрного рядка, який ми вже маємо.

Безумовно

input->{
    // Lambda expression with target type of IntConsumer
    String allDigits = "";
    int lineLength, line = 0;

    // Collect a list of all digits in order.
    for (;line < input; allDigits += ++line) {}

    // Save the max length of a line, and create a string of that many spaces.
    for (lineLength=allDigits.length(), line=0; line < lineLength;) {
        System.out.printf(   "%" // construct a format string to handle the padding
                           + (   1 > input%4/2
                               ? 1 // No padding
                               : w // Yes padding
                             )
                           + "s\n"
                         , allDigits.substring( 0
                                              ,   1 > (i-1)%4/2
                                                ? w - l++
                                                : ++l
                                              ) // A string containing only the digit we want.
                         );
    }
}

1
Гарна відповідь. Однак для гольфу є ще багато речей: Місця після for(байдарки можна прибрати. new String(new char[w=s.length()]).replace('\0',' ')можна " ".repeat(w=s.length())використовувати Java 11+. Ви можете видалити дужки навколо потрійних чеків. 1>(i-1)%4/2може бути 1>~-i%4/2. w-1-l++може бути w+~l++. І вам не доведеться рахувати проміжну крапку з комою в підрахунку байтів. Який усього в поєднанні стає 209 байт .
Кевін Круїссен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.