Imprimer Triangle Wave of Numbers

14

Étant donné l'amplitude et la période d'une onde, imprimez l'onde. Voir l'exemple de sortie pour plus de détails. Le nombre total de formes d'onde est égal à la période et la hauteur de chaque vague est égale à l'amplitude. L'amplitude et la période sont inférieures à 10. Vous pouvez ignorer les espaces de fin mais pas les espaces de tête.

Sample Input
3 2

Sample Output
  3           3    
 232         232  
12321 12321 12321 12321
       232         232
        3           3  
fR0DDY
la source
2
Cela ressemble plus à des triangles qu'à des sinus.
JB
Je pense que cela tombe sous le ascii-arttag. Mais la partie artistique n'est pas tout à fait présente, peut-être qu'il devrait y avoir une autre balise pour les graphiques ascii?
Juan
Je suppose que vous voulez dire "nombre de périodes" et non fréquence. La fréquence est (nombre de périodes) / temps, comme le RPM dans les voitures.
Dr belisarius
@Juan, je pense que les gens qui recherchent des questions d'ascii-art ne verraient probablement pas d'inconvénient à voir celui-ci inclus dans les résultats
gnibbler
Suis-je autorisé à avoir un espace de tête dans chaque ligne? Me sauverait trois caractères.
FUZxxl

Réponses:

4

Dyalog APL, 43 40 octets

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

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

Il s'agit d'une fonction dyadique avec l'amplitude comme argument de droite ( ) et la période comme argument de gauche ( ). Un programme qui lit les entrées utilisateur prendrait le même nombre de caractères.

S'inspirant de la réponse CJam de Martin Büttner :

{⍉⊃⍪/⍺⍴⊂(⌽⍪⊢)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
la source
Haha, et j'étais tellement heureux d'avoir battu APL par une marge considérable pour une fois. : D
Martin Ender
Je n'aurais pas essayé si vous ne l'aviez pas fait :) En passant, il semble que votre réponse ainsi que l'autre réponse APL produisent une sortie incorrecte. Selon l'échantillon, les triangles devraient se rencontrer sur la ligne centrale.
2015
Oh, bonne prise, réparée!
Martin Ender
1
Vous pouvez jouer au golf par 2 autres: b⍴¨⍕¨b ← peut être réécrit comme ⍴∘⍕¨⍨ je pense. Super réponse btw, je l'aime beaucoup!
Moris Zucca
C'est très gentil de votre part! Je viens juste de réaliser que je peux aussi raccourcir (n,1-n←2×⍵)à n(1-n←2×⍵).
2015
4

Python - 135 caractères

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

Cette version avec un espace de tête est de 132 caractères

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

Il peut également être considérablement plus court s'il n'est pas nécessaire de lire depuis stdin ou même si l'entrée est séparée par des virgules

Pour une entrée séparée par des virgules, la première ligne devient

A,F=input();R=range
grignoteur
la source
4

APL (77)

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

J, 87 caractères

En tant que programme:

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

fonctionne comme ceci:

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

C'est 5 caractères de plus si nous en avons besoin en fonction F:

3 F 2
  3           3         
 232         232        
12321 12321 12321 12321 
       232         232  
        3           3   
Eelvex
la source
Je doute que cela compte pour des arguments.
2

Haskell ( 226 225 222 220 214)

Mon essai à 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

Désolé les gars, (€)est optimisé, cela prend trois octets pour un € au lieu de! qui ne prend qu'un octet chacun.
Voici une "version beta", qui ne satisfait pas aux spécifications:

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
la source
1
L'opérateur EUR! Première fois que je le rencontre :)
JB
1
Je pensais que € était trop discriminé dans les langages de programmation. Et parce que je cherchais un op inutilisé, cela m'a été très utile.
FUZxxl
4
Qu'est ce que ça fait? Est-ce 1,35 * l'opérateur américain? :)
gnibbler
1

CJam, 45 octets

CJam est beaucoup plus jeune que ce défi, donc cette réponse n'est pas éligible pour la coche verte (qui devrait être mise à jour pour la réponse APL de marinus). C'était quand même un petit exercice amusant.

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

Testez-le ici.

L'idée est de générer une demi-période verticalement , comme ceci:

  1  
 22  
333  
 22  
  1  

(Plus la ligne vide suivante que SE avale). Ceci est ensuite dupliqué, chaque ligne est inversée et la seconde moitié de la période est ajoutée. Ensuite, le tout est répété par le nombre de périodes, et finalement la grille est transposée pour orienter l'onde le long de l'horizontale.

Martin Ender
la source