O vencedor (obviamente) é Dennis ♦, que usou Jelly com 10 bytes!
Este desafio ainda estará aqui, no entanto, os resultados não serão mais aceitos.
O trem de força de um número é um conceito de John Conway (que também é notável por fazer o Game of Life de Conway, mas esse não é o ponto). É definido da seguinte forma:
Para qualquer número ..., o trem de força do número é ... (ou seja, todo segundo dígito, da esquerda para a direita, é um poder do dígito antes disso). Este processo é repetido até o resultado ser um único dígito.
EXEMPLOS:
2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed
135 => (1^3)5 = 5
1234 => (1^2)(3^4) = 81 => (8^1) = 8
1100 => (1^1)(0^0) = 1 # (0^0) = 1
-42 => -42 # Negative numbers output the input
Seu desafio é, para qualquer número n
da entrada, retornar powertrain(n)
(ou seja, n
após a decomposição do trem de força terminar) como saída.
Isso é código de golfe, e a menor quantidade de bytes ganha.
AVISO LEGAL:
- Você pode ter um número ímpar de dígitos na entrada, o último dígito simplesmente não terá energia.
- 0 ^ 0 é 1, porque se fosse 0, muitos números seriam reduzidos instantaneamente para 0 ou 1.
- Se o número for indestrutível em qualquer parte do processo de computação (por exemplo, se terminar com
2592
), você poderá simplesmente gerar o número. - Se a entrada for
< 10
(ou seja, todos os números de um dígito e negativos), faça a saída.
Provavelmente anunciarei um vencedor depois de algumas horas .
Classificação atual:
- Geléia ( Dennis ♦ ): 10
- Pyth ( DenkerAffe ): 16
- MATL ( Don Muesli ): 21
- Perl ( Ton Hospel ): 42
- Haskell ( Damien ): 64
- Javascript ES6 ( edc65 ): 71
- Mathematica ( murphy ): 74
- Mathematica ( LegionMammal978 ) e Haskell ( Renzeee ): 77
- Python 2 ( mathmandan ): 111
- Python 3 ( Erwan ): 161
- Java 8 ( Azul ): 229
- Oracle SQL 11.2 ( Jeto ): 456
- Befunge '93 ( Lex ): 490
1100
e-42
É fácil perder regras sobre casos extremos, se eles não aparecerem nos casos de teste.Respostas:
Geléia,
15141210 bytesExperimente online!
Como funciona
fonte
n
, simplesmente repetindo os tempos, mas não tenho uma prova de que funcione para todas as entradas possíveis.D*2/Pµ¡
Haskell,
6764 bytes(>> = (==)) >> = até $ p.show é uma função sem nome, recebendo um número inteiro como entrada e retornando seu trem de força.
Economizou 3 bytes graças ao Zgarb
fonte
((==)=<<g)
salva dois bytes acima(\n->g n==n)
.(>>=(==))>>=
realmente parece um trem!Perl, 42
48bytesInclua +2 para
-lp
(você pode soltar-l
também, mas eu gosto de novas linhas)Execute com entrada no STDIN, por exemplo
powertrain.pl
:(em perls mais antigos, você também pode soltar o espaço entre a regex e até)
Isso não será capaz de lidar com o ponto fixo,
24547284284866560000000000
mas um valor tão alto não funcionará de qualquer maneira, porque nesse momento o perl passou para a notação exponencial.De fato, a versão acima funcionará rapidamente (na maioria dos
2592
loops) para todos os números que o perl pode representar sem usar notação exponencial, pois está provado que não há pontos fixos entre2592
e24547284284866560000000000
( https://oeis.org/A135385 )No entanto, isso pressupõe algo ainda não comprovado. Em princípio, pode haver uma redução que leva mais do que
X=10^7
etapas (é suposto que nenhum ponto não fixo execute mais de 16 etapas, https://oeis.org/A133503 ) cujo valor cai abaixoX
(mas acima10^7
) e depois sobe novamente. Se for esse o caso, devo recorrer a:Explicação
O código funciona colocando
**
e*
(alternando) entre os dígitosassim
2592
se torna2**5*9**2
e12345
se torna1**2*3**4*5
. Essas são expressões perl válidas que podem ser avaliadas com(
0**0
está1
em perl). Em seguida, basta colocar um loop em torno disso com um contador que faça com que ele expire. Como, exceto pelos pontos fixos, os valores diminuem extremamente rapidamente, a série do trem de força converge antes que o contador tenha a chance de realmente continuarfonte
Pitão,
25181116 bytesExperimente aqui!
714 bytes salvos com a ajuda de @JakubeExplicação
fonte
Python 2, 111 bytes
A idéia é criar uma string onde os dígitos de
n
são separados por operações que alternam entre*
e**
, e depoiseval
a string. (Outras soluções usam essa mesma idéia; veja, por exemplo, a resposta Perl de Ton Hospel .)Portanto, a operação alterna entre o
'**'[0:]
que é**
e o'**'[-1:]
que é justo*
.No entanto, no final do
for
loop, a string termina com uma operação (uma ou outra), então precisamos soltar a última operação ou adicionar outro dígito, para que a string faça sentido.Felizmente, anexar um
1
no final funcionará, não importa qual operação seja a última. (Se você preferir,1
é uma identidade unilateral da direita, para multiplicação e exponenciação. Outra maneira de dizer isso é issopowertrain(n) == powertrain(10*n + 1)
para todosn>0
.)Finalmente, se o resultado do resultado
eval
for o mesmo que a entrada (como em um1
ciclo de duração ), a função será encerrada. Caso contrário, a função chama a si mesma no resultado. (Ele permanecerá para sempre em qualquer ciclo de duração> 1
, mas, de acordo com os comentários do OP, posso assumir que não existem tais ciclos.)(Nota: a explicação acima funciona para números inteiros positivos de um dígito, pois uma entrada de um dígito
n
será concluída en**1
resultará em um1
ciclo. No entanto, também precisamos aceitar entradas não positivas, portanto, há uma condição no iniciando esse curto-circuito se a entrada for menor que1
. Nós poderíamos eliminar essa linha e economizar 17 bytes, se a entrada não fosse negativa.)fonte
Java 8,
265244229 bytesEsta é a minha primeira resposta, mas estou lendo este site há algum tempo e acho que sei o que estou fazendo. Pelo menos ele bate befunge e SQL ...
Infelizmente, como outras respostas, esta não funciona para 24547284284866560000000000 devido a java'a embutida em restrições sobre o tamanho de números inteiros grandes.
Guardado 36 bytes graças a @JackAmmo
Explicação Ungolfed
fonte
if(n<10)return n;else{...}
o else é desnecessário, pois logicamente tudo nesse bloco else seria executado de qualquer maneira quando n <10 for falso. Remover o resto e os 2 chaves correspondentes economizará 6 bytes. Existe uma situação semelhante à sua última se ... elseif(n==t)return n;else return p(t);
remover o else e o espaço após ele para salvar outros 5 bytes. Na verdade, você pode reduzi-lo ainda mais se você usar o operador triádica em vez do if ... else como assimreturn n==t?n:p(t);
int t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
JavaScript (ES6) 71
Uma função recursiva, parando quando uma repetição é encontrada. Isso não pode funcionar para loops mais longos (2 ou mais valores repetidos), mas parece que isso não poderia acontecer, pelo menos no intervalo limitado de precisão do número de javascript (17 dígitos)
Teste
fonte
+'1'
matar dois coelhos com uma cajadada só!replace
foi 1 byte mais:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
Mathematica, 77 bytes
Função anônima. Não é muito complicado.
fonte
Baixar
720490 bytesNão pude resistir a fazer mais uma vez depois da coisa Nunca me diga as probabilidades . Então, eu otimizei o "ASCII-fier" do anterior. Nesse caso, não vi necessidade de deixar o ponteiro das instruções percorrer os dígitos para lê-los; portanto, não me esforcei para torná-los legíveis por humanos. Portanto, agora é mais um digitador.
Novamente, se vocês quiserem uma explicação, avise-me nos comentários, tentarei criar algumas descrições úteis. Você pode copiar e colar o código no intérprete . Descobri que o exemplo 24547284284866560000000000 gera 0, mas isso parece ser um problema ao obter um valor tão grande de um ponto na grade, pois é possível ver claramente o valor correto sendo armazenado nas etapas finais.
Esta versão também suporta entrada negativa. É uma grande melhoria em relação à versão anterior, se é que digo. Pelo menos 1 bug foi corrigido e o tamanho foi reduzido bastante.
fonte
Haskell,
1007977 bytesNão jogou golfe:
Esta função divide a entrada em dígitos e faz o truque via
i
.EDIT: Obrigado a nimi por algumas dicas.
fonte
i(a:[])=a
éi[a]=a
, b) sem a necessidade demax 1
, por causa0^0 = 1
de Haskell, c) substitua(:[])
compure
, d) mover olet
interiorg
em uma função separada e substituir oif ... then ... else
com guardas:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
pure
não está no Prelude, mas o restante das dicas funciona, obrigado. Eu estava tentando fazer isso com os guardas, mas acabei usando;
antes do guarda e isso não funcionou, mas agora eu sei como deve funcionar.pure
está no Prelude que vem com base-4.8.2.0. Não sei quando foi introduzido. Você não precisa o( )
noi([a])=a
.Mathematica, 74 bytes
Explicação
Esta solução usa uma função auxiliar
f
, que aceita os dígitos do número como argumentos e aplica uma iteração da operação do trem de força. A última linha é uma função pura criada para explorar aReplaceRepeated
função (ou//.
abreviada), que aplica uma regra a uma expressão (nesse caso, o argumento#
da função pura) até que ela não mude mais. A regrai_/;i>0:>f@@IntegerDigits@i
substitui qualquer coisa não negativa pela funçãof
aplicada aos seus dígitos decimais.fonte
:=
)SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>
,Set::write: Tag Times in 1 f[n_] is Protected. >>
O segundo erro desaparece quando eu uso:=
vs=
.;
s em vez das quebras de linha:0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
MATL , 21 bytes
Pode demorar alguns segundos para produzir a saída.
EDIT (30 de julho de 2016): o código vinculado substitui
9L
por1L
para se adaptar às alterações recentes no idioma.Experimente online!
Isso usa os dois truques a seguir para reduzir a contagem de bytes em detrimento da eficiência do código:
n
tempos em vez de esperar até que um ciclo seja encontrado. Isso é aceitável conforme os comentários do OP.1
teria que ser anexada para concluir a operação final de energia. Em vez disso, o número adicionado1
é o número de dígitos. Isso garante um número par, para que todas as operações de energia possam ser realizadas (mesmo que as últimas sejam1^1
operações desnecessárias ).Código:
fonte
a, b, a, b
ad infinitum (mais de um termo). Se um termo for repetido, você deverá gerar esse número. Desculpe se isso não estava realmente claro.2592
a entrada, ela parece não produzir nada por um bom tempo.Python 3,
169161 bytesUngoldfed
Resultados
fonte
;
espaço em branco. Dessa maneira, você economiza os espaços em branco da intenção. Também é possível colocar o corpo do loop for na mesma linha.def f(s,o=[['1',s]["-"in s]],n=int):
while s not in o:
o+=[s];s+=1*(len(s)%2<1);r=1
for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j)
s=str(r)
return o[-1]
o=[['1',s]["-"in s]]
no argumento padrão não funcionam para mim levantar um erro `s não defined`Oracle SQL 11.2, 456 bytes
Sem golfe
v é uma visão recursiva, os parâmetros são
n: número a ser dividido em partes de 2 dígitos
c: número de partes de 2 dígitos
i: parte atual de 2 dígitos para calcular
f: string concatenando os poderes com * como separador
t: avaliação de f
Os DECODES alternam para o próximo número para dividir e calcular quando todas as partes do número atual forem concluídas.
XMLTABLE (f) pega uma expressão e a avalia, colocando o resultado na pseudo coluna "column_value". É a versão para golfe de http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html
CYCLE é o oráculo construído na detecção de ciclo e é usado como condição de saída.
Como o resultado para: 1 <10 é: 1 ev não retorna nenhuma linha para esses casos, SUM força uma linha com NULL como o valor. NVL retorna: 1 como resultado se a linha for nula.
fonte