Проиллюстрировать музыкальные ритмы


24

Вы знаете, они выглядят так:

источник

Цель состоит в том, чтобы нарисовать музыку, которая выглядит следующим образом:

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

Правила таковы:

  • Ширина иллюстрации составляет 33 символа, но если вам нужно, допускаются любые конечные пробелы, превышающие эту ширину.
  • Каждый столбец состоит из знаков равенства ( =).
  • Каждый столбец имеет произвольную высоту (высота следующего столбца никоим образом не должна зависеть от высоты предыдущего столбца), варьируясь от 1 до 6. Также хорошо, если по крайней мере возможно получить какой-либо ввод без строгого математическая вероятность (т. е. некоторые входные данные могут появляться реже, чем другие).
  • Столбец не может плавать над дном и иметь пробелы в нем.
  • Поскольку каждый столбец имеет минимальную высоту 1, в последней строке также не должно быть пробелов - он всегда состоит из 33 знаков равенства.
  • Так как столбцы с высотой 6 не могут быть (в конце концов, все они случайны): в этом случае вам не нужно иметь верхнюю строку из пробелов. Применяется к любым крайним случаям такого рода: если вдруг в вашем коде не было столбцов с высотой больше 1, вам не нужно иметь дополнительные строки из пробелов выше нижней строки.
  • Вы не берете никакой информации .

@ Линн О, первоначально это определило, но я случайно удалил это из почты.
Никаэль

11
(Nitpicking) Для меня это похоже на спектрограмму в данный момент, а не на представление каких-либо ударов
Луис Мендо

2
Разрешено ли разделять столбцы пробелами? (то есть нижний ряд будет = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =)
LegionMammal978

2
Можно ли иметь дополнительные строки над выводом?
Джон Дворак

1
«высота следующего столбца никоим образом не должна зависеть от высоты предыдущего столбца» - встроены генераторы случайных чисел большинства языков. По этой причине функция like Math.random()напрямую вычисляется из предыдущего вызова, если известны параметры линейного конгруэнтного генератора, что означает, что вам придется изменить большинство встроенных случайных функций, чтобы соответствовать этим критериям. Я полагаю, что это лучше сформулировано.
Патрик Робертс

Ответы:


12

Pyth , 13 байт

И я перехитрил желе .

j_.tm*hO6\=33

Попробуйте онлайн!

j_.tm*hO6\=33
    m      33  for 33 times:
       O6          yield a random number in [0,1,2,3,4,5].
      h            add one.
     *   \=        repeat "=" that number of times.
  .t           transpose, filling with whitespace
 _             reverse
j              join by newlines.

Почему это не работает здесь ?
Безумный

@Insane Pyth довольно устарел в TIO.
Деннис

@Dennis Но я люблю TIO: '(
Безумный

13

Dyalog APL , 14 байтов

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

объяснение

33⍴6 33 повторения 6

?случайное целое число в диапазоне [1, n ] для каждого из 33 6 с

'='⍴¨⍨ символ равенства повторяется каждый из этих раз

преобразовать список списков в таблицу строк

транспонировать строки в столбцы, столбцы в строки

перевернуть с ног на голову

Пример работает

Введено шесть пробелов:

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


9

JavaScript (ES6), 116 байт

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

Предварительный просмотр фрагмента

Проверьте это в анимированном фрагменте ниже:

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
Вау, это действительно круто!
Никель

8

C 87 байтов

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

Звоните как f();. Этот ответ основан на том факте, что шесть последовательных вызовов time(0)возвращают один и тот же результат (в секундах). Это практически всегда так, но, вероятно, стоит упомянуть.


Вы ставите xи yизбегать объявлять их как int. Раз нет ввода, это разрешено? Если да, это хорошая идея!
Aloisdg говорит восстановить Монику

2
Только что попробовал твой код. Вы можете запустить его с f();Thats приятно! Я не знал, что С может сделать это.
Aloisdg говорит восстановить Монику

Мне очень нравится твой код. Я портирую его на C # для результата в 117 байт. Я не уверен в том, чтобы опубликовать его, потому что это буквально ваш код.
Aloisdg говорит восстановить Монику

1
Не стесняйтесь размещать его, если вы мне доверяете. :)
Линн

8

Чеддер, 68 65 байт (неконкурирующий)

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

О_О Чеддер на самом деле делает хорошо! Использует sprintfи turnделает основную часть работы. vfuseэто вертикальный предохранитель, означающий, что он присоединяется к массиву, но вертикально. Это очень гольф, но и довольно быстро. Версия - prerelease v 1.0.0-beta.10 , которая публикуется позже .

объяснение

->           // 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

Пример запускается:

введите описание изображения здесь


5

05AB1E , 22 байта

Нет автоматического соединения, нет автоматического заполнения при переносе, osabie обречена на это. Код:

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

Использует кодировку CP-1252 . Попробуйте онлайн! ,


5

Python 2, 95 байт

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 байт

У Python даже не было шанса ...

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='')

Как это работает

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

Попробуйте это на Ideone



3

SpecaBAS - 76 байт

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

Печатает знак равенства по соответствующей экранной координате.

введите описание изображения здесь

с пятном цвета и GOTOпетли становится

введите описание изображения здесь



2

C #, 200 117 байтов

()=>{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;};

Я переезжаю в @Lynn алгоритму и сохраняю 83 байта!

C # лямбда без ввода и где выход является строкой. Попробуйте онлайн .

Код:

()=>{
    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 байта

Будучи чисто функциональным языком, Haskell был обречен с самого начала. Я все равно это сделал, и оказалось, что необходимые накладные расходы не так уж велики.

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])

Использование:

s

Объяснение:

import System.Random

чтобы иметь возможность использовать newStdGenиrandoms

import Data.List

быть в состоянии использовать transpose

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

определяет функцию, которая печатает пробел, если ее первый аргумент больше, чем второй, и =иначе. Вызывается с map (f m) [0..5]заданным номером mи списком[0,1,2,3,4,5] . (Увидеть ниже)

s=do
g<-newStdGen

Создает новый стандартный генератор случайных чисел

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

занимает 33 случайных целых числа

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

Вычисляет m = n % 6и отображает (f m)в списке [0,1,2,3,4,5], что приводит к одному из "======", " =====", ..., " =". Эти строки отображаются в списке из 33 случайных целых чисел, в результате чего получается таблица. (Таблица в Haskell - это список списков)

transpose$

переключает столбцы и строки таблицы

mapM_ putStrLn$

печатает каждую строку в таблице


1

CJam, 19 байтов

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

Попробуйте онлайн!

объяснение

{       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 байт

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

Анонимная функция. Не требует ввода и возвращает строку в качестве вывода. Символ Unicode - это U + F3C7, представляющий \[Transpose].


1

R, 102 байта

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="")}

объяснение

m=rep(" ",33) инициировать пустой вектор для предстоящего цикла

n=ifelse(m=="=",m,sample(c(" ","="),33,T,c(6-i,i)))Если =в ряду выше есть, то убедитесь, что у места внизу также есть =; в противном случае случайно выбрать. Случайные выборки взвешиваются, чтобы убедиться, что а) нижний ряд - это все =и б) вы получите аккуратную форму для всего этого.

cat(n,"\n",sep="") выведите эту строку в консоль с новой строкой в ​​конце и без пробелов между элементами!


1

PHP 95 92 89 байт

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

Очень доволен этим на самом деле. Некоторое время у меня была версия, которая теоретически могла генерировать любые входные данные, но на практике генерировала бы только сплошные блоки =, но это и короче, и равномерно распределено!
Создает 7 неопределенных, что-то замечает, когда вы запускаете его, но это нормально.

редактировать: хорошо, я только что узнал, что объединение является псевдонимом взрыва, так что это хорошо.


1

J, 18 байт

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

Очень простые вещи. С исправлением от миль!


Это выбирает случайные целые числа в диапазоне [0, 6], тогда как OP хотел [1, 6]. Вы можете сделать, >:?33#6чтобы получить случайные целые числа в диапазоне [1, 6]. Кроме того, копия ранга 0 будет короче, используя '='#~"0. Это приводит |.|:'='#~"0>:?33#6к тому, что, к сожалению, экономия в 2 байта в конечном итоге уменьшается за счет включения оператора приращения.
миль

@ Майлз Вау, спасибо! Очень круто.
Конор О'Брайен

1

Perl, 64 байта

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

использование

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

Perl, 68 байт

Альтернативная версия, которая использует управляющие коды ANSI для перемещения курсора, сначала опуская 6 строк вниз, затем записывая исходную строку (все строки =), перемещая строку вверх и печатая замененную строку (s/=/rand>.4?$&:$"/ge ) несколько раз, пока не произойдет больше подстановок. Это может привести к написанию более шести строк, но в итоге оно будет заменено пустой строкой.

Примечание: \x1bs на самом деле символ ASCII Esc.

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

1

Рубин, 102 99 84 83 байта

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

Новый и значительно более короткий подход, где я начинаю со строки, полной новых строк.

Старая версия ...

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

... дал вывод с новой строкой. Моя первая подача в Ruby с использованием подхода, подобного подходу @ Barbarossa, но в одном цикле.

Что мне понравилось в Ruby при работе над этой программой:

  • .times петля
  • rand() который довольно короткий
  • составление тернарных операторов без скобок

Мне не понравилось (в основном с точки зрения игры в гольф):

  • обязательный $для глобальных переменныхне так обязательно в .timesцикле
  • doи endключевые слова который может быть заменен однострочным блоком
  • 0 это не обман

0

JavaScript, 179 байт

Все еще работаю над игрой в гольф. Мне нравится это, так как это просто.

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');}

Использование:

>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();
           = =  =   =    = =     
=   =    = = =  =  == =  = =  =  
= = =  = === ====  ====  = = === 
= = =  = === ==========  ======= 
= === ===========================
=================================

Вы должны быть в состоянии заменить .map(n=>{return Math.floor(Math.random() * 6)+1})на .map(n=>Math.floor(Math.random()*6)+1). Лямбда
велики

if (n<=m+1){r[m]+="="}elseможет бытьif(n<=m+1)r[m]+="=" else
говорит aloisdg Восстановить Монику

Я должен был сделать свой собственный PRNG, и моя программа Forth не намного дольше. : P
mbomb007

0

Далее 190 байт

Я должен был создать свой собственный PRNG , сдвиг Xor отсюда . Слово f- это слово, которое вы бы назвали несколько раз, чтобы увидеть результат.

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

Попробуйте онлайн - обратите внимание, что системное время - это одно из двух значений, в зависимости от того, какой сервер (или что-то еще) выполняет код. Кроме того, по какой-то причине они не меняются в онлайн-среде IDE. Таким образом, вы увидите только два возможных выхода. Вы можете вручную установить начальное значение, изменивutimeего на целое число.

Ungolfed

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

Разрушенный онлайн


0

JavaScript, 165 байт

// 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``))

Новые строки не нужны, но они помогают увидеть, что происходит. Не самое оптимальное решение, но оно имеет смысл для меня, по крайней мере.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.