Encontre o número de dígitos x cujo produto dos dígitos é N


8

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

menor comprimento de código ou menor tempo de execução? Parece que este, o menor tempo de execução com comprimento de código <1000 (por exemplo) seria um alvo mais significativo.
SMCI

Não entendo: 2 dígitos x e N, x = 8, N = 3 significa 8 dígitos em que o produto é 3. Como 3 é primo, ele pode ser apenas 3111 ... 1, 1311 ... 1, 113 ... - 8 possibilidades. o que estou perdendo?
usuário desconhecido

@userunknown É o contrário: três dígitos em que o produto é oito. (222, 811, 181, 118, e seis maneiras de organizar 1,2,4, eu acredito.)
breadbox

@readbox: Enquanto isso, reconheci isso, mas a descrição deve ser corrigida. Se eu estiver dando dois números N e x, não se deve afirmar que recebi dois números x e N (que também é a ordem no título).
usuário desconhecido

Respostas:


3

Python 208 chars

def dec(num, num_dig):
    if num_dig==0:
        return int(num==1)
    else:
        return sum(dec(num/i, num_dig-1) for i in range(1,10) if num/i*i==num)

if __name__ == "__main__":    
    print dec(8,3)

3

Golfscript 42 31

~10\?.10/\,>{10base{*}*1$=},,\;

Entrada: espera os números Ne xcomo argumentos da linha de comando (separados por espaço).

O programa pode ser testado aqui .


Eu testei e obtive um Code took longer than 5 seconds to run, so it was aborted.com os parâmetros invertidos. :)
usuário desconhecido

@userunknown Você está certo. O código é muito ineficiente quando xultrapassa 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 8que eu acho que poderia ser horas ...
Cristian Lupascu

Eu nunca olhei para esse Golfscript-coisinha. É quase sempre tão lento?
desconhecido usuário

O objetivo do @userunknown Golfscript não é a velocidade e é conhecido por ser um pouco lento. No entanto, neste caso, é o algoritmo que é muito ineficiente. Mas o código é curto :)
Cristian Lupascu

1
@userunknown, o GolfScript é interpretado em Ruby. Além disso, todos os valores são imutáveis, por isso há muitas cópias envolvidas. Ele não costuma ser rápido e geralmente pode adicionar uma ou duas de n ao tempo de execução assintótico de algoritmos que geralmente são analisados ​​no modelo de RAM.
22812 Peter Taylor

2

Brachylog (2), 13 bytes, desafio de pós-datas de idiomas

{h.&t~lℕẹ≜×}ᶜ

Experimente online!

Explicação

{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.


1

Scala 107:

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

Eu testei no simplyscala.com e é muito rápido. +1 para desempenho.
Cristian Lupascu

0

Python (ainda trabalhando nele) 164

from itertools import *
N,x=map(int,raw_input().split())
print len([c for c in product([d for d in range(1,10)if N%d==0],repeat=x) if reduce(lambda x,y:x*y,c)==N])

0

C # 128

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 xnúmeros de-dígitos cujo produto de dígitos é n. Requer que os namespaces Systeme System.Linqsejam importados no contexto atual.

Versão online: http://ideone.com/0krup


0

Haskell 117 chars

import Data.Char
main = print $ f 3 8
f n t = length[x|x<-[10^(n-1)..(10^n-1)],foldr(*)1(map digitToInt $ show x)==t]

0

K, 49

{+/x=*/'"I"$''${x@&~x in y}.!:'"i"$10 xexp y,y-1}

.

k){+/x=*/'"I"$''${x@&~x in y}.!:'"i"$10 xexp y,y-1}[8;3]
10

0

J, 40 bytes

[:+/[=[:*/"1(10#~])#:(10^<:@])}.[:i.10^]

Gera todos os xnú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.


0

Geleia , 12 bytes, desafio de pós-datas de idiomas

,’⁵*r/ḊDP€ċƓ

Experimente online!

Toma x como argumento da linha de comando e N na entrada padrão.

Explicaçã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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.