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  

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

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

4

APL (77)

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

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   

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.