Vencedor: resposta de Ian D. Scott , em um byte (48 bytes)! Soberbo!
Seu programa deve aceitar a entrada de uma fração que pode ser simplificada e, em seguida, simplificada.
Regras:
- Se a fração já estiver em sua forma mais simplificada, você deverá informar o usuário
- Não há funções internas para fazer isso
- O usuário deve digitar o número em algum momento; no entanto, o método que o programa lê não importa. Pode ser com stdin, console.readline, etc. Desde que o usuário digite
9/18
(por exemplo) em algum momento, é válido - A saída deve ser feita com stdout, console.writeline, etc ...
- A fração será inserida como
x/y
e deve produzir comoa/b
- A fração deve gerar a forma mais simplificada. Por exemplo, 8/12 -> 6/9 não é válido , a única solução válida é 2/3.
- Este concurso termina em 9 de agosto de 2014 (7 dias após a publicação)
- Esta é uma questão de código-golfe , então o código mais curto vence
Respostas:
Python -
6948A primeira coisa a fazer é representá-lo no formato nativo do python para armazenar frações, a saber, a classe Fraction.
Agora simplificamos ... mas veja! Já está simplificado.
Isso conta como usar uma função interna? Não se destina especificamente à simplificação, e Fraction é uma classe de qualquer maneira, não uma função.
Eu não chamei nenhuma função simplificadora, por isso não é minha culpa se o python decidir fazer isso sozinho.
fonte
type(fractions.Fraction.__init__)
retorna emwrapper_descriptor
vez defunction
, então você poderia dizer que não é uma função. Na verdade, isso significa apenas que é implementado em c, mas qualquer coisa que não esteja na função de classe não é uma função, certo?> <> (92)
Eu sei que posso diminuir isso, vou jogar um pouco mais de manhã.
Explicação básica: As duas primeiras linhas e a segunda metade da terceira são todas para leitura de números. Infelizmente,> <> não tem como fazer isso, então a análise ocupa metade do programa.
A quarta linha é um simples cálculo iterativo do gcd. Estou surpreso com o desempenho da contagem de bytes no algoritmo real. Se não fosse pelo terrível I / O, poderia ser realmente um idioma de golfe razoável.
As duas últimas linhas são apenas para imprimir o resultado e dividir os números originais pelo MDC.
fonte
GolfScript, 49 caracteres
Execute os dois casos de teste aqui :
fonte
JavaScript 101
Pela primeira vez, uma solução que não usa o EcmaScript 6
Mas com E6 poderia ser 93
fonte
for([a,b]=[c,d]=prompt().split('/');b;[a,b]=[b,a%b]);alert(a-1?c/a+'/'+d/a:'Reduced');
86 i espero que seja matematicamente correto ...Python 2.7, 124
Solução muito simples, embora eu saiba que seria mais curto em muitos outros idiomas.
Eu usei um importado,
gcd
mas se ele conta como um redutor de fração interno, ele pode ser implementado diretamente.fonte
Python 2 (82)
Imprime um booleano posteriormente para dizer se o original estava na forma mais simples. Apenas faz o algoritmo GCD usual. A maioria dos caracteres é gasta na entrada / saída.
fonte
input()
?print
,map
ser descompactado e talvez inteiro, em vez da divisão float.map
ser desembalado?a,b=map(int,...)
não requer caracteres extras, pois éa,b=...
descompactado automaticamente. O problema que você às vezes encontra com o Python 3 é quemap
não produz uma lista, mas um objeto de mapa que exige a transformação em uma lista antes que você possa fazer algo como cortá-la. Uma expressão como*l,=map(...)
é necessária para atribuirl
como uma lista.PHP> = 7.1, 76 bytes (não-concorrente)
Versão Online
fonte
C, 94
Apenas adivinhe a força bruta e verifique se o GCD começa em a | b até 1;
fonte
c;d;f(a,b){b?f(b,a%b):printf("%d/%d",c/a,d/a);}main(){scanf("%d/%d",&c,&d);f(c,d);}
Rebmu (104 caracteres)
Não silencioso:
fonte
PHP 156
meh.
Corre:
Aqui está uma versão não-gasta com alguns testes (modificados em forma de função):
fonte
Java,
361349329 (obrigado @Sieg pelaint
dica)Sei que não é curto, mas estou hipnotizado com o que fiz.
Para usá-lo, compile o código e execute-o passando os argumentos pela linha de comando.
doubles
e a tarefa não exige).Ungolfed (se alguém quiser ver essa bagunça):
fonte
int
vez deInteger
, mesmo no código de produção. Int é alocado da pilha, enquanto inteiro é da pilha.new Integer(str)
terá o mesmo resultado queInteger.parseInt(str)
. Além disso, por que não usarString f=""
(sempre)?new Integer(str)
cria umInteger
fora de uma string, mas nãoInteger.parseInt(str)
faz a mesma coisa? E a coisa comString f=""
, eu sei que eu deveria usá-lo maisString f=new String()
, mas eu não sei porque eu não, talvez seja um mau hábito: PInteger.parseInt
realmente faz a mesma coisa, mas com alguns valores em cache para uma pesquisa mais rápida.Ruby - 112 caracteres
g
é um lambda auxiliar que calcula o GCD de dois números inteiros.f
recebe uma fração como uma string, por exemplo'42/14'
, e gera a fração reduzida ousimplest
se o numerador e o denominador são relativamente primos.Alguns casos de teste:
Resultado:
Note que, embora contra as regras, Ruby tenha
Rational
suporte, então poderíamos fazerfonte
JavaScript
(91)(73)Retorna '/' quando a fração já está em sua forma mais simples. A função g calcula o gcd. BTW: Existe alguma maneira mais curta para '1 == something' em que algo é um número inteiro não negativo?
function s(f){[n,m]=f.split(b='/');g=(u,v)=>v?g(v,u%v):u;return 1==(c=g(n,m))?b:n/c+b+m/c;}
Obrigado a @bebe por uma versão ainda mais curta:
fonte
s=f=>...
e atribua g ao usá-la(g=...)(n,m)
, passe-a para c e teste se é igual a 1 porc-1?not_equals:equals
e tente evitar o retorno. Resultado:s=f=>([n,m]=f.split(b='/'),c=(g=(u,v)=>v?g(v,u%v):u)(n,m))-1?n/c+b+m/c:f;
73 (Devolve a forma mais simples (f), se não puder ser reduzido)function
ereturn
. E obrigado pelas-1
=)Lua -
130115 caracteres10/10 eu realmente tentei
Eu aproveitei totalmente a capacidade de Lua de converter automaticamente uma string em um número ao realizar operações aritméticas em uma string. Eu tive que adicionar "+0" no lugar do número para obter algum código de comparação.
Desculpe, eu não tenho uma versão não-destruída, a descrição acima é como eu a escrevi
fonte
Lote - 198
Entrada é dividida como
a/b
, em seguida, para cadac
emb,b-1,...1
vamos verificar sea
eb
são divisíveis porc
, e dividi-los porc
se eles são. Então voltamosa/b
fonte
Befunge 93 (192)
fonte
C 135
Aceita entrada para 2 números inteiros separados por espaço. Mantém a divisão pelo mínimo de a & b abaixo de 1 para encontrar o GCD.
fonte
Java (200)
A melhor solução anterior em Java ainda tinha> 300 bytes, esta possui 200:
Isso usa o módulo (mais rápido) para determinar o MDC em vez de iterar todos os números.
fonte
class M