Cetak Gelombang Angka Segitiga

14

Diberikan amplitudo dan periode untuk gelombang, cetak gelombang. Lihat contoh output untuk lebih jelasnya. Jumlah total bentuk gelombang sama dengan periode, dan tinggi setiap gelombang sama dengan amplitudo. Amplitudo dan Periode kurang dari 10. Anda dapat mengabaikan spasi tambahan tetapi bukan spasi utama.

Sample Input
3 2

Sample Output
  3           3    
 232         232  
12321 12321 12321 12321
       232         232
        3           3  
fR0DDY
sumber
2
Ini lebih mirip segitiga daripada sinus.
JB
Saya pikir ini termasuk dalam ascii-artlabel. Tetapi bagian seni tidak cukup hadir, mungkin harus ada tag lain untuk grafis ascii?
Juan
Saya kira, maksud Anda "jumlah periode" dan bukan frekuensi. Frekuensi adalah (jumlah periode) / waktu, seperti RPM dalam mobil.
Dr. belisarius
@Juan, saya pikir orang yang mencari pertanyaan ascii-art mungkin tidak keberatan melihat yang satu ini termasuk dalam hasil
gnibbler
Apakah saya diizinkan memiliki spasi kosong di setiap baris? Akan menyelamatkan saya tiga karakter.
FUZxxl

Jawaban:

4

Dyalog APL, 43 40 byte

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

{⍉⊃⍪/⍺⍴⊂(⌽⍪⊢)n(1-n←2×⍵)↑↑⍴∘⍕¨⍨a,1↓⌽a←⍳⍵}( Terima kasih, Moris Zucca )

Ini adalah fungsi diadik dengan amplitudo sebagai argumen kanan ( ) dan periode sebagai argumen kiri ( ). Suatu program yang membaca input pengguna akan mengambil jumlah karakter yang sama.

Menggambar beberapa inspirasi dari jawaban Martin Bü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
ngn
sumber
Haha, dan saya sangat senang telah mengalahkan APL dengan selisih yang cukup besar untuk sekali. : D
Martin Ender
Saya tidak akan mencoba jika Anda belum :) Omong-omong, sepertinya jawaban Anda serta jawaban APL lainnya menghasilkan output yang salah. Menurut sampel, segitiga harus bertemu di garis tengah.
ngn
Oh, tangkapan bagus, diperbaiki!
Martin Ender
1
Anda dapat golf dengan 2 lebih: b⍴¨⍕¨b ← dapat ditulis ulang sebagai ⍴∘⍕¨⍴∘⍕ saya pikir. Jawaban bagus btw, saya sangat menyukainya!
Moris Zucca
Anda baik sekali! Aku baru saja menyadari saya juga dapat mempersingkat (n,1-n←2×⍵)ke n(1-n←2×⍵).
ngn
4

Python - 135 karakter

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

Versi ini dengan ruang terdepan adalah 132 karakter

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

Ini juga dapat menjadi jauh lebih singkat jika tidak diharuskan untuk membaca dari stdin atau bahkan jika input dipisahkan dengan koma

Untuk input yang dipisahkan koma, baris pertama menjadi

A,F=input();R=range
gnibbler
sumber
4

APL (77)

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

J, 87 karakter

Sebagai sebuah program:

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

berjalan seperti ini:

,.~^:(<: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 

Ini 5 karakter lagi jika kita membutuhkannya sebagai fungsi F:

3 F 2
  3           3         
 232         232        
12321 12321 12321 12321 
       232         232  
        3           3   
Eelvex
sumber
Saya ragu apakah itu dianggap mengambil argumen.
2

Haskell ( 226 225 222 220 214 214)

Percobaan saya di 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

Maaf teman-teman, (€)dioptimalkan jauh, dibutuhkan tiga byte untuk satu € sebagai lawan! yang hanya membutuhkan satu byte.
Ini adalah "Versi beta", yang tidak memenuhi spesifikasi:

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
FUZxxl
sumber
1
Operator EUR! Pertama kali saya temui :)
JB
1
Saya pikir bahwa € terlalu banyak diskriminasi dalam bahasa pemrograman. Dan karena saya sedang mencari operasi yang tidak digunakan, ini sangat berguna.
FUZxxl
4
Apa fungsinya? Apakah 1,35 * operator AS? :)
gnibbler
1

CJam, 45 byte

CJam jauh lebih muda dari tantangan ini, jadi jawaban ini tidak memenuhi syarat untuk tanda centang hijau (yang seharusnya diperbarui dengan jawaban APL marinus). Ini masih sedikit latihan yang menyenangkan.

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

Uji di sini.

Idenya adalah untuk menghasilkan setengah periode secara vertikal , seperti:

  1  
 22  
333  
 22  
  1  

(Ditambah baris kosong berikutnya yang ditelan SE). Ini kemudian digandakan, setiap baris dibalik, dan paruh kedua periode ditambahkan. Kemudian seluruh hal diulangi dengan jumlah periode, dan akhirnya grid ditransposisikan untuk mengarahkan gelombang sepanjang horizontal.

Martin Ender
sumber