Tarea:
Su tarea es, cuando se le dan tres entradas:
- un numerador
n
- un denominador
d
- otro entero
x
Cree un programa / función que encuentre el x
enésimo dígito del número después del decimal.
Especificaciones:
- El rango de
n
yd
es entre1
y2^31 - 1
, inclusive. - El rango de
x
es entre1
y10,000,000
, inclusive.- Puede elegir usar indexación basada en 1 o indexación basada en 0 para
x
. Indique en su respuesta cuál está utilizando.
- Puede elegir usar indexación basada en 1 o indexación basada en 0 para
n
puede ser mayor qued
.n
,d
yx
se garantiza que son enteros positivos (para la versión de índice basada en 1x
, si elige usar la indexación basada en 0,x
entoncesx
puede ser0
).- Puede tomar entradas de cualquier manera razonable (es decir, cualquier forma que no sea una laguna estándar).
Reglas:
- Debe devolver el
x
dígito th exacto , no cuando se redondea, por lo que el15
dígito th de1/6
, por ejemplo, no es7
, pero6
. - Su programa debe funcionar para todos los
x
menores de 10 millones, a menos que su idioma no admita decimales a 10 millones de lugares.
Ejemplo de E / S:
La entrada de ejemplo usa indexación basada en 0, lo que significa x
que irá de 0
a 9,999,999
. Además de eso, la "entrada" se escribe como una cadena con espacios que separan los números.
1 2 3: 0
5 6 0: 8
5 6 1: 3
1 6 15: 6 (not 7, as it's not rounded)
1 11 2: 0
1 10000 9999999: 0
11 7 1: 7
Respuestas:
Python 2 , 25 bytes
El puerto de mi respuesta de Haskell, ya que Python también admite bignums por defecto. Como allí,
x
está 1 indexado.Pruébalo en línea! (Tomando prestado el envoltorio de Keerthana Prabhakaran).
fuente
Mathematica 33 Bytes
Indexación basada en 1.
ej., 10 millonésimo dígito de Pi a la derecha del punto decimal:
Toma alrededor de 2 segundos en mi vieja máquina.
Puede probarlo en línea en WolframAlpha (haga clic en el signo igual)
fuente
Haskell , 26 bytes
Funciona para todos los casos de prueba. Yay bignums!
(n#d)x
tomaInteger
s y devuelve unInteger
.x
está indexado en 1.Pruébalo en línea!
fuente
PHP> = 7.1, 40 bytes
bcdiv
Versión en línea
fuente
<br /> <b>Notice</b>: Uninitialized string offset: -1 in <b>[...][...]</b> on line <b>6</b><br />
Jalea , 7 bytes
Pruébalo en línea!
Una presentación de función (pero también funciona como un programa completo). Las funciones Jelly solo pueden tomar dos argumentos directamente; por lo tanto, tomo el dígito para regresar como argumento izquierdo, el numerador como argumento derecho y el denominador de la entrada estándar (en lugar de usar un tercer argumento).
Las personas acostumbradas a Jelly pueden ser conscientes de que un programa completo puede tomar más de dos argumentos, pero hacerlo hace que pierdas el acceso a la forma más estricta de escribir el entero constante 10, que es bastante relevante aquí. Como tal, este tipo de entrada mixta se siente como un exploit en lugar de un golf útil real; Personalmente no estoy de acuerdo con eso, pero la regla sobre permitir esto está actualmente en +40 / -12, por lo que mientras esté en las reglas, también podría explotarlo (y más o menos tener que ser competitivo).
Un argumento izquierdo de 1 se refiere al dígito inmediatamente después del punto decimal (el "dígito .1s"), un argumento de 2 al dígito .01s, y así sucesivamente.
Explicación
Jelly tiene una aritmética de precisión arbitraria en enteros, por lo que al multiplicar previamente por una potencia de 10, estamos moviendo efectivamente el dígito que queremos a la posición de las unidades, donde es mucho más fácil extraerlo.
fuente
sed
-r
, 93131136bytesPruébalo en línea!
( Ver salida en decimal )
Toma entradas en unario y salidas en unario, y el programa está indexado en 1. Afortunadamente, esto desafío ya me ha preparado para este.
El concepto es similar, ambos implementan una división larga. Aquí realizo una división larga
x
tiempos de , dondex
está el dígito después del lugar decimal que tengo que encontrar. Después de cada iteración, descarto los decimales anteriores porque ya no son necesarios.Mientras hace la división, el programa está en el formato
dividend;divisor;x,result
.s/$/,/
agrega esta coma, se requiere la coma para separar el resultado de todo lo demásLuego sigue el ciclo principal del programa
:d
etiqueta ds/,.+/,/
eliminar todo después de la coma:
etiqueta vacías/(1+)(1*;\1;1*,)1{10}?/\21/
realice la división, agregando 1 al resultado en cada iteración, mientras que simultáneamente elimina bloques de 10 1 continuos en el resultadot
salte a la etiqueta vacía, en otras palabras, repita hasta que se haya agotado el dividendos/1*/&&&&&&&&&&/
multiplique el dividendo por 10 para prepararse para la próxima iteraciónta
rama para etiquetar un:a
etiqueta a, esta línea y la línea de arriba son necesarias para hacer eltd
trabajos/1,/,/
restar 1 de xtd
rama condicional a d, esto se activa si ha habido una sustitución exitosa desde la última rama condicional, yas/1*/&&&&&&&&&&/
que siempre es exitosa,td
siempre se activará, pero al introducir la rama a, lo arreglamos para que solo dependa de la sustitución anteriors/.+,//
finalmente, elimine todo menos el resultadofuente
Ruby ,
3433 bytesPruébalo en línea!
fuente
REXX, 76 bytes
(No es muy breve, pero pensé que sería un cambio hacer uno en REXX) Rexx se basa en 1 por definición.
Explicación:
La fusión de 3 y 4 en realidad lo hace más largo debido al cambio en la sintaxis:
Para no REXXers: las cadenas y los números son totalmente intercambiables en REXX. Están determinados por cómo actúas sobre ellos. Por lo tanto, puede analizar un número utilizando funciones de picadura sin conversión. Por ejemplo
devuelve 55 y no 2728!
fuente
rexx main.rexx 1 2 3
. Debe mencionar en su respuesta que la entrada está indexada en 1.Lote, 70 bytes.
fuente
Ensamblaje del lenguaje de CPU Intel x86, 50 bytes
traducción en nasm
Para el parámetro 'c' el rango comienza desde 0; sería 0..0xfffffffd. Si los parámetros b = 0 o c fuera del rango 0..0xfffffffd devolvería -1
fuente
Lua, 42 bytes
fuente
C,
4943 bytesEl argumento 'i' es indexación 0. Código de prueba y resultado
fuente
Java 7,
146139137133128122 Bytes-3 bytes gracias a Erik the Outgolfer, olvidé totalmente que las importaciones no tenían que estar en su propia línea
-4 bytes gracias a Qwerp-Derp por mover n% d al constructor
-6 bytes gracias Kevin Cruijssen por eliminar toString ()
Espero que así es como se realiza el recuento de bytes para las funciones de Java con importaciones
Utiliza la clase BigDecimal de Java para obtener una representación exacta de la expansión decimal. Tenga en cuenta que no es el código que se ejecuta más rápido, pero finalmente produce el resultado correcto para todos los casos de prueba. Código sin golf:
Pruébalo en línea!
fuente
BigDecimal(n)
conBigDecimal(n%d)
, y deshacerse de lan=n%d
?.toString()
y usar+""
en su lugar (con dos paréntesis adicionales).Clojure, 39 bytes
función anónima con argumentos
n,d,x
dondex
usa una indexación basada.fuente
F # (.NET Core) , 30 bytes
Pruébalo en línea!
(use indexación basada en 1)
fuente
Groovy, 30 bytes
x usa 1 indexación basada.
Explicación:
fuente
Python 2 ,
50,44,40,36 bytesPruébalo en línea!
fuente
1,7,10000000
Ruby, 39 bytes
fuente
JavaScript (ES6), 34 bytes
x está basado en 0
fuente
f(1,7,10000000)
, por ejemplo.Python 2 , 32 bytes
Utiliza indexación 0
Pruébalo en línea!
Editar:
Volví a la solución original como se ve en la respuesta de Ørjan Johansen de que funciona, pero no lo seguiré jugando.
fuente
Groovy, 55 bytes
Explicado usando
1,11,2
:fuente
Axioma,
71 6176 bytesn es indexación 0 [0..M]. Código de prueba y resultado
fuente
JavaScript (Node.js) , 43 bytes, puerto
Pruébalo en línea!
JavaScript (Node.js) , 51 bytes
Pruébalo en línea!
use Array en lugar de recursivo para evitar stackoverflow
fuente