Introdução
Isso se baseia em um problema real que recentemente enfrentei ao criar um jogo de computador e achei que seria uma boa rodada de golfe com código .
Existem sete classes espectrais principais de estrelas que emitem quantidades variáveis de calor. A geologia dos planetas ao redor de uma estrela é grandemente influenciada pela quantidade de calor recebido da estrela, que é um fator de classe espectral e distância da estrela. Portanto, Mercúrio é praticamente derretido, Netuno congelado.
A galáxia do meu jogo é gerada proceduralmente e a seleção aleatória de tipos de planeta para determinadas estrelas acabou sendo um verdadeiro 'inferno de afirmações'!
O desafio
Seu método deve selecionar um planeta a partir de uma lista de tipos de planeta apropriados para a classe de estrela, com base em um limite mínimo de calor, um limite máximo de calor e um número aleatório. Por simplicidade, esse desafio usará apenas uma estrela da classe G, assim como o nosso sol.
Entradas
Um número inteiro heat
no intervalo de 4 a 11, representando a quantidade de calor recebido pelo planeta da estrela.
Variáveis
Esta tabela mostra os possíveis planetas com base em heat
. Seu método deve primeiro restringir as opções disponíveis com base no calor mínimo e no calor máximo, heat
deve cair sobre ou entre os dois. Por exemplo, com um calor de 10 passado, as únicas opções seriam Deserto, Ferro e Lava.
Planet type Heat min Heat max Random Chance
Gas Giant 4 9 15
Ice 4 6 10
Ice Giant 4 6 10
Gaia class 5 7 10
Dense Atmosphere 7 9 10
Desert 7 10 25
Iron 7 10 14
Lava 10 11 6
Em seguida, a probabilidade de um planeta (nas demais opções) ser escolhida são suas chances aleatórias divididas pela soma das chances aleatórias de todas as opções.
No exemplo acima, a probabilidade de ferro ser escolhido é 14/(25+14+6)
.
Saída
Retorne o tipo de planeta como uma string.
Faça o melhor que puder para evitar pontas de flechas lógicas. O código mais curto ganha, aponta para a criatividade. Feliz golfe!
Respostas:
Geléia , 78 bytes
Um link monádico que aceita um número inteiro (em [4,11] ) que retorna uma lista de caracteres.
Experimente online!
Quão?
Cria os intervalos de calor dos planetas como uma lista de listas e conta as ocorrências do calor de entrada nessas listas para obter uma lista de zeros e aqueles que representam os tipos de planeta possíveis e, em seguida, multiplica pelos números de probabilidade dos oito tipos de planeta. obtenha a distribuição. A distribuição é usada para repetir os nomes dos tipos de planeta e, finalmente, uma escolha aleatória uniforme é feita.
fonte
R ,
225223183 bytesAgradeço a Giuseppe pela refatoração inteligente para reduzi-lo a 188 bytes; os cinco restantes foram eliminados usando representações numéricas menos redundantes.
Experimente online!
fonte
with
,data.frame
esubset
será mais curto.JavaScript 212
Editar 6 bytes salvar thx Jonathan Allan
menos golfe
Teste
fonte
[3913, 2630, 2630, 2647, 2681, 6522, 3706, 1707]
)(z/16&15)
porz/16&15
. Independentemente disso, você pode salvar 6 bytes usando uma compressão base 8 com deslocamentos de três e seis ... uso[971,648,648,657,675,1636,932,445]
comz/8&7+3
,z%8+6
ez>>6
:)(z/8&7)+4
porque&
tem prioridade menor - seria7/8&(7+4)
Coco ,
214195 bytesExperimente online!
Uma porta Python teria
203200 bytes de comprimento:Experimente online!
fonte
Carvão ,
115111 bytesExperimente online! Link é a versão detalhada do código. Editar: salvou 4 bytes graças a @ ASCII-only. Explicação:
Subtraia 3 da entrada para que possa ser comparado com dígitos únicos.
Divida a string
0715 0410 0410 1510 3710 3825 3814 696
em espaços (os espaços parecem compactados melhor que vírgulas, mas eu não tentei nenhum outro caractere) e faça um loop sobre cada parte.Compare a entrada com o primeiro e o segundo dígitos e, se estiver entre, pressione o índice do loop o número de vezes especificado para a lista vazia predefinida, preenchendo-a.
Divida a lista de planetas em novas linhas (novamente, melhor do que vírgulas por algum motivo) e selecione o elemento correspondente a um índice escolhido aleatoriamente na lista.
fonte
R ,
196193190175171 bytesExperimente online!
Inicialmente inspirado por esta solução por @rturnbull, no entanto, como as duas apresentações evoluíram significativamente, agora isso é essencialmente uma mistura de idéias do autor original, @Giuseppe, que tem sido muito útil nos comentários e no meu. Aqui está um resumo dos pontos principais que ajudaram a diminuir a contagem de bytes:
Codificando dados do planeta como CSVColetando nomes comreadLines
para evitar o grande número de caracteres de cotação em torno de cadeias.Ajustando os parâmetros de calor para que pudéssemos usar sinais
<
e>
sinais em vez de<=
e>=
.Alterando o formato dos dados de aquecimento deHeat min, Heat max
paraHeat min, Heat Delta
para se livrar dos números de dois dígitos.Substituído pela mudança de todos os números por -3
Dividir todas as probabilidades do planeta por 5, o que também resulta em alguns dígitos a menos.
Multiplicar o vetor de probabilidades do planeta pelo vetor de booleanos (indicando se nossa entrada atende aos requisitos de calor) para anular as probabilidades de planetas inadequados.
Provavelmente, mais alguns bytes poderiam ser obtidos com a aplicação de algum tipo de compactação de dados.Eu acho que não mais.
fonte
t=
em vez de,text=
também salvará 3 bytes.read.csv
uma única coluna sugeriureadLines
para se livrar das citações inteiramente, embora você tem que definir explicitamenten
Python,
282 bytes, 261 bytes:Bastante simples - quase certo de que poderia jogar mais - Ainda está procurando uma maneira melhor de representar a faixa do planeta e os dados de probabilidade. Se i estiver no intervalo do tipo de planeta, anexa-o à lista de acordo com a probabilidade e imprime aleatoriamente um.
EDIT: Com crédito para Jonathan Frech - refiz o loop for para eliminar alguns bytes. Melhor maneira de anexar itens à lista
fonte
i in range(x[1], x[2])
exclui a borda superior do calor, ao contrário da especificação?p,d="Gas Giant,Ice,Ice Giant,Gaia class,Dense Atmosphere,Desert,Iron,Lava".split(","),[ord(i)-10 for i in"#"] d=[[p[x//3]]+d[x:x+3]for x in range(0,len(d),3)]
Oitava com pacote de estatísticas,
178176174158 bytesO código define uma função anônima que insere um número e gera uma string.
Experimente online!
Explicação
O código
define uma função anônima com entrada
h
.A corda
é dividido em vírgulas usando
O resultado é uma matriz de células de cadeias, onde cada cadeia é uma classe de planeta.
O código
define a string mostrada e subtrai
70
os pontos de código de seus caracteres. Isso fornece a matriz de valores mínimos de calor menos 1 , ou seja[3 3 3 4 6 6 6 9]
,.Similarmente,
produz a matriz de valores máximos de calor mais 1 , ou seja
[10 7 7 8 10 11 11 12]
,.As comparações
dar uma matriz contendo
true
oufalse
indicando quais classes de planeta são possíveis.Por outro lado,
define a matriz de valores de chance aleatórios,
[15 10 10 10 10 25 14 6]
,.A operação
é a multiplicação por elementos dos dois últimos arrays (
true
efalse
se comporta como0
e1
respectivamente). Isso fornece uma matriz em que cada classe de planeta tem sua chance aleatória ou0
se essa classe não é possível com base na entrada. Essa matriz será usada como pesos na amostragem aleatóriaA chamada de função
seleciona uma das células da matriz de células (primeiro argumento de entrada), usando a matriz calculada de pesos (quarto argumento de entrada). Especificamente, a função
randsample
normaliza automaticamente os pesos para probabilidades e, em seguida, faz a seleção aleatória com essas probabilidades. O resultado é uma matriz de células que contém uma sequência. O códigoé usado para extrair essa sequência, que constitui a saída da função.
fonte
Python 3 , 263 bytes
Experimente online!
fonte
Perl 5 (
-p
), 230 bytesExperimente online!
fonte
[Ice,4,5,11]
vez de[Ice,4,6,10]
etc), poderá usar em<
vez de<=
e em>
vez de>=
, economizando 2 bytes. (sim, isso não é muito ...)Nim ,
294 bytes314298Para loop agora em uma linha, sem retorno, menos bytes para o tipo implícito
4 espaços removidos (obrigado Kevin )
Experimente online!
fonte
Nim
, mas acho que você pode jogar golfe em quatro espaços: um emfor n in[(
; e três emif h>=n[1]and h<=n[2]
.05AB1E ,
7876 bytesExperimente online!
Explicação
”Œï²°™Ä²° Gaia classêη•™Äµ‰Ÿ± Lava”
empurra a corda
Gas Giant Ice Giant Gaia class Dense Atmosphere Ice Desert Iron Lava
fonte
Python 3,
199194 bytesDividir
h
em máscaras de bits separadas e valores de chance aleatórios (consulte a explicação) economiza alguns bytes, eliminando uma atribuiçãoh
e simplificando arange()
compreensão na lista.Solução anterior
Define uma função anônima que recebe um int e retorna o tipo de planeta.
Para cada tipo de planeta, um valor de 13 bits foi calculado. Os 8 bits superiores definem uma máscara de bit de valores de calor válidos para esse tipo de planeta. Os 5 bits inferiores são a chance aleatória desse tipo de planeta. Por exemplo, "classe Gaia" é um tipo válido para os valores de calor 4 a 7, portanto, possui uma máscara de
0b00001111
. Tem uma chance aleatória de 10 ou0b01010
. Combiná-los resulta no valor de 13 bits0b0000111101010
para o tipo "classe Gaia". Os valores de 13 bits para cada tipo de planeta são concatenados para obter o valor parah
(os 13 bits mais baixos são para o tipo de planeta "Ice"). (A resposta mais recente não combina esses valores).A compreensão da lista itera sobre os valores de 13 bits para criar uma lista de pesos, onde o peso é a chance aleatória se o tipo de planeta for uma opção válida para o valor de calor fornecido e, caso contrário, zero. Para cada tipo de planeta,
(h>>i&31)
extrai a chance aleatória desse tipo de planeta.(h>>i+n+1&1)
avalia para 1 se o tipo de planeta é uma opção válida para o valor do calorn
e avalia para 0 caso contrário.A função de biblioteca
random.choices(choices, weights)
seleciona um item da lista de opções com base na lista de pesos.fonte
i+n+1
pode seri-~n
. TIORuby ,
214193bytesExperimente online!
fonte
Haskell ,
377364358318312270265262256251 bytes(Adicionei quebras de linha para obter uma impressão melhor). A tarefa diz "retornar", não "imprimir", assim
f
como uma função que retorna o nome do planeta selecionado aleatoriamente naIO
mônadaf :: Int -> IO String
,.O
main
émain = do {f 10 >>= print}
( dicas de golfe Haskell diz que não conta). Impressões(edições:
&
caso base removido ; movidomain
para fora; alterado para quádruplos eunzip
, e mudou para guardas de padrões e>>=
seguindo as sugestões de Laikoni , obrigado!; implementou a abordagem da solução Jelly , repetindo os nomes; o tipo explícito não é mais necessário ; outro conselho de Laikoni economiza mais 3 bytes; transformou-o em umaIO
função; conselho implementado da sala de bate-papo).Experimente online!
fonte
Java 8,
398384bytesDefinitivamente, pode ser jogado um pouco mais, mas a probabilidade em combinação com o Strings não é muito fácil em Java.
Explicação:
Experimente online.
fonte
Mínimo ,
280277 bytesComeça com o calor na pilha, deixa um barbante na pilha. O mesmo processo geral da resposta do Python 2.
Explicação
Observe que min é concatenativo
fonte
PowerShell, 56 + 135 (arquivo CSV) + 1 (nome do arquivo) = 192 bytes
Experimente online! (esta é uma versão ligeiramente modificada que cria o arquivo CSV temporário descrito abaixo)
Importa um arquivo CSV usando
ipcsv
(abreviação deImport-CSV
) nomeadoa
no diretório local que contém o seguinte:Isso cria automaticamente uma hashtable iterável de coisas como as seguintes:
Em seguida, usamos
Where-Object
(?
) para retirar as entradas onde o nosso inteiro de entrada$z
é-in
a gama$_.m
de$_.x
(ou seja, é na faixa de calor). Em seguida, os bombeamos para umForeach-Object
loop (%
) que cria uma matriz de cadeias de nomes com base na chance aleatória desses nomes. Por exemplo, isso criará uma matriz de15
"Gas Giant"
seqüências de caracteres se esse calor corresponder. Em seguida, colocamos asGet-Random
que puxam a corda apropriada com a ponderação apropriada.fonte
PHP , 1236 bytes
Experimente online!
fonte