O desafio do produto digital diferente de zero

26

Originalmente a raiz digital multiplicativa

Desafio

Basicamente, faça o que o título diz

Método

Dado um número inteiro positivo 1 <= N <= 100000000 através de um de nossos métodos de entrada padrão , multiplique cada dígito juntos, ignorando os zeros.

Ex: Pegue um número, diga 361218402:

  • 3* 6=18
  • 18* 1=18
  • 18* 2=36
  • 36* 1=36
  • 36* 8=288
  • 288* 4=1152
  • 1152* 1 (ignore zeros ou transforme-os em um) =1152
  • 1152* 2=2304

A saída para 361218402é2304

Casos de teste

1 => 1
todos os outros dígitos> 0 => em si
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

As brechas padrão não são permitidas, e este é um , portanto, a menor contagem de bytes vence!

Parabéns a Jo King, que recebeu a recompensa com sua resposta cerebral de 70 bytes!

FantaC
fonte
5
Prefiro chamar esse produto digital diferente de zero . "root" sugere que ele se reduz a um único dígito, o que nem sempre é verdade aqui.
Erik the Outgolfer
1
Podemos considerar a entrada como uma string? Ou (pressionando) uma matriz de dígitos?
Salsicha
@EriktheOutgolfer Sim, no entanto, se você repetir o processo várias vezes , ele parece sempre ir para um único dígito.
DJMcMayhem
Você pode tirar a entrada citado, mas não, você não pode tomar uma lista pré-analisado de dígitos se é isso que você está perguntando
FantaC
7
Se precisarmos dar suporte ao máximo 100000000000, sugiro o caso de teste 99999999999 => 31381059609, pois ele não se encaixa em um número inteiro de 32 bits padrão. Talvez o melhor seria diminuir a saída máxima para um máximo de 32 bits (2147483647).
Kevin Cruijssen

Respostas:

3

Pyt , 3 bytes

ąžΠ

Explicação:

ą       Convert input to array of digits (implicit input as stack is empty)
 ž      Remove all zeroes from the array
  Π     Get the product of the elements of the array

Experimente online!

mudkip201
fonte
Surpreendeu-se que este relativamente novo jogo de golfe seja o único que parece ser capaz de resolver esse desafio em 3 bytes!
ETHproductions
Fiquei surpreso com isso também!
precisa saber é o seguinte
Não vi sua resposta quando aceitei pela primeira vez, mas essa é a mais curta!
FantaC 17/02
11

Haskell , 27 bytes

foldr((*).max 1.read.pure)1

Experimente online!

Ungolfed with UniHaskell and-XUnicodeSyntax

import UniHaskell

f  String  Int
f = product  map (max 1  read  pure)

Explicação

Vou começar com o que eu tinha inicialmente:

product.map(max 1.read.pure)

Esta é uma expressão sem pontos que é avaliada como uma função que utiliza uma string (ou uma lista de caracteres) s ( "301") como argumento. Ele mapeia max 1.read.puresobre s , essencialmente tomando cada personagem i , injetá-lo em uma lista (o que torna uma string) ( ["3", "0", "1"]), em seguida, lê-lo, que avalia a string ( [3, 0, 1]) e, finalmente, tomar a maior de i e 1 ( [3, 1, 1]). Depois, pega a productlista resultante de números inteiros ( 3).

Eu então joguei um byte com:

foldr((*).max 1.read.pure)1

Isso funciona porque producté equivalente a foldr (*) 1. Em vez de mapear e dobrar, combinei os dois dobrando com o (*).max 1.read.purequal pega cada dígito diferente de zero e o multiplica com o acumulador.

totalmente humano
fonte
7

Gelatina , 4 bytes

Do1P

Experimente online! ou veja a suíte de testes

Como funciona

Do1P - Main link. Argument: n (integer)  e.g. 1230456
D    - Digits                                 [1, 2, 3, 0, 4, 5, 6]
 o1  - Replace 0 with 1                       [1, 2, 3, 1, 4, 5, 6]
   P - Product                                720
caird coinheringaahing
fonte
@tfbninja Chama o principal elo com cada uma das entradas
caird coinheringaahing
6

R , 40 bytes

cat(prod((x=scan()%/%10^(0:12)%%10)+!x))

Experimente online!

Como a entrada é garantida para não ter mais de 12 dígitos, isso deve funcionar bem. Calcula os dígitos como x(incluindo zeros à esquerda), substitui zeros por 1e calcula o produto.

cat(					#output
    prod(				#take the product of
         (x=				#set X to
	    scan()			#stdin
		  %/%10^(0:12)%%10)	#integer divide by powers of 10, mod 10, yields digits of the input, with leading zeros. So x is the digits of the input
                                   +!x  #add logical negation, elementwise. !x maps 0->1 and nonzero->0. adding this to x yields 0->1, leaving others unchanged
                                      ))
Giuseppe
fonte
Então é assim que codegolf com R ... Bom;) Ainda tentando descobrir como esse funciona!
Florian
1
@ Florence Adicionei uma explicação mais detalhada.
Giuseppe
Essa é uma nova maneira de dividir dígitos que vou ter que tentar!
BLT
@BLT essa é uma das minhas dicas para jogar golfe em R!
Giuseppe
5

C (gcc) , 39 bytes

k;f(n){for(k=1;n;n/=10)k*=n%10?:1;k=k;}

Precisa ser compilado sem otimizações (que é a configuração padrão para o gcc, de qualquer maneira).

Experimente online!

Steadybox
fonte
Que k=k;colocar ko registro de retorno acidentalmente é simplesmente um mal. Você provavelmente deve adicionar que isso só funciona sem otimizações, possivelmente apenas em x86 / x64. +1.
tomsmeding
1
Surpreendentemente, ele funciona em arquiteturas diferentes do x86 . Nenhuma otimização ( O0) é o padrão para o gcc; portanto, não há necessidade de usar explicitamente esse sinalizador. Eu acho que vou adicionar uma menção ao post de qualquer maneira.
Steadybox
Convém especificar a versão exata do GCC com a qual trabalha, para provas futuras.
moonheart08
@ moonheart08 Duvido que ele pare de funcionar após alguma versão. De qualquer forma, ele funciona com a versão mais recente; portanto, o horário da postagem pode ser usado para encontrar uma versão com a qual pelo menos funcione.
Steadybox # 2/18
5

Flacidez Cerebral , 74 72 70 bytes

-2 obrigado a Nitrodon por sugerir obter a negação do número para que você só precise incrementar em vez de diminuir mais tarde

{([{}]((((()()()){}){}){}){}){({<({}())><>([[]](){})<>}<><{}>)<>}{}}<>

Experimente online!

Pode haver algumas maneiras de jogar isso ainda mais, como refazer a multiplicação para evitar a necessidade de inicializar o total com 1. (-2 bytes)

Como funciona:

{ Loop over every number
  ([{}]((((()()()){}){}){}){}) Add 48 to the negative of the ASCII to get the negation of the digit
  { If the number is not 0
     ({<({}())><>([[]](){})<>}<><{}>)<> Multiply the total by the number
                                          If the total is on an empty stack, add 1
  } 
  {} Pop the excess 0
}<> Switch to the stack with the total
Brincadeira
fonte
1
Você pode jogar mais dois bytes calculando a negação do dígito real e, em seguida, contando até 0 em vez de até
zero
4

05AB1E , 4 bytes

0KSP

Experimente online!

Explicação

0K     # remove zeroes
  S    # split to list of digits
   P   # product
Emigna
fonte
Aceitei esta resposta porque havia uma ligação de quatro vias entre Jelly, husk e 05AB1E, e você respondeu primeiro.
FantaC
4

J , 17 14 13 bytes

-4 bytes cortesia de @GalenIvanov

[:*/1>.,.&.":

Experimente online!

Provavelmente pode ser melhorado alguns. Edit: e assim foi.

Explicação

[: */ 1 >. ,.&.":
                 ": Convert to string
             ,.     Convert row to column vector
               &.   Convert to numbers
      1 >.        Maximum of each element with 1 (convert 0 to 1)
   */              Product
[:                 Cap fork

&.-under é um advérbio bacana que aplica o verbo à direita, depois o verbo à esquerda e o inverso do verbo à direita. Também converter de volta para números é tecnicamente usando eval ( ".-do).

Cole
fonte
1
Você pode salvar um byte, alterando +0=]para *#] Experimente-o on-line
Galen Ivanov
1
[:*/0-.~,.&.":por 14 bytes. Experimente on-line
Galen Ivanov
@GalenIvanov Eu sabia que o signum seria útil! Meu pensamento original era (+-.@*): acho que estou inclinado a acrescentar. Eu tentei usar '0'-.~assumindo a entrada de uma string, sem saber por que não passou pela minha cabeça fazê-lo nos dígitos divididos. Obrigado!
cole
1
1>.faz o trabalho de 0-.~por um byte a menos. [:*/1>.,.&.": Tente!
Galen Ivanov
3

JavaScript (ES6), 28 bytes

Projetado para números inteiros de 32 bits.

f=n=>!n||(n%10||1)*f(n/10|0)

Casos de teste

Arnauld
fonte
3

Bash + coreutils + sed + bc, 27 24 23 bytes

tr 0 1|sed s/\\B/*/g|bc

Experimente online!

Dennis
fonte
3

Brachylog , 5 bytes

⊇ẹ×ℕ₁

Experimente online!

Explicação

⊇        Take a subset of the input
 ẹ       Split the subset into a list of digits
  ×      Product
   ℕ₁    This product must be in [1, +∞)

Isso funciona porque unifica de subconjuntos grandes a subconjuntos pequenos; portanto, o primeiro que resultará em um produto diferente de zero é quando todos os zeros são excluídos e nada mais.

Fatalizar
fonte
3

Java 8, 55 54 53 51 bytes

int f(int n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}

Porto da resposta do @Dennis 'Python 2 .
-1 byte graças a @RiaD .

Experimente aqui.

55 54 bytes versão:

n->{int r=1;for(;n>0;n/=10)r*=n%10>0?n%10:1;return r;}

Experimente online.

Kevin Cruijssen
fonte
1
você pode salvar parênteses assim:long f(long n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}
RiaD 16/01
1
Desculpe, eu estou reivindicando este (45 bytes) porque o algoritmo é totalmente diferente ;-)
Olivier Grégoire
3

Julia 0.6, 26 bytes

!x=prod(max.(digits(x),1))

Exemplo de uso:

julia> !54
20

Experimente online!

Lyndon White
fonte
você poderia adicionar um exemplo de como chamar isso, bem como uma contagem de bytes? você pode usar o TIO !
Giuseppe
@ Giuseppe oops, fiquei distraído. Contei o comprimento, mas não o adicionei. Huh TIO suporta julia agora. Arrumado.
Lyndon White
De fato, o TIO suporta Julia 0.4-0.6! muito bom, +1.
Giuseppe
3

JavaScript (Node.js) , 30 bytes

f=([a,...b])=>a?(+a||1)*f(b):1

Experimente online!

Pega string como uma entrada, trata-a como matriz e, por meio da destruição da matriz, separa o primeiro elemento [a,...b]. +a||1retorna o dígito correspondente ao acaractere. Eu acho que o resto é auto-explicativo ..

zworek
fonte
3

Oitava , 21 bytes

Agradecemos a @Luis Mendo por salvar um byte e a @alephalpha por salvar outro byte!

@(n)prod((k=n-48)+~k)

Recebe a entrada como uma sequência de dígitos.

Experimente online!

30 bytes:

@(n)prod((k=num2str(n)-48)+~k)

Recebe a entrada como um número.

Experimente online!

Steadybox
fonte
2

Brain-Flak , 88 bytes

Versão legível:

#Push a 1 onto the alternate stack. Return to the main stack
(<>())<>

#While True:
{

    #Push the current digit minus 48 (the ASCII value of '0') onto the alternate stack
    ({}[((((()()()){}){}){}){}]<>)

    #If it's not 0...
    {
        (<

            #Multiply the top two values (the current digit and the current product that started at 1)
            ({}<>)({<({}[()])><>({})<>}{}<><{}>)

        #Also push a 0
        >)

    #Endwhile
    }

    #Pop the 0
    {}

    #Return to the main stack
    <>

#Endwhile
}

#Toggle to the alternate stack, and implicitly display
<>

Experimente online!

DJMcMayhem
fonte
1
74 bytes
Jo King
Eu literalmente esqueci que postei esse comentário e o reescrevi do zero. Vou postar separadamente
Jo King
2

Clojure , 56 bytes

(fn[n](apply *(replace{0 1}(map #(-(int %)48)(str n)))))

Bastante básico. Transforma o número em uma sequência e subtrai 48 de cada caractere para transformá-los novamente em números. Em seguida, substitui cada 0 por 1 e se aplica *à lista resultante de números (que é reduzida ao *longo da lista). Pode aceitar um número ou um número estrito.

Experimente online!

(defn non-zero-prod [n]
  (let [; Abusing strings to get each digit individually
        str-n (str n)

        ; Then turn them back into numbers
        digits (map #(- (int %) 48) str-n)

        ; Substitute each 0 for a 1
        replaced (replace {0 1} digits)]

    ; Then get the product
    (apply * replaced)))
Carcinigenicado
fonte
2

MATL , 5 bytes

!UXzp

A entrada é tomada como uma sequência

Experimente no MATL Online! Ou verifique os casos de teste no Try It Online!

Explicação

!     % Implicit input: string (row vector of chars). Transpose into
      % a column vector of chars
U     % Convert from string to number. Treats each row independently,
      % producing a column vector of numbers
Xz    % Keep only nonzeros
p     % Product. Implicit display
Luis Mendo
fonte
2

Befunge, 23 22 bytes

1<*_$#`.#0@#:+!:-"0"~$

Experimente online!

Explicação

1<                        Push 1, turn back left, and push a second 1.       
                     $    Drop one of them, leaving a single 1, the initial product.

                -"0"~     Read a char and subtract ASCII '0', converting to a number.
             +!:          If it's 0, make it 1 (this is n + !n).
      `  0  :             Then test if it's greater than 0, to check for EOF.
   _                      If it is greater than 0, it wasn't EOF, so we continue left.
  *                       Multiply with the current product, becoming the new product.
1<                        Now we repeat the loop, but this time push only a single 1...
                     $    ...which is immediately dropped, leaving the current product.

   _                      On EOF, the input value will be negative, so we branch right.
    $                     We don't need the input, so drop it.
       .  @               Leaving us with the product, which we output, then exit.
James Holderness
fonte
2

JavaScript (Node.js) , 36 33 bytes

O método Javascript simples (ES6) que recebe a entrada como sequência numérica, a espalha em uma matriz e a reduz por multiplicação ou retorna o valor se o resultado for 0.

3 bytes salvos graças a Shaggy

s=>[...s].reduce((a,b)=>b*a||a,1)

Experimente online!

Wilson Johnson Reta232
fonte
Salve 3 bytes usando a entrada como uma sequência.
Shaggy
Eu não sei porque eu pensei que tinha que ser convertido, graças: D
Wilson Johnson Reta232
2

Ruby, 42 40 35 32 27 bytes

p eval (gets.chars-[?0])*?*

Não assume novas linhas na entrada Maior influência

-2 bytes graças a @GolfWolf

-5 bytes graças a @Conor O'Brien

Håvard Nygård
fonte
Mesmo menor que tr: 32 bytes
Cristian Lupascu 16/01
@GolfWolf Clever :)
Håvard Nygård
O seu talvez use *para participar? p eval (gets.chars-[?0])*?*?
Conor O'Brien
2

C # , 97 bytes (primeiro código de golfe)

static int X(int y){var z=y.ToString();int r=1;foreach(var q in z){if(q!=48){r*=q-48;}}return r;}

Não tenho certeza se eu tinha que envolvê-lo em um método ou não, apenas incluí-lo para ser seguro.

Pega um Int, converte-o em uma string e retorna o múltiplo de cada um dos caracteres, ignorando os 0's. Teve que menos 48 devido ao programa usando o valor ascii, pois o lê como um caractere.

James m
fonte
2
Bem-vindo ao PPCG! Não tenho nada de c #, mas isso deve ajudá-lo a entender as regras para o golfe nele.
H.PWiz 01/03
Obrigado @ H.PWiz Estou realmente começando a amar esses pequenos desafios, definitivamente me fazendo mudar minha programação regular para ser mais concisa e eficiente.
James m
Bem-vindo e boa primeira tentativa: D Algumas dicas para sua resposta: você pode remover oe var z=y.ToString();colocá-lo diretamente no foreach, assim foreach(var q in y.ToString()):; e para obter o resultado, você pode salvar mais bytes substituindo {if(q!=48){r*=q-48;}}por r*=(q>48?q:1);, raspando os colchetes e if.
auhmaan 23/09
1

Gelatina , 6 , 5 bytes

ṢU×\Ṁ

Experimente online!

DJMcMayhem
fonte
5 minutos, nada mal!
FantaC 15/0118
DTịDPsalvaria um byte, mas existem maneiras melhores de eliminar os zeros ou substituí-los por outra coisa.
Dennis
5
Raiz multiplicativa com ṢUṀ
Uriel