打印数字三角波


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图形添加另一个标签?
胡安

我想,您的意思是“周期数”,而不是频率。频率是(周期数)/时间,例如汽车的RPM。
belisarius博士2011年

@Juan,我认为正在搜寻ascii美术问题的人们可能不会介意将这一问题包含在结果中
gnibbler 2011年

我可以在每行中使用前导空格吗?将为我节省三个字符。
FUZxxl 2011年

Answers:


4

Dyalog APL,43个 40字节

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

{⍉⊃⍪/⍺⍴⊂(⌽⍪⊢)n(1-n←2×⍵)↑↑⍴∘⍕¨⍨a,1↓⌽a←⍳⍵}谢谢,莫里斯·祖卡Moris Zucca))

这是一个二元函数,振幅为右自变量(),周期为左自变量()。读取用户输入的程序将使用相同数量的字符。

MartinBüttner的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答案似乎都产生了错误的输出。根据样本,三角形应在中心线相交。
ngn

哦,好,固定!
马丁·恩德

1
您可以再打2个球:b⍴¨⍕b←可以改写为⍴∘⍕¨⍨。很好的回答,我非常喜欢!
莫里斯·祖卡

谢谢您的好意!我刚刚意识到我也可以缩短(n,1-n←2×⍵)n(1-n←2×⍵)
ngn 2015年

4

Python-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

如果不需要从stdin读取,或者即使输入是逗号分隔,它也可以大大缩短

对于逗号分隔的输入,第一行变为

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 

如果我们需要它作为函数F,则还有5个字符:

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

我怀疑这是否算是争论。

2

Haskell的(226 225 222 220 214)

我在Haskell的尝试:

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

抱歉,我们(€)已经过优化,一欧元需要3个字节,而不是!每个仅占用一个字节。
这是不符合规格的“测试版”:

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
欧元运营商!我第一次遇到它:)
JB

1
我认为在编程语言中€太多被歧视了。由于我正在寻找未使用的操作,因此非常方便。
FUZxxl 2011年

4
它有什么作用?是1.35 *美国运营商吗?:)
ni


1

CJam,45个字节

CJam比这个挑战要年轻得多,因此该答案不符合绿色复选标记的要求(应该将其更新为marinus的APL答案)。但是,这仍然是一个有趣的小练习。

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

在这里测试。

这个想法是垂直产生半个周期,像这样:

  1  
 22  
333  
 22  
  1  

(加上SE吞下的下一个空行)。然后将其复制,将每一行反转,并在句号的后半部分附加。然后,整个事物被重复一定数量的周期,最终网格被移置以沿水平方向定向波。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.