Imprimir triângulo onda de números


14

Dada a amplitude e o período de uma onda, imprima a onda. Veja exemplo de saída para mais detalhes. O número total de formas de onda é igual ao período e a altura de cada onda é igual à amplitude. Amplitude e Período são menores que 10. Você pode ignorar os espaços finais, mas não os espaços iniciais.

Sample Input
3 2

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

2
Parece mais triângulos que senos.
JB

Eu estou pensando que isso se enquadra na ascii-artetiqueta. Mas a parte da arte não está muito presente, talvez deva haver outra tag para gráficos ascii?
Juan

Eu acho que você quer dizer "número de períodos" e não frequência. A frequência é (número de períodos) / tempo, como RPM nos carros.
Dr. belisarius

@Juan, eu acho que as pessoas à procura de perguntas ascii-art provavelmente não me importaria de ver este incluído nos resultados
gnibbler

Posso ter espaços em branco à esquerda em cada linha? Isso me salvaria três caracteres.
FUZxxl

Respostas:


4

Dyalog APL, 43 40 bytes

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

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

Essa é uma função diádica com a amplitude como argumento correto ( ) e o período como argumento esquerdo ( ). Um programa que lê a entrada do usuário terá o mesmo número de caracteres.

Inspirando-se na resposta 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

Haha, e eu fiquei muito feliz por ter vencido a APL por uma margem considerável pela primeira vez. : D
Martin Ender

Eu não teria tentado se você não tivesse :) A propósito, parece que sua resposta e a outra resposta da APL estão produzindo resultados errados. De acordo com a amostra, os triângulos devem se encontrar na linha central.
NGN

Oh, boa captura, consertada!
Martin Ender

1
Você pode jogar mais 2 vezes: b⍴¨⍕¨b ← pode ser reescrito como ⍨¨⍨ eu acho. Ótima resposta btw, eu gosto muito!
Moris Zucca

É muita gentileza da sua parte! Eu só percebi que eu também pode encurtar (n,1-n←2×⍵)a n(1-n←2×⍵).
NGN

4

Python - 135 caracteres

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

Esta versão com um espaço à frente tem 132 caracteres

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

Também pode ser consideravelmente mais curto se não for necessário ler a partir de stdin ou mesmo se a entrada for separada por vírgula

Para entrada separada por vírgula, a primeira linha se torna

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 caracteres

Como um programa:

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

corre assim:

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

São mais 5 caracteres se precisarmos como uma função F:

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

Estou em dúvida se isso conta como argumento.

2

Haskell ( 226 225 222 220 214)

Minha tentativa em 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

Desculpe pessoal, (€)é otimizado, leva três bytes por um € em vez de! que leva apenas um byte cada.
Aqui está uma "versão beta", que não satisfaz as especificações:

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
O operador EUR! Primeira vez que eu encontrá-lo :)
JB

1
Eu pensei que € é discriminado demais nas linguagens de programação. E como eu estava procurando por uma operação não utilizada, isso foi muito útil.
FUZxxl

4
O que isso faz? É 1,35 * o operador dos EUA? :)
gnibbler


1

CJam, 45 bytes

O CJam é muito mais novo que esse desafio, portanto, essa resposta não é elegível para a marca de seleção verde (que deve ser atualizada para a resposta da APL de marinus). Este ainda era um pequeno exercício divertido.

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

Teste aqui.

A idéia é gerar meio período verticalmente , assim:

  1  
 22  
333  
 22  
  1  

(Mais a próxima linha vazia que SE engole). Isso então é duplicado, cada linha é revertida e a segunda metade do período é anexada. Então, a coisa toda é repetida pelo número de períodos e, finalmente, a grade é transposta para orientar a onda ao longo da horizontal.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.