Напечатать равносторонний треугольник на языке J - PullRequest
2 голосов
/ 25 января 2020

Я пытаюсь напечатать равносторонний треугольник на экране консоли. это то, что я мог найти

]\ 'hello' NB. which prints
h
he
hel
hell
hello

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Первое решение, которое я придумала, это:

   eq=. ('b< >' 8!:2 (] ,.~ |.@}."1)@:([: >:/~ i.)) 
   eq 5
    1    
   111   
  11111  
 1111111 
111111111
   eq 10
         1         
        111        
       11111       
      1111111      
     111111111     
    11111111111    
   1111111111111   
  111111111111111  
 11111111111111111 
1111111111111111111

eq - это глагол, который сначала берет аргумент и создает матрицу с левым нижним из 1, используя ([: >:/~ i.), это затем подается на (] ,.~ |.@}."1), который отбрасывает первый символ каждой строки, а затем переворачивает перед добавлением к исходной матрице. Наконец, чтобы избавиться от уродливых 0, я использую внешнее соединение 8!:2, которое форматирует двоичный массив в символы, а левый аргумент 'b< >' указывает, что 0 будут заменены пробелами.

Второе решение:

   eq2=: ([ ,.~ |.@}."1)@:(]\) 
   eq2 'hello'
    h    
   ehe   
  lehel  
 llehell 
ollehello
   eq2 '*******'
      *      
     ***     
    *****    
   *******   
  *********  
 *********** 
*************

eq2 работает так же, за исключением того, что изначально использует ]\, что означает, что формат внешнего соединения не требуется, поскольку результат передается ([ ,.~ |.@}."1) уже в символьной форме.

1 голос
/ 09 февраля 2020

Продолжая от вашего] \, который составляет матрицу символов, вы хотите поставить обратную (|.) Каждой строки, соединенную (,) самой строкой с первым пропущенным символом (}.). Вы хотите делать это построчно, а не для всей матрицы сразу, что задается как «1.

» Другими словами: (обратное падение), ранг 1 или в J: (|. ,}.) "1

(|. , }.)"1 ]\ 'Helloooo'
       H       
      eHe      
     leHel     
    lleHell    
   olleHello   
  oolleHelloo  
 ooolleHellooo 
oooolleHelloooo
...