Ілюструє музику


24

Ви знаєте - вони виглядають так:

джерело

Мета полягає в тому, щоб намалювати тактику музики, як:

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

Правила такі:

  • Ширина ілюстрації - 33 символи, але якщо вам потрібно - допускаються будь-які проміжки, що перевищують цю ширину.
  • Кожен стовпець складається із знаків рівності ( =).
  • Кожен стовпець має випадкову висоту (висота наступного стовпця жодним чином не повинна залежати від висоти попереднього стовпця), коливаючись від 1 до 6. Це також добре, якщо принаймні можна отримати деякий внесок без суворого математична ймовірність (тобто деякі входи можуть з’являтися рідше, ніж інші).
  • Стовпець не може плавати над дном і має прогалини.
  • Оскільки кожен стовпець має мінімальну висоту 1, останній рядок також не може мати пропусків - він завжди складається з 33 знаків рівності.
  • Оскільки стовпці висотою до 6 (можливо, все це випадково), у цьому випадку вам не потрібно мати верхню лінію з пробілів. Застосовується до будь-яких крайових випадків такого характеру: якщо раптом у вашому коді не було стовпців висотою більше 1, вам не потрібно мати додаткових рядків із пробілів вище нижнього рядка.
  • Ви не берете жодного вкладу .

@Lynn О, спочатку це було вказано, але я випадково його видалив з посади.
nicael

11
(Нітпікінг) Мені це здається спектрограмою в даний момент, а не поданням будь-яких ударів
Луїс Мендо

2
Чи дозволено розділяти стовпці пробілами? (тобто, нижній ряд буде = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =)
LegionMammal978

2
Чи добре мати додаткові рядки над виходом?
Джон Дворак

1
"висота наступного стовпця не повинна жодним чином залежати від висоти попереднього стовпця" - вбудовані генератори випадкових чисел у більшості мов висіваються насіння. З цієї причини функцію на кшталт 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

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

@Dennis Але я люблю TIO: '(
Insane

13

Діалог APL , 14 байт

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

Пояснення

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

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

'='⍴¨⍨ символ рівності повторюється кожен із цих кількох разів

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

переміщуйте рядки в стовпці, стовпці - у рядки

перевернути догори дном

Приклад виконання

Введення з відступом шість пробілів:

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

9

Желе, 14 байт

6x33X€”=ẋz⁶Ṛj⁷

Спробуйте тут.


11
О, це не може бути правильним. Желе за визначенням повинно бути коротшим, ніж APL.
Adám

Це не дуже ефективно, але 6ṗ33Xдобре працює.
Денніс

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
Ого, це справді круто!
nicael

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 nice! Я не знав, що C може це зробити.
aloisdg повідомляє про відновлення Моніки

Мені дуже подобається ваш код. Я портую його на C # за результат 117 байт. Я не впевнений у публікації, оскільки це буквально ваш код.
aloisdg повідомляє відновити Моніку

1
Не соромтеся розміщувати це, доки ви мені не позичите. :)
Лінн

8

Чеддар, 68 65 байт (неконкурентоспроможний)

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

O_O Чеддар насправді робить добре! Використовує sprintfі turnвиконувати основну частину роботи. vfuseє вертикальним запобіжником, тобто він приєднується до масиву, але вертикально. Це дуже сильно, але також досить швидко. Версія є попередньою версією 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

Деякі приклади працює:

enter image description here


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

Пітон ніколи навіть не мав шансів ...

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

Друкує знак рівності на відповідній екранній координаті.

enter image description here

з плямою кольору і GOTOпетлею це стає

enter image description here



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

Хаскелл, 164 байт

Будучи чисто функціональною мовою, Хаскелл був приречений з самого початку. Я все одно це зробив і виявляється, що необхідні накладні витрати насправді не такі великі.

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

Математика, 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], тоді як ОР хотів [1, 6]. Ви можете зробити, >:?33#6щоб отримати випадкові цілі числа в діапазоні [1, 6]. Крім того, копія з рангом 0 буде коротшою '='#~"0. Це призводить до, |.|:'='#~"0>:?33#6але, на жаль, заощадження в 2 байтах у результаті зменшення за рахунок включення оператора приросту.
милі

@miles Whoa, дякую! Дуже круто.
Conor O'Brien

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 - це насправді Escсимвол ASCII .

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 на ціле число.

Безумовно

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 в Інтернеті


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.