Bubble-wraps são entretenimento de nível máximo. Todos podem concordar com isso.
Agora, você fará com que até os computadores desfrutem de envoltórios de bolhas.
Especificações
Você receberá dois números inteiros, w e h. (Cada um é responsivamente largura e altura)
Seu programa deve gerar todas as fases w * h aguardando 1 segundo entre cada uma e terminar.
Todo plástico bolha começa com todas as células cheias.
Por exemplo, um invólucro com bolhas de ar 4 * 6 começa como:
O_O_
_O_O
O_O_
_O_O
O_O_
_O_O
E a cada fase, uma célula aleatória não exibida é exibida. Por exemplo,
O_O_
_O_O
O_X_
_O_O
O_O_
_O_O
O programa deve terminar quando todas as células forem exibidas. aka.
X_X_
_X_X
X_X_
_X_X
X_X_
_X_X
Exemplos
(4,6)
(5,5)
(6,2)
(10,10)
(7,9)
1
e em0
vez deO
eX
?(1,1)
não tenha bolhas (por exemplo, "célula" superior esquerda é sempre um sublinhado)?Respostas:
C (Windows),
260248 bytesfonte
system("cls")
também é específico do Windows, então o código também não seria mais portátil com a biblioteca de threads. E com C ++ eu também precisaria incluiriostream
orcstdio
.Python 3 ,
222220 bytesEsta é a primeira vez que respondo, portanto, seja gentil (e indique os erros que cometi).
Experimente online!
Como funciona:
r*c+r%2*c%2
Tempos de repetição : Existemr*c
bolhas no padrão, a menos que r e c sejam ímpares; nesse caso, existemr*c+1
.fonte
f(c,r)
e você ficará bem).MATL , 37 bytes
O canto superior esquerdo é sempre um sublinhado (permitido pelo desafio).
A tela é limpa entre as fases. Eu poderia salvar um byte não limpando a tela, mas fica melhor assim.
O programa sai com um erro ( permitido por padrão ) após exibir todas as fases.
Experimente no MATL Online! (Se não funcionar após alguns segundos, atualize a página e tente novamente).
fonte
Mathematica (145 bytes)
Função anônima, usa altura e largura como entrada (nessa ordem - se houver um problema, substitua
{##}
por{#2,#}
no meio do código por 2 bytes adicionais).Código:
Explicação:
""<>Riffle[Array["_"["O"][[Mod[#+#2,2]]]&,{##}],"\n"]
cria o invólucro com bolhas de ar inicial, não populado, criando uma matriz de "_" se "O" se, em seguida, StringJoining entre as novas linhas.NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]
escolhe repetidamente um dos "O" s para substituir por um "X", quantas vezes houver "O" s (que é Piso [largura * altura / 2]) - obrigado a @ JonathanAllan pela idéia de colocar "_ "em vez de" O "no canto superior esquerdo, caso contrário, seria oCeiling
contrário e, portanto, mais 2 bytes).Monitor[Do[Pause@1,{i,...}],i]
fazi
pegar os valores da lista que acabamos de calcular, por 1 segundo cada, e imprimir dinamicamentei
.Exemplo de saída:
fonte
Geléia ,
3029 bytesChama o link como díade com os argumentos do programa e fecha com uma mensagem (cujo código é
çṛ“\'=ṙMḋḌẓ(ėo»
)Nuance: a "célula" inferior direita sempre será uma bolha (em vez da parte superior esquerda, como no exemplo da pergunta), para garantir que, quando todas as bolhas forem acionadas, a escolha aleatória retorne 0, que será
"X"
o final da lista - substituindo o que não faz alteração no valor e interrompe o loop.Nota: não limpa a tela (não foi especificada e não sei como fazê-lo).
Quão?
fonte
Scala , 764 bytes
Como funciona
O algoritmo preenche primeiro uma sequência 2D com valores falsos. Ele determina quantas iterações (caixas abertas) existem com base nos argumentos da linha de comando inseridos. Ele cria uma dobra com esse valor como limite superior. O valor inteiro da dobra é usado apenas implicitamente como uma maneira de contar quantas iterações o algoritmo deve executar. A sequência preenchida que criamos anteriormente é a sequência inicial da dobra. Isso é usado na geração de uma nova sequência 2D de valores falsos com suas indecisões de resposta correspondente.
Por exemplo,
Será transformado em
Observe que todas as listas que são completamente verdadeiras (têm um comprimento de 0) são omitidas da lista de resultados. O algoritmo pega essa lista e escolhe uma lista aleatória na lista mais externa. A lista aleatória é escolhida para ser a linha aleatória que escolhemos. A partir dessa linha aleatória, encontramos novamente um número aleatório, um índice de coluna. Depois de encontrarmos esses dois índices aleatórios, adormecemos o segmento em que estamos por 1000 milissegundos.
Depois que terminamos de dormir, limpamos a tela e criamos um novo quadro com um
true
valor atualizado nos índices aleatórios que criamos.Para imprimir isso corretamente, usamos
map
e compactamos com o índice do mapa, para que o tenhamos em nosso contexto. Usamos o valor verdadeiro da sequência para determinar se devemos imprimir umX
ou umO
ou_
. Para escolher o último, usamos o valor do índice como nosso guia.Coisas interessantes a serem observadas
Para descobrir se deve imprimir um
O
ou um_
,((r._2 % 2) + c._2) % 2 == 0
é utilizado o condicional .r._2
refere-se ao índice de linha atual, enquantoc._2
refere-se à coluna atual. Se um estiver em uma linha ímpar,r._2 % 2
será 1, compensando, portantoc._2
, um na condicional. Isso garante que, nas linhas ímpares, as colunas sejam movidas por 1 como pretendido.A impressão da string
"\033[H\033[2J\n"
, de acordo com algumas respostas do Stackoverflow que li, limpa a tela. Está escrevendo bytes no terminal e fazendo algumas coisas descoladas que eu realmente não entendo. Mas eu achei a maneira mais fácil de fazer isso. Porém, ele não funciona no emulador de console do Intellij IDEA. Você terá que executá-lo usando um terminal regular.Outra equação pode ser estranha de se ver quando se olha pela primeira vez para esse código
(l * k) / 2 - (l * k + 1) % 2
. Primeiro, vamos desmistificar os nomes das variáveis.l
refere-se aos primeiros argumentos passados para o programa enquantok
refere-se ao segundo. Para traduzir(first * second) / 2 - (first * second + 1) % 2
,. O objetivo dessa equação é criar a quantidade exata de iterações necessárias para obter uma sequência de todos os Xs. A primeira vez que fiz isso, fiz(first * second) / 2
como fazia sentido. Para todos osn
elementos de cada sub-lista, existemn / 2
bolhas que podemos abrir. No entanto, isso é interrompido ao lidar com entradas como(11 13)
. Precisamos calcular o produto dos dois números, torná-lo ímpar, se for par, e mesmo se for ímpar, e então pegar o mod disso em 2. Isso funciona porque as linhas e colunas ímpares exigirão uma iteração a menos para chegar ao resultado final.map
é usado em vez de aforEach
porque possui menos caracteres.Coisas que provavelmente podem ser melhoradas
Uma coisa que realmente me incomoda nessa solução é o uso frequente de
zipWithIndex
. Está ocupando tantos personagens. Tentei fazer isso para que eu pudesse definir minha própria função de um caractere que apenas executariazipWithIndex
com o valor passado. Mas acontece que Scala não permite que uma função anônima tenha parâmetros de tipo. Provavelmente existe outra maneira de fazer o que estou fazendo sem usar,zipWithIndex
mas não pensei muito em uma maneira inteligente de fazer isso.Atualmente, o código é executado em duas passagens. O primeiro gera uma nova placa enquanto a segunda passagem a imprime. Eu acho que se alguém combinasse essas duas passagens em uma, isso economizaria alguns bytes.
Este é o primeiro código de golfe que eu fiz, então tenho certeza de que há muito espaço para melhorias. Se você gostaria de ver o código antes de eu otimizar o máximo possível de bytes, aqui está ele.
fonte
JavaScript (ES6),
246229 bytesfonte
`${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}
alguma forma ser combinada? Talvez um sinalizador booleano para primeiro determinar_O
ouO_
e depois fazer o.repeat(w).slice(w)
?Python - 290 bytes
Eu nunca fiz um desses antes - então qualquer crítica construtiva seria apreciada :)
O principal truque aqui é apenas uma compreensão de lista irritantemente aninhada. Eu poderia salvar alguns caracteres por não ter uma nova linha entre os pops, mas isso parece feio.
fonte
w
eh
como entrada (através do STDIN, como uma entrada de função ou algo semelhante), em vez de ter um código fixoH=4 W=6
. Além disso, embora nunca tenha programado em Python, acho que você pode jogar alguns espaços no seu código atual. Dicas para jogar golfe em Python também podem ser interessantes para ler, para que você tenha idéias sobre como jogar golfe ainda mais. Aproveite sua estadia! :)Carvão ,
494639 bytes (não competitivo)Verbose
fonte
APL (Dyalog) ,
6159 bytes⎕←
saídam←
m , onde m é'O_'[
…]
esses caracteres indexados por…2|
a divisão-restante-quando-dividido-por-dois da-/¨
diferença entre cada uma das⍳
coordenadas (índices) em uma matriz de⎕
entrada numérica de forma (o número de linhas e colunas )(
...)[
...]←'X'
atribuir o carácter X para um dos ...b/
filtrou-a-passo b (a ser definido),m
elementos de m, especificamente ... raveled?
um elemento aleatório (número lit.) na uma gama para+/
a soma deb←
b , onde b é'O'=
booleano para onde a letra iguais,m
m raveled⎕DL 1
D e L ay um segundo→2
Vá para a linha 2/⍨
se (lit. filtrado por)'O'∊
se a letra é um membro do⎕←m
valor emitido, em que o valor emitido é mExperimente online!
A partir da versão 16.0, será mais curto:
{0::→⋄'X'@(⊂(?∘≢⊃⊢)⍸'O'=⍵⊣⎕DL 1)⊢⎕←⍵}⍣≡'O_'[2|-/¨⍳⎕]
fonte
Python 3,
195188 bytesUsar
bytearray
edecode
parece ser mais curto do que cortar e remontar uma corda a laa[:i]+'X'+a[i+1:]
.fonte
Java 7, 317 bytes
Explicação:
Teste gif (4,6)
fonte
Perl, 148 bytes
146 bytes de código +
-pl
sinalizadores.Para executá-lo:
fonte
MATLAB (R2016b), 172 bytes
Código:
Recomendações são sempre bem-vindas! Experimente online!
Saída do Programa:
Explicação:
fonte