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.