Stampa Triangle Wave of Numbers


14

Data l'ampiezza e il periodo di un'onda, stampare l'onda. Vedi l'output di esempio per maggiori dettagli. Il numero totale di forme d'onda è uguale al periodo e l'altezza di ciascuna onda è uguale all'ampiezza. L'ampiezza e il periodo sono inferiori a 10. È possibile ignorare gli spazi finali ma non gli spazi iniziali.

Sample Input
3 2

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

2
Sembra più un triangolo che un seno.
JB,

Sto pensando che questo rientri nel ascii-arttag. Ma la parte artistica non è del tutto presente, forse ci dovrebbe essere un altro tag per la grafica ASCII?
Juan,

Immagino, intendi "numero di periodi" e non frequenza. La frequenza è (numero di periodi) / tempo, come RPM in auto.
Dr. belisarius,

@Juan, penso che le persone alla ricerca di domande sull'arte ascii probabilmente non dispiaceranno vedere questo incluso nei risultati
gnibbler,

Sono autorizzato ad avere spazi bianchi iniziali in ogni riga? Mi risparmierebbe tre caratteri.
FUZxxl,

Risposte:


4

Dyalog APL, 43 40 byte

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

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

Questa è una funzione diadica con l'ampiezza come argomento destro ( ) e il periodo come argomento sinistro ( ). Un programma che legge l'input dell'utente richiederebbe lo stesso numero di caratteri.

Traendo ispirazione dalla risposta CJam di 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, ed ero così felice di aver battuto APL con un margine considerevole per una volta. : D
Martin Ender,

Non avrei provato se non l'avessi fatto :) A proposito, sembra che la tua risposta e l'altra risposta APL stiano producendo risultati errati. Secondo il campione, i triangoli dovrebbero incontrarsi sulla linea centrale.
ngn,

Oh, buona cattura, risolto!
Martin Ender,

1
Puoi giocare a golf con altri 2: b⍴¨⍕¨b ← può essere riscritto come ⍴∘⍕¨⍨ credo. Ottima risposta tra l'altro, mi piace molto!
Moris Zucca,

È molto gentile da parte tua! Ho appena realizzato che posso anche ridurre (n,1-n←2×⍵)a n(1-n←2×⍵).
ngn

4

Python - 135 caratteri

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

Questa versione con uno spazio iniziale è di 132 caratteri

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

Può anche essere notevolmente più breve se non è necessario leggere da stdin o anche se l'input è separato da virgola

Per l'input separato da virgola, la prima riga diventa

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 caratteri

Come programma:

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

funziona così:

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

Sono altri 5 caratteri se ne abbiamo bisogno come funzione F:

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

Sono dubbioso sul fatto che ciò valga come prendere argomenti.

2

Haskell ( 226 225 222 220 214)

Il mio tentativo in 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

Scusate ragazzi, (€)è ottimizzato, ci vogliono tre byte per un € invece di! che richiede solo un byte ciascuno.
Ecco una "versione beta", che non soddisfa le specifiche:

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
L'operatore EUR! La prima volta che lo incontro :)
JB,

1
Pensavo che € fosse troppo discriminato nei linguaggi di programmazione. E poiché stavo cercando un'opera inutilizzata, questo mi è stato molto utile.
FUZxxl,

4
Che cosa fa? È 1,35 * l'operatore statunitense? :)
Gnibbler,


1

CJam, 45 byte

CJam è molto più giovane di questa sfida, quindi questa risposta non è ammissibile per il segno di spunta verde (che dovrebbe essere aggiornato alla risposta APL di Marinus). Questo è stato comunque un piccolo esercizio divertente.

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

Provalo qui.

L'idea è di generare mezzo periodo in verticale , in questo modo:

  1  
 22  
333  
 22  
  1  

(Più la riga vuota successiva che ingoia SE). Questo poi duplicato, ogni riga viene invertita e viene aggiunta la seconda metà del periodo. Quindi l'intera cosa viene ripetuta dal numero di periodi e alla fine la griglia viene trasposta per orientare l'onda lungo l'orizzontale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.