O sistema de número fatorial , também chamado de fatorádico, é um sistema numérico de raiz mista. Os fatoriais determinam o valor da posição de um número.
Nesse sistema, o dígito mais à direita pode ser 0 ou 1, o segundo dígito mais à direita pode ser 0, 1 ou 2 e assim por diante. Isso significa que um n
número fatorádico de dígito pode ter um valor máximo de (n + 1)!
.
Por exemplo, para converter o número fatorádico 24201
em decimal, você faria o seguinte:
2 * 5! = 240
4 * 4! = 96
2 * 3! = 12
0 * 2! = 0
1 * 1! = 1
240 + 96 + 12 + 0 + 1 = 349
Portanto, o número fatorádico 24201
é 349
base 10
.
Para converter um número decimal (com 349
um exemplo) em um número fatorádico, faça o seguinte:
Tome o maior fatorial menor que o número. Nesse caso, é 120
ou 5!
.
349 / 5! = 2 r 109
109 / 4! = 4 r 13
13 / 3! = 2 r 1
1 / 2! = 0 r 1
1 / 1! = 1 r 0
Portanto, 349
base 10
é o número fatorádico 24201
.
Seu desafio é criar o programa ou função mais curto que converta um número de entrada na outra base.
A entrada será uma representação em cadeia de um número inteiro não negativo. Um número fatorádico será precedido por um !
(por exemplo !24201
), enquanto um número decimal não será precedido por nada. Você pode assumir que a entrada máxima será 10! - 1
- 3628799
em decimal e 987654321
em fatorádico. Isso significa que as letras não aparecerão em uma entrada / saída fatorádica.
O programa não precisa !
acrescentar a a uma saída fatorádica e pode gerar uma string ou um número inteiro. A entrada pode estar em qualquer formato razoável.
Casos de teste:
Input: 1234
Output: 141120
Input: 746
Output: 101010
Input: !54321
Output: 719
Input: !30311
Output: 381
fonte
⍴⍵∩'!'
por'!'∊⍵
para salvar um personagem.~'!'
por∩⎕D
para salvar um personagem.Python 2.7 (
163157152)Versão mais legível:
Demolir:
fonte
'!'==i[0]
por'!'in i
, e pode usara=x=1
. Além disso, você não precisa de colchetes na declaração exec.(len(i)-1)
por~-len(i)
.(a,b)['!'in i]
e consegui raspar 6 caracteres. Não é tão legível como era embora ... pastebin ligaçãoGolfScript (
48 4443 caracteres)Este é um programa independente. A conversão factoriadic => decimal é bastante lenta, porque faz uma pesquisa usando a conversão decimal => factoriadic em vez de uma conversão de base direta.
O formato de entrada permite um comutador de modo muito curto:
.~
copia a string de entrada e a avalia; portanto, se a entrada for apenas um número, acabamos com, por exemplo,"1234" 1234
na pilha e se ela começa com!
(não é lógico, com qualquer não vazio) string sendo verdade) nós terminamos com, por exemplo,0 30311
na pilha. Então o valor na parte inferior da pilha é verdadeiro para decimal => factoriadic e falso para factoriadic => decimal.fonte
PHP <7,1
178 171 170 168 164 155 147 144 138 126123 bytesExecute como tubo
-r
ou teste-o online .subfunção: a base fatorial está sendo reutilizada (aumentada / diminuída nos loops)decimal 0 retorna uma string vazia em vez de(as duas outras respostas PHP também.)0
.Se isso for inaceitável, adicione +5 para o caso extra.ungolfed:
idéias de golfe abandonadas:
$b<=$x
->$b<$x
(-1)quebraria fatoriais decimais puros (isto é, aqueles que resultam em um número fatorial com apenas um dígito diferente de zero). A solução da JMPC sofre com isso; HamZa não.
floor($x/$b)
->(int)($x/$b)
poderia ser um pouco mais rápido, mas a conversão de tipo precede a divisão, por isso preciso dos parênteses e não ganho um byte.
$x/$b|0
faz o truqueO loop de fato-> dec é semelhante ao fatorial-encontrar em dec-> fato. Mesmo incremento, o corpo não importa, mas, infelizmente, predefinições diferentes e diferentes condições pós. Dang; poderia ter jogado -21 lá.YAY eu encontrei uma solução. Tomou bastante golfe, mas cortou outros -4 (no: -9) e fechou todos os bugs / brechas.
Existe mais potencial ... ou já terminei de jogar golfe?
fonte
+$r
em vez de$r|0
salvar um byte. O mesmo paraif($x|0)
JavaScript (ES 6)
139 137 122 113111tentou uma abordagem diferente usando alguma mágica de matriz; mas acabei com
174172 bytes com o seguinte:Então, peguei meu código PHP e o traduzi. Poderia remover todos os se
$
alguns;
, mas a necessidade de inicializar vars consumia alguns desses benefícios. Conseguiu jogar as duas respostas um pouco mais longe, no entanto.golfed
destroçado
suíte de teste
fonte
.split('')
=>.split``
f=
. Além disso, poder+=(x/(b/=j--)|0)
serr+=x/(b/=j--)|0
?Perl 6 ,
666560 bytes-1 byte graças a Jo King
Experimente online!
fonte
GolfScript, 69 caracteres
Pega a entrada de STDIN como de costume e imprime o resultado. Teste online .
fonte
Haskell, 221 caracteres
Code Golf
Uso
Código ungolfed
fonte
Mathematica
213 177175Um número fatorial é envolvido
f[]
, seja ele de entrada ou de saída.Uso
Conversão de fatorial para número decimal .
QuotientRemainder[n,j!]
atua recursivamente nos dígitos do número fatorial da esquerda para a direita, diminuindoj
a cada passo.QuotientRemainder[349, 5!]
, por exemplo, retornos{2, 109}
e assim por diante.Conversão do número decimal em fatorial . Movendo da direita para a esquerda, a função pura
# (p++)! &
multiplica cada dígito#
pelo fatorial apropriado.fonte
Python, 128 caracteres
Isso leva cerca de meia hora para ser executado, mas é pequeno:
Ele cria uma lista de todos os números fatorádicos <= 9 dígitos em ordem numérica e, em seguida, faz uma pesquisa ou índice para converter.
Se você deseja testar, basta substituir
10**9
por10**6
e restringir-se a números variáveis de 6 dígitos.Eu poderia tecnicamente salvar um personagem usando em
range(10**9)
vez dexrange(10**9)
. Não tente isto em casa.fonte
d+2
efor
PHP
231214204Resposta mais recente
Resposta antiga
Exemplo
Saída
fonte
foreach(range())
pode ser substituído por umfor
loop simples (-9). Eu gosto da ideia no fim das contas.24
deve retornar,1000
mas retorna400
. correção:g(++$p)<$x
->g(++$p)<=$x
(+1)for
construção:,
deve ser;
3) Tenho mais 7 alterações economizando 20 bytes nesse código. Os quero?if
condição e use meu tipo sexy convertido para int (-6) Isso não afetará o resultado decimal 0! e) os restantesfor
construção pode ser reescrita com uma muito agradávelwhile(++$t<$c=strlen($x))
: incremento antes do corpo -> $ t não precisa de inicialização (-6)GELÉIA, 5 bytes
Explicação
* A geléia é menor que a idade da pergunta, portanto minha resposta é não-competitiva.
fonte
V
eṾ
.)Gelatina , 15 bytes
Experimente online!
Como funciona
Por que
*)
funciona¬
NÃO é elemento-lógica. Quando determinado um único número inteiro, ele se torna um único zero, o que é falso. No entanto, quando uma string é fornecida, cada elemento (caractere) é transformado em zero, e o resultado inteiro é uma matriz de zeros, o que é verdadeiro.Zero como um número inteiro é um caso especial. Ele percorre a rota "fatorial -> inteiro", mas ainda dá zero, o que está correto.
Sem base fatorial embutida, 25 bytes
Experimente online!
Como funciona
fonte
K, 102
Definitivamente poderia ser melhorado.
fonte
D (159 caracteres)
Ungolfed e com ponto de entrada do programa
Todos os argumentos da linha de comando são impressos como
<original> -> <converted>
. Somente decimal para fatorádico é realmente implementado emx
. O contrário apenas chamax
com todos os números decimais (0 .. *) até que o resultado seja igual à entrada. Isso leva aproximadamente 3 segundos para a maior entrada (! 987654321).Versão executável online: http://dpaste.dzfl.pl/46e425f9
fonte
string n
parachar[]n
salvar um byte (eu sei que estou atrasado aqui).if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}
pode tornarif(n[0]<48)while(r.text.x<n[1..$].to!int)r++;
- se para salvar dois bytes.VBA 225
Obrigado a Titus pela ajuda! Ainda olhando para o golfe um pouco mais.
fonte
b
um valor numérico em vez de comparar o primeiro caractere?If Not IsNumeric(b) Then
mas isso exige mais caracteres. Agora, eu não entrei e reexaminei todo o código; pode haver uma maneira um pouco melhor de fazer isso noIsNumeric
geral. - Correção, há uma ligeira melhora aqui. Obrigado!For d=9To 1Step-1
eFact(d)
->For d=0To 8
eFact(9-d)
e outros dois se você fizerFor d=2To e
eFact(e-d+1)*Mid(b,d,1)
PHP , 124 bytes
Experimente online!
Estendido
fonte
Perl 6 , 150 bytes
fonte
APL (NARS), 36 caracteres, 72 bytes
parece que 10⊥ (9..2) ⊤ é melhor que a função recursiva, graças a Howard pela outra solução de APL que mostra isso ... (mesmo que eu não entenda 100%). Introduza números sem '!' <10 !. Teste:
fonte