Aquí hay un buen desafío fácil:
Dada una cadena que representa un número en una base desconocida, determine la base más baja posible en la que pueda estar ese número. La cadena solo contendrá
0-9, a-z
. Si lo desea, puede optar por letras mayúsculas en lugar de minúsculas, pero especifíquelo. Debe generar esta base más baja posible en decimal.
Aquí hay un ejemplo más concreto. Si la cadena de entrada era "01234", es imposible que este número esté en binario, ya que 2, 3 y 4 están todos indefinidos en binario. Del mismo modo, este número no puede estar en la base 3 o en la base 4. Por lo tanto, este número debe estar en la base 5 o en una base más alta, por lo que debe generar '5'.
Su código debe funcionar para cualquier base entre la base 1 (unario, todos '0') y la base 36 ('0-9' y 'a-z').
Puede tomar entrada y proporcionar salida en cualquier formato razonable. Las conversiones de conversión de base están permitidas. Como de costumbre, se aplican las lagunas estándar, ¡y la respuesta más corta en bytes es la ganadora!
Prueba IO:
#Input #Output
00000 --> 1
123456 --> 7
ff --> 16
4815162342 --> 9
42 --> 5
codegolf --> 25
0123456789abcdefghijklmnopqrstuvwxyz --> 36
fuente
You must output this lowest possible base in decimal.
Respuestas:
Jalea , 4 bytes
Requiere mayúscula. Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Python,
2722 bytesEsto requiere que la entrada sea una cadena de bytes (Python 3) o un bytearray (Python 2 y 3).
¡Gracias a @AleksiTorhamo por jugar golf 5 bytes!
Pruébalo en Ideone .
Cómo funciona
Comenzamos tomando el máximo de la cuerda. Los puntos de código de las letras son más altos que los puntos de código de los dígitos, este carácter máximo es también la base máxima de 36 dígitos.
El punto de código de '0' - '9' es 48 - 57 , por lo que debemos restar 48 de sus puntos de código para calcular los dígitos correspondientes, o 47 para calcular la base más baja posible. Del mismo modo, los puntos de código de las letras 'a' - 'z' son 97-122 . Como 'a' representa el dígito con el valor 10 , debemos restar 87 de sus puntos de código para calcular los dígitos correspondientes, o 86 para calcular la base más baja posible. Una forma de lograr esto es la siguiente.
La diferencia entre 97 y 58 ( ':' , el carácter después de '9' ) es 39 , por lo que tomar los puntos de código del módulo 39 puede lograr la resta. Como 48% 39 = 9 , y el resultado deseado para el carácter '0' es 1 , primero restamos 8 antes de tomar el módulo de resultado 39 . Restar primero es necesario ya que de lo contrario 'u'% 39 = 117% 39 = 0 .
fuente
ord()
y ganar en 3 bytes. :)Python, 25 bytes
Define una lambda que toma la cadena
x
. Encuentra el dígito más grande en la cadena (ordenado con letras por encima de los dígitos, por defecto de Python), y convierte a la base 36. Agrega 1, porque8
no está en la base 8.fuente
Haskell, 34 bytes
Utiliza la
mod(ord(c)-8,39)
idea de Dennis.41 bytes
45 bytes:
Salidas como
Just 3
.fuente
Cheddar ,
342921 bytesGuardado 8 bytes gracias a Dennis !!!
Utiliza letras minúsculas
Pruébalo en línea
Explicación
fuente
(-)&8
lugar den->n-8
?f&n
une bajon
al primer argumento de la función.05AB1E , 6 bytes
Toma letras en mayúsculas.
Explicación
Pruébalo en línea
fuente
En realidad , 6 bytes
Pruébalo en línea!
fuente
Julia, 22 bytes
Hay un carácter BS (0x08) entre las comillas. Pruébalo en línea!
fuente
-''
hacer?JavaScript (ES6),
4137 bytesEditar: Guardado 4 bytes gracias a @ edc65.
fuente
pop()
para guardar 4Haskell,
5540 bytesGracias @ Dennis por su enfoque. (toma eso, @xnor;))
fuente
f=
por 38 bytes yaf
que no toma argumentos explícitos.Perl 6: 18 bytes
Define una lambda que toma un argumento de cadena única y devuelve un entero. Divide la cadena en caracteres, encuentra la "más alta", la convierte en base 36 y agrega 1.
Éste usa el enfoque de módulo de Dennis. Mismo largo.
fuente
Retina , 28 bytes
Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).
Explicación
Esto ordena los caracteres de la entrada.
Esto elimina todos los caracteres excepto el último, por lo que las dos primeras etapas encuentran el carácter máximo.
Estas son dos etapas que forman un bucle. El primero duplica el primer carácter y el segundo "decrementos" uno que (en sustitución de por ejemplo
x
conw
,a
con9
y1
con0
). La última etapa encuentra un cero como primer personaje, lo elimina en su lugar. Esta es una técnica estándar para generar un rango de caracteres, dado el extremo superior. Por lo tanto, esto genera todos los "dígitos" desde0
el dígito máximo.Finalmente, simplemente contamos el número de dígitos, lo que nos da la base.
fuente
R,
998985 bytesMira ! ¡Menos de 100 bytes!
Mira ! 10 bytes de descuento!
Mira ! ¡4 bytes de descuento!
Sin golf:
Como a menudo, esta respuesta hace uso de la
ifelse
función:ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)
fuente
scan
método para jugar al golf algunos bytes;)PHP,
5138 bytes(De Dennis) ^^
Otra propuesta sin el truco de Dennis
fuente
<?=base_convert(max(str_split($argv[1])),36,10)+1
es una solución elegante, ¡pero con 49 bytes!intval()
lugar de lobase_convert()
que se acorta a 38 bytes<?=intval(max(str_split($argn)),36)+1;
tio: tio.run/##K8go@P/…Octava, 20 bytes
fuente
Pyke, 6 bytes
Pruébalo aquí!
fuente
Java 7,
6761 bytes(m-8)%39
es gracias a la asombrosa respuesta de @Dennis .Ungolfed y código de prueba:
Pruébalo aquí.
Salida:
fuente
Math.max()
que pueda usarm = m>c?m:c
reduce
C89,
55535250 bytes-8%39
robado descaradamente de DennisPrueba
Salida
Guardado 2 bytes gracias a Toby Speight
Guardado 2 bytes gracias a Kevin Cruijssen
fuente
f(char*s,int b)
conviertef(s,b)char*s;
.f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}
C, 55 bytes
Esta respuesta supone que la entrada está en ASCII (o idéntica en los números y letras, por ejemplo, ISO-8859 o UTF-8):
Simplemente iteramos a lo largo de la cadena, recordando el valor más grande visto, luego usamos la conocida conversión de módulo 39 de base- {11..36}.
Programa de prueba
Resultados de la prueba
fuente
f()
más de una vez. Sé que casi todo es juego limpio en el golf, ¡pero mis instintos profesionales lo consideran demasiado frágil!m
entre llamadas af()
. Entonces mi programa de prueba aún podría funcionar.Mathematica,
3432 bytes2 bytes guardados gracias a Martin Ender
Decidí que el método diferente merecía una nueva respuesta.
método
robadoinspirado en la solución de Dennisfuente
Max@Mod[ToCharacterCode@#-8,39]&
(lo mismo ocurre con su otra respuesta)&
al final para indicar una función anónima.@
en sus dos respuestas (ToCharacterCode@#
yCharacters@#
).Mathematica,
3432 bytesahorró 2 bytes gracias a Martin Ender
Define una función pura que toma una cadena como entrada.
Divide la entrada en caracteres, los convierte en números base 36 y devuelve el máximo +1
fuente
Max@BaseForm[Characters@#,36]+1&
C # REPL, 17 bytes
Acabo de portar la respuesta de @ Dennis a C #.
fuente
CJam, 10 bytes
¡Gracias a Martin Ender por salvarme unos pocos bytes!
Utiliza la fórmula de Dennis
Pruébalo en línea
CJam,
1816 btyesSolución alternativa:
Pruébalo en línea
fuente
Scala, 25 bytes
print((args(0).max-8)%39)
Ejecútalo como:
$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz
fuente
R,
6254 bytesSin golf:
Actualización: se recortaron 8 bytes debido a la redundancia de
na.rm=T
bajo el supuesto de validez de entrada.Una mejora del 39% en el tamaño en comparación con la respuesta de Frédéric . Además de eso, funciona un poquito más rápido: 0.86 segundos para 100000 repeticiones versus 1.09 segundos para la respuesta competitiva. Entonces el mío es más pequeño y más eficiente.
fuente
Dyalog APL , 10 bytes
Solicita entrada en mayúsculas.
⌈/
máximo⍞
caracteres de entrada⍳⍨
1 indexado en⎕D,
todos los dígitos seguidos de⎕A
Todos los personajesTryAPL en línea!
fuente
BASH 70
Las letras de entrada son minúsculas.
fuente
JavaScript,
575048 bytes7 bytes guardados gracias a @ kamaroso97 2 bytes guardados gracias a @Neil
Respuesta original:
fuente
n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1))
.Math.max
existía. ¡Gracias por decirme al respecto![...s]
es más corto ques.split``
.Perl,
3027 bytesIncluye +1 para
-p
Ejecutar con la entrada en STDIN, p. Ej.
base.pl
:fuente
LiveScript, 32 bytes
Un puerto de esta respuesta en mi idioma favorito que compila a JavaScript. Si el
base~number
operador trabajara con variables, podría escribir->1+36~(it/'')sort!pop!
(23 bytes), pero entra en conflicto con la función de operador de enlace: /fuente