Imprimir triángulo Ola de números

14

Dada la amplitud y el período de una onda, imprima la onda. Ver salida de muestra para más detalles. El número total de formas de onda es igual al período, y la altura de cada onda es igual a la amplitud. La amplitud y el período son inferiores a 10. Puede ignorar los espacios finales pero no los espacios iniciales.

Sample Input
3 2

Sample Output
  3           3    
 232         232  
12321 12321 12321 12321
       232         232
        3           3  
fR0DDY
fuente
2
Esto se parece más a triángulos que a senos.
JB
Estoy pensando que esto cae bajo la ascii-artetiqueta. Pero la parte del arte no está del todo presente, ¿tal vez debería haber otra etiqueta para los gráficos ascii?
Juan
Supongo que quieres decir "número de períodos" y no frecuencia. La frecuencia es (número de períodos) / tiempo, como las RPM en los automóviles.
Dr. belisarius
@Juan, creo que la gente en busca de preguntas del arte ASCII, probablemente no le importaría ver éste incluido en los resultados
gnibbler
¿Se me permite tener espacios en blanco iniciales en cada línea? Me ahorraría tres caracteres.
FUZxxl

Respuestas:

4

Dyalog APL, 43 40 bytes

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

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

Esta es una función diádica con la amplitud como argumento derecho ( ) y el punto como argumento izquierdo ( ). Un programa que lee la entrada del usuario tomaría la misma cantidad de caracteres.

Inspirándose en la respuesta de Martin Büttner en 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
fuente
Jaja, y estaba tan feliz de haber vencido a APL por un margen considerable por una vez. : D
Martin Ender
No lo habría intentado si no lo hubiera hecho :) Por cierto, parece que su respuesta, así como la otra respuesta APL, están produciendo resultados incorrectos. Según la muestra, los triángulos deben encontrarse en la línea central.
ngn
Oh, buena captura, arreglado!
Martin Ender
1
Puedes jugar golf por 2 más: b⍴¨⍕¨b ← puede reescribirse como ⍴∘⍕¨⍨, creo. Gran respuesta por cierto, me gusta mucho!
Moris Zucca
¡Es muy amable por tu parte! Me acabo de dar cuenta que también se puede acortar (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 versión con un espacio inicial es de 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

También puede ser considerablemente más corto si no es necesario leer desde stdin o incluso si la entrada está separada por comas

Para la entrada separada por comas, la primera línea se convierte en

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

APL (77)

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

J, 87 caracteres

Como un programa:

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

funciona así:

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

Son 5 caracteres más si lo necesitamos como función F:

3 F 2
  3           3         
 232         232        
12321 12321 12321 12321 
       232         232  
        3           3   
Eelvex
fuente
Dudo si eso cuenta como tomar argumentos.
2

Haskell ( 226 225 222 220 214)

Mi intento en 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

Lo siento chicos, (€)está optimizado, ¡se necesitan tres bytes por un € en lugar de! que solo toma un byte cada uno.
Aquí hay una "versión beta" que no satisface las especificaciones:

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
fuente
1
El operador EUR! Primera vez que lo encuentro :)
JB
1
Pensé que € se discrimina demasiado en los lenguajes de programación. Y debido a que estaba buscando una operación sin usar, esto fue muy útil.
FUZxxl
44
¿Qué hace? ¿Es 1.35 * el operador de EE. UU.? :)
gnibbler
1

CJam, 45 bytes

CJam es mucho más joven que este desafío, por lo que esta respuesta no es elegible para la marca de verificación verde (que por cierto debería actualizarse a la respuesta APL de marinus). Sin embargo, este fue un pequeño ejercicio divertido.

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

Pruébalo aquí.

La idea es generar medio período verticalmente , así:

  1  
 22  
333  
 22  
  1  

(Además de la siguiente fila vacía que SE traga). Esto luego se duplica, cada fila se invierte y se agrega la segunda mitad del período. Luego, todo se repite por el número de períodos, y finalmente la cuadrícula se transpone para orientar la onda a lo largo de la horizontal.

Martin Ender
fuente