Entrada:
Um número inteiro positivo n que consiste em dígitos no intervalo de 0 a 9 .
Desafio:
Se d é o dígito mais alto do número inteiro, assuma que a base do número é d + 1 . Por exemplo, se o número inteiro é 1256 , você deve assumir que está na base-7 , se for 10110 , deve assumir que é a base-2 (binária) e, se for 159 , é decimal.
Agora, faça o seguinte até você: 1: atingir um número inteiro de base 10 ou 2: alcançar um número inteiro de um dígito.
- Converta o número inteiro de base- (d + 1) em base-10
- Encontre a base desse novo número inteiro (novamente, base- (d + 1) onde d é o dígito mais alto do novo número)
- Vá para o passo 1 .
Exemplos:
Suponha que a entrada seja n = 413574 . O dígito mais alto d = 7 , então isso é base-8 (octal). Converta isso em decimal e obtenha 137084 . O dígito mais alto d = 8 , então isso é base-9 . Converta isso em decimal e obtenha 83911 . O dígito mais alto é 9 , então esse é um número decimal e paramos. A saída deve ser 83911 .
Suponha que a entrada seja n = 13552 . O dígito mais alto é d = 5 , então isso é base-6 . Converta isso em decimal e obtenha 2156 . O dígito mais alto d = 6 , então isso é base-7 . Converta isso em decimal e obtenha 776 . O dígito mais alto é d = 7 , então isso é base-8 . Converta isso em decimal e obtenha 510 . O dígito mais alto é d = 5 portanto é a base-6 . Converta isso em decimal e obtenha 186 . O dígito mais alto é 8 , então é a base-9 . Converta isso para decimal e obtenha 159 . O dígito mais alto é 9, então esse é um número decimal e paramos. A saída deve ser 159 .
Suponha que a entrada seja n = 17 . Isso nos dará 15 , depois 11 e 3 , que produziremos uma vez que é um dígito único.
Casos de teste:
5
5
17
3
999
999
87654321 (base-9 -> 42374116 in decimal -> base-7 -> 90419978 in decimal)
9041998
41253 (5505 -> 1265 -> 488 -> 404 -> 104 -> 29)
29
Notas:
- Regras padrão sobre E / S, brechas, etc. Você pode considerar a entrada como uma string
- As explicações são incentivadas
- Você pode usar comandos internos de conversão de base
- As soluções que não usam as funções internas de conversão de base da linguagem (se existirem) são bem-vindas, mesmo que elas acabem sendo muito mais longas do que a abordagem óbvia usando funções internas.
Aparentemente, esse é o OEIS A091047 .
fonte
Respostas:
Mathematica, 56 bytes
Experimente online!(Usando matemática.)
Eu pensei em verificar como é a sequência:
E aqui está um gráfico do número de etapas necessárias para encontrar o resultado:
(Clique para versões maiores. Veja o histórico de revisões para gráficos apenas até n = 1000. )
Parece uma mistura muito interessante de estrutura em grande escala e caos em pequena escala. Eu me pergunto o que há com as lacunas mais amplas em torno de 30.000 e 60.000.
fonte
9
, então eles já estão na base 10. Mas, para 30k e 60k, parece que números com 8 ou até 7 (teriam que check) no lugar desses 9 sempre se tornam a base 10 após, no máximo, uma etapa.Java 8,
17216616315215114013811611499 bytesToma a entrada como a
String
.-64 bytes graças a @ OlivierGrégoire . E aqui eu pensei que meu 172 inicial não era tão ruim ..;)
Experimente aqui.
Explicação:
fonte
s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}
. Também apaguei a maioria dos meus comentários, pois agora são totalmente irrelevantes (b
é a base, o seua
; es
é o número em que estamos trabalhando).Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));
(88), mas sou novo em codificar golf. Este é um trecho, certo? Existe uma maneira de declarar isso como um método sem a necessidade de adicionarpublic String c(String s)
?public
, mas receio que você realmente precise usarString c(String s){}
chamadas recursivas, mesmo no Java 8. Quando você cria um lambda usandojava.util.function.Function<String, String> c=s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c.apply(""+b.valueOf(s,b));}
ou interface usando,interface N{String c(String s);}N n = s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:n.c(""+b.valueOf(s,b));};
ele dará uma " auto-referência no inicializador erro "nos dois casos. Mas uma abordagem muito agradável, no entanto!Pitão, 9 bytes
Suíte de teste
Explicação:
fonte
Q
eQ
, entendi.u
sem sua terceira entrada é aplicada até a repetição, enquanto que com uma terceira entrada é aplicada um número fixo de vezes.u
lambda temG
eH
, mas você não precisa usarH
.G
porH
teria o mesmo resultado ... btw variável implícita éG
?G
sim.H
conta de 0 a cada iteração, por isso é completamente diferente. Não tenho muita certeza do que você está falando. Aqui está um exemplo de programa para mostrar o que está acontecendo: pyth.herokuapp.com/…JavaScript (ES6),
63 57 5453 bytesEconomizou 8 bytes graças a Shaggy e Dom Hastings
fonte
+a>9||b<9
e reverter o ternário.f=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Python 3 ,
91 78 76 7573 bytes@Emigna raspou 5 bytes. @FelipeNardiBatista salvou 1 byte. @ RomanGräf salvou 2 bytes
Experimente online!
Explicação
fonte
05AB1E ,
105 bytes5 bytes economizados graças ao Magic Octopus Urn
Como isso diminui muito rapidamente para grandes entradas, estou deixando a versão antiga muito mais rápida aqui para teste. O algoritmo é o mesmo, apenas o número de iterações é diferente.
Experimente online!
Explicação
fonte
тFZ>ö§
? Vendo como o número de iterações ( como visto aqui ) parece platô? Se você quer ser técnico, a taxa na qual as iterações aumentam é provavelmente logarítmica ... Portanto, você pode usar algo como:DFZ>ö§
e declarar que não será executado em grande escalan
. OU talvez até:T.n>FZ>ö§
calcular diretamente o número de iterações comolog_10(n)
.F§Z>ö
deve fazer o truque.§
.§
,Z
assumirá o número mais alto da pilha em vez do dígito mais alto do número na parte superior da pilha.APL (Dyalog) ,
2016 bytesPega e retorna uma string
(
…)⍣≡
Aplique a seguinte função até que dois termos consecutivos sejam idênticos:⍎¨
executar cada caractere (transforma a string em uma lista de números)(
…)
Aplique a seguinte função tácita a isso:⌈/
encontre o máximo do argumento1+
Adicione um⊢⊥⍨
avaliar o argumento nessa base⍕
formato (stringify, em preparação para outra aplicação da função externa)Experimente online!
fonte
Ruby ,
6056 bytesExperimente online!
fonte
Mathematica, 52 bytes
Função pura, recebendo um número inteiro não negativo como entrada e retornando um número inteiro não negativo. Usa a mesma mecânica central
FromDigits[s=IntegerDigits@#,Max@s+1]
como resposta de Jenny_mathy , mas exploraFixedPoint
a fazer a iteração.fonte
Perl 6 , 49 bytes
Teste-o
Expandido:
fonte
PHP , 71 bytes
Experimente online!
fonte
Pip , 17 bytes
Recebe entrada como um argumento de linha de comando. Experimente online!
Explicação
Isso foi divertido - eu tive que retirar os operadores de comparação de encadeamento.
Queremos fazer um loop até o número ter um único dígito OU conter um 9. Equivalentemente, queremos fazer um loop enquanto o número é de vários dígitos E não contém um 9. Equivalentemente, fazer um loop enquanto o número é maior que 9 E o dígito máximo é menos de 9:
a>9>MXa
.fonte
Python 2 ,
60595653 bytesGuardado 4 bytes graças a Felipe Nardi Batista
Guardado 3 bytes graças a ovs
Experimente online!
Usando uma lambda recursiva, comparando o resultado da conversão de base com a iteração anterior.
fonte
x==y and x or ...
comox
nunca será0
(base 1). ou mesmo(x==y)*x or ...
x and x==y or ...
que não funcionou, mas eu não estou muito acostumado com esses truques assim que eu não sabia que eu poderia reverter isso :)C #,
257244243244233222 bytesBem, o C # sempre usa muitos bytes, mas isso é ridículo. Nenhum dos built-ins pode lidar com uma base arbitrária, então eu tive que calcular a conversão sozinho. Ungolfed:
fonte
Mathematica, 92 bytes
fonte
Javascript (ES6) com função de seta 0, 74 bytes
fonte
f('11')
após a função? A menos que eu esteja perdendo algo que apenas parece ser de uso, na verdade não faz parte do envio. Nesse caso, você deve retirá-lo da seção de código e colocá-lo em sua explicação (quando adicionar um) e atualizar sua contagem de bytes para 67.K4 , 19 bytes
Solução:
Exemplos:
Explicação:
Use
/:
interno para converter a base.fonte
Kotlin , 97 bytes
Embelezado
Teste
TIO
TryItOnline
fonte
Japt , 25 bytes
Experimente online!
fonte
Geléia , 9 bytes
Experimente online!
fonte
C,
159157 bytesfonte
Scala , 119 bytes
Experimente online!
Scala , 119 bytes
Experimente online!
Ambos os métodos funcionam da mesma maneira, mas no primeiro eu insiro
x.length-1
uma variável e no segundo não.fonte