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.