ASCII треугольник пульсации


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 Hexagons , я не уверен, что это добавляет много по сравнению с другими.
Geobits

4
@Geobits ИМО достаточно отличается - входная спецификация совершенно иная, метод определения количества различных фигур для рисования и треугольников! = Шестиугольники ;-)
Digital Trauma

@WooiKent Теперь я сомневаюсь, правильно ли я понял вопрос. Что такое пульсация? Это один концентрический набор треугольников или что-то еще?
Цифровая травма

2
Хороший вопрос, но он не указан. (1) Читая текст буквально, когда ввод 1,2 или 3, мы всегда должны вывести три треугольника. (2) Я бы воспринял как данность, что каждый набор треугольников должен быть концентрическим, и (3) кажется, что они также должны иметь свои нижние углы на одной линии. (4) Должно ли горизонтальное разделение составлять ровно один интервал, как показано, или допускается другое разделение? (5) Допускается ли ненужный пробел в (a, b, c, d) слева, справа, сверху, снизу?
Уровень Река St

Я думаю, что это довольно ясно, хотя и не явно. Вы всегда рисуете один треугольник заданного размера с вложенными треугольниками размера 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флагом, сохраняя #маркеры. При желании вы можете изменить #символы на новые строки в выходных данных. Например:

> 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операторы на троичные операторы. Конечно, это становится трудно читать таким образом, но полностью в духе этого сайта писать некрасивый код, если он короче. :)
Рето Коради

Спасибо @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.