La sfida del prodotto digitale diverso da zero


26

Originariamente la radice digitale moltiplicativa

Sfida

Fondamentalmente fai quello che dice il titolo

Metodo

Dato un numero intero positivo 1 <= N <= 100000000 attraverso uno dei nostri metodi di input standard , moltiplica ogni cifra insieme, ignorando gli zero.

Es: Prendi un numero, di ' 361218402:

  • 3* 6=18
  • 18* 1=18
  • 18* 2=36
  • 36* 1=36
  • 36* 8=288
  • 288* 4=1152
  • 1152* 1 (ignora gli zeri o trasformali in uno) =1152
  • 1152* 2=2304

L'output per 361218402è2304

Casi test

1 => 1
ogni altra cifra> 0 => stessa
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

Le scappatoie standard non sono ammesse, e questo è , quindi vince il conteggio dei byte più corto!

Congratulazioni a Jo King che ha ottenuto la taglia con la sua risposta da 70 byte a scaglie di cervello!


5
Preferirei chiamare questo prodotto digitale diverso da zero . "root" suggerisce che si riduce a una sola cifra, il che non è sempre vero qui.
Erik the Outgolfer,

1
Possiamo prendere l'input come una stringa? O (spingendolo) una serie di cifre?
Shaggy,

@EriktheOutgolfer Sì, tuttavia, se si ripete il processo abbastanza volte , sembra che vada sempre a una singola cifra.
DJMcMayhem

Puoi prendere l'input tra virgolette, ma no, non puoi prendere un elenco pre-analizzato di cifre se è quello che stai chiedendo
FantaC

7
Se dobbiamo supportare al massimo 100000000000suggerisco il caso di test 99999999999 => 31381059609, poiché non si adatta a un numero intero a 32 bit predefinito. Forse meglio sarebbe abbassare l'uscita massima a un massimo di 32 bit (2147483647).
Kevin Cruijssen,

Risposte:


3

Pyt , 3 byte

ąžΠ

Spiegazione:

ą       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

Provalo online!


Sorpreso dal fatto che questo lang golfistico relativamente nuovo sia l'unico in grado di risolvere questa sfida in 3 byte!
ETHproductions

Anche questo mi ha sorpreso!
mudkip201,

Non ho visto la tua risposta quando ho accettato per la prima volta, ma questa è la più breve!
FantaC,

11

Haskell , 27 byte

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

Provalo online!

Ungolfed con UniHaskell e-XUnicodeSyntax

import UniHaskell

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

Spiegazione

Inizierò con quello che avevo inizialmente:

product.map(max 1.read.pure)

Questa è un'espressione senza punti che restituisce una funzione che accetta una stringa (o un elenco di caratteri) s ( "301") come argomento. Mappa max 1.read.puresu s , essenzialmente prendendo ogni carattere i , iniettandolo in un elenco (che lo rende una stringa) ( ["3", "0", "1"]), quindi leggendolo, che valuta la stringa ( [3, 0, 1]) e infine prendendo il maggiore di io e 1 ( [3, 1, 1]). Quindi prende l' productelenco risultante di numeri interi ( 3).

Ho quindi giocato a golf di un byte con:

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

Questo funziona perché productequivale a foldr (*) 1. Invece di mappare e piegare, ho combinato i due piegando con il (*).max 1.read.purequale prende ogni cifra diversa da zero e la moltiplica con l'accumulatore.




6

R , 40 byte

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

Provalo online!

Poiché è garantito che l'input non contenga più di 12 cifre, dovrebbe funzionare correttamente. Calcola le cifre come x(inclusi gli zeri iniziali), quindi sostituisce gli zeri 1e calcola il prodotto.

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
                                      ))

Quindi ecco come codegolf con R ... Bello;) Sto ancora cercando di capire come funziona!
Florian,

1
@Florian Ho aggiunto una spiegazione più dettagliata.
Giuseppe,

È un nuovo modo di dividere le cifre che dovrò provare!
BLT

@BLT questo è uno dei miei consigli per giocare a golf in R!
Giuseppe

5

C (gcc) , 39 byte

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

Deve essere compilato senza ottimizzazioni (che è l'impostazione predefinita per gcc, comunque).

Provalo online!


Il fatto di k=k;inserire kaccidentalmente il registro dei resi è semplicemente un male. Probabilmente dovresti aggiungere che questo funziona solo senza ottimizzazioni solo su x86 / x64. +1.
tomsmeding

1
@tomsmeding Un po 'sorprendentemente, funziona su architetture diverse da x86 . Nessuna ottimizzazione ( O0) è l'impostazione predefinita per gcc, quindi non è necessario utilizzare esplicitamente quel flag. Immagino che ne aggiungerò comunque una menzione al post.
Steadybox

Potresti voler specificare la versione esatta di GCC con cui funziona, per prove future.
moonheart08

@ moonheart08 Dubito che smetterebbe di funzionare dopo qualche versione. Ad ogni modo, funziona con l'ultima versione, quindi il tempo di pubblicazione può essere usato per trovare una versione con cui almeno funziona.
Steadybox

5

Brain-Flak , 74 72 70 byte

-2 grazie a Nitrodon per aver suggerito di ottenere la negazione del numero in modo che tu debba solo incrementare piuttosto che diminuire in seguito

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

Provalo online!

Potrebbero esserci alcuni modi per golfare ulteriormente, come ripetere la moltiplicazione per evitare di dover inizializzare il totale con 1. (-2 byte)

Come funziona:

{ 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

1
Puoi giocare a golf altri due byte calcolando la negazione della cifra effettiva, quindi contando fino a 0 invece che fino a 0.
Nitrodon,

4

05AB1E , 4 byte

0KSP

Provalo online!

Spiegazione

0K     # remove zeroes
  S    # split to list of digits
   P   # product

Ho accettato questa risposta perché si trattava di un pareggio a quattro vie tra Jelly, husk e 05AB1E, e tu hai risposto prima.
FantaC,

4

J , 17 14 13 byte

-4 byte per gentile concessione di @GalenIvanov

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

Provalo online!

Probabilmente può essere migliorato alcuni. Modifica: e così è stato.

Spiegazione

[: */ 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 è un avverbio elegante che applica il verbo a destra, quindi il verbo a sinistra, quindi l' inverso del verbo a destra. Anche la conversione in numeri è tecnicamente usando eval ( ".-do).


1
Puoi salvare un byte cambiando +0=]in *#] Provalo online
Galen Ivanov

1
[:*/0-.~,.&.":per 14 byte. Provalo online
Galen Ivanov,

@GalenIvanov Sapevo che signum sarebbe stato utile! Il mio pensiero originale era (+-.@*), suppongo che sono propenso ad aggiungere. Avevo provato a usare '0'-.~supponendo un input di una stringa, non sapevo perché non mi passasse per la testa farlo con le cifre divise. Grazie!
Cole

1
1>.fa il lavoro di 0-.~per un byte in meno. [:*/1>.,.&.": Provalo!
Galen Ivanov,


3

JavaScript (ES6), 28 byte

Progettato per numeri interi a 32 bit.

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

Casi test



3

Brachylog , 5 byte

⊇ẹ×ℕ₁

Provalo online!

Spiegazione

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

Questo funziona perché unisce da sottogruppi di grandi dimensioni a sottoinsiemi di piccole dimensioni, quindi il primo che si tradurrà in un prodotto diverso da zero è quando tutti gli zero sono esclusi e nient'altro.




3

Julia 0.6, 26 byte

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

Esempio di utilizzo:

julia> !54
20

Provalo online!


potresti aggiungere un esempio di come chiamare questo, nonché un conteggio dei byte? puoi usare TIO !
Giuseppe,

@Giuseppe oops, mi sono distratto. Ho contato la lunghezza ma non l'ho aggiunta. Huh TIO supporta julia ora. Neat.
Lyndon White,

In effetti, TIO supporta Julia 0.4-0.6! molto bello, +1.
Giuseppe,

3

JavaScript (Node.js) , 30 byte

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

Provalo online!

Prende la stringa come input, la tratta come array e, mediante array destructuring, separa il primo elemento [a,...b]. +a||1restituisce la cifra corrispondente al acarattere. Immagino che il resto sia autoesplicativo ..



2

Brain-Flak , 88 byte

Versione leggibile:

#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
<>

Provalo online!



Ho letteralmente dimenticato di aver pubblicato quel commento e lo ho riscritto da zero. Pubblicherò solo separatamente
Jo King

2

Clojure , 56 byte

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

Piuttosto semplice. Trasforma il numero in una stringa, quindi sottrae 48 da ciascun carattere per trasformarli in numeri. Sostituisce quindi ogni 0 con 1 e si applica *all'elenco di numeri risultante (che si riduce *sull'elenco). Può accettare un numero o un numero limitato.

Provalo 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)))

2

MATL , 5 byte

!UXzp

L'input è preso come una stringa

Provalo su MATL Online! O verifica i casi di test in Provalo online!

Spiegazione

!     % 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

2

Befunge, 23 22 byte

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

Provalo online!

Spiegazione

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.




2

C # , 97 byte (golf di primo codice)

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;}

Non sono sicuro se ho dovuto avvolgerlo in un metodo o meno, quindi l'ho incluso per sicurezza.

Accetta un Int, lo converte in una stringa e restituisce il multiplo di ciascuno dei caratteri ignorando gli 0. Ho dovuto meno 48 a causa del programma che utilizzava il valore ASCII mentre lo legge come carattere.


2
Benvenuti in PPCG! Non ho niente di C #, ma questo dovrebbe aiutarti a capire le regole per giocare a golf.
H.Piz

Grazie @ H.PWiz sto davvero iniziando ad amare queste piccole sfide, facendomi sicuramente cambiare la mia programmazione regolare per essere più conciso ed efficiente.
James m

Benvenuto e simpatico primo tentativo: D Alcuni consigli per la tua risposta: puoi rimuovere il var z=y.ToString();e inserirlo direttamente nel foreach, in questo modo foreach(var q in y.ToString()):; e per ottenere il risultato è possibile salvare più byte sostituendoli {if(q!=48){r*=q-48;}}con r*=(q>48?q:1);, radendo tra parentesi e if.
auhmaan,




Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.