Wyzwanie dla niezerowego cyfrowego produktu

26

Pierwotnie multiplikatywny cyfrowy root

Wyzwanie

Zasadniczo rób to, co mówi tytuł

metoda

Biorąc pod uwagę dodatnią liczbę całkowitą 1 <= N <= 100000000 jedną z naszych standardowych metod wprowadzania , pomnóż każdą cyfrę razem, ignorując zera.

Np .: Weź numer, powiedz 361218402:

  • 3* 6=18
  • 18* 1=18
  • 18* 2=36
  • 36* 1=36
  • 36* 8=288
  • 288* 4=1152
  • 1152* 1 (zignoruj ​​zera lub zamień je na jedynki) =1152
  • 1152* 2=2304

Dane wyjściowe dla 361218402to2304

Przypadki testowe

1 => 1
każda inna cyfra> 0 => sama
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

Standardowe luki są niedozwolone, a to jest , więc wygrywa najkrótsza liczba bajtów!

Gratulacje dla Jo Kinga, który otrzymał nagrodę za swoją 70-bajtową odpowiedź na atak mózgu!

FantaC
źródło
5
Wolę nazwać ten niezerowy produkt cyfrowy . „root” sugeruje, że zmniejsza się do jednej cyfry, co nie zawsze jest prawdą.
Erik the Outgolfer
1
Czy możemy brać dane wejściowe jako ciąg? A może (wypychając) tablicę cyfr?
Kudłaty
@EriktheOutgolfer Tak, jednak jeśli powtórzysz proces wystarczająco dużo razy , wydaje się, że zawsze przechodzi do jednej cyfry.
DJMcMayhem
Możesz wziąć cytowane dane, ale nie, nie możesz wziąć wstępnie przeanalizowanej listy cyfr, jeśli o to pytasz
FantaC
7
Jeśli musimy maksymalnie wspierać 100000000000, sugeruję przypadek testowy 99999999999 => 31381059609, ponieważ nie mieści się on w domyślnej 32-bitowej liczbie całkowitej. Być może lepiej byłoby obniżyć maksymalną moc wyjściową do 32-bitowej wartości maksymalnej (2147483647).
Kevin Cruijssen

Odpowiedzi:

3

Pyt , 3 bajty

ąžΠ

Wyjaśnienie:

ą       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

Wypróbuj online!

mudkip201
źródło
Zaskoczony, że ten stosunkowo nowy golfowy język jest jedynym, który wydaje się być w stanie rozwiązać to wyzwanie w 3 bajtach!
ETHprodukcje
Też mnie to zaskoczyło!
mudkip201
Nie widziałem twojej odpowiedzi, kiedy ją po raz pierwszy zaakceptowałem, ale ta jest najkrótsza!
FantaC
11

Haskell , 27 bajtów

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

Wypróbuj online!

Niegolfowany z UniHaskell i-XUnicodeSyntax

import UniHaskell

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

Wyjaśnienie

Zacznę od tego, co początkowo miałem:

product.map(max 1.read.pure)

Jest to wyrażenie bez punktów, które zwraca wartość do funkcji, która przyjmuje argument (lub listę znaków) s ( "301") jako argument. Mapuje max 1.read.purena s zasadniczo przy każdej postaci I , wstrzykując go do listy (co sprawia, że łańcuch) ( ["3", "0", "1"]), a następnie czyta je, który ocenia ciąg ( [3, 0, 1]) i wreszcie przy większej z I i 1 ( [3, 1, 1]). Następnie pobiera productwynikową listę liczb całkowitych ( 3).

Następnie grałem w golfa bajtem z:

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

Działa productto, ponieważ jest równoważne z foldr (*) 1. Zamiast mapować i składać, połączyłem te dwa, składając, z (*).max 1.read.purektórymi każda niezerowa cyfra pobiera i mnoży ją przez akumulator.

całkowicie ludzki
źródło
7

Galaretka , 4 bajty

Do1P

Wypróbuj online! lub zobacz pakiet testowy

Jak to działa

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
Cairney Coheringaahing
źródło
@tfbninja Wywołuje główny link do każdego z wejść
caird coinheringaahing
6

R , 40 bajtów

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

Wypróbuj online!

Ponieważ dane wejściowe mają nie więcej niż 12 cyfr, powinno to działać dobrze. Oblicza cyfry jako x(łącznie z zerami wiodącymi), a następnie zastępuje zera 1i oblicza 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
                                      ))
Giuseppe
źródło
Więc to jest jak kodegolf z R ... Fajny;) Wciąż próbuję dowiedzieć się, jak to działa!
Florian
1
@Florian Dodałem bardziej szczegółowe wyjaśnienie.
Giuseppe,
To nowy sposób dzielenia cyfr, który będę musiał wypróbować!
BLT
@BLT to jedna z moich wskazówek dotyczących gry w golfa w R!
Giuseppe
5

C (gcc) , 39 bajtów

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

Musi zostać skompilowany bez optymalizacji (co zresztą jest domyślnym ustawieniem gcc).

Wypróbuj online!

Steadybox
źródło
Że k=k;umieszczenie kw rejestrze powrotnej przypadkowo jest po prostu zła. Powinieneś chyba dodać, że działa to tylko bez optymalizacji na prawdopodobnie tylko x86 / x64. +1.
tomsmeding
1
@tomsmeding Nieco zaskakujące, działa na architekturach innych niż x86 . Brak optymalizacji ( O0) jest domyślną opcją gcc, więc nie ma potrzeby jawnego używania tej flagi. W każdym razie dodam wzmiankę o tym w poście.
Steadybox
Możesz chcieć określić dokładną wersję GCC, z którą współpracuje, w celu późniejszego sprawdzenia.
moonheart08
@ moonheart08 Wątpię, aby przestał działać po jakiejś wersji. W każdym razie działa z najnowszą wersją, więc czas publikacji można wykorzystać do znalezienia wersji, z którą przynajmniej działa.
Steadybox
5

Brain-Flak , 74 72 70 bajtów

-2 dzięki Nitrodonowi za zasugerowanie uzyskania negacji liczby, abyś musiał tylko zwiększać, a nie zmniejszać później

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

Wypróbuj online!

Może istnieć kilka sposobów gry w golfa, takich jak powtórzenie mnożenia, aby uniknąć konieczności inicjalizacji sumy z wartością 1. (-2 bajty)

Jak to działa:

{ 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
Jo King
źródło
1
Możesz
zagrać w
4

05AB1E , 4 bajty

0KSP

Wypróbuj online!

Wyjaśnienie

0K     # remove zeroes
  S    # split to list of digits
   P   # product
Emigna
źródło
Przyjąłem tę odpowiedź, ponieważ była to czterokierunkowa więź między Galaretką, łuską i 05AB1E, a ty odpowiedziałeś pierwszy.
FantaC
4

J , 17 14 13 bajtów

-4 bajty dzięki uprzejmości @GalenIvanov

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

Wypróbuj online!

Prawdopodobnie można to poprawić. Edycja: i tak było.

Wyjaśnienie

[: */ 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 to fajny przysłówek, który stosuje czasownik po prawej stronie, następnie czasownik po lewej stronie, a następnie odwrotność czasownika po prawej stronie. Również konwersja z powrotem na liczby jest technicznie za pomocą eval ( ".-do).

kapusta
źródło
1
Można zapisać bajt zmieniając +0=]aby *#] Spróbuj go w Internecie
Galen Iwanow
1
[:*/0-.~,.&.":przez 14 bajtów. Wypróbuj online
Galen Iwanow
@GalenIvanov Wiedziałem, że podpis będzie przydatny! Moją pierwotną myślą było (+-.@*), myślę, że jestem skłonny dodać. Próbowałem użyć '0'-.~założenia ciąg znaków, nie jestem pewien, dlaczego nie przyszło mi do głowy, aby zrobić to na podzielonych cyfrach. Dzięki!
cole
1
1>.wykonuje 0-.~mniej bajtów. [:*/1>.,.&.": Spróbuj!
Galen Iwanow
3

JavaScript (ES6), 28 bajtów

Zaprojektowany dla 32-bitowych liczb całkowitych.

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

Przypadki testowe

Arnauld
źródło
3

Bash + coreutils + sed + bc, 27 24 23 bajtów

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

Wypróbuj online!

Dennis
źródło
3

Brachylog , 5 bajtów

⊇ẹ×ℕ₁

Wypróbuj online!

Wyjaśnienie

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

Działa to, ponieważ łączy duże podzbiory z małymi podzbiorami, więc pierwszym, który spowoduje powstanie niezerowego produktu, jest wykluczenie wszystkich zer i nic więcej.

Fatalizować
źródło
3

Java 8, 55 54 53 51 bajtów

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

Port odpowiedzi @Dennis na Python 2 .
-1 bajt dzięki @RiaD .

Wypróbuj tutaj.

55 54 bajtów wersja:

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

Wypróbuj online.

Kevin Cruijssen
źródło
1
możesz zapisać pareny w ten sposób:long f(long n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}
RiaD
1
Przepraszam, twierdzę, że ten (45 bajtów), ponieważ algorytm jest zupełnie inny ;-)
Olivier Grégoire
3

Julia 0.6, 26 bajtów

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

Przykład zastosowania:

julia> !54
20

Wypróbuj online!

Lyndon White
źródło
czy możesz dodać przykład, jak to nazwać, a także liczbę bajtów? możesz użyć TIO !
Giuseppe,
@Giuseppe ups, rozproszyłem się. Policzyłem długość, ale jej nie dodałem. Huh TIO obsługuje teraz Julię. Schludny.
Lyndon White,
W rzeczywistości TIO obsługuje Julię 0.4-0.6! bardzo fajnie, +1.
Giuseppe,
3

JavaScript (Node.js) , 30 bajtów

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

Wypróbuj online!

Pobiera ciąg znaków jako dane wejściowe, traktuje go jako tablicę, a poprzez destrukcję tablicy oddziela pierwszy element [a,...b]. +a||1zwraca cyfrę odpowiadającą aznakowi. Wydaje mi się, że odpoczynek wyjaśnia się sam…

zworek
źródło
3

Oktawa , 21 bajtów

Dzięki @Luis Mendo za uratowanie bajtu i dzięki @alephalpha za uratowanie kolejnego bajtu!

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

Pobiera dane wejściowe jako ciąg cyfr.

Wypróbuj online!

30 bajtów:

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

Pobiera dane wejściowe jako liczbę.

Wypróbuj online!

Steadybox
źródło
2

Brain-Flak , 88 bajtów

Wersja do odczytu:

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

Wypróbuj online!

DJMcMayhem
źródło
1
74 bajty
Jo King
Dosłownie zapomniałem, że opublikowałem ten komentarz i przepisałem go od nowa. Po prostu zamierzam pisać osobno
Jo King
2

Clojure , 56 bajtów

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

Całkiem proste. Zamienia liczbę na ciąg znaków, a następnie odejmuje 48 od każdego znaku, aby przekształcić je z powrotem w liczby. Następnie zamienia każde 0 na 1 i stosuje *się do wynikowej listy liczb (która zmniejsza się *nad listą). Może zaakceptować numer lub numer strunowy.

Wypróbuj 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)))
Carcigenicate
źródło
2

MATL , 5 bajtów

!UXzp

Dane wejściowe są traktowane jako ciąg

Wypróbuj w MATL Online! Lub sprawdź przypadki testowe w Try It Online!

Wyjaśnienie

!     % 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
źródło
2

Befunge, 23 22 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
źródło
2

JavaScript (Node.js) , 36 33 bajtów

Prosta metoda Javascript (ES6), która pobiera dane wejściowe jako ciąg liczbowy, rozkłada je na tablicę, a następnie zmniejsza przez mnożenie lub zwraca wartość, jeśli wynikiem jest 0.

3 bajty zapisane dzięki Shaggy

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

Wypróbuj online!

Wilson Johnson Reta232
źródło
Zapisz 3 bajty, przyjmując dane wejściowe jako ciąg.
Kudłaty
Nie wiem, dlaczego myślałem, że trzeba go przekonwertować, dzięki: D
Wilson Johnson Reta232
2

Rubinowy, 42 40 35 32 27 bajtów

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

Zakłada brak wprowadzania nowych linii Znaczący wpływ

-2 bajty dzięki @GolfWolf

-5 bajtów dzięki @Conor O'Brien

Håvard Nygård
źródło
Nawet krótszy niż tr: 32 bajty
Cristian Lupascu
@GolfWolf Clever :)
Håvard Nygård
Może użyjesz, *aby dołączyć? p eval (gets.chars-[?0])*?*?
Conor O'Brien
2

C # , 97 bajtów (pierwszy kod golfa)

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

Nie jestem pewien, czy musiałem zawinąć to w metodę, czy nie, więc po prostu umieściłem ją dla bezpieczeństwa.

Pobiera Int, konwertuje go na ciąg znaków i zwraca wielokrotność każdego z znaków ignorując 0. Musiał minus 48 ze względu na to, że program używa wartości ascii, ponieważ odczytuje ją jako znak.

James m
źródło
2
Witamy w PPCG! Nie mam nic z C #, ale to powinno pomóc ci zrozumieć zasady gry w golfa.
H.PWiz
Dzięki @ H.PWiz Naprawdę uwielbiam te małe wyzwania, zdecydowanie zmuszając mnie do zmiany mojego regularnego programowania, aby była bardziej zwięzła i wydajna.
James m
Witamy i ładny pierwsza próba: D Wskazówki na odpowiedź: można wyjąć var z=y.ToString();i umieścić go bezpośrednio w foreach, tak: foreach(var q in y.ToString()); i aby uzyskać wynik, możesz zaoszczędzić więcej bajtów, zastępując {if(q!=48){r*=q-48;}}je r*=(q>48?q:1);, goląc nawiasy i if.
auhmaan
1

Galaretka , 6 , 5 bajtów

ṢU×\Ṁ

Wypróbuj online!

DJMcMayhem
źródło
5 minut, nieźle!
FantaC
DTịDPzaoszczędziłby bajt, ale są lepsze sposoby na usunięcie zer lub zastąpienie ich czymś innym.
Dennis
5
Korzeń multiplikatywny z ṢUṀ
Uriel