Frações intermediárias
O desafio:
Você precisará criar um código que leve pelo menos três entradas; 2 números inteiros e "uma representação de fração" - qualquer que seja o tipo que se adequa ao seu idioma para representar os incrementos de fração), ie. Se você escolher uma string, a entrada será "1/4" ou você poderá escolher 2 entradas inteiras extras ou uma tupla ou w / e.
A entrada pode ser razoável em qualquer lugar (STDIN, argumentos de função, de um arquivo, etc.), assim como a saída (STDOUT, valor de retorno da função para um arquivo, etc.)
Regras:
- A "fração" de entrada sempre será uma fração válida, menor que 1; exemplo "1/4"
- O segundo número inteiro de entrada sempre terá um valor mais alto que o primeiro número inteiro. Ou seja, o primeiro número inteiro de entrada sempre terá um valor menor que o segundo.
- Os números inteiros de entrada podem ser negativos.
- As frações produzidas devem ser reduzidas o máximo possível (simplificado)
O código precisará gerar cada "passo de fração" entre os 2 números em incrementos da fração de entrada.
O código deve ser um programa ou função, conforme indicado aqui
Exemplo 1:
Entrada: -2,3,"1/2"
Resultado:
-2
-3/2
-1
-1/2
0
1/2
1
3/2
2
5/2
3
Exemplo 2:
Entrada: 1,2,"2/3"
Resultado:
1
5/3
2
ou
1
4/3
2
Nota: A contagem pode começar em qualquer direção (obrigado @Mego)
Isso é código-golfe , então a resposta mais curta em bytes vence.
fonte
Respostas:
Oitava,
3430 bytesAgora leva a fração como uma expressão numérica em vez de numerador e denominador separados.
Amostra em ideone
fonte
@(a,b,c)rats(union([a:c:b],b))
?1/2
uma entrada numérica em vez de string), mas não é assim que eu interpreto "uma representação de fração". Se o OP concordar, ficarei feliz em cortar 4 bytes.Mathematica, 16 bytes
Uma função sem nome que pega dois números inteiros e um número racional e retorna uma lista de números, por exemplo:
O Mathematica
Range
faz exatamente o que o desafio pede, exceto que omite o limite superior se a diferença entre o limite inferior e o superior não for exatamente um múltiplo do tamanho da etapa. Portanto, pegamos oUnion
(usando⋃
) com a lista que contém apenas o limite superior, o que garante que ele apareça exatamente uma vez. Observe queUnion
classificará o resultado, mas queremos que seja classificado de qualquer maneira, pois o tamanho da etapa é sempre positivo. Além disso, como estamos trabalhando com argumentos, eles são automaticamente reduzidos o máximo possível.fonte
T-SQL 2012+,
831535477270246240219 bytesObserve que este é um liner - o sql não possui função de compilação para reduzir a fração. Pode não ser o melhor idioma para esse tipo de pergunta. É legível por humanos (mais ou menos - em comparação com alguns dos outros idiomas).
Experimente online
fonte
@n
ou@d
para simples@
. Sua consulta CTE para N poderia serN AS(SELECT N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N))
ouN AS(SELECT 1N FROM sys.all_views)
. Dado que é quase garantido que haja algumas centenas nessa visualização, você também pode reduzir as junções cruzadas.ISNULL
é menor do queCOALESCE
e deve funcionarPython 2, 81 bytes
Experimente online
fonte
Haskell,
3126 bytesAvaliação preguiçosa FTW! Demo:
(Fui inicialmente tentado pela
[a,a+c..b]
notação de Haskell , mas ela tem algumas peculiaridades que exigem algo comof a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]
41 bytes ouf a b c=[x|x<-[a,a+c..],x<b]++[b]
33.)fonte
import Data.Ratio
na sua contagem de bytes também, acho que você não pode usarf
sem isso, certo?Data.Ratio
porf
si só, porque é polimórfico para todos os tipos numéricos. No entanto, quando você quiser chamá-lo com valores do tipoRatio
, precisará da importação. O desafio requer apenas "criar código que ...", não usá-lo. Eu acho que está tudo bem sem a importação.%
operador criar as frações de teste1 % 2
e2 % 3
. Não estou trapaceando aqui: você pode realmente colocar esses 26 bytes em um arquivo sozinho, executar o intérprete nesse módulo e ter a interação que eu exibi. (Você pode até mesmo evitar a digitaçãoimport Data.Ratio
na interação demo, se você em vez soletrar%
comoData.Ratio.%
.)MATL ,
1615 bytesIsso pode falhar para denominadores muito grandes. Espero que o formato de saída seja aceitável.
Experimente online!
fonte
Ruby ,
325448 bytesEssa solução é baseada na resposta Python do Mego e assume que
c
sempre será umRational
formato de fração de Ruby. Experimente online!Editar: Corrigido um erro em que números inteiros não eram apresentados como números inteiros. -6 bytes graças a Not That Charles e MegaTom.
As funções são chamadas desta maneira:
fonte
Rational
forma de3
em Ruby é(3/1)
.step(b,c).map
deve reduzir a contagem de bytes aqui(a==a.to_i)
pode sera%1==0
de -4 bytes.-2,3,1/2r
(exemplo 1) imprime o último3
duas vezes.Julia, 14 bytes
Isso é semelhante à resposta do Mathematica, exceto que os intervalos de Julia já estão no formato desejado, portanto é ainda mais curto. Também retorna uma coleção de números. Exemplo de saída:
Observe que os números inteiros são exibidos com 1 no denominador e uma barra dupla é usada para frações. Para obter a saída exatamente como definido na pergunta, é necessário mais código:
fonte
Matlab com caixa de ferramentas simbólica / oitava com SymPy, 27 bytes
Obrigado a @sanchises por apontar um erro, agora corrigido
Esta é uma função anônima. Para chamá-lo, atribua a uma variável ou use
ans
.Exemplo:
fonte
c
você pode usar, cito, o tipo que melhor se adequa ao seu idioma para representar os incrementos de fração [...] ou p / e . Eu acho que é bem claro quesymbolic
é uma opção lógica e permitida (o @VisualBean pode querer confirmar isso). O resultado do operador de dois pontos é então 'atualizado' para umasymbolic
matriz, o que significa que você pode se livrarsym()
completamente da chamada.Javascript,
108 90 8681 bytesUma função anônima. Após a atribuição a uma variável nomeada com espaço em branco:
Exemplos de teste:
Uma abordagem imperativa usando javascript, sem recursão, biblioteca ou programação funcional.
fonte
Smalltalk - 89 bytes
Pela primeira vez, o Smalltalk é quase competitivo!
Ligue assim:
fonte
R - 71 bytes
Supõe que você já instalou o
MASS
pacotefonte
Pyret, 56 bytes
Toma no início (b), final (e), numerador (n) e denominador (d). Cria um intervalo de números inteiros, divide-os e anexa o final da lista (vinculando e classificando).
fonte