Escreva um programa que aceite dois números como entrada. A primeira é o número de dimensões - 0 para um ponto, 1 para uma linha reta, 2 para um círculo, 3 para uma esfera. O segundo número é o raio do objeto ou, se é unidimensional, o próprio número. Saída 0 para 0 dimensões. A saída é o comprimento / área / volume do objeto.
Se chamarmos o primeiro número n
, o segundo r
e a saída x
, obtemos o seguinte:
para n = 0, x = 1
para n = 1, x = 2 × r
para n = 2, x = r 2 × π
para n = 3, X = ( 4 / 3 ) r × 3 × π
e assim por diante ... se você quiser, no entanto.
Notas:
Casos em que um ou ambos os números são negativos ou quando o primeiro número não é inteiro, não precisam ser cobertos.
O programa não deve ler nenhum arquivo e a única entrada são esses dois números.
A saída deve usar apenas números (por exemplo, não "14 * pi") e deve ter precisão de pelo menos dois dígitos decimais.
Quanto a n = 0, você pode gerar 0 se ele diminuir o código.
Ganhos extras por uma resposta que abrange até 4 "esferas" dimensionais e mais!
É código-golfe , então a resposta mais curta em bytes vence!
Exemplos:
1 1 -> 2
2 3 -> 28,27
3 1 -> 4,19
3 4,5 -> 381,70
1 9.379 -> 18.758
0 48 -> 1
== r
é a esfera, o conjunto de pontos com distância da origem<= r
é a bola. Então, são 0 bola = ponto, 1 bola = segmento, 2 bola = disco, 3 bola = bola, 4 bolas, 5 bolas, etc. (listado como "n
-ball = nome comum").Respostas:
Gelatina , 13 bytes + ganhos extras
Experimente online!
Funciona para qualquer dimensão, desde que o valor fixo de π gerado por
ØP
(3.141592653589793
) seja suficientemente preciso.Quão?
fonte
Mathematica, 18 bytes, até ~ 168,15 trilhões de dimensões
Função anônima. Pega dois números como entrada e retorna um número inexato como saída. Funciona com qualquer número de dimensões. Saídas
1.
para n = 0. Usa a fórmula do Volume de um n-ball na Wikipedia.Explicação
Estamos tentando calcular π n / 2 / Γ ( n / 2 + 1) · R n ou
N[Pi^(n/2)/Gamma[n/2 + 1] R^n]
no Mathematica. No nosso caso,#
(primeiro argumento) é N e#2
(segundo argumento) é R . Isso nos deixa comN[Pi^(#/2)/Gamma[#/2 + 1] #2^#] &
, que pode ser jogado da seguinte maneira:e assim, nosso programa original.
fonte
!
funciona para não integrais. Usando Mathematica para este quase se sente como fazer batota ... :)JavaScript (ES6), 45 bytes + ganhos extras
A fórmula recursiva da wikipedia deve funcionar para qualquer número de dimensões
fonte
R,
754038 bytes (mais ganhos adicionais)Bem, parece que eu poderia resolver isso cedendo e usando a função gama em vez de funções recursivas.
Define uma função anônima para calcular o volume de uma
n
hiperesfera de raio tridimensionalr
.Alguns exemplos:
Solução Swagless,
3834 bytesPor menos bytes, você pode ter uma função anônima que funciona apenas para as dimensões de 1 a 3. Retorna
numeric(0)
paran=0
eNA
paran>3
. (numeric(0)
é um vetor numérico de comprimento 0;NA
é para "não disponível".) O desempenho é idêntico à solução geral acima.fonte
Haskell,
746536 bytes + ganhos adicionaisFórmula recursiva, funciona para todas as dimensões que podem ser apresentadas exatamente como um número de ponto flutuante de precisão dupla, mas fará um loop infinito para dimensões não integrais. A versão antiga por causa da posterioridade:
Funciona para todas as dimensões. Usa a fórmula do manifesto tau .product[n,n-2..1.1]
é um truque fatorial duplo que não conta zero paran==2
fonte
JavaScript,
61514943 bytes0-3 dimensões são suportadas porque não há quarta dimensão .
Obrigado a @Hedi por salvar 7 bytes
Cria função
d
. Em seguida, aumentar
para an
potência th e multiplica-a com um número, dependendo don
uso de operadores ternários. Saídas1
paran=0
Dá saída a pelo menos 2 casas decimais (10+ dp)
Aqui está um trecho de lanche!
fonte
3 dimensions that behave in the same way and one that behaves in a different way
- Nesse ponto, ele parece estar dizendo que há uma quarta dimensão, mas não a 1ª, 2ª ou 3ª!MATL , 17 bytes
Isso funciona até 3 dimensões apenas. As entradas estão na ordem inversa, ou seja:,
r
entãon
.Experimente online!
Considere
r=3
,n=2
como um exemplo.fonte
Java / C / C ++ / C #,
6967 bytes + ganhos extras!Editar: salvou 2 bytes graças a @AlexRacer
Uma função diádica - o primeiro argumento é o número de dimensões, o segundo é o raio da bola n.
float v(int n,float r){return n<1?1:n<2?2*r:6.283f*r*r*v(n-2,r)/n;}
Fórmula recursiva para o volume de uma bola n: V n = (2πr 2 V n-2 ) ⁄ n
Uau! Java (minha linguagem de teste) vence o Scala aqui, graças à
?:
sintaxe ternária concisa ! Esta função está sintaticamente correta nos 4 idiomas do cabeçalho e a testei com C (MinGW GCC 5.4.0) e C # (VS Ultimate 2016, C # 6.0). Estou assumindo que ele funcionará em C ++ também, então está aí. Como essa função é praticamente independente da biblioteca, deve funcionar em qualquer linguagem semelhante a C com sintaxe semelhante.fonte
n==0
pode ser encurtado paran<1
e tambémn==1
paran<2
Haskell,
52 bytes para recuo da tabulação42 bytes + ganhos extrasEditar: salvou 10 bytes graças a @WChargin
Uma função curada diádica - o primeiro argumento é o número de dimensões, o segundo é o raio da bola n.
Fórmula recursiva para o volume de uma bola n: V n = (2πr 2 V n-2 ) ⁄ n
Salve isso como um arquivo de script separado e execute com o GHCi, com uma função para testar
v
a saída, por exemploshow (v 3 4.5)
,. Eu não testei isso, por favor me avise se isso não funcionar.Programa antigo com aproximação 6.2832 para 2π substituído (50 bytes com recuo de tabulação):
Isso pode ser usado com o GHCi no modo de múltiplas linhas (usando
:set +m
ou colocando o código entre:{
&:}
, os gabinetes estando em suas próprias linhas. É necessária a função de testador.A digitação estática com inferência de tipo de programa completo entra em jogo aqui, permitindo que Haskell se saía muito melhor que Scala e se aproximando do Groovy, mas não superando isso graças à correspondência de padrões em vez de um ternário, envolvendo alguma repetição de caracteres.
fonte
2*pi
para6.2832
, e 47 se você deixar cair os parênteses em torno da chamada recursiva:let{v 0 r=1;v 1 r=2*r;v n r=2*pi*r*r*v(n-2)r/n}
...let{}
e substitua meus pontos-e-vírgulas por feeds de linha para obter apenas 42 bytes (sem seguir a nova linha).Raquete 69 bytes (mais ganhos extras)
Usa fórmula recursiva em https://en.wikipedia.org/w/index.php?title=Volume_of_an_n-ball§ion=3#Recursions
Incluindo sugestões de @wchargin
Sem golfe (v = volume, d = dimensões, r = raio):
Teste:
Resultado:
fonte
v
não é vinculada (para não mencionar os outros parâmetros). Certamente você precisa contar(define(v d r))
também? Isso gera até 82 bytes ...cond
porif
expressões aninhadas , reduzindo-o para 78 bytes por(define(v d r)(if(= d 0)1(if(= d 1)(* 2 r)(*(/(* 2 pi(* r r))d)(v(- d 2)r)))))
.match
para obter(define(v d r)(match d[0 1][1(* 2 r)][_(*(/(* 2 pi(* r r))d)(v(- d 2)r))]))
.Perl, 63 bytes + ganhos extras
Aceita dois números inteiros n e r, um de cada vez, e depois gera o volume n para o raio r dado de uma n esfera. Quando n = 0, V = 1 e quando n = 1, V = 2r. Todas as outras dimensões são calculadas pela seguinte fórmula:
Como r n é o fator do raio em todas as fórmulas, deixo-o fora do cálculo base e só o aplico no final.
2π é aproximado no código por 6.283.
fonte
Scala, 53 bytes
Desculpe, nenhum ganho extra para mim :(
Explicação:
fonte
JavaScript (ES6), 39 bytes, sem ganhos
fonte
Python 3,
767268 bytes + ganhos extras!Solução recursiva com ganhos extras!
Retorna
0
paran=0
Abordagem antiga (
1
paran=1
):Fórmula recursiva da Wikipedia .
Experimente online.
fonte
Python 3, 56 bytes + ganhos extras!
Simples com ganhos extras!
Fórmula padrão.
Experimente online
fonte
Scala,
8179 bytes + ganhos extras!Editar: salvou 2 bytes graças a @AlexRacer
Uma função diádica - o primeiro argumento é o número de dimensões, o segundo é o raio da bola n.
def v(n:Int,r:Float):Float=if n<1 1 else if n<2 2*r else 6.2832f*r*r*v(n-2,r)/n
Fórmula recursiva para o volume de uma bola n: V n = (2πr 2 V n-2 ) ⁄ n
A falta de inferência de tipo de Scala para tipos de retorno de funções recursivas e parâmetros de função e sintaxe ternária detalhada dói bastante aqui :(
fonte
Groovy,
4947 bytes + ganhos extras!Editar: salvou 2 bytes graças a @AlexRacer
Uma função diádica - o primeiro argumento é o número de dimensões, o segundo é o raio da bola n.
def v(n,r){n<1?1:n<2?2*r:6.2832*r*r*v(n-2,r)/n}
Fórmula recursiva para o volume de uma bola n: V n = (2πr 2 V n-2 ) ⁄ n
Digitação dinâmica FTW!
Minhas respostas Scala e Java usam a mesma lógica, mas com digitação estática, contagens de bytes mais altas devido às anotações de tipo :(. No entanto, Scala e Groovy me permitem omitir
return
o ponto e vírgula, de modo que ajude a contagem de bytes, ao contrário do Java / C ...fonte
Lithp , 96 caracteres + ganhos extras
Linha dividida em 2 para facilitar a leitura:
Pensando que preciso atualizar meu analisador para exigir menos espaços. O tamanho do código seria bem reduzido, especialmente nessa
((/ (* (* (* (*
seção.Uso:
Agradecemos a Rudolf por remover alguns bytes.
fonte
3.141592653589793
" para "3.1416
", salvar 11 bytes e ainda se encaixar nas regras?CJam (27 bytes com crédito extra)
Conjunto de testes online . Este é um bloco anônimo (função) que recebe argumentos
d r
na pilha e deixa o resultado na pilha.Dissecação
A fórmula n-dimensional geral pode ser reescrita como
fonte