Entrada:
Un entero positivo n que consta de dígitos en el rango 0-9 .
Reto:
Si d es el dígito más alto en el entero, suponga que la base del número es d + 1 . Por ejemplo, si el número entero es 1256 , supondrá que está en base-7 , si es 10110 , supondrá que es base-2 (binario), y si es 159, entonces es decimal.
Ahora, haga lo siguiente hasta que: 1: alcance un entero de base 10 o 2: alcance un entero de un solo dígito.
- Convierta el número entero de base- (d + 1) a base-10
- Encuentre la base de este nuevo entero (nuevamente, base- (d + 1) donde d es el dígito más alto en el nuevo número)
- Ve al paso 1 .
Ejemplos:
Suponga que la entrada es n = 413574 . El dígito más alto d = 7 , entonces esto es base-8 (octal). Convierta esto a decimal y obtenga 137084 . El dígito más alto d = 8 , entonces esto es base-9 . Convierta esto a decimal y obtenga 83911 . El dígito más alto es 9 , entonces este es un número decimal y nos detenemos. La salida será 83911 .
Suponga que la entrada es n = 13552 . El dígito más alto es d = 5 , por lo que es base-6 . Convierta esto a decimal y obtenga 2156 . El dígito más alto d = 6 , entonces esto es base-7 . Convierte esto a decimal y obtén 776 . El dígito más alto es d = 7 , por lo que es base-8 . Convierta esto a decimal y obtenga 510 . El dígito más alto es d = 5, por lo que es base-6 . Convierta esto a decimal y obtenga 186 . El dígito más alto es 8 , por lo que es base-9 . Convierte esto a decimal y obtén 159. El dígito más alto es 9 , entonces este es un número decimal y nos detenemos. El resultado será 159 .
Suponga que la entrada es n = 17 . Esto nos dará 15 , luego 11 , luego 3 , que mostraremos ya que es un solo dígito.
Casos de prueba:
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:
- Reglas estándar sobre E / S, lagunas, etc. Puede tomar la entrada como una cadena
- Se alientan las explicaciones.
- Puede usar comandos de conversión de base incorporados
- Las soluciones que no utilizan las funciones integradas de conversión de bases del lenguaje (si existen) son bienvenidas, incluso si terminan siendo mucho más largas que el enfoque obvio que usa funciones incorporadas.
Aparentemente, esto es OEIS A091047 .
fuente
Respuestas:
Mathematica, 56 bytes
Pruébalo en línea! (Usando matemáticas).
Pensé en comprobar cómo se ve la secuencia:
Y aquí hay una gráfica del número de pasos necesarios para encontrar el resultado:
(Haga clic para versiones más grandes. Consulte el historial de revisiones para gráficos solo hasta n = 1000 ).
Parece una mezcla muy interesante de estructura a gran escala y caos a gran escala. Me pregunto qué pasa con las brechas más amplias alrededor de 30,000 y 60,000.
fuente
9
, por lo que ya están en la base 10. Pero para 30k y 60k parece que los números con un 8 o incluso 7 (tendrían que check) en lugar de ese 9 siempre se convierte en base 10 después de como máximo un paso.Java 8,
17216616315215114013811611499 bytesToma la entrada como a
String
.-64 bytes gracias a @ OlivierGrégoire . Y aquí pensé que mi 172 inicial no era tan malo ...;)
Pruébalo aquí
Explicación:
fuente
s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}
. También eliminé la mayoría de mis comentarios, ya que ahora son totalmente irrelevantes (b
es la base, tua
; ys
es el número en el que estamos trabajando).Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));
(88), pero soy nuevo en el código de golf. Este es un fragmento, ¿verdad? ¿Hay alguna manera de declarar esto como un método sin necesidad de agregarpublic String c(String s)
?public
, pero me temo que tendrá que usarloString c(String s){}
para llamadas recursivas, incluso en Java 8. Cuando cree un 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));}
o usando una interfazinterface 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));};
, le dará una " autorreferencia en el inicializador error "en ambos casos. Pero muy buen enfoque, no obstante!Pyth, 9 bytes
Banco de pruebas
Explicación:
fuente
Q
yQ
, lo entiendo.u
sin su tercera entrada se aplica hasta la repetición, mientras que con una tercera entrada se aplica un número fijo de veces.u
lambda tieneG
yH
, pero no necesita usarH
.G
conH
habría tenido el mismo resultado ... por cierto variables implícita esG
?G
sí.H
cuenta desde 0 con cada iteración, por lo que es completamente diferente. No estoy realmente seguro de lo que estás hablando. Aquí hay un programa de ejemplo para mostrarle lo que está sucediendo: pyth.herokuapp.com/…JavaScript (ES6),
63 57 5453 bytesGuardado 8 bytes gracias a Shaggy y Dom Hastings
fuente
+a>9||b<9
e invertir el ternario.f=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Python 3 ,
91 78 76 7573 bytes@Emigna recortó 5 bytes. @FelipeNardiBatista guardó 1 byte. @ RomanGräf guardó 2 bytes
Pruébalo en línea!
Explicación
fuente
05AB1E ,
105 bytes5 bytes guardados gracias a Magic Octopus Urn
A medida que esto se ralentiza muy rápidamente para grandes entradas, dejo la versión anterior mucho más rápida aquí para probar. El algoritmo es el mismo, solo difiere el número de iteraciones.
Pruébalo en línea!
Explicación
fuente
тFZ>ö§
? ¿Ver como el número de iteraciones ( como se ve aquí ) parece estabilizarse? Si desea ser técnico, la velocidad a la que aumentan las iteraciones es probablemente logarítmica ... Por lo tanto, podría usar algo como:DFZ>ö§
y afirmar que no se ejecutará en gran medidan
. O tal vez incluso:T.n>FZ>ö§
para calcular directamente el número de iteraciones comolog_10(n)
.F§Z>ö
debería ser el truco.§
.§
,Z
tomará el número más alto en la pila en lugar del dígito más alto en el número en la parte superior de la pila.APL (Dyalog) ,
2016 bytesToma y devuelve una cadena.
(
...)⍣≡
aplique la siguiente función hasta que dos términos consecutivos sean idénticos:⍎¨
ejecuta cada carácter (convierte la cadena en una lista de números)(
...)
Aplica la siguiente función tácita a eso:⌈/
encuentra el máximo del argumento1+
Agrega uno⊢⊥⍨
evaluar el argumento en esa base⍕
formato (stringify, en preparación para otra aplicación de la función externa)Pruébalo en línea!
fuente
Ruby ,
6056 bytesPruébalo en línea!
fuente
Mathematica, 52 bytes
Función pura que toma un entero no negativo como entrada y devuelve un entero no negativo. Utiliza la misma mecánica central
FromDigits[s=IntegerDigits@#,Max@s+1]
que la respuesta de Jenny_mathy , pero explotaFixedPoint
para hacer la iteración.fuente
Perl 6 , 49 bytes
Pruébalo
Expandido:
fuente
PHP , 71 bytes
Pruébalo en línea!
fuente
Pip , 17 bytes
Toma entrada como argumento de línea de comando. Pruébalo en línea!
Explicación
Esto fue divertido: tuve que sacar los operadores de comparación de encadenamiento.
Queremos hacer un ciclo hasta que el número sea un solo dígito O contenga un 9. De manera equivalente, queremos hacer un ciclo mientras el número tenga varios dígitos Y no contenga un 9. De manera equivalente, haga un ciclo mientras el número sea mayor que 9 Y el dígito máximo sea menos de 9:
a>9>MXa
.fuente
Pitón 2 ,
60595653 bytesGuardado 4 bytes gracias a Felipe Nardi Batista
Guardado 3 bytes gracias a ovs
Pruébalo en línea!
Usando una lambda recursiva, comparando el resultado de la conversión de base con la iteración anterior.
fuente
x==y and x or ...
comox
nunca será0
(base 1). o incluso(x==y)*x or ...
x and x==y or ...
lo que no funcionó, pero no soy muy competente con estos trucos, así que no me di cuenta de que podía revertirlo :)C #,
257244243244233222 bytesBueno, C # siempre toma muchos bytes, pero esto es simplemente ridículo. Ninguno de los incorporados puede manejar una base arbitraria, así que tuve que calcular la conversión yo mismo. Sin golf:
fuente
Mathematica, 92 bytes
fuente
Javascript (ES6) con función de flecha 0, 74 bytes
fuente
f('11')
después de la función? A menos que me falte algo que solo parece ser un uso que en realidad no forma parte del envío. Si es así, debe sacarlo de la sección de código y ponerlo en su explicación (cuando agrega uno) y actualizar su recuento de bytes a 67.K4 , 19 bytes
Solución:
Ejemplos:
Explicación:
Use
/:
incorporado para convertir la base.fuente
Kotlin , 97 bytes
Embellecido
Prueba
TIO
TryItOnline
fuente
Japt , 25 bytes
Pruébalo en línea!
fuente
Jalea , 9 bytes
Pruébalo en línea!
fuente
C,
159157 bytesfuente
Scala , 119 bytes
Pruébalo en línea!
Scala , 119 bytes
Pruébalo en línea!
Ambos métodos funcionan de la misma manera, pero en el primero pongo
x.length-1
una variable y en el segundo no.fuente