Você receberá o nome de um dos 20 maiores objetos do Sistema Solar. Sua tarefa é retornar uma aproximação de seu raio, expresso em quilômetros.
Esse é um desafio de código em que sua pontuação consiste no comprimento do seu código (em bytes) multiplicado por uma taxa de penalidade , com base na sua pior aproximação. Portanto, a pontuação mais baixa vence .
"Enquanto viajamos pelo universo" é a última linha da música Planet Caravan do Black Sabbath , também posteriormente coberta por Pantera .
Os objetos do Sistema Solar
Fonte: Wikipedia
NB: A classificação é dada apenas para informação. A entrada é o nome do objeto.
n | Object | Radius (km)
----+----------+-------------
1 | Sun | 696342
2 | Jupiter | 69911
3 | Saturn | 58232
4 | Uranus | 25362
5 | Neptune | 24622
6 | Earth | 6371
7 | Venus | 6052
8 | Mars | 3390
9 | Ganymede | 2634
10 | Titan | 2575
11 | Mercury | 2440
12 | Callisto | 2410
13 | Io | 1822
14 | Moon | 1737
15 | Europa | 1561
16 | Triton | 1353
17 | Pluto | 1186
18 | Eris | 1163
19 | Haumea | 816
20 | Titania | 788
Ou como listas amigáveis de copiar e colar:
'Sun', 'Jupiter', 'Saturn', 'Uranus', 'Neptune', 'Earth', 'Venus', 'Mars', 'Ganymede', 'Titan', 'Mercury', 'Callisto', 'Io', 'Moon', 'Europa', 'Triton', 'Pluto', 'Eris', 'Haumea', 'Titania'
696342, 69911, 58232, 25362, 24622, 6371, 6052, 3390, 2634, 2575, 2440, 2410, 1822, 1737, 1561, 1353, 1186, 1163, 816, 788
Sua pontuação
Seja o raio esperado do objeto e seja a resposta do seu programa para esse objeto.
Então sua pontuação é definida como:
onde é o comprimento do seu código em bytes.
Exemplo:
Se o tamanho do seu código for bytes e sua pior aproximação for na Lua com um raio estimado de km em vez de km, sua pontuação será:
Quanto mais baixo, melhor.
Cabeçalho recomendado para sua resposta:
Language, 100 bytes, score = 302
Você pode usar esse script para calcular sua pontuação (primeira linha = comprimento do código, próximas 20 linhas = suas saídas, do Sun ao Titania).
Regras
- Você pode usar o nome do objeto em minúsculas, maiúsculas ou exatamente como descrito acima (maiúscula). Outros casos mistos não são permitidos.
- A entrada é garantida como um dos 20 nomes possíveis.
- Você pode retornar números inteiros ou flutuantes. Nos dois casos, a penalidade deve ser computada diretamente com esses valores (não valores arredondados no caso de flutuações).
- Você deve retornar valores positivos.
- Programas vazios não são permitidos.
fonte
7512
todos os casos de teste. Vou ver se vou mergulhar na criação de uma solução MathGolf em breve, mas será difícil vencer 05AB1E.Respostas:
PowerShell , 3 bytes, pontuação 3637
Experimente online!
Implementação muito ingênua, chata; apenas retorna,
20000
não importa a entrada. Experimentar coisas como a cobertura especial do sol ou o uso de valores de ponto flutuante em vez de2
todos resultou em pontuações piores porque o tamanho do código aumentou o suficiente para compensar qualquer ganho na comparação de tamanhos.fonte
Geléia , 34 bytes, pontuação = 37
A entrada está em maiúscula, a saída é a potência de 1.1 com o menor erro.
Experimente online!
Como funciona
fonte
Java (JDK) , 90 bytes, pontuação = 97
Experimente online!
Créditos
String
vez de codificá-los em umaint
matriz explícita .fonte
(...-7)
: O caractere não imprimível(char)0
está vazio, então eu tive que adicionar algo. A primeira vez que tentou9
e8
sendo um dígito, mas9
deu abas de curso, exigindo múltiplos\t
(dois bytes cada), e8
deu um erro de cerca de uma personagem sem escape usado.*100-700
e jogando com os valores como string e esses dois números, mas esses são os melhores, na verdade. Alguns valores podem diminuir o byte contagem, mas a pontuação permanece a mesma. Identificação tão aleatória feita (um dos) o melhor caso;)Wolfram Language
114 103 97 88 8682 bytes. score =114 103 97 89 8783 pontosPelo menos 6 pontos economizados graças a
Dennis
, vários mais graças alirtosiast
e mais 6 graças auser202729
.Embora o Mathematica possa buscar dados do sistema solar (assim como muitos dados astronômicos adicionais), são necessários alguns pequenos ajustes, conforme explicado abaixo.
Interpreter[#,"AstronomicalObject"]&
retornará a entidade (ou seja, o objeto computável da máquina) associado ao termo representado por#
.EntityValue[AstronomicalObject[],"Radius"]
retorna o raio, em milhas, da entidade. No caso de "Haumea", o valor 816,27 (ou seja, 507 * 1,61) é retornado.Multiplicação do raio por
1.61
conversões de milhas para km. Valores decimais, em vez de números inteiros, representam muito menos que 1% de erro, mesmo no caso mais extremo.[[1]]
retorna a magnitude sem a unidade, km. Mais tarde, isso foi alterado para#&@@
, produzindo o mesmo resultado.fonte
Python 3 , pontuação 95, 95 bytes
Experimente online!
Python 3 , pontuação 133, 133 bytes
Experimente online!
fonte
Powershell,
150141 bytes, pontuação163153Experimente online!
Script de teste:
Resultado:
Explicação:
end of line mode
é apenas LF.Exemplo:
PowerShell, 178 bytes, pontuação 178
fonte
05AB1E , pontuação
1006660 (1006156 bytes )Porta da resposta Java de @ OlivierGrégoire , por isso, se você gosta desta primeira resposta, certifique-se de vomitá-lo também!
Entrada em titlecase.
Verifique todos os casos de teste.
05AB1E , pontuação 100 (100 bytes )
Entrada em minúsculas completa. Emite o raio exato, portanto, nenhuma penalidade é adicionada.
Verifique todos os casos de teste.
Explicação:
Consulte esta dica 05AB1E (seções Como compactar números inteiros grandes? E Como compactar cadeias de caracteres que não fazem parte do dicionário? ) Para entender como a compactação usada funciona.
Eu criei uma alternativa de 70 bytes para mapear o sol600,000
; [Júpiter, Saturno] para60,000
; [Urano, Netuno] para30,000
; [terra, Vênus] para6,000
; [Marte, Ganimedes, Titã, Mercúrio, Calisto]3,000
; [io, lua, europa, triton, plutão, eris] para1,500
; e [haumea; titania] para750
. Infelizmente, obtive uma pontuação de 117. Vou ver se consigo ficar abaixo de 100 com uma abordagem alternativa mais tarde.fonte
Mathematica, 57 bytes, pontuação =
6258-4 bytes / score graças ao lirtosiast !
Apenas faz uma pesquisa no Wolfram Alpha para o raio médio.
fonte
WolframAlpha
função foi utilizada em menos quatro vezes ...Gelatina , 28 bytes, pontuação = 31
Isso usa um hash configurável embutido que eu adicionei ao Jelly na sugestão do @ lirtosiast.
A entrada está em titlecase, a saída é a potência de 1.1 com o menor erro.
Experimente online!
Como funciona
Esta resposta consiste em apenas duas partes.
“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘ḥ
usa o novo built-in para mapear cada uma das 20 entradas possíveis para 15 números inteiros diferentes.1.1*
eleva 1,1 à potência calculada.“__ʋ7ṗ“RUu⁽NM\sOSJj[FL‘
é um literal; todo caractere sem aspas é substituído pelo seu índice baseado em 0 na página de códigos de Jelly, produzindo .O hash embutido[95,95,169,55,242] 1 376510639244
ḥ
primeiro mapeia para um número inteiro incrementando cada número e, em seguida, tratando o resultado como o número inteiro básico de 250 dígitos da base bijetiva e adicionando . Isso produz .Ao dividir e dividir pela metade esse número inteiro até o resultado ser , obtemos a sequência , que possui as diferenças .0 [376510639244,188255319622,94127659811,47063829905,…,5,2,1,0] [188255319622,94127659811,47063829906,…,3,1,1]
Em seguida, geramos 64 números inteiros de 64 bits aplicando SHAKE256-4096 à representação em seqüência de caracteres da representação interna do
ḥ
argumento correto, e depois dividindo os 4096 bits resultantes em 64 pedaços de 64 bits.ḥ
agora calcula o produto escalar das 39 diferenças e os 39 primeiros números inteiros de 64 bits gerados, módulo . Isso gera um número inteiro em .A lista tem comprimento 15, então multiplicamos o número inteiro gerado por 15 e elevamos o número 64 bits do resultado. Isso gera um número inteiro em , que usamos para indexar na lista.[82,85,117,141,78,77,92,115,79,83,74,106,91,70,76] [0,15)
Para encontrar a configuração de hash apropriada, usei um brute-forcer em C que faz parte do repositório Jelly .
fonte
Python 2 , 155 bytes, score = 155
Experimente online!
Surpreendentemente bem para esta solução preguiçosa ... procurará melhorar também. ;-)
fonte
Japt , 86 bytes, pontuação = 94
Experimente para todas as entradas , calcule a pontuação ou verifique o erro mais alto
Muito parecido com a resposta original de Olivier. A entrada está toda em minúscula.
Após várias melhorias nos valores de saída, o maior erro atual é Venus, com pouco mais de 4%.
Explicação agora que as coisas estão um pouco mais estáveis:
A sequência dos nomes é
sujusaurneeavemagatimecaiomoeutrplerha
compactada usando a compactação interna do Japt. Os números que representam os raios são calculados da seguinte forma:fonte
Japt,
777675 bytes, pontuação = 75Primeira passagem para isso; Eu queria tentar uma solução de penalidade 0 para me dar uma linha de base para resolver. Voltará amanhã para ver quais melhorias podem ser feitas, espero que ainda com 0 de penalidade.
A entrada não diferencia maiúsculas de minúsculas.
Experimente ou teste todas as entradas
O
"..."
representa uma string contendo muitos não imprimíveis. Os pontos de código são:Para oferecer uma explicação rápida: a sequência é dividida em partes de 2 caracteres. Em seguida, indexamos esse array usando parte da fórmula do ovs, além de alguns agrupamentos de índice e, em seguida, mapeamos os 2 caracteres para seus pontos de código.
54 bytes, pontuação = 58
Um porto da solução de Olivier .
Teste todas as entradas
fonte
%24
:-)Ruby , 105 bytes, pontuação 109
Experimente online!
Se dividirmos 700000 pelos raios, obteremos uma sequência que aumenta razoavelmente linearmente (embora de maneira irregular). Os incrementos na tabela abaixo podem ser aproximados pelos valores ASCII dos caracteres. O problema dessa abordagem é que ela exige que a entrada seja decodificada para um valor que ordene os diferentes nomes por tamanho.
Uma questão menor é que a diferença entre Eris e Haumea é bastante grande.
~~d
São necessários três caracteres para codificar esse incremento no formato somente ASCII. A seqüência de planeta para índice possui dois espaços "planeta fantasma" para preencher o índice.fonte
T-SQL,
203 202 201196 bytes, pontuação =217 216 212208Quebras de linha são apenas para legibilidade.
A entrada é obtida através da tabela preexistente i com a coluna varchar v , de acordo com nossos padrões de IO .
Une a tabela de entrada a uma tabela na memória nos dois primeiros caracteres e retorna os dígitos restantes x100.
Trata "Titan" como um caso especial usando
IIF
.EDIT : Salva 1 byte (e 1 ponto) usando
STUFF
para apagar os dois primeiros caracteres em vez deSUBSTRING
. Obrigado, t-clausen.dk!EDIÇÃO 2 : Queria ver o que aconteceria se tentasse salvar outro byte multiplicando cada valor de pesquisa por 99 em vez de 100 e descobri, para minha surpresa, que realmente aumentava a precisão (da estimativa menos precisa) !.
Isso me levou a alguns testes de tentativa e erro e a algumas sofisticadas tabelas de dados hipotéticos do Excel, onde encontrei uma solução ideal usando um multiplicador de 89 (que, é claro, alterou todos os meus valores armazenados).
Portanto, embora isso economize apenas um byte, ele na verdade melhora minha pontuação em 4,6 da minha solução anterior.
EDIT 3 : Pesquisou mais alto em vez de mais baixo e encontrou um fator de multiplicação ainda melhor , 198 . Os valores permanecem razoavelmente precisos enquanto diminuem minha string armazenada em alguns caracteres, o que melhora minha pontuação.
fonte
PowerShell , 203 bytes, pontuação 203
Experimente online!
Muito semelhante à resposta de Olivier, agora que a vejo, mas desenvolvida de forma independente.
fonte
Carvão , 101 bytes, pontuação = 101
Experimente online! Link é a versão detalhada do código. Explicação:
Pegue o primeiro e o décimo primeiro caractere (ciclicamente) da sequência de entrada e concatene-os.
Procure-os na sequência
SuJiSrUuNtEEVVMrGnTTMcClIIMoEpToPPEiHeTa
dividida em pares de caracteres.Divida a sequência
m.w'fv&J|\"l|\"e1 c& _c Ca ;e ;* 9a 9C 31 2; 0I .7 ,N ,7 (X (<
em grupos de três caracteres e pegue o grupo correspondente.Decodifique o resultado como um número base-95 usando o conjunto de caracteres ASCII imprimíveis como dígitos. Exemplo:
Io
o 11º caractere éI
, então procuramosII
e descobrimos que é o 13º maior objeto e seu tamanho é o31
que é mapeado19 * 95 + 17 = 1822
.fonte
Swift 4 , 225 bytes, pontuação = 241
Provavelmente jogável com muito mais golfe (talvez na área "Ga-Me-Ca"?), Mas Swift não é frequentemente usado (por uma razão, talvez).
e ungolfed
Experimente Online!
Tentei diferentes "tamanhos de chave" para o mapa, mas é claro que 1 tem muitos conflitos e o uso de três caracteres não me dá
i=="Titan" ?2575:
17 caracteres, já que há "Io" para gerenciar (e vai demorar mais de 3 caracteres, Eu acho que).fonte
JavaScript (ES6), 152 bytes, pontuação = 163
Bem, é uma solução bastante padrão, mas eu gostei do desafio de qualquer maneira!
Minha pontuação:
Experimente Online!
fonte
FALSO , 152 bytes, Pontuação = 563
Resposta preguiçosa usando o tamanho das palavras e as primeiras letras, mas minha desculpa é que estou usando uma linguagem estranha
Experimente online! (copie, cole o código, pressione show e depois execute)
Meus resultados:
fonte
C (gcc) , 118 bytes, pontuação = 135
Experimente online!
Pontuação
Atropelar
O nome do objeto é transformado em um hash de caractere único através do processo complicado
cujo inchaço aponta para "Titã" / "Titânia" como os principais infratores. A inclusão do último caractere no hash foi considerada, mas isso ainda requer um
strlen()
em C. A primeira ocorrência do caractere de hash é pesquisada na cadeia de hash / data. Quando encontrado, o próximo caractere é utilizado e usado para aproximar o raio do objeto em questão.O caractere de dados contém o logaritmo natural alterado e dimensionado do raio. Gerado da seguinte forma:
A escala foi escolhida através de tentativa e erro altamente científicos e a mudança para trazer o valor para o intervalo ASCII imprimível, evitando barras invertidas. Foi necessário algum rearranjo dos objetos na sequência devido a algumas colisões de hash / dados.
fonte
Python 2 , 89 bytes, Pontuação = 234
Experimente online!
A maioria das respostas postadas parece ter usado uma estratégia de "codificação / decodificação". Gostaria de saber o quão bem eu poderia fazer, estimando o diâmetro dos corpos celestes usando uma equação simples. Foi um exercício divertido, mas a economia moderada de bytes é mais do que compensada pela penalidade de precisão.
O núcleo desta solução é a equação de estimativa:
onde x é o dobro da ordem de classificação do raio do corpo.
Gero o valor de x com base na string de entrada usando uma modificação da solução Python 2 do @Erik the Outgolfer. Salvei alguns bytes no código dele reformulando minhas equações para trabalhar com [2..40] em vez de [1..20].
O código para gerar pedidos de classificação ocupa mais de 2/3 dos bytes de toda a solução. Se alguém tiver uma maneira mais compacta de gerar classificações, essa solução poderá ser reduzida ainda mais. Por causa da penalidade de precisão (em torno de 2,6), a pontuação melhoraria bastante.
Gerando a equação
Eu usei métodos estatísticos para procurar equações simples para estimar o tamanho de cada corpo com base em sua classificação. Em parte, acompanhando as idéias da solução Ruby do @Level River St e generalizando, resolvi as equações da forma:
Trabalhando em R, usei modelos lineares no log dos raios para desenvolver estimativas iniciais e, em seguida, usei a otimização não linear, semeando a otimização com os resultados dos modelos lineares, para procurar soluções que minimizassem a função de penalidade especificada no problema.
O valor estimado de A na equação acima é de sete dígitos, então procurei uma expressão simples para salvar alguns bytes. Procurei expressões do formulário
para dois dígitos xe 1 dígito y (para um total de cinco bytes, economizando dois bytes, ou cerca de cinco pontos, considerando a penalidade) que não era muito diferente do valor ideal de A e não inflava muito a penalidade e terminava com o (inexplicável):
fonte
TI-BASIC (TI-84), 285 bytes, Pontuação = 285
Um simples "índice na cadeia de caracteres para listar" o programa. Pode ser jogado ainda mais.
A entrada está dentro
Ans
e é um dos nomes dos objetos em maiúsculas.A saída está dentro
Ans
e é impressa automaticamente.Exemplo:
Explicação:
(A lista de raios e a sequência de nomes foram abreviadas.
...
É usada para indicar o restante da lista / sequência.)Modelo Visual:
fonte