Número misto para uma fração imprópria
Neste desafio, você converterá um número misto em uma fração imprópria.
Como frações impróprias usam menos números, seu código precisará ser o mais curto possível.
Exemplos
4 1/2
9/2
12 2/4
50/4
0 0/2
0/2
11 23/44
507/44
Especificação
Você pode assumir que o denominador da entrada nunca será 0. A entrada sempre estará no formato em x y/z
que x, y, z são números inteiros não negativos arbitrários. Você não precisa simplificar a saída.
Este é o código-golfe, pelo que o código mais curto em bytes vence.
code-golf
number
parsing
rational-numbers
Downgoat
fonte
fonte
x
,y
ez
ser negativo?x,y,z
entradas separadas? A maioria das respostas pressupõe que o formato de entrada seja realmente obrigatóriox y/z
, mas algumas não são, portanto, essa pergunta tem uma resposta definitiva.Respostas:
Japonês, 10 bytes
Woohoo, atualmente batendo CJam!
Experimente online!
Como funciona
fonte
LabVIEW, 29 primitivas do LabVIEW
fonte
CJam,
161514 bytesou
Teste aqui.
Explicação
A outra versão evita o uso de uma variável usando um deslocamento de pilha um pouco mais.
fonte
'//~\S/1$b'/@
isso é 13 bytes. Edit : oh eu esqueci a entradal
.Mathematica, 58 bytes
Isso retorna o resultado simplificado. Se a saída de um número racional em vez de uma string estiver correta, podemos salvar 19 bytes:
fonte
PowerShell,
474442 bytesO riscado 44 ainda é regular 44;
Golfou alguns bytes usando regex
-split
. Golf mais um par de graças ao TessellatingHeckler trocando o regex.Ele
$args-split'\D'
pega nosso argumento de entrada e divide em caracteres que não são dígitos. Aqui, ele executa duas divisões, uma em espaço em branco e a outra no/
personagem. Os resultados são armazenados nas três variáveis usando uma atribuição simultânea. Em seguida, formulamos a saída da string como (o$l
número eft vezes o$d
enominator mais o$n
umerator) executado como um bloco de código, uma/
barra e, em seguida, o$d
enominator novamente.fonte
-split ' |/'
para salvar um caractere com uma regex "corresponder isso | ou aquele" ou usar-split '\D'
para dividir em qualquer coisa que não seja um dígito e (h) tenha dois caracteres. Se o @Downgoat quiser ser um pouco flexível no formato de saída,'{0}*{2}+{1};{2}'-f($args-split'\D')|iex
tem 40 bytes e tem uma saída muito mais fria, porque os números são iguais um acima do outro!$l,$n,$d=$args-split'\D';+$l*$d+$n;$d
é mais curto ainda aos 37 anos e segue logicamente o mesmo padrão que aqui.Java com pólo a laser de dez pés 1.03, 79 + 25 (importação) = 104 bytes
Requer
import sj224.tflp.math.*;
Isso quase certamente funcionará com a 1.04 também, mas até agora só a testei com a 1.03, porque já havia um projeto java configurado com a 1.03 no caminho da compilação.
fonte
JavaScript (ES6),
4441 bytesEconomizou 3 bytes graças a @ETHproductions !
Explicação
Muito simples.
Teste
O teste é sem atribuição de desestruturação para funcionar na maioria dos navegadores.
Mostrar snippet de código
fonte
[p,q,r]=
no lugar dep=
, em seguida, substituirp[0]
,p[1]
e,p[2]
comp
,q
er
, respectivamente. Após essa alteração, recebo 41:m=>([p,q,r]=m.match(/\d+/g),+q+p*r+"/"+r)
m.split(/\W/g)
vez disso, você pode salvar um byteJulia,
5850 bytesEsta é uma função anônima que aceita uma string e retorna um
Rational
objeto de tipo. Para chamá-lo, dê um nome, por exemplof=s->...
.Podemos tirar vantagem do fato de que a entrada pode ser manipulada levemente para ser uma expressão que é avaliada como racional. Em particular, um número inteiro mais um racional é um racional, e os racionais são indicados com barras duplas. Portanto, se nos transformarmos
4 1/2
em4+1//2
, o resultado avaliado será9//2
.Ungolfed:
fonte
Smalltalk - 76 caracteres
A entrada corresponde exatamente ao delimitador da matriz e à representação da fração inerente do Smalltalk. Se não fosse tão detalhado, poderia ter sido um candidato sério!
É uma pena que a simplificação não fosse um requisito, o Smalltalk faz isso automaticamente!
fonte
Bash + coreutils, 28
$@
expande para todos os parâmetros da linha de comando, portanto,${@/\// }
expande para todos os parâmetros da linha de comando/
substituídos por, que é colocado na
dc
pilha de. O resto é simples manipulação de pilha e aritmética.fonte
Haskell ,
746763 bytesExperimente online!
Explicação
Como H.PWiz descobriu, podemos usar o lexer de Haskell aqui para quebrar a corda em suas partes. (No começo eu estava usando
span(>'/')
) E Laikoni apontou que<$>
funciona exatamente comomapSnd
emData.Tuple
.O protetor de padrão divide nosso código nos três números que queremos usar
lex
.lex
chama o lexer de haskell para interromper o primeiro token. Ele retorna uma lista com cada elemento representando uma maneira possível de analisar a sequência. Esses elementos são tuplas, com o primeiro elemento sendo o primeiro token e o restante da string sendo o segundo elemento. Agora, como o formato de entrada é muito regular, apenas teremos exatamente uma análise, para que possamos sempre fazer a primeira. A primeira coisa que fazemos é chamarlex
na entradaEm seguida, desembrulhámo-lo da lista, fornecendo uma
O primeiro token será a parte inteira da fração mista, deixando a fração precedida por um espaço para análise. Então, como as tuplas são
Functors
, podemos usar(<$>)
um alias parafmap
aplicarlex
ao segundo elemento da tupla.Isso consome o espaço e interrompe o próximo token, o numerador da nossa fração. Agora, vinculamos isso a uma correspondência de padrão usando
<-
. Nosso padrão éa
agarra a parte inteira da fração, nosso primeiro token.:_
desembrulha a lista resultante do nosso segundolex
.c
pega o segundo token que inserimos, que é o numerador da fração. Tudo o que resta está vinculado aos:d
que o divide em seu primeiro caractere, garantido pelo formato de a/
e o restante, que será o denominador.Agora que analisamos a entrada, fazemos o cálculo real:
Onde
r
está a função de leitura que ligamos anteriormente.É importante observar que
lex
retorna uma lista vazia se falhar e não vazia se for bem-sucedida. Por que isso não é umMaybe
eu não sei.fonte
/
Javascript ES6, 62 bytes
fonte
[b,c]=
no lugar deb=
e depois usarb
no lugar deb[0]
ec
no lugar deb[1]
. Além disso, você pode reorganizar a equação para não precisar de parênteses:p=prompt;[b,c]=p(a=+p()).split
/;alert(+b+c*a+"/"+c)
Perl,
826138 bytesProvavelmente isso pode ser jogado mais.
Alterar
split
e 5 usando em<>
vez de<STDIN>
.fonte
#!perl -paF/\D/
(9 bytes), você pode usar$_=$F[0]*$F[2]+$F[1]."/$F[2]"
.#!perl
parte do shebang e o avanço de linha não contam. Isso é apenas 38 bytes.Mathematica, 51 bytes
Curiosamente, o Mathematica suporta isso com um built-in. Se a saída de um número for permitida, precisamos apenas de 28 bytes:
fonte
Java,
159148142120110 bytesEconomizou um monte de bytes graças ao FlagAsSpam.
fonte
Long b=new Long(a[0]),c=new Long((a=a[1].split("/"))[0]),d=new Long(a[1]);
ARBLE , 13 bytes
Experimente online!
fonte
"x y/z"
é obrigatório para esse desafio em particular, mas caso eu tenha solicitado ao OP para verificar.05AB1E ,
1715 bytes-2 bytes graças a @MagicOctopusUrn .
Experimente online ou verifique todos os casos de teste .
Explicação:
Com o formato flexível de entrada e saída, pegando os números inteiros na ordem
x,z,y
e emitindo o nominador e o denominador em linhas separadas, seria de 4 bytes (e foi por isso que adicionei a tag de análise ao desafio ..):Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
4 1/2
é obrigatório para esse desafio em particular. Caso contrário, eu teria usado a minha versão de 4 bytes (ou se a saída era obrigatório, mas a entrada I flexível usaria este 6-Byter:*+'/²J
)a
pilha " .. o.Ô Exatamente o que eu precisava para esse desafio! E inteligente com a junção por "/". Obrigado! :)a
na pilha " em vez de usar'`'
..Python 3 ,
7876 bytesExperimente online!
fonte
return'%s/'%(int(a)*int(c)+int(b))+c
é 2 bytes mais curtoStax , 1 byte
Execute e depure (embora não haja muito o que depurar)
A especificação do desafio diz "Você não precisa simplificar a saída". Supondo que seja permitido simplificar, há uma instrução interna no stax para fazer isso. A entrada é implicitamente interpretada como um número inteiro e um número racional. A
+
instrução amplia ambos para os racionais, adiciona e simplifica. O resultado é impresso implicitamente.fonte
Perl 5 com -la -Mfeature = digamos,
32 bytes25 bytesExperimente online!
(-7 bytes graças a Dom Hastings)
$_
é a entrada inteirax y/z
, que avalia o valorx
em contextos numéricos (como o*
aqui).$'
é a cadeia de caracteres pós-correspondência regex, que aqui contém o que vem depois/
- entãoz
,. Para obter oy
valor, usamos a-a
flag que divide a entrada em espaços e as coloca na@F
matriz. Então aqui, o@F = ("x", "y/z")
que significa o$F[1]="y/z"
que é avaliado emy
contextos numéricos (já quey
é a sequência contígua inicial de dígitos com$F[1]
).fonte
-p
bandeira na sua contagem de bytes; em vez disso, você conta o idioma comoPerl 5 with -p flag, 32 bytes
. Veja esta meta post para o consenso atual.$'
era realmente a única diferença real!$'
e-a
-$F[n]
para obter partes da string é uma boa idéia, tenho que lembrar disso! Obrigado, atualizou a postagem.Lua, 123 bytes
fonte
Via Láctea 1.6.0 , 31 bytes
Acabou sendo muito mais longo do que eu pensava.
Explicação
Uso
fonte
Python 2.7, 88 bytes
Experimente online !
Você deve digitar a entrada entre aspas.
Provavelmente não é o melhor ...
fonte
C, 64
Lê a entrada de STDIN. Bastante auto-explicativo, eu acho.
fonte
Verifique , 120 bytes
Experimente online!
Talvez eu consiga salvar alguns bytes se não tentar reutilizar o loop de análise (a segunda linha). Dessa forma, eu poderia tornar o loop mais específico, evitar a enorme confusão de condicionais e usar o registro para outras coisas.
fonte
Ruby , 23 bytes
Experimente online!
fonte
C #, 112 bytes
Versão completa / formatada:
fonte
APL (Dyalog Unicode) , 31 bytes
Experimente online!
Graças a ngn pelo
⊃⊥1∘↓
truquefonte
PHP, 65 bytes
Experimente online
Código
Explicação
fonte
Java 10, 87 bytes
Um lambda de
String
paraString
.Experimente Online
fonte