Dados dos números N yx, encuentre el número de números de x dígitos cuyo producto de dígitos es N
limits: N(<10^6) and x(<12)
Sample Input:
8 3
Sample Output:
10
Dados dos números N yx, encuentre el número de números de x dígitos cuyo producto de dígitos es N
limits: N(<10^6) and x(<12)
Sample Input:
8 3
Sample Output:
10
Respuestas:
~10\?.10/\,>{10base{*}*1$=},,\;
Entrada: Espera los números N
y x
como argumentos de línea de comando (separados por espacio).
El programa se puede probar aquí .
Code took longer than 5 seconds to run, so it was aborted.
con los parámetros invertidos. :)
x
va por encima de 4. Por ejemplo, si lo ejecuto en mi máquina con los parámetros 3 5
obtengo el resultado después de más de 30 segundos. Así 3 8
que supongo que podrían ser horas ...
{h.&t~lℕẹ≜×}ᶜ
{h.&t~lℕẹ≜×}ᶜ
{ }ᶜ Count the number of
≜ values at this point
&t formed via taking the last element of the input,
ℕ generating an integer
~l of that length,
ẹ and splitting it into digits
× such that the product of those digits
h. is the first element of {the input}
Un buen truco de golf utilizado aquí es que, a diferencia de casi todos los metapredicados, ᶜ
no le importa en absoluto el valor real de .
(que normalmente se usa para construir una salida para los metapredicados); como tal, .
se puede usar como cualquier otra variable (guardar un byte porque aparece implícitamente antes }
). No hay labelisations implícitos en cualquier lugar aquí, así que he tenido que añadir un labelisation explícita usando ≜
para dar ᶜ
algo para contar.
def f(N:Int,x:Int,s:Int=1):Int=if(s==N&&x==0)1 else
if(s>N||x==0)0 else
((1 to 9).map(i=>f(N,x-1,s*i))).sum
Versión no depurada y amigable:
def findProduct (N: Int, sofar: Int, togo:Int, collected:String=""):Int={
if (sofar == N && togo == 0) {
println (collected)
1
} else
if (sofar > N || togo == 0) 0 else
(1 to 9).map (x=> findProduct (N, sofar*x, togo-1, collected + " " + x)).sum
}
Invocación con salida de depuración:
scala> findProduct (3, 1, 8)
1 1 1 1 1 1 1 3
1 1 1 1 1 1 3 1
1 1 1 1 1 3 1 1
1 1 1 1 3 1 1 1
1 1 1 3 1 1 1 1
1 1 3 1 1 1 1 1
1 3 1 1 1 1 1 1
3 1 1 1 1 1 1 1
res175: Int = 8
scala> findProduct (8, 1, 3)
1 1 8
1 2 4
1 4 2
1 8 1
2 1 4
2 2 2
2 4 1
4 1 2
4 2 1
8 1 1
res176: Int = 10
int Z(int n,int x){var i=(int)Math.Pow(10,x-1);return Enumerable.Range(i,i*9).Count(j=>(j+"").Aggregate(1,(a,c)=>a*(c-48))==n);}
Este método C # devuelve el número de x
números de dígitos cuyo producto de dígitos es n
. Requiere que los espacios de nombres System
y System.Linq
se importen en el contexto actual.
Versión en línea: http://ideone.com/0krup
[:+/[=[:*/"1(10#~])#:(10^<:@])}.[:i.10^]
Genera todos los x
números de dígitos, convierte cada uno en base 10, luego encuentra el producto de cada número y prueba si cada número es igual al lado izquierdo, y luego encuentra la suma de cada booleano.
,’⁵*r/ḊDP€ċƓ
Toma x como argumento de línea de comando y N en la entrada estándar.
,’⁵*r/ḊDP€ċƓ
, On {the input} and
’ {the input} minus 1
⁵* take 10 to the power of each of those numbers
r/ then form a range between them
Ḋ without its first element;
D treat each element as a list of digits,
P€ take the product of each of those digit lists,
ċ then count the number of times
Ɠ the value from standard input appears
La parte difícil es generar la lista de números con x dígitos; el número más bajo es 10 x −1 , el más alto es 10 x −1. El rango aquí se genera al generar primero el par ( x , x −1), luego tomar 10 a la potencia de ambos y luego generar el rango entre ellos. El rango incluye ambos puntos finales por defecto; solo en caso de que N sea 0, necesitamos eliminar el extremo superior del rango (que viene primero porque es un rango "hacia atrás") usando Ḋ
.