Die Non-Zero Digital Product Challenge


26

Ursprünglich die multiplikative digitale Wurzel

Herausforderung

Grundsätzlich tun, was der Titel sagt

Methode

Bei einer positiven Ganzzahl von 1 <= N <= 100000000 mit einer unserer Standardeingabemethoden multiplizieren Sie jede Ziffer miteinander und ignorieren Sie dabei Nullen.

Bsp .: Nehmen Sie eine Zahl, sagen Sie 361218402:

  • 3* 6=18
  • 18* 1=18
  • 18* 2=36
  • 36* 1=36
  • 36* 8=288
  • 288* 4=1152
  • 1152* 1 (Nullen ignorieren oder in Einsen verwandeln) =1152
  • 1152* 2=2304

Die Ausgabe für 361218402ist2304

Testfälle

1 => 1
jede zweite Ziffer> 0 => sich selbst
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

Standard-Schlupflöcher sind nicht zulässig, und dies ist , so dass die kürzeste Anzahl an Bytes gewinnt!

Herzlichen Glückwunsch an Jo King , der mit seiner 70-Byte-Brain-Flak-Antwort das Kopfgeld erhalten hat !


5
Ich würde dieses digitale Produkt lieber als ein Produkt ungleich Null bezeichnen . "root" legt nahe, dass es auf eine einzelne Ziffer reduziert wird, was hier nicht immer zutrifft.
Erik der Outgolfer

1
Können wir Eingaben als String annehmen? Oder eine Reihe von Ziffern?
Shaggy

@EriktheOutgolfer Ja, wenn Sie den Vorgang jedoch genügend oft wiederholen , scheint er immer auf eine einzelne Ziffer zu gehen.
DJMcMayhem

Sie können Eingaben in Anführungszeichen vornehmen, aber nein, Sie können keine vorab analysierte
Ziffernliste erstellen,

7
Wenn wir maximal unterstützen müssen 100000000000 schlage ich den Testfall vor 99999999999 => 31381059609, da er nicht in eine standardmäßige 32-Bit-Ganzzahl passt. Vielleicht ist es besser, die maximale Ausgabe auf ein 32-Bit-Maximum (2147483647) zu senken.
Kevin Cruijssen

Antworten:


3

Pyt , 3 Bytes

ąžΠ

Erläuterung:

ą       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

Probieren Sie es online!


Überrascht, dass diese relativ neue Golfsprache die einzige zu sein scheint, die diese Herausforderung in 3 Bytes lösen kann!
ETHproductions

Das hat mich auch überrascht!
mudkip201

Ich habe Ihre Antwort nicht gesehen, als ich sie zum ersten Mal angenommen habe, aber dies ist die kürzeste!
FantaC

11

Haskell , 27 Bytes

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

Probieren Sie es online!

Ungolfed mit UniHaskell und-XUnicodeSyntax

import UniHaskell

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

Erläuterung

Ich beginne mit dem, was ich anfangs hatte:

product.map(max 1.read.pure)

Hierbei handelt es sich um einen punktfreien Ausdruck, der zu einer Funktion ausgewertet wird, die einen String (oder eine Liste von Zeichen) s ( "301") als Argument verwendet. Es bildet max 1.read.pureüber s , im Wesentlichen jedes Zeichen unter i , es in eine Liste Injektion ((was ein String macht) ["3", "0", "1"]), dann ist es zu lesen, die die Zeichenfolge auswertet ( [3, 0, 1]) und schließlich die größere der Einnahme i und 1 ([3, 1, 1] ). Dann nimmt es die productaus der resultierenden Liste der ganzen Zahlen ( 3).

Ich habe es dann byteweise golfen mit:

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

Das funktioniert, weil productes äquivalent zu ist foldr (*) 1. Anstatt zu mappen und zu falten, habe ich die beiden durch Falten kombiniert, wobei (*).max 1.read.purejede Ziffer ungleich Null genommen und mit dem Akkumulator multipliziert wird.




6

R , 40 Bytes

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

Probieren Sie es online!

Da die Eingabe garantiert nicht mehr als 12 Stellen hat, sollte dies gut funktionieren. Berechnet die Ziffern als x(einschließlich führender Nullen), ersetzt dann die Nullen durch 1und berechnet das Produkt.

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

Das ist also die Codegolf-Methode mit R ... Nice one;) Ich versuche immer noch herauszufinden, wie dieser funktioniert!
Florian

1
@Florian Ich habe eine ausführlichere Erklärung hinzugefügt.
Giuseppe

Das ist eine neue Art, Ziffern zu teilen, die ich versuchen muss!
BLT

@BLT das ist einer meiner Tipps zum Golfen in R!
Giuseppe

5

C (gcc) , 39 Bytes

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

Muss ohne Optimierungen kompiliert werden (was ohnehin die Standardeinstellung für gcc ist).

Probieren Sie es online!


Das versehentliche k=k;Einfügen kin das Rücksenderegister ist schlichtweg böse. Sie sollten wahrscheinlich hinzufügen, dass dies nur ohne Optimierungen auf möglicherweise nur x86 / x64 funktioniert. +1.
Tomsmeding

1
@tomsmeding Überraschenderweise funktioniert es auch auf anderen Architekturen als x86 . Keine Optimierungen ( O0) ist die Standardeinstellung für gcc, sodass dieses Flag nicht explizit verwendet werden muss. Ich schätze, ich werde dem Post trotzdem eine Erwähnung hinzufügen.
Steadybox

Möglicherweise möchten Sie die genaue Version von GCC angeben, mit der es funktioniert, um zukünftige Überprüfungen durchzuführen.
moonheart08

@ moonheart08 Ich bezweifle, dass es nach einer Version nicht mehr funktionieren würde. Auf jeden Fall funktioniert es mit der neuesten Version, so dass der Zeitpunkt der Veröffentlichung verwendet werden kann, um eine Version zu finden, mit der es zumindest funktioniert.
Steadybox

5

Brain-Flak , 74, 72 70 Bytes

-2 Dank an Nitrodon für den Vorschlag, die Negation der Zahl zu erhalten, damit Sie später nur noch inkrementieren und nicht dekrementieren müssen

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

Probieren Sie es online!

Es gibt möglicherweise einige Möglichkeiten, dies weiter zu verbessern , z. B. das Wiederherstellen der Multiplikation, um zu vermeiden, dass die Summe mit 1 initialisiert werden muss. (-2 Bytes)

Wie es funktioniert:

{ 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
Sie können zwei weitere Bytes
golfen,

4

05AB1E , 4 Bytes

0KSP

Probieren Sie es online!

Erläuterung

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

Ich habe diese Antwort akzeptiert, da es sich um eine Vier-Wege-Verbindung zwischen Jelly, Husk und 05AB1E handelte und Sie zuerst geantwortet haben.
FantaC

4

J , 17 14 13 Bytes

-4 Bytes mit freundlicher Genehmigung von @GalenIvanov

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

Probieren Sie es online!

Wahrscheinlich kann man einiges verbessern. Edit: und so war es.

Erläuterung

[: */ 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 ist ein geschicktes Adverb, das das Verb auf der rechten Seite, dann das Verb auf der linken Seite und dann die Umkehrung des Verbs auf der rechten Seite anwendet . Auch das Zurückkonvertieren in Zahlen erfolgt technisch mit eval ( ".-do).


1
Sie können , indem ein Byte speichern , +0=]um *#] Online ausprobieren
Galen Ivanov

1
[:*/0-.~,.&.":für 14 Bytes. Versuchen Sie es online
Galen Ivanov

@GalenIvanov Ich wusste, dass signum nützlich sein würde! Mein ursprünglicher Gedanke war (+-.@*), denke ich bin geneigt, hinzuzufügen. Ich hatte versucht, '0'-.~die Eingabe eines Strings anzunehmen, nicht sicher, warum es mir nicht in den Sinn kam, dies mit den aufgeteilten Ziffern zu tun. Vielen Dank!
Cole

1
1>.erledigt die Aufgabe 0-.~für ein Byte weniger. [:*/1>.,.&.": Versuch es!
Galen Ivanov


3

JavaScript (ES6), 28 Byte

Entwickelt für 32-Bit-Ganzzahlen.

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

Testfälle



3

Brachylog , 5 Bytes

⊇ẹ×ℕ₁

Probieren Sie es online!

Erläuterung

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

Dies funktioniert, weil von großen Teilmengen zu kleinen Teilmengen vereinheitlicht wird. Das erste, was zu einem Produkt ungleich Null führt, ist, wenn alle Nullen ausgeschlossen sind und sonst nichts.



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

Port von @Dennis 'Python 2 Antwort .
-1 Byte dank @RiaD .

Probieren Sie es hier aus.

55 54 Bytes Version:

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

Probieren Sie es online aus.


1
Sie können Parens wie long f(long n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}
folgt

1
Entschuldigung, ich beanspruche dieses (45 Bytes), weil der Algorithmus völlig anders ist ;-)
Olivier Grégoire

3

Julia 0,6, 26 Bytes

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

Anwendungsbeispiel:

julia> !54
20

Probieren Sie es online!


Könnten Sie ein Beispiel hinzufügen, wie man das aufruft, sowie eine Byteanzahl? Sie können TIO !
Giuseppe

@ Giuseppe Hoppla, ich wurde abgelenkt. Ich habe die Länge gezählt, aber nicht addiert. Huh TIO unterstützt jetzt Julia. Ordentlich.
Lyndon White

Tatsächlich unterstützt TIO Julia 0.4-0.6! sehr schön, +1.
Giuseppe

3

JavaScript (Node.js) , 30 Byte

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

Probieren Sie es online!

Nimmt einen String als Eingabe, behandelt ihn als Array und trennt durch Array-Destrukturierung das erste Element [a,...b]. +a||1Gibt die dem aZeichen entsprechende Ziffer zurück . Ich denke, dass der Rest selbsterklärend ist ..



2

Gehirn-Flak , 88 Bytes

Lesbare Version:

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

Probieren Sie es online!



Ich habe buchstäblich vergessen, dass ich diesen Kommentar gepostet und von Grund auf neu geschrieben habe. Ich werde nur separat posten
Jo King

2

Clojure , 56 Bytes

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

Ziemlich einfach. Wandelt die Zahl in eine Zeichenfolge um und subtrahiert dann 48 von jedem Zeichen, um sie wieder in Zahlen umzuwandeln. Es ersetzt dann jede 0 durch eine 1 und gilt *für die sich ergebende Liste von Zahlen (die sich verringert)* über der Liste ). Kann eine Zahl oder eine fortlaufende Zahl akzeptieren.

Probieren Sie es 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 Bytes

!UXzp

Die Eingabe wird als Zeichenfolge verwendet

Probieren Sie es bei MATL Online! Oder verifizieren Sie Testfälle in Try It Online!

Erläuterung

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

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

Probieren Sie es online!

Erläuterung

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

JavaScript (Node.js) , 36 33 Bytes

Einfache Javascript (ES6) -Methode, die Eingaben als Zahlenzeichenfolge verwendet, sie in ein Array aufteilt und dann durch Multiplikation reduziert oder den Wert zurückgibt, wenn das Ergebnis 0 ist.

3 Bytes gespart dank Shaggy

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

Probieren Sie es online!


Sparen Sie 3 Bytes, indem Sie die Eingabe als Zeichenfolge übernehmen.
Shaggy

Ich weiß nicht, warum ich dachte, es
müsste



2

C # , 97 Bytes (erster Code Golf)

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

Ich bin mir nicht sicher, ob ich es in eine Methode einwickeln musste oder nicht, nur um sicher zu gehen.

Nimmt ein Int auf, konvertiert es in einen String und gibt das Vielfache jedes Zeichens zurück, wobei die Nullen ignoriert werden. Musste minus 48, weil das Programm den ASCII-Wert als Zeichen liest.


2
Willkommen bei PPCG! Ich habe keine Ahnung von C #, aber dies sollte Ihnen helfen, die Regeln für das Golfen darin zu verstehen.
H.PWiz

Danke @ H.PWiz Ich fange wirklich an, diese kleinen Herausforderungen zu lieben, was mich definitiv dazu veranlasst, meine reguläre Programmierung so zu ändern, dass sie präziser und effizienter ist.
James m

Willkommen und netter erster Versuch: D Einige Tipps für Ihre Antwort: Sie können das entfernen var z=y.ToString();und direkt in das platzieren foreach, wie so foreach(var q in y.ToString()):; und um das Ergebnis zu erhalten , können Sie mehr Bytes sparen durch Ersetzen {if(q!=48){r*=q-48;}}mit r*=(q>48?q:1);, Rasieren aus den Halterungen und dem if.
Auhmaan




Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.