Desafio
Trabalhadores de fábrica são geralmente muito trabalhadores. No entanto, o trabalho deles agora está sendo substituído por máquinas.
Você precisa escrever um programa que aceite um número como entrada. Ele imprimirá uma fábrica de 10 trabalhadores 10 vezes. Toda vez, cada trabalhador tem a 1/input
chance de ser demitido e substituído por uma máquina.
Entrada
Um número inteiro, proveniente de STDIN ou de uma chamada de função.
Resultado
10 casos da fábrica, cada um com geralmente mais trabalhadores demitidos.
Formato de saída - como imprimir uma fábrica
Uma fábrica fica assim:
|0000000000|
ou |0000011001|
Um tubo representa as paredes, um 0 representa um trabalhador e um 1 representa uma máquina; portanto, a primeira impressão da fábrica será sempre |0000000000|
.
Exemplo
Entrada: 10
Resultado:
|0000000000| //always start off with this
|0000000010| //a 1/10 chance means that this worker lost his job
|0000010010|
|0010010010|
|1010010010|
|1010110010|
|1010110011|
|1010111011|
|1010111111|
|1110111111|
Entrada: 5
Resultado:
|0000000000| //always start here
|0000001001| //a 1/5 chance means that 2 workers got fired
|1000101001|
|1000101111|
|1101101111|
|1111111111| //after achieving all machinery, the machines continue to be printed
|1111111111|
|1111111111|
|1111111111|
|1111111111|
NOTA
O número de trabalhadores demitidos é ALEATÓRIO - nos meus exemplos 1/5 chance
, sempre haveria 2 trabalhadores demitidos, mas seu programa precisa fazer isso aleatoriamente - às vezes 1 e às vezes 3 - eles têm apenas 1/5 de chance de serem demitidos.
Respostas:
Japt
-R
,2221201918 bytesTente
Explicação
fonte
R ,
9289 bytesExperimente online!
Ungolfed:
fonte
replicate
efor
loops sem sucesso, no entanto, mas com suas dicasDo-while loops
, finalmente percebi o quão{
potencialmente isso é abusivo . Estendi esse abuso a um exemplo comfor()
uma solução de 92 bytes. Talvez você já tenha percebido as implicações do{
abuso quando escreveu esse post, mas eu percebi agora. tio.run/##K/r/…"for"
quase sempre não é melhor do que issofor
, e às vezes é pior !pmax
pode ser usado. Aqui está o meu argumento anterior sobre o{
operador. tio.run/##PZDBasNADETv@xVDfKhNjcGHXAKl5OJTT2l/...JavaScript (ES6), 84 bytes
Experimente online!
Versão recursiva, 88 bytes
Experimente online!
Quão?
Começamos com k = s = '5000000000' .
Em cada iteração:
Coagimos cada caractere i de s a um número, calculamos o módulo 5 - para que o 5 inicial seja tratado como um 0 - e executamos aleatoriamente um OR bit a bit com 1 com a probabilidade esperada 1 / n , exceto na primeira iteração .
O contador k é deslocado à direita em 3 bits. Paramos a recursão assim que k = 0 , o que fornece 10 iterações.
É importante observar que 5000000000 é um pouco maior que um número inteiro de 32 bits; portanto, é convertido implicitamente em 5000000000 & 0xFFFFFFFF = 705032704 imediatamente antes da primeira mudança bit a bit. Daí as seguintes etapas:
fonte
APL (Dyalog) , 37 bytes
Experimente online!
Quão?
10⍴0
- comece com 10 zeros.⎕←' '~⍨⍕'|'⍵'|'
- sempre que imprimir a matriz formatada,?10⍴⍺
- gerar uma matriz aleatória com valores que variam1
de entrada,⍺=
- comparação elemento a elemento com a entrada. deve marcar1
/ entrada dos elementos, dando a cada1
entrada a / toda vez,⍵+
- adicione à matriz,×
- signum. zero permanece zero, qualquer coisa maior que um volta para um.⍣10
- repita 10 vezes.fonte
Retina , 30 bytes
Experimente online!
Estou me divertindo muito com a aleatoriedade na Retina ^^
Explicação
A primeira etapa define a string com a qual trabalharemos:
Ele substitui toda a entrada por
|
uma nova linha e, em seguida, 10 linhas contendo tantos0
s quanto a entrada indica. O primeiro caractere em cada linha representará um trabalhador da fábrica.O seguinte estágio significa:
A primeira linha da sequência de trabalho contém apenas a
|
, que será o primeiro caractere impresso por cada iteração do loop (sendo o primeiro caractere da primeira linha) e também será impresso no final de cada iteração (sendo o primeiro caractere de toda a cadeia). A substituição nunca terá efeito nesta linha porque não contém nenhum dígito.Cada outra linha contém
n
dígitos; portanto, há 1 emn
chance de transformar o primeiro caractere da linha (que é o único significativo) em um1
.fonte
PowerShell ,
828069 bytesExperimente online!
Recebe entrada
$x
. Cria uma matriz de todos os zeros, salva esses dados$a
e os repete várias vezes. Convenientemente, a fábrica é tão ampla quanto vale as iterações. A cada iteração, produzimos nossa fábrica atual e"|$(-join$a)|"
, em seguida, percorremos cada elemento de$a
.Dentro, estamos selecionando o elemento atual
$_
que foi-b
inaradoor
com1
base naRandom
chance baseada na entrada$x
. Por exemplo, para a entrada10
,Get-Random -max 10
vai variar entre0
e9
e seja0
aproximadamente 1/10 do tempo. Assim, com o!(...)
empacotamento deRandom
, obteremos1
aproximadamente uma1/input
quantidade de tempo e a outra1-1/input
quantidade de tempo$_
. Sim, isso às vezes significa que estamos substituindo um1
por outro1
, mas tudo bem.Essa matriz resultante é então armazenada de volta
$a
para a próxima rodada. Todas as seqüências resultantes são deixadas no pipeline e o implícitoWrite-Output
na conclusão do programa nos fornece novas linhas de graça.-2 bytes graças ao Veskah.
-11 bytes, graças apenas ao ASCII.
fonte
$a
quando já estamos fazendo um loop? lol E esse é um truque inteligente com o-bor
. Obrigado!Perl 6 , 58 bytes
Experimente online!
+(1 > $_ * rand)
gera um único bit com a frequência necessária de1
s.xx 10
replica essa expressão dez vezes para produzir uma única instância de fábrica como uma lista de bits e[~]
une essa lista em uma única sequência.xx 9
replica essa expressão geradora de cadeia de fábrica nove vezes e, em seguida,[\~|]
realiza uma redução triangular (que alguns outros idiomas chamam de "varredura") com o operador ou a cadeia de caracteres~|
, para que um trabalhador acionado em uma iteração anterior permaneça acionado nas versões posteriores.fonte
for
. Bate a solução baseada em número em que{say "|{.join}|"for [\<<+|>>] (?$++X*!<<^$_).roll(10)xx 10}
eu estava trabalhando em dois bytes. Com[\Z+|]
isso, seriam 56 bytes, mas isso não funciona por algum motivo.$_*rand
por.rand
. A maneira como interpreto as regras, retornando uma lista de strings "factory" também deve estar OK.Python 2 ,
104103 bytesExperimente online!
fonte
Gelatina , 22 bytes
Um programa completo que aceita o número inteiro como entrada de linha de comando e imprime a saída em STDOUT.
(Como um link monádico, ele retorna uma lista de caracteres e números inteiros.)
Experimente online!
Quão?
Decide efetivamente em cada estágio se cada trabalhador (incluindo qualquer máquina) perde seu emprego (com uma chance em N), no entanto, as máquinas são substituídas por máquinas (usando OR lógico).
fonte
MATL , 26 bytes
Experimente online!
Explicação (longa)
Exemplo de conteúdo da pilha é mostrado ao longo do caminho. Em cada etapa, o conteúdo da pilha é mostrado de baixo para cima.
fonte
JavaScript (Node.js) ,
1059390 bytesExperimente online!
+2 bytes para colocar a matriz dentro da função, graças a @Shaggy por apontar isso
Experimente online!
fonte
w
, precisam ser declaradas dentro da sua função.C (gcc) ,
110106 bytes-4 bytes de @ceilingcat
Experimente online!
Repete uma lista de caracteres para cada rodada de substituições.
Ungolfed:
fonte
SmileBASIC, 75 bytes
fonte
Perl 5 , 44 bytes
Experimente online!
fonte
05AB1E , 22 bytes
Experimente online!
Deveria haver mais espaço para jogar golfe.
TÅ0
- Empurre uma lista de 10 zeros.TF...
- Faça isso 10 vezes:DJ
- Duplique o item atual e junte-se a ele.'|.ø=
- Cercá-lo com dois|
imprima em STDOUT.ITи
- Repita a entrada 10 vezes.€L€Ω
- E para cada ocorrência, obtenha um elemento aleatório de [1 ... N] . (Pode haver um built-in para isso que eu ainda não vi)Θ
- Pressione 05AB1E truthified ™. Para cada, verifique se é igual a 1 .s...~
- Lógico OU o resultado pelo item atual.fonte
JavaScript, 83 bytes
Mostrar snippet de código
fonte
Java 10,
153152131 bytes-18 bytes graças a @ OlivierGrégoire , e mais -3 bytes ao converter o Java 8 em Java 10.
Explicação:
Experimente online.
fonte
var
porString
para Java 9 e abaixo e por mais 3 bytes. Basicamente, mesclei os dois loops que você tem.Carvão ,
302927 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Empurre uma sequência de 10
0
s para a lista vaziau
.Repita o próximo comando 10 vezes.
Para cada caractere da última string, repita-a
n-1
vezes, adicione1
ae escolha um caractere aleatório da string. Isso dá a1/n
chance de mudar o personagem para a1
. O resultado é enviado parau
.Mapeie a lista de cadeias de caracteres, envolvendo cada uma delas
|
e imprima implicitamente cada uma em sua própria linha.fonte
Python 3 , 132 bytes
Experimente online!
fonte
APL + WIN,
30 4035 bytesPerdeu o bit sobre nenhum espaço; (- fixo & graças a Uriel por -3 bytes
Solicita a entrada na tela do número
Explicação semelhante à de Uriel:
fonte
9 10⍴?90⍴5
→?9 10⍴5
. Você também precisa eliminar os espaçosVBA, 144 bytes
Recuado para facilitar a leitura:
Aproveita 2 pontos: as matrizes VBA serão padronizadas como Base 0 (assim
w(9)
é o mesmo quew(0 to 9)
) e a criação da matriz como um longo inicializará automaticamente para 0.(Irritantemente, 20 bytes são formatação automática que o VBA adiciona, mas não é realmente necessário - 19 espaços e um ponto e vírgula)
fonte
Ainda não vejo resposta para Ruby, então:
Ruby , 92 bytes
Experimente online!
fonte
rand(n)<1
vez derand(n)==0
e salve alguns usando em{..}
vez dedo..end
, por exemplo,x.times{puts'|'+z...}
Ruby, 67 bytes
Eu acho que trapacei algumas coisas aqui. Antes de tudo, essa função imprime a saída entre aspas em cada linha, por exemplo:
Se isso é inaceitável (dado que é arte-ASCII , provavelmente esse é o caso), aqui está uma solução que imprime sem aspas por 70 bytes :
Explicação:
fonte
PHP,
7170 bytesa mesclagem de loops salvou 5 bytes (novamente):
Execute como pipe
-nR
ou experimente online .edit 1: formato fixo e primeira saída (sem alteração na contagem de bytes graças ao golfe adicional)
edit 2: golf mais um byte: após a última impressão, não é mais necessário disparar ninguém.
fonte
C # (compilador interativo do Visual C #) , 131 bytes
Ei, pelo menos eu amarrei com Java.
Experimente online!
fonte