Sin usar cadenas (excepto cuando sea necesario, como con entrada o salida), calcule el enésimo dígito, desde la izquierda , de un entero (en la base 10).
La entrada se dará en este formato:
726433 5
La salida debe ser:
3
como ese es el quinto dígito de "726433".
La entrada no contendrá ceros a la izquierda, por ejemplo, "00223".
Casos de prueba / ejemplos adicionales:
9 1 -> 9
0 1 -> 0
444494 5 -> 9
800 2 -> 0
Este es el código de golf; menor cantidad de caracteres victorias, pero cualquier construido en funciones tales como "nthDigit (x, n)" son no aceptable .
Aquí hay algunos pseudocódigos para comenzar:
x = number
n = index of the digit
digits = floor[log10[x]] + 1
dropRight = floor[x / 10^(digits - n)]
dropLeft = (dropRight / 10 - floor[dropRight / 10]) * 10
nthDigit = dropLeft
Como puede ver, soy nuevo en el código de golf, y aunque creo que es un poco injusto hacer una pregunta antes de responderla, realmente me gustaría ver qué tipo de respuestas genera. :)
Editar : esperaba respuestas matemáticas, por lo que realmente no puedo aceptar respuestas que dependen de la conversión de cadenas en matrices o de poder acceder a los números como una lista de dígitos.
Tenemos un ganador
Escrito en "dc", 12 bytes. Por DigitalTrauma .
Respuestas:
dc , 12 bytes
Esta es una respuesta matemática. Así es como funciona:
?
leer el número de entrada y presionar para apilard
duplicar la parte superior de la pilaZ
Extrae el valor de la pila, calcula y empuja el número de dígitos?
leer el índice de dígitos y presionar para apilar-
restar índice de dígitos del recuento de dígitosA
empuja 10 a la pilar
intercambiar los 2 valores superiores en la pila^
exponer 10 ^ (recuento de dígitos - índice de dígitos)/
dividir el número por el resultado de la exponenciaciónA
empuja 10 a la pila%
calcule el número mod 10 para obtener el último dígito y presione hasta la parte superior de la pilap
pop e imprime la parte superior de la pilaEn acción:
fuente
base conversion -> arrays
.GolfScript (10 bytes)
Esto supone que la entrada es como una cadena (por ejemplo, a través de stdin). Si es como dos enteros en la pila, la inicial
~
debe eliminarse, ahorrando 1 carácter.Si se considera que la conversión de base no cumple con la regla de funciones incorporadas, tengo una alternativa de 16 caracteres:
fuente
CJam - 7
CJam es un nuevo lenguaje que estoy desarrollando, similar a GolfScript: http://sf.net/p/cjam . Aquí está la explicación:
l
lee una línea desde la entrada,~
evalúa la cadena (obteniendo así los dos números)(
disminuye el segundo número\
intercambia los númerosA
es una variable preinicializada a 10b
realiza una conversión base, haciendo una matriz con los dígitos de base 10 del primer número=
obtiene el deseado elemento de la matrizEl programa es básicamente una traducción de la solución de Peter Taylor.
fuente
Haskell 60 bytes y legible
sin compromiso!
fuente
J -
1524 charUna respuesta suficientemente "matemática".
Los mismos resultados que a continuación, pero está dotado de la cualidad mística de ser matemático.
La versión corta, que usa expansión de base 10.
Anteponemos un 0 para ajustar la indexación basada en 1.
Uso:
fuente
Python 127
fuente
def f(i,n): ... return d
if n>k: return -1
caso.C, 50
Esto usa matrices.
Solo ignora todas las advertencias.
Y sí, en C, las cadenas son realmente solo matrices, por lo que esto es algo barato.
Más matemática:
C, 83
fuente
a. C. (impulsado por bash),
4129Creo que esta es la primera respuesta para hacer esto matemáticamente y no con cadenas:
El uso de
length()
quizás parece un poco fibroso, pero la página de manual de bc habla sobre el número de dígitos y no la longitud de la cadena:Salida:
fuente
Mathematica -
2423Este es algo obvio :)
Ejemplo:
Salida:
Puede acortarlo codificando dos enteros, p. Ej.
pero luego primero tienes que escribir
n = 726433; m = 5;
. La llamada a la función se sintió más similar a un programa.fuente
1
.C 145
El programa encuentra la distancia desde el final del número entero y lo divide hasta que se alcanza el índice, luego usa el módulo 10 para obtener el último dígito.
fuente
i,a;main(){scanf("%d%d",&i,&a);for(a=log(i)/log(10)+1-a;a--;)i/=10;printf("%d",i%10);}
.Wolfram Alpha - entre 40 y 43
Por supuesto, puedo defender totalmente que usar
IntegerDigits
es un truco que no está incluidoPero debido a que mi respuesta anterior aún parecía hacer trampa un poco, aquí hay una alternativa. Desafortunadamente es un poco más largo, pero no vi cómo acortarlo más de lo que lo hice.
Contando de la misma manera que antes (con el signo y sin pasar ningún argumento),
Tiene 43 caracteres. Al negar el exponente y barajar los términos, puedo perder un operador aritmético (
10^(...)x
se interpretará como multiplicación)No tengo a mano Mathematica para probar, dudo que sea loque sospeché (y fue amablemente verificado por kukac67 ) en Mathematica, esto no es aceptado, pero se ejecuta en WolframAlpha .Tengo dudas sobre el uso de
RealDigits
, porque me limité a usarIntegerDigits
para esta respuesta y son bastante similares. Sin embargo, si me permito incluirla (después de todo, no devuelve los números enteros directamente, lo que muchos de ellos no lo son), puedo recortar fuera otros dos personajes:fuente
Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
[
caracteres incluso cuando están codificados. Lo sacaré a través de un acortador de URL. {edit2} Aparentemente W.Alpha tiene uno: cambió el enlace.Tcl (42 bytes, lambda):
(49 bytes, función):
(83 bytes, si necesitamos aceptar la entrada del shell):
fuente
R (60)
Resolvió el problema usando log10 para calcular el número de dígitos. El caso especial x == 0 cuesta 13 caracteres, suspiro.
Sin golf:
Uso
fuente
Scala (
13399 bytes):Funciona para todas las entradas positivas. Se divide por 10 a la potencia del dígito buscado desde la derecha, luego toma el módulo 10.
Gracias por notar el error en la fórmula anterior. Este es más corto.
fuente
Haskell, 142
No estoy seguro de haber entendido la pregunta correctamente, pero esto es lo que creo que quería: leer stdin (cadena), hacer los dos números int (no cadena), hacer algunas cosas algorítmicas y luego generar el resultado (cadena). Lo metí en 142 caracteres, que es demasiado:
ejemplo de uso:
fuente
JavaScript - 84
Puramente matemático, sin condiciones, ninguna de ellas. Toma el primer número en la primera solicitud y el segundo número en la segunda solicitud.
Caso de prueba :
Código sin golf:
fuente
perl,
38, 36no 30 caracteres(sin contar el salto de línea)
Esto es posiblemente una trampa debido al cambio de comando, pero gracias por dejarme jugar :-)
editar :
Fue capaz de eliminar 2 caracteres:
... luego 6 más:
Cómo
Dividimos la entrada del primer argumento al script
$ARGV[0]
por character (split//
) creando una matriz indexada a cero; agregar uno al segundo argumento$ARGV[1]
del script corresponde al elemento en esa posición en la cadena o primer argumento. Luego mantenemos la expresión dentro()
como una lista de un elemento quesay
iterará. Para la versión corta más corta, solo utilizamosshift
el primer argumento y utilizamos la parte restante de @ARGV para el índice; una vezshift
editado, solo queda el segundo argumento, por lo quepop()
lo restamos 1.¿Se supone que esto es un ejercicio de matemáticas? Me acabo de dar cuenta de que estoy indexando una cadena de lectura de entrada, así que ... ¿supongo que pierdo? Marcarme si tengo sentido en un campo de golf paralelo e intentaré nuevamente, más matemáticamente, en una respuesta separada.
salud,
fuente
PHP, 58
Usar solo matemáticas
<?$n=$argv[1];while($n>pow(10,$argv[2]))$n/=10;echo $n%10;
fuente
echo$n%10
.~ - ~! -
9493Dobla un poco las reglas: es una función que toma n como entrada y supone que el número para encontrar el dígito n se almacena en
'''''
- y ~ - ~! No admite flotadores.'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:
resultará en''''''
ser~~
(2) ('' '' '= 128).fuente
:)
Python 2.7 (89 bytes)
Transforme el número entero en un "polinomio" usando una lista de dígitos. Sé que dices que no puedes aceptar eso, pero no veo por qué no, ya que usa el concepto matemático de los números que se representan como polinomios de sus bases. Solo fallará cuando el entero pasado sea
0
, pero usted dijo que no había ceros rellenados;)Ejecutar como
test.py
:Supongo que quería una entrada de shell y que no podía hacer uso del hecho de que la entrada sería cadenas. Saltar la entrada del shell es de solo 43 bytes, con:
Aunque uso algunas iteraciones innecesarias, guardo algunos bytes al no agregar una disminución adicional
n
.fuente
BrainFuck extendido : 49
Uso:
Ectually no estoy usando ninguna característica especial de EBF excepto el operador de multiplicación (por ejemplo.
10+ => ++++++++++
). Aparte de eso, es principalmente puro BrainFuckCómo funciona:
Esquema (R6RS): 100 (sin espacios en blanco innecesarios)
fuente
awk - 53
Sin golf:
fuente
Scala (83)
No utiliza ninguna característica especial de Scala. Más bien la solución estándar.
Sin golf:
fuente
C, 94
C, 91, inválido por usar matrices.
fuente
Julia 37
Debido al operador incorporado ^. La aritmética de precisión arbitraria permite cualquier tamaño int.
Muestra
fuente
perl (un poco más mathy / no muy golfista) - 99 caracteres
Ejecútalo como:
fuente
Perl6 - 85 caracteres
fuente
Smalltalk, 44
Aunque dc es inmejorable, aquí hay una solución Smalltalk:
argumentos, n número; d digit-nr para extraer:
fuente