Печать треугольника Волна чисел


14

Учитывая амплитуду и период для волны, выведите волну. Смотрите пример выходных данных для более подробной информации. Общее количество волновых форм равно периоду, а высота каждой волны равна амплитуде. Амплитуда и период меньше 10. Вы можете игнорировать конечные пробелы, но не начальные пробелы.

Sample Input
3 2

Sample Output
  3           3    
 232         232  
12321 12321 12321 12321
       232         232
        3           3  

2
Это больше похоже на треугольники, чем на синусы.
JB

Я думаю, что это подпадает под ascii-artтег. Но художественная часть не совсем присутствует, может быть, должен быть еще один тег для графики ascii?
Хуан

Я думаю, вы имеете в виду «количество периодов», а не частота. Частота (количество периодов) / время, как обороты в автомобилях.
д-р Велизарий

@Juan, я думаю, что люди, ищущие вопросы ascii-art, вероятно, не возражают против того, чтобы этот вопрос был включен в результаты
gnibbler

Могу ли я иметь начальные пробелы в каждой строке? Спас бы меня три символа.
FUZxxl

Ответы:


4

Dyalog APL, 43 40 байт

{⍉⊃⍪/⍺⍴⊂(⌽⍪⊢)(n,1-n←2×⍵)↑↑b⍴¨⍕¨b←a,1↓⌽a←⍳⍵}

{⍉⊃⍪/⍺⍴⊂(⌽⍪⊢)n(1-n←2×⍵)↑↑⍴∘⍕¨⍨a,1↓⌽a←⍳⍵}( Спасибо, Морис Зукка )

Это диадическая функция с амплитудой в качестве правого аргумента ( ) и точкой в ​​качестве левого аргумента ( ). Программа, которая читает пользовательский ввод, будет иметь такое же количество символов.

Черпая вдохновение из ответа CJam Мартина Бюттнера :

{⍉⊃⍪/⍺⍴⊂(⌽⍪⊢)n(1-n←2×⍵)↑↑⍴∘⍕¨⍨a,1↓⌽a←⍳⍵}
                                   a←⍳⍵ ⍝ numbers 1 2 3, call them "a"
                                  ⌽     ⍝ reverse them: 3 2 1
                                1↓      ⍝ drop one: 2 1
                              a,        ⍝ prepend "a": 1 2 3 2 1
                         ⍴∘⍕¨⍨          ⍝ format a[i] and repeat it a[i] times:
                                        ⍝     (,'1') '22' '333' '22' (,'1')
                        ↑               ⍝ mix, i.e. obtain a character matrix:
                                        ⍝    ┌───┐
                                        ⍝    │1  │
                                        ⍝    │22 │
                                        ⍝    │333│
                                        ⍝    │22 │
                                        ⍝    │1  │
                                        ⍝    └───┘
             n(1-n←2×⍵)↑                ⍝ take a 2×⍵ by 1-2×⍵ matrix
                                        ⍝ (negative length extends backwards):
                                        ⍝    ┌─────┐
                                        ⍝    │  1  │
                                        ⍝    │  22 │
                                        ⍝    │  333│
                                        ⍝    │  22 │
                                        ⍝    │  1  │
                                        ⍝    │     │
                                        ⍝    └─────┘
        (⌽⍪⊢)                           ⍝ the reverse of it, vertically joined with it
                                        ⍝    ┌─────┐
                                        ⍝    │  1  │
                                        ⍝    │ 22  │
                                        ⍝    │333  │
                                        ⍝    │ 22  │
                                        ⍝    │  1  │
                                        ⍝    │     │
                                        ⍝    │  1  │
                                        ⍝    │  22 │
                                        ⍝    │  333│
                                        ⍝    │  22 │
                                        ⍝    │  1  │
                                        ⍝    │     │
                                        ⍝    └─────┘
     ⍺⍴⊂                                ⍝ take ⍺ copies
  ⊃⍪/                                   ⍝ join them vertically
 ⍉                                      ⍝ transpose

Ха-ха, и я был так счастлив, что побил APL со значительным отрывом за один раз. : D
Мартин Эндер

Я бы не стал пробовать, если бы вы этого не сделали :) Кстати, похоже, что ваш ответ, а также ответ другого APL дают неправильный вывод. Согласно выборке, треугольники должны встречаться на центральной линии.
нг

О, хороший улов, исправлено!
Мартин Эндер

1
Вы можете сыграть в гольф еще на 2: b⍴¨⍕¨b ← можно переписать как ⍴∘⍕¨⍨ Я думаю. Отличный ответ, кстати, мне это очень нравится!
Морис Зукка

Очень мило с Вашей стороны! Я просто понял , что я также может сократить (n,1-n←2×⍵)до n(1-n←2×⍵).
НГН

4

Питон - 135 символов

A,F=map(int,raw_input().split());R=range
for y in R(-A+1,A):print"".join((" %s"%x)[-x<s*y<1]for s in(1,-1)for x in R(1,A)+R(A,-1,-1))*F

Эта версия с ведущим пробелом 132 символа

A,F=map(int,raw_input().split());R=range
for y in R(-A+1,A):print"".join((" %s"%x)[-x<s*y<1]for s in(1,-1)for x in R(A)+R(A,0,-1))*F

Он также может быть значительно короче, если не требуется читать со стандартного ввода или даже если ввод разделен запятой

Для ввода через запятую первая строка становится

A,F=input();R=range

4

APL (77)

,/{×⍎⍵:⍵⋄' '}¨¨⊃∘↑∘⍕¨¨K⍴⊂(⊖M),⍨M←(2⍴N+N-1)↑(0 1↓M),⍨⌽M←(⌽⊖/¨M)×≥/¨M←⍳2⍴⊃N K←⎕

3

J, 87 знаков

Как программа:

b=:]\@(]#~' '~:])(":@:>:@i.@-)
,.~^:(<:Y)(,.|.)@(' ',.~((<:({."1|."1)b),.b),' '$~2<:])X
        Y                                              X

работает так:

,.~^:(<:2)(,.|.)@(' ',.~((<:({."1|."1)b),.b),' '$~2#<:) 3
  3           3         
 232         232        
12321 12321 12321 12321 
       232         232  
        3           3   
,.~^:(<:4)(,.|.)@(' ',.~((<:({."1|."1)b),.b),' '$~2#<:) 2
 2       2       2       2       2       2       2       2      
121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 121 
     2       2       2       2       2       2       2       2 

Это еще 5 символов, если нам нужно это как функция F:

3 F 2
  3           3         
 232         232        
12321 12321 12321 12321 
       232         232  
        3           3   

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

2

Haskell ( 226 225 222 220 214)

Моя попытка в Хаскеле:

import List
n!k|n>k=p:n!(k+1)++[p]|0<1=[p]where p=(n-1)?" "++k?show k++(n-k)?" ">>=id
f[n,k]=k?(n!1++(2*n-1)?' ':map reverse(n!1)++[(2*n-1)?' '])>>=id
main=interact$unlines.transpose.f.map read.words
(?)=replicate

Извините, ребята, (€)оптимизирован, он занимает три байта за одно €, в отличие от! который занимает только один байт каждый.
Вот «бета-версия», которая не удовлетворяет спецификации:

import List

-- Creates a single wave of numbers. k should be equal to 1
-- and is used for internal stuff,
wave n k|n==k=[peek]
        |otherwise = peek:wave n(k+1)++[peek] where
  peek=replicate(n-1)" "++replicate k(show k)++replicate(n-k)" ">>=id

-- Creates a full wave
-- k: number of waves, n: size of waves
fullWave[n,k]=unlines.transpose.concat.replicate k$wave n 1++map reverse(wave n 1)

main=interact$fullWave.map read.words

1
Оператор EUR! Впервые с этим сталкиваюсь :)
JB

1
Я думал, что € слишком сильно различается в языках программирования. И поскольку я искал неиспользованную операционную систему, это оказалось очень полезным.
FUZxxl

4
Что оно делает? Это 1.35 * оператор США? :)
gnibbler


1

CJam, 45 байтов

CJam намного моложе этой задачи, поэтому этот ответ не имеет права на зеленую галочку (которая, между прочим, должна быть обновлена ​​до ответа APL от marinus). Это было все еще маленькое забавное упражнение.

r~:I2*,{)IS*I@I\-z-_a*+I~)>I(S*+}%_Wf%+r~*zN*

Проверьте это здесь.

Идея состоит в том, чтобы генерировать половину периода по вертикали , вот так:

  1  
 22  
333  
 22  
  1  

(Плюс следующая пустая строка, которую проглатывает SE). Затем это дублируется, каждая строка переворачивается, и вторая половина периода добавляется. Затем все это повторяется числом периодов, и в конечном итоге сетка перемещается так, чтобы ориентировать волну по горизонтали.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.