Zilustruj rytmy muzyki


24

Wiesz - wyglądają tak:

źródło

Celem jest narysowanie ilustracji beatów muzycznych w następujący sposób:

=     =      =
=  =  =      =          =
== = ==   =  ==     = ====
== ====  == ===   = = =======
======== == ====  = ========= =
=================================

Reguły są następujące:

  • Szerokość ilustracji wynosi 33 symbole, ale jeśli potrzebujesz - dozwolone są wszelkie spacje końcowe przekraczające tę szerokość.
  • Każda kolumna składa się ze znaków równości ( =).
  • Każda kolumna ma losową wysokość (wysokość następnej kolumny nie powinna w żaden sposób zależeć od wysokości poprzedniej kolumny), od 1 do 6. Jest również w porządku, jeśli przynajmniej możliwe jest uzyskanie danych wejściowych bez ścisłego prawdopodobieństwo matematyczne (tzn. niektóre dane wejściowe mogą pojawiać się rzadziej niż inne).
  • Kolumna nie może unosić się nad dnem i mieć w niej luki.
  • Ponieważ każda kolumna ma minimalną wysokość 1, ostatni rząd również nie może mieć żadnych przerw - zawsze składa się z 33 znaków równości.
  • Ponieważ nie można mieć żadnych kolumn o wysokości 6 (w końcu wszystko jest losowe): w tym przypadku nie trzeba mieć górnej linii ze spacjami. Ma zastosowanie do wszystkich przypadków krawędzi tego rodzaju: jeśli nagle twój kod nie podał żadnych kolumn o wysokości większej niż 1, nie musisz mieć dodatkowych linii składających się ze spacji powyżej dolnej linii.
  • Nie bierzesz żadnych danych wejściowych .

@ Lynn Och, pierwotnie to określił, ale przypadkowo usunąłem go z postu.
nicael

11
(Nitpicking) To wydaje mi się w danym momencie spektrogramem, a nie reprezentacją jakichkolwiek uderzeń
Luis Mendo,

2
Czy kolumny mogą być oddzielone spacjami? (tj. dolny wiersz byłby = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =)
LegionMammal978,

2
Czy mogę mieć dodatkowe linie powyżej wyjścia?
John Dvorak,

1
„wysokość następnej kolumny nie powinna w żaden sposób zależeć od wysokości poprzedniej kolumny” - wbudowane są generatory liczb losowych w większości języków. Z tego powodu funkcję podobną Math.random()można obliczyć bezpośrednio z jej poprzedniego wywołania, jeśli znane są parametry liniowego generatora kongruencjalnego, co oznacza, że ​​musisz zmodyfikować większość wbudowanych funkcji losowych, aby spełnić te kryteria. Sugeruję, żeby to było lepiej sformułowane.
Patrick Roberts,

Odpowiedzi:



13

Dyalog APL , 14 bajtów

⊖⍉↑'='⍴¨⍨?33⍴6

Wyjaśnienie

33⍴6 33 powtórzenia z 6

?losowa liczba całkowita w zakresie [1, n ] dla każdej z 33 6s

'='⍴¨⍨ symbol równości powtarzany za każdym razem tyle razy

konwertuj listę list do tabeli wierszy

transponuj wiersze do kolumn, kolumny do wierszy

odwróć do góry nogami

Przykład działa

Wejście jest wcięte sześć spacji:

      ⊖⍉↑'='⍴¨⍨?33⍴6
=          ==        =      ==   
= =    =   ==      ====     ==   
= = = ===  ==  === ==== =  ===  =
= = ===== ==== === ==== = ====  =
=== ============== ==== ====== ==
=================================
      ⊖⍉↑'='⍴¨⍨?33⍴6
         =  =  =    =    =       
  =      =  =  ==  == == =  =    
 === == ==  =  === =======  =    
==== == ==  ====== ==========   =
==== ============= ========== = =
=================================
      ⊖⍉↑'='⍴¨⍨?33⍴6
             =    =   =  =       
         =   =    =   = == =     
=      = =   =    ==  = ==== === 
= = =  = =   =    ==  = ==== ====
=====  = == ==  ============ ====
=================================

9

Galaretka, 14 bajtów

6x33X€”=ẋz⁶Ṛj⁷

Wypróbuj tutaj.


11
Och, to nie może być prawda. Galaretka musi być z definicji krótsza niż APL.
Adám,

To nie jest bardzo wydajne, ale 6ṗ33Xdziała również.
Dennis

9

JavaScript (ES6), 116 bajtów

(a=Array(33).fill``.map(_=>[,,,,,,].fill` `.fill('=',Math.random()*6)))[0].map((x,i)=>a.map(x=>x[i]).join``).join`
`

Podgląd fragmentu

Sprawdź to w animowanym fragmencie poniżej:

F = () => (a=Array(33).fill``.map(_=>[,,,,,,].fill` `.fill('=',Math.random()*6)))[0].map((x,i)=>a.map(x=>x[i]).join``).join`
`

var interval;
G = () => output.innerHTML = F().split('\n').map((r, i) => `<span id="row-${6-i}">${r}</span>`).join('\n');
A = () => {
  clearInterval(interval);
  if (auto.checked) {
    speed.disabled = false;
    interval = setInterval(G, speed.value);
  } else {
    speed.disabled = true;
  }
}
S = () => {
  if (stylized.checked) {
    output.classList.add('stylized');
  } else {
    output.classList.remove('stylized');
  }
}

generate.onclick = G;
auto.onchange = speed.onchange = A;
stylized.onchange = S;

G();
A();
S();
#output {
  background: #000;
  color: #9fff8a;
  overflow: hidden;
  padding: 1em;
  line-height: 1;
}

#output.stylized {
  line-height: 0.25;
  font-size: 2em;
  margin: 0.5em 0 0 0;
  padding: 0.5em;
}

.stylized #row-1 { color: #9fff8a; }
.stylized #row-2 { color: #c5ff8a; }
.stylized #row-3 { color: #e0ff8a; }
.stylized #row-4 { color: #ffe88a; }
.stylized #row-5 { color: #ffc28a; }
.stylized #row-6 { color: #ff8a8a; }
<button id="generate">Generate</button>
<label>Auto: <input id="auto" type="checkbox" checked/></label>
<label>Speed: <select id="speed">
  <option value="25">25</option>
  <option value="50">50</option>
  <option value="100" selected>100</option>
  <option value="200">200</option>
  <option value="400">400</option>
  <option value="600">600</option>
  <option value="800">800</option>
  <option value="1000">1000</option>
</select></label>
<label>Stylized: <input id="stylized" type="checkbox" checked/></label>
<pre id="output"></pre>


1
Wow, to naprawdę fajne!
nicael

8

C, 87 bajtów

f(x,y){for(y=6;y--;){srand(time(0));for(x=33;x--;)putchar("= "[rand()%6<y]);puts("");}}

Jak zadzwonić f();. Ta odpowiedź polega na tym, że sześć kolejnych wywołań time(0)zwraca ten sam wynik (w sekundach). Jest to praktycznie zawsze prawda, ale prawdopodobnie warto o tym wspomnieć.


Umieszczasz xi yunikasz ich deklarowania jako int. Ponieważ nie ma danych wejściowych, czy jest to dozwolone? Jeśli tak, to fajny pomysł!
aloisdg mówi Przywróć Monikę

2
Właśnie próbowałem napisać kod. Możesz uruchomić to z f();Thats nice! Nie wiedziałem, że C może to zrobić.
aloisdg mówi Przywróć Monikę

Naprawdę lubię twój kod. Przesyłam go do C # z wynikiem 117 bajtów. Nie jestem pewien, czy go opublikować, ponieważ jest to dosłownie twój kod.
aloisdg mówi Przywróć Monikę

1
Nie krępuj się opublikować, jeśli tylko mi się podoba. :)
Lynn,

8

Cheddar, 68 65 bajtów (niekonkurencyjny)

->(1:33).map(->IO.sprintf("%6s","="*Math.rand(1,7))).turn().vfuse

O_O Cheddar naprawdę ma się dobrze! Wykorzystuje sprintfi turnwykonuje większość pracy. vfusejest bezpiecznikiem pionowym, co oznacza, że ​​łączy się z tablicą, ale pionowo. To jest bardzo golfowe, ale także dość szybkie. Wersja jest w wersji wstępnej 1.0.0-beta.10 , która jest późniejsza niż wyzwanie.

Wyjaśnienie

->           // Anonymous function
  (1:33)     // Range 1-33 inclusive
  .map(->    // Loop through the above range
    IO.sprintf("%6s",       // `sprintf` from C/C++
      "="*Math.rand(1,7)    // Repeat `=` a random time from [1,7)
    )
  ).turn().vfuse     // Turn it 90deg, and fuse it vertically

Niektóre przykłady działają:

wprowadź opis zdjęcia tutaj


5

05AB1E , 22 bajty

Bez automatycznego łączenia, bez automatycznego wypełniania podczas transpozycji, osabie jest skazana na to. Kod:

33F6ð×6L.R'=×ðñ})ø€J¶ý

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .


5

Python 2, 95 bajtów

from random import*
x=map(randrange,[6]*33)
for y in range(6):print''.join('= '[z>y]for z in x)

4

Python 3, 115 bajtów

Python nigdy nie miał nawet szansy ...

from random import*
for k in zip(*[[' ']*(6-len(j))+j for j in[randint(1,6)*['=']for i in[0]*33]]):print(*k,sep='')

Jak to działa

from random import*    Import everything in the random module
randint(1,6)*['=']     Create a list containing a random number in [1,6] of '='...
...for i in[0]*33      ...33 times...
[...]                  ...and store in a list X
for j in...            For all lists j in X...
[' ']*(6-len(j))+j     ...create a list containing j padded with the correct number of
                       spaces to give a height of 6...
[...]                  ...and store in a list Y

Y now contains a list for each output line, but transposed.

for k in zip(*...):...  For all lists k in the transpose of Y...
print(*k,sep='')        Print all elements in k with no separating space

Wypróbuj na Ideone



3

SpecaBAS - 76 bajtów

1 FOR x=1 TO 33: r=1+INT(RND*6): FOR y=7-r TO 6: ?AT y,x;"=": NEXT y: NEXT x

Drukuje znak równości na odpowiedniej współrzędnej ekranu.

wprowadź opis zdjęcia tutaj

z plamą koloru i GOTOpętlą staje się

wprowadź opis zdjęcia tutaj



2

C #, 200 117 bajtów

()=>{var s="";int x,y=6;for(;y-->0;){var r=new Random();for(x=33;x-->0;)s+="= "[r.Next(6)<y?1:0];s+='\n';}return s;};

Przechodzę do algorytmu @Lynn i oszczędzam 83 bajty!

C # lambda bez danych wejściowych i gdzie wyjściem jest ciąg znaków. Wypróbuj online .

Kod:

()=>{
    var s="";int x,y=6;
    for(;y-->0;){
        var r=new Random();
        for(x=33;x-->0;)
            s+="= "[r.Next(6)<y?1:0];
        s+='\n';
    }return s;
};

2

Haskell, 164 bajtów

Będąc językiem czysto funkcjonalnym, Haskell był skazany od samego początku. Zrobiłem to i tak i okazuje się, że niezbędne koszty ogólne nie są tak duże.

import System.Random
import Data.List
f r n|r>n=' '|0<1='='
s=do
g<-newStdGen
mapM_ putStrLn$transpose$map(\n->map(f$mod n 6)[0..5])(take 33(randoms g)::[Int])

Stosowanie:

s

Wyjaśnienie:

import System.Random

aby móc używać newStdGenirandoms

import Data.List

móc korzystać transpose

f r n|r>n=' '|0<1='='

definiuje funkcję, która wypisuje spację, jeśli jej pierwszy argument jest większy niż drugi, a w =przeciwnym razie. Jest wywoływany z map (f m) [0..5]podanym numerem mi listą [0,1,2,3,4,5]. (Patrz poniżej)

s=do
g<-newStdGen

Tworzy nowy standardowy generator liczb losowych

(take 33(randoms g)::[Int])

przyjmuje 33 losowe liczby całkowite.

map(\n->map(f$mod n 6)[0..5])

Oblicza m = n % 6i mapuje (f m)listę [0,1,2,3,4,5], co daje jeden z nich "======", " =====", ..., " =". Linie te są odwzorowane na listę 33 losowych liczb całkowitych, w wyniku czego powstaje tabela. (Tabela w Haskell to lista list)

transpose$

przełącza kolumny i wiersze tabeli

mapM_ putStrLn$

drukuje każdą linię w tabeli


1

CJam, 19 bajtów

{5mrS*6'=e]}33*]zN*

Wypróbuj online!

Wyjaśnienie

{       e# 33 times...
  5mr   e#   Push a random number in [0 1 2 3 4 5].
  S*    e#   Create a string with that many spaces.
  6'=e] e#   Pad to length 6 with =.
}33*    
]       e# Wrap all 33 strings in a list.
z       e# Transpose that list.
N*      e# Join the lines with linefeeds.

1

Mathematica, 78 bajtów

StringRiffle[(PadLeft[Array["="&,#+1],6," "]&/@5~RandomInteger~33),"
",""]&

Funkcja anonimowa. Nie pobiera danych wejściowych i zwraca ciąg wyjściowy. Znak Unicode to U + F3C7, reprezentujący \[Transpose].


1

R, 102 bajty

m=rep(" ",33);for(i in 1:6){n=ifelse(m=="=",m,sample(c(" ","="),33,T,c(6-i,i)));m=n;cat(n,"\n",sep="")}

Wyjaśnienie

m=rep(" ",33) zainicjuj pusty wektor dla nadchodzącej pętli

n=ifelse(m=="=",m,sample(c(" ","="),33,T,c(6-i,i)))Jeśli =w wierszu powyżej znajduje się znak, upewnij się, że miejsce poniżej również ma znak =; w przeciwnym razie losowo wybierz. Losowe typy są ważone, aby upewnić się, że a) dolny rząd jest wszystkim= ib) uzyskasz zgrabny kształt całej rzeczy.

cat(n,"\n",sep="") wypisuje ten wiersz do konsoli z nową linią na końcu i bez spacji między elementami!


1

PHP, 95 92 89 bajtów

<?php for(;++$i<34;)for($j=6,$e=' ';$j--;)$a[$j].=$e=rand(0,$j)?$e:'=';echo join("
",$a);

Właściwie całkiem zadowolony z tego. Przez jakiś czas miałem wersję, która teoretycznie mogłaby generować dowolne dane wejściowe, ale w praktyce generowałaby tylko solidne bloki =, ale jest ona zarówno krótsza, jak i równo rozłożona!
Generuje 7 niezdefiniowanych powiadomień o treści za każdym razem, gdy je uruchomisz, ale to jest w porządku.

edycja: cóż, właśnie dowiedziałem się, że join jest aliasem implode, więc to miłe.


1

J, 18 bajtów

|.|:'='#~"0>:?33#6

Bardzo proste rzeczy. Z poprawką z mil!


Wybiera losowe liczby całkowite z zakresu [0, 6], podczas gdy OP chciał [1, 6]. Możesz zrobić, >:?33#6aby uzyskać losowe liczby całkowite z zakresu [1, 6]. Ponadto, kopia w rankingu 0 będzie krótsza przy użyciu '='#~"0. Powoduje to, |.|:'='#~"0>:?33#6ale niestety, 2-bajtowe oszczędności zostały ostatecznie złagodzone przez włączenie operatora przyrostu.
mile

@miles Whoa, dzięki! Bardzo fajny.
Conor O'Brien

1

Perl, 64 bajty

@f=$_="="x33;s/=/rand>.4?$&:$"/ge,@f=($_.$/,@f)while@f<6;print@f

Stosowanie

perl -e '@f=$_="="x33;s/=/rand>.3?$&:$"/ge,@f=($_.$/,@f)while@f<6;print@f'
  = =           =  ==      =    =
  = =         ===  ==      =    =
= = =         ===  ==      =    =
= = =   = =   ===  ===   = =    =
= = == =====  === ====   ===  = =
=================================

Perl, 68 bajtów

Alternatywna wersja, która wykorzystuje kody specjalne ANSI do przesuwania kursora, najpierw upuszczając 6 linii, a następnie zapisując oryginalną linię (wszystkie =s), przesuwając linię w górę i drukując s/=/rand>.4?$&:$"/gewielokrotnie ciąg znaków ( ), aż nie będzie więcej podstawień. Może to zakończyć się pisaniem więcej niż sześciu linii, ale ostatecznie zostanie zastąpione pustą linią.

Uwaga: w \x1brzeczywistości są znakami ASCII Esc.

print"\x1bc\x1b[6B",$_="="x33;print"\x1b[1A\x1b[33D$_"while s/=/rand>.4?$&:$"/ge

1

Rubin, 102 99 84 83 bajty

s='
'*203;33.times{|j|a=(' '*rand(6)).ljust 6,'=';6.times{|i|s[i*34+j]=a[i]}};$><<s

Nowe i znacznie krótsze podejście, w którym zaczynam od ciągu pełnego nowych linii.

Starsza wersja...

s='';204.times do|i|s+=->i{i%34==0?"\n":i>170?'=':s[i-34]=='='?'=':rand(2)==1?'=':' '}[i]end;puts s

... dał wynik dzięki wiodącej nowej linii. Moje pierwsze zgłoszenie w Rubim, przy użyciu podobnego podejścia do tego z @ Barbarossa, ale w pojedynczej pętli.

Co lubiłem w Ruby podczas pracy nad tym programem:

  • .times pętla
  • rand() co jest dość krótkie
  • układanie operatorów trójskładnikowych bez nawiasów

Nie podobało mi się (głównie pod względem golfowym):

  • obowiązkowe $dla zmiennych globalnychnie tak obowiązkowe w .timespętli
  • doi endsłowa kluczowe który można zastąpić blokiem jednowierszowym
  • 0 nie jest fałszem

0

JavaScript, 179 bajtów

Nadal pracuję nad tym trochę. Lubię to, ponieważ jest to proste.

n=>{a=Array(33).fill(0).map(n=>Math.floor(Math.random()*6)+1);r=Array(6).fill("");r.map((e,m)=>{a.map(n=>{if (n<=m+1){r[m]+="="}else r[m]+=" "})});return r.join('\n');}

Stosowanie:

>q=n=>{a=Array(33).fill(0).map(n=>{return Math.floor(Math.random() * 6)+1});
r=Array(6).fill("");r.map((e,m)=>{a.map(n=>{if (n<=m+1){r[m]+="="}else r[m]+=" "})});return r.join('\n');}
>q();
           = =  =   =    = =     
=   =    = = =  =  == =  = =  =  
= = =  = === ====  ====  = = === 
= = =  = === ==========  ======= 
= === ===========================
=================================

Powinieneś być w stanie wymienić .map(n=>{return Math.floor(Math.random() * 6)+1})z .map(n=>Math.floor(Math.random()*6)+1). Lambda są
świetni

if (n<=m+1){r[m]+="="}elsemoże byćif(n<=m+1)r[m]+="=" else
aloisdg mówi Przywróć Monikę

Musiałem stworzyć własny PRNG, a mój program Forth nie jest już dłuższy. : P
mbomb007

0

Dalej, 190 bajtów

Musiałem stworzyć swój własny PRNG , wzięty stąd Xor-shift . Słowo fto słowo, które wywołujesz wiele razy, aby zobaczyć wynik.

variable S utime S !
: L lshift xor ;
: R S @ dup 13 L dup 17 rshift xor dup 5 L dup S ! 6 mod ;
: f
33 0 DO R LOOP
1 -5 DO
33 0 DO
I PICK J + 0< 1+ IF ." =" ELSE SPACE THEN
LOOP CR
LOOP
; f

Wypróbuj online - pamiętaj, że czas systemowy jest jedną z dwóch wartości, na podstawie których serwer (lub coś takiego) uruchamia kod. Poza tym z jakiegoś powodu nie zmieniają się w IDE online. Więc zobaczysz tylko dwa możliwe wyniki. Możesz ręcznie ustawić ziarno, zmieniającutime na liczbę całkowitą.

Bez golfa

variable seed                   \ seed with time
utime seed !

: RNG                           \ xor-shift PRNG
seed @
dup 13 lshift xor
dup 17 rshift xor
dup 5 lshift xor
dup seed !
6 mod                           \ between 0 and 6, exclusive
;

: f 33 0 DO RNG LOOP            \ push 33 randoms
    1 -5 DO                     \ for (J = -6; J <  0; J++)
        33 0 DO                 \ for (I =  0; I < 33; I++)
            I PICK J + 0< 1+ IF \ if  (stack[I] < J)
                61 EMIT         \ print "="
            ELSE
                32 EMIT         \ print " "
            THEN
        LOOP
        CR                      \ print "\n"
    LOOP
; f

Ungolfed online


0

JavaScript, 165 bajtów

// function that fills a column with a specified number of = signs
m=l=>Array(6).fill``.map((e,i)=>i<l?"=":" ");
// fill an array of 33 length with columns of random number of = signs
a=Array(33).fill``.map(e=>m(Math.ceil(Math.random()*6)));
// transponse the rows and columns and print to console
a[0].map((c,i)=>a.map(r=>r[5-i])).map(r=>console.log(r.join``))

Nowe linie są niepotrzebne, ale ułatwiają sprawdzenie, co się dzieje. Nie jest to najbardziej optymalne rozwiązanie, ale przynajmniej ma dla mnie sens.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.