Ilustrar batidas da música


24

Você sabe - eles ficam assim:

fonte

O objetivo é desenhar uma ilustração de batidas de música como a seguinte:

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

As regras são:

  • A largura da ilustração é de 33 símbolos, mas se você precisar, são permitidos espaços à direita que excedam essa largura.
  • Cada coluna é composta de sinais de igual ( =).
  • Cada coluna tem uma altura aleatória (a altura da próxima coluna não deve depender de forma alguma da altura da coluna anterior), variando de 1 a 6. Também é bom se for pelo menos possível obter alguma entrada sem nenhuma restrição estrita. probabilidade matemática (ou seja, algumas entradas podem aparecer mais raramente do que outras).
  • Uma coluna não pode flutuar acima da parte inferior e ter lacunas.
  • Como todas as colunas têm a altura mínima de 1, a última linha também não pode ter espaços - ela sempre consiste em 33 sinais de igual.
  • Como é possível não ter colunas com a altura de 6 (afinal é tudo aleatório): nesse caso, você não precisa ter uma linha superior feita de espaços. Aplica-se a todos os casos de borda dessa natureza: se de repente seu código não fornecer colunas com altura maior que 1, você não precisará ter linhas adicionais feitas de espaços acima da linha inferior.
  • Você não recebe nenhuma entrada .

@ Lynn Oh, originalmente ele especificou, mas eu o removi acidentalmente da publicação.
Nicael 10/07

11
(Picuinhas) que olha para mim como um espectrograma em um dado instante, ao invés de uma representação de quaisquer batidas
Luis Mendo

2
As colunas podem ser separadas por espaços? (ou seja, a linha de baixo seria = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =) #
LegionMammal978 10/07

2
É bom ter linhas extras acima da saída?
John Dvorak

11
"a altura da próxima coluna não deve depender de forma alguma da altura da coluna anterior" - os geradores de números aleatórios embutidos na maioria dos idiomas são semeados. Por esse motivo, uma função como Math.random()é diretamente calculável a partir de sua chamada anterior se os parâmetros do gerador congruencial linear forem conhecidos, o que significa que você precisaria modificar a maioria das funcionalidades aleatórias incorporadas para atender a esse critério. Eu sugiro que isso seja melhor formulado.
Patrick Roberts

Respostas:


12

Pitão , 13 bytes

E eu superei Jelly .

j_.tm*hO6\=33

Experimente online!

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.

Por que isso não funciona aqui ?
Insana

O @Insane Pyth está bastante desatualizado no TIO.
Dennis

@Dennis Mas eu amo o TIO: '(
Insano

13

Dyalog APL , 14 bytes

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

Explicação

33⍴6 33 repetições de 6

?número inteiro aleatório no intervalo [1, n ] para cada um dos 33 6s

'='⍴¨⍨ símbolo de igualdade repetiu cada um desses números de vezes

converter lista de listas em tabela de linhas

transpor linhas para colunas, colunas para linhas

virar de cabeça para baixo

Execuções de exemplo

A entrada é recuada seis espaços:

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


9

JavaScript (ES6), 116 bytes

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

Visualização de trechos

Confira no snippet animado abaixo:

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>


11
Uau, isso é muito legal!
Nicael 11/07

8

C, 87 bytes

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

Ligar como f();. Esta resposta se baseia no fato de que seis chamadas consecutivas time(0)retornam o mesmo resultado (em segundos). Isso é quase sempre verdade, mas provavelmente vale a pena mencionar.


Você coloca xe yevita declará-los como int. Como não há entrada, isso é permitido? Se sim, é uma boa ideia!
aloisdg diz Reinstate Monica

2
Apenas tentei codificar. Você pode executá-lo com f();Isso é legal! Eu não sabia que C pode fazer isso.
aloisdg diz Reinstate Monica

Eu realmente gosto do seu código. Eu o porto para C # para obter um resultado de 117 bytes. Não tenho certeza sobre publicá-lo porque é literalmente o seu código.
aloisdg diz Reinstate Monica

11
Sinta-se livre para publicá-lo, desde que me credite. :)
Lynn

8

Cheddar, 68 65 bytes (não concorrente)

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

O_O Cheddar está realmente indo bem! Usa sprintfe turnfaz a maior parte do trabalho. vfuseé fusível vertical, o que significa que se junta à matriz, mas verticalmente. Isso é muito golfe, mas também bastante rápido. A versão é pré-lançamento v 1.0.0-beta.10 , que pós-data do desafio.

Explicação

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

Alguns exemplos são executados:

insira a descrição da imagem aqui


5

05AB1E , 22 bytes

Sem união automática, sem preenchimento automático durante a transposição, o osabie está condenado a este. Código:

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

Usa a codificação CP-1252 . Experimente online! .


5

Python 2, 95 bytes

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 bytes

Python nunca teve uma chance ...

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

Como funciona

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

Experimente no Ideone



3

SpecaBAS - 76 bytes

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

Imprime um sinal de igual na coordenada da tela relevante.

insira a descrição da imagem aqui

com uma mancha de cor e um GOTOlaço torna-se

insira a descrição da imagem aqui


2

K4, 18 bytes

Essencialmente, uma porta da solução APL (sem surpresa).

+-6$(33?1+!6)#'"="

2

C #, 200 117 bytes

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

Passo para o algoritmo @Lynn e salvo 83 bytes!

C # lambda sem entrada e em que output é uma string. Experimente online .

Código:

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

Sendo uma linguagem puramente funcional, Haskell estava condenado desde o início. Fiz de qualquer maneira e, ao que parece, a sobrecarga necessária não é realmente tão grande.

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

Uso:

s

Explicação:

import System.Random

para poder usar newStdGenerandoms

import Data.List

poder usar transpose

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

define uma função que imprime um espaço se seu primeiro argumento for maior que o segundo e um =caso contrário. É chamado com map (f m) [0..5]um determinado número me a lista [0,1,2,3,4,5]. (Ver abaixo)

s=do
g<-newStdGen

Cria um novo gerador de números aleatórios padrão

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

leva 33 números aleatórios.

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

Calcula m = n % 6e mapeia (f m)para a lista [0,1,2,3,4,5], que resulta em um dos "======", " =====", ..., " =". Essas linhas são mapeadas para a lista dos 33 números inteiros aleatórios resultando em uma tabela. (Uma tabela em Haskell é uma lista de listas)

transpose$

alterna colunas e linhas da tabela

mapM_ putStrLn$

imprime todas as linhas da tabela


1

CJam, 19 bytes

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

Experimente online!

Explicação

{       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 bytes

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

Função anônima. Não recebe entrada e retorna uma string como saída. O caractere Unicode é U + F3C7, representando \[Transpose].


1

R, 102 bytes

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

Explicação

m=rep(" ",33) init um vetor vazio para o próximo loop

n=ifelse(m=="=",m,sample(c(" ","="),33,T,c(6-i,i)))Se houver um =na linha acima, verifique se o local abaixo também possui um =; caso contrário, escolha aleatoriamente. As escolhas aleatórias são ponderadas para garantir que a) a linha inferior seja toda= eb) você tenha uma forma elegante para a coisa toda.

cat(n,"\n",sep="") imprima essa linha no console com uma nova linha no final e sem espaços entre os elementos!


1

PHP, 95 92 89 bytes

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

Muito feliz com este, na verdade. Por um tempo, tive uma versão que, em teoria, poderia gerar qualquer entrada, mas na prática geraria apenas blocos sólidos de =, mas isso é mais curto e igualmente distribuído!
Gera 7 algo indefinido, percebe sempre que você o executa, mas tudo bem.

edit: bem, eu acabei de aprender que join é um apelido de implode, então isso é legal.


1

J, 18 bytes

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

Coisas muito simples. Com um bugfix de milhas!


Isso seleciona números inteiros aleatórios no intervalo [0, 6] enquanto o OP queria [1, 6]. Você poderia fazer >:?33#6para obter números inteiros aleatórios no intervalo [1, 6]. Além disso, uma cópia de classificação 0 seria mais curta usando '='#~"0. Isso resulta, |.|:'='#~"0>:?33#6mas infelizmente, a economia de 2 bytes acaba sendo mitigada pela inclusão do operador de incremento.
miles

@miles Whoa, obrigado! Muito legal.
Conor O'Brien

1

Perl, 64 bytes

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

Uso

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

Perl, 68 bytes

Versão alternativa que depende dos códigos de escape ANSI para mover o cursor, primeiro descendo 6 linhas e depois escrevendo a linha original (todos =), movendo uma linha para cima e imprimindo a sequência substituída (s/=/rand>.4?$&:$"/ge ) repetidamente até que não faça mais substituições. Isso pode acabar escrevendo mais de seis linhas, mas é substituído por uma linha vazia.

Nota: \x1b s são realmente o Esccaractere ASCII .

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

1

Rubi, 102 99 84 83 bytes

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

Abordagem nova e significativamente mais curta, onde começo com uma sequência cheia de novas linhas.

Versão mais antiga ...

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

... deu saída com a nova linha líder. Minha primeira submissão em Ruby, usando abordagem semelhante à do @ Barbarossa, mas em loop único.

O que eu gostei em Ruby enquanto trabalhava neste programa:

  • .times laço
  • rand() o que é bem curto
  • operadores ternários de empilhamento sem parênteses

Não gostei (principalmente em termos de golfe):

  • obrigatório $para variáveis ​​globaisnão é tão obrigatório em .timesloop
  • doe endpalavras - chave que pode ser substituído por um bloco de linha única
  • 0 não é falso

0

JavaScript, 179 bytes

Ainda trabalhando um pouco nisso. Eu gosto disso, pois é simples.

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

Uso:

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

Você deve poder substituir .map(n=>{return Math.floor(Math.random() * 6)+1})por .map(n=>Math.floor(Math.random()*6)+1). Lambda são grandes :)
aloisdg diz Reinstate Monica

if (n<=m+1){r[m]+="="}elsepode serif(n<=m+1)r[m]+="=" else
aloisdg diz Reinstate Monica 11/07

Eu tive que fazer meu próprio PRNG, e meu programa Forth não é muito mais longo. : P
mbomb007 12/07

0

Quarto, 190 bytes

Eu tive que criar meu próprio PRNG , um xor-shift tirado daqui . A palavra fé a palavra que você chamaria várias vezes para ver a saída.

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

Experimente online - Observe que a hora do sistema é um dos dois valores com base em qual servidor (ou algo) está executando o código. Fora isso, eles não mudam no IDE online por algum motivo. Então você verá apenas duas saídas possíveis. Você pode definir manualmente a semente alterandoutime para um número inteiro.

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

Ungolfed online


0

JavaScript, 165 bytes

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

As novas linhas são desnecessárias, mas facilitam a visualização do que está acontecendo. Não é a solução mais ideal, mas pelo menos faz sentido para mim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.