ASCII трикутник Ripple


12

Гаразд, моє перше питання про гольф. Будь ласка, будь ласкавий :) Я знаю, що є занадто багато загадок ascii: P, але ось ми підемо.

Завдання просте, використовуйте улюблену мову програмування, щоб надрукувати пульсацію трикутника. Вхід повинен бути розміром пульсації.

Кожен трикутник рівномірно розташований. В основному ви продовжуєте додавати трикутники, поки не буде достатньо місця для найменшого трикутника.

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

Приклад

q)g 1
__
\/
q)g 2
____
\  /
 \/
q)g 3
______
\    /
 \  /
  \/
q)g 4
________
\  __  /
 \ \/ /
  \  /
   \/
q)g 5
__________
\  ____  /
 \ \  / /
  \ \/ /
   \  /
    \/
q)g 6
____________
\  ______  /
 \ \    / /
  \ \  / /
   \ \/ /
    \  /
     \/
q)g 7
______________
\  ________  /
 \ \  __  / /
  \ \ \/ / /
   \ \  / /
    \ \/ /
     \  /
      \/
q)g 8
________________
\  __________  /
 \ \  ____  / /
  \ \ \  / / /
   \ \ \/ / /
    \ \  / /
     \ \/ /
      \  /
       \/

Як завжди, найкоротший код виграє :)


2
Хоча це не точний дублікат Draw Concentric ASCII шестикутників , я не впевнений, що це значно додає інших.
Геобіц

4
@Geobits IMO його досить різний - специфікація вводу зовсім інша, метод з'ясування, скільки фігур для малювання відрізняється, і трикутники! = Шестикутники ;-)
Digital Trauma

@WooiKent Зараз я сумніваюся, чи правильно я зрозумів питання. Що таке пульсація? Це один концентричний набір трикутників чи щось інше?
Цифрова травма

2
приємне запитання, але це не визначено. (1) Читаючи текст буквально, коли вхід 1,2 або 3, ми завжди повинні виводити три трикутники. (2) Я вважаю, що кожен набір трикутників повинен бути концентричним, і (3) виявляється, що вони також повинні мати свої нижні кути на одній лінії. (4) Чи повинен горизонтальний поділ бути таким самим простором, як показано, чи допускаються інші розділення? (5) Чи дозволено не потрібний пробіл вліво (a, b, c, d) ліворуч, праворуч, вгорі, внизу?
Рівень Св. Св.

Я думаю, що це досить зрозуміло, хоча і не явно. Ви завжди малюєте один трикутник заданого розміру з вкладеними трикутниками розміром n-3, n-6, n-9 тощо.
Sparr

Відповіді:


5

Pyth, 31 байт

VhQ+J<t+++*Nd*N"\ "d*Q\_Q_XJ"\/

Демонстрація.

Пояснення:

VhQ+J<t+++*Nd*N"\ "d*Q\_Q_XJ"\/
                                   Implicit: Q = eval(input()), d = ' '
VhQ                                for N in range(Q + 1):
                                   Concatenate:
          *Nd                      N spaces
         +   *N"\ "                N of the string "\ "
        +          d               another space
       +            *Q\_           Q of the string "_"
                                   If N = 2 and Q = 7, the string so far is:
                                   "  \ \  _______" and we want
                                   " \ \  _" as the left half.
      t                            Remove the first character.
     <                  Q          Take the first Q characters remaining.
                                   This is the left half of the triangle ripple.
    J                              Store it in J.
                          XJ"\/    Translate \ to / in J.
                         _         Reverse it.
   +                               Concatenate the left and right halves and print.

7

GNU sed -nr, 210

Початок:

s/1/__/g
p
s#_(.*)_#\\\1/#
s#\\__#\\  #
s#__/#  /#
ta
:a
p
s#(.*) _{6}(_*) # \1\\  \2  /#;ta
s#(.*)  (  )# \1\2#;
s#(.*) _(_*)_ # \1\\\2/#
y/_/ /
Tc
:b
p
:c
s#(.*)((\\)  ( *)(/)|()()()\\/)# \1\3\4\5#;tb

Введення є позитивним одинарним цілим числом через STDIN, відповідно до цього мета-питання .

Вихід:

$ for i in 1 11 111 1111 11111 111111 1111111; do sed -rnf triripple.sed <<< $i; done
__
\/

____
\  /
 \/

______
\    /
 \  /
  \/

________
\  __  /
 \ \/ /
  \  /
   \/

__________
\  ____  /
 \ \  / /
  \ \/ /
   \  /
    \/

____________
\  ______  /
 \ \    / /
  \ \  / /
   \ \/ /
    \  /
     \/

______________
\  ________  /
 \ \  __  / /
  \ \ \/ / /
   \ \  / /
    \ \/ /
     \  /
      \/

$ 

5

C, 165 байт

n,x,y,b,c;main(c,v)char**v;{for(n=atoi(v[1]);y<=n;++y){for(x=-n;x<n;++x){b=2*n-abs(2*x+1);c=b-2*y+2;b-=6*y;putchar(b>0?95:b<-4&c>0&c%4==1?"/\\"[x<0]:32);}puts("");}}

Перед кроками для гольфу, які знищують читабельність:

#include <stdio.h>
#include <stdlib.h>

int main(int c, char** v) {
    int n = atoi(v[1]);
    for (int y = 0; y <= n; ++y) {
        for (int x = -n; x < n; ++x) {
            int b = 2 * n - abs(2 * x + 1);
            int c = b - 2 * y + 2;
            b -= 6 * y;
            putchar(b > 0 ? 95 : 
                    b < -4 && c > 0 && c % 4 == 1 ? "/\\"[x<0] : 32);
        }
        puts("");
    }
}

Це петлі над усіма символами прямокутника, що містить фігуру, і оцінює рівняння ліній, що відокремлюють внутрішню частину трикутника від зовнішньої, а також ті, що розділяють різні частини трикутника.


Гарна робота з математикою. Спробуйте спробувати це: codegolf.stackexchange.com/q/51396/21348
edc65

156:n,x,y,b,c;main(c,v)char**v;{for(n=atoi(v[1]);y<=n;++y)for(x=-n;x<=n;putchar(x++-n?b>6*y?95:b<6*y-4&c>0&c%4==1?"/\\"[x<1]:32:10))c=(b=2*n-abs(2*x+1))-2*y+2;}
edc65

4

Сітківка , 182 байт

1
_
^
#$_
((`#([^#]*?)( ?)_(_*)_( ?)([^#]*?)$
$0# $1\$3/$5
+)`\\( ?)_(_*)_( ?)/(?=[^#]*$)
\ $1$2$3 /
#( *(\\ )*\\ *)  ( *(/ )*/)$
$0# $1$3
)`#( *(\\ )*)\\/(( /)*)$
$0# $1$3
# 
#
^#
<empty line>

Приймає дані як одинакові.

Кожен рядок повинен мати свій власний файл і його #слід змінити на новий рядок у файлах. Це недоцільно, але ви можете запустити код як один файл із -sпрапором, зберігаючи #маркери. Ви можете змінити #'s на нові рядки у висновку для читабельності, якщо бажаєте. Наприклад:

> echo -n 1111|retina -s triangle|tr # '\n'
________
\  __  /
 \ \/ /
  \  /
   \/

Код ще не надто добре гольф (поки що).


2

C - 206 байт

i,j,m,k,a,b;main(i,v)char**v;{m=atoi(v[1])*2;while(k<m*(m/2+1)){i=k/m;j=k%m;a=i*3,b=(i+j)%2;putchar("_\\/ "[j>=a&&j<m-a?0:j>i-2&&b&&j<i*3-1&&j<m/2?1:j<=m-i&&!b&&j>m-a&&j>=m/2?2:3]);if(j==m-1)puts("");k++;};}

 x,m,i,j,a,b;
int main(x,v)char**v;{
    m=atoi(v[1])*2;
    for(i=0;i<m/2+1;i++){
        for(j=0;j<m;j++){
            a=i*3,b=(i+j)%2;
            j>=a&&j<m-a?a=0:j>=i-1&&b&&j<i*3-1&&j<m/2?a=1:j<=m-i&&!b&&j>m-a&&j>=m/2?a=2:(a=3);putchar("_\\/ \n"[a]);
        }
        puts("");
    }
}

Приклад виведення

Pauls-iMac:ppcg pvons$ for i in $(seq 1 7); do ./a.out $i; done
__
\/
____
\  /
 \/ 
______
\    /
 \  / 
  \/  
________
\  __  /
 \ \/ / 
  \  /  
   \/   
__________
\  ____  /
 \ \  / / 
  \ \/ /  
   \  /   
    \/    
____________
\  ______  /
 \ \    / / 
  \ \  / /  
   \ \/ /   
    \  /    
     \/     
______________
\  ________  /
 \ \  __  / / 
  \ \ \/ / /  
   \ \  / /   
    \ \/ /    
     \  /     
      \/      

1
Ви можете це обрізати зовсім небагато. Скориставшись старим стилем C, ви можете оголосити змінні без типу, якщо вони є int. Крім того, якщо ви оголосите їх у глобальному масштабі, вони автоматично ініціалізуються до 0. Замість того, щоб здійснювати купу putchar()дзвінків у різних галузях, ви можете використовувати один виклик та замінювати ifзаяви операторами з потрійними операторами. Звичайно, важко читати таким чином, але цілком в дусі цього сайту писати некрасивий код, якщо він коротший. :)
Reto Koradi

Дякую @RetoKoradi, я скоротив його з 279 до 214, реалізуючи ваші пропозиції :) Я думаю, мені потрібно вдосконалити свій алгоритм, щоб отримати подальші вдосконалення.
paulvs

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

1

JavaScript ( ES6 ) 165 180 204

Запустіть фрагмент у Firefox для тестування. Якщо повернення рядка недостатньо, використання сповіщення для виведення на 2 символи більше.

// 165 - return the string
F=n=>
  (i=>{
    for(r='__'[R='repeat'](m=n);i<n;)
      r+=`\n`+' '[R](i)
       +('\\ '[R](t=-~(m>3?i:~-n/3))+' ').slice(0,n-i)
       +'__'[R](m>3?m-=3:0)
       +(' '+' /'[R](t)).slice(i++-n)
  })(0)||r


// 167 - output the string
A=n=>{
  for(i=0,r='__'[R='repeat'](m=n);i<n;)
    r+=`\n`+' '[R](i)
     +('\\ '[R](t=-~(m>3?i:~-n/3))+' ').slice(0,n-i)
     +'__'[R](m>3?m-=3:0)
     +(' '+' /'[R](t)).slice(i++-n);
  alert(r)
}

// TEST
out=x=>O.innerHTML += x+'\n' 

for(k=1;k<13;k++)out(k+'\n'+F(k))
<pre id=O></pre>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.