数字の三角波を印刷


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と同じです。
ベリサリウス博士11

@Juan、アスキーアートの質問を検索する人は、おそらくこれが結果に含まれているのを見て気にしないと思います
ニブラー

各行に先頭に空白を入れることはできますか?3文字節約できます。
-FUZxxl

回答:


4

Dyalog APL、43 40バイト

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

{⍉⊃⍪/⍺⍴⊂(⌽⍪⊢)n(1-n←2×⍵)↑↑⍴∘⍕¨⍨a,1↓⌽a←⍳⍵}ありがとう、モリス・ズッカ

これは、右引数()としての振幅と左引数()としての周期を持つ二項関数です。ユーザー入力を読み取るプログラムは、同じ文字数を取ります。

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←はb¨beと書き直すことができます。素晴らしい答えです、私はそれがとても好きです!
モリスズッカ

貴方のご親切に感謝します!に短縮(n,1-n←2×⍵)することもできn(1-n←2×⍵)ます。
ngn

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

ハスケル(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

申し訳ありませんが、(€)最適化されていないため、1€で3バイトかかります。それぞれ1バイトしか必要としません。
これが仕様を満たさない「ベータ版」です。

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
プログラミング言語では€はあまりにも差別されていると思いました。そして、未使用のopを探していたので、これは非常に便利でした。
FUZxxl

4
それは何をするためのものか?1.35 *米国のオペレーターですか?:)
ニブラー


1

CJam、45バイト

CJamはこのチャレンジよりもずっと若いので、この回答は緑色のチェックマークの対象ではありません(ただし、マリナスのAPLの回答に更新する必要があります)。しかし、これはまだ楽しい小さな運動でした。

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

ここでテストしてください。

アイデアは、次のように半周期を垂直に生成することです:

  1  
 22  
333  
 22  
  1  

(さらに、SEが飲み込む次の空の行)。これが複製され、各行が反転され、ピリオドの後半が追加されます。その後、周期の数だけ全体が繰り返され、最終的にグリッドが転置されて、波が水平に沿って方向付けられます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.