Dados dois números N e x, encontre o número de dígitos de x cujo produto dos dígitos seja N
limits: N(<10^6) and x(<12)
Sample Input:
8 3
Sample Output:
10
Dados dois números N e x, encontre o número de dígitos de x cujo produto dos dígitos seja N
limits: N(<10^6) and x(<12)
Sample Input:
8 3
Sample Output:
10
Respostas:
~10\?.10/\,>{10base{*}*1$=},,\;
Entrada: espera os números N
e x
como argumentos da linha de comando (separados por espaço).
O programa pode ser testado aqui .
Code took longer than 5 seconds to run, so it was aborted.
com os parâmetros invertidos. :)
x
ultrapassa 4. Por exemplo, se eu executá-lo na minha máquina com os parâmetros 3 5
, obtenho o resultado após mais de 30 segundos. Assim, por 3 8
que eu acho que poderia 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}
Um bom truque de golfe usado aqui é que, ao contrário de quase todos os metapredicados, ᶜ
não se preocupa com o valor real de .
(que normalmente é usado para construir uma saída para os metapredicados); como tal, .
pode ser usado como qualquer outra variável (salvar um byte porque ele aparece implicitamente antes }
). Não há rotulagens implícitas em nenhum lugar aqui, então tive que adicionar uma rotulagem explícita usando ≜
para fornecer ᶜ
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
versão não-destruída e sem amigos:
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
}
Chamada com saída de depuração:
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);}
Esse método C # retorna o número de x
números de-dígitos cujo produto de dígitos é n
. Requer que os namespaces System
e System.Linq
sejam importados no contexto atual.
Versão online: http://ideone.com/0krup
[:+/[=[:*/"1(10#~])#:(10^<:@])}.[:i.10^]
Gera todos os x
números de dois dígitos, converte cada um na base 10, encontre o produto de cada número e teste se cada número é igual ao lado esquerdo e, em seguida, encontre a soma de cada booleano.
,’⁵*r/ḊDP€ċƓ
Toma x como argumento da linha de comando e N na entrada padrão.
,’⁵*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
A parte difícil é gerar a lista de números com dígitos x ; o menor número desse tipo é 10 x -1 , o mais alto é 10 x -1. O intervalo aqui é gerado primeiro pela geração do par ( x , x −1), depois levando 10 à potência de ambos e depois gerando o intervalo entre eles. O intervalo inclui os dois pontos de extremidade por padrão; apenas no caso de N ser 0, precisamos remover a extremidade superior do intervalo (que vem primeiro porque é um intervalo "para trás") usando Ḋ
.