Tantangan Produk Digital Non-Nol

26

Awalnya akar digital Multiplikatif

Tantangan

Pada dasarnya lakukan apa yang dikatakan judulnya

metode

Diberikan bilangan bulat positif 1 <= N <= 100000000 melalui salah satu metode input standar kami , kalikan setiap digit bersama-sama, abaikan nol.

Mis: Ambil nomor, katakan 361218402:

  • 3* 6=18
  • 18* 1=18
  • 18* 2=36
  • 36* 1=36
  • 36* 8=288
  • 288* 4=1152
  • 1152* 1 (abaikan nol atau ubah menjadi yang) =1152
  • 1152* 2=2304

Output untuk 361218402is2304

Uji Kasus

1 => 1
setiap digit lainnya> 0 => itu sendiri
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

Celah Standar tidak diizinkan, dan ini , sehingga jumlah byte terpendek menang!

Selamat kepada Jo King yang mendapat hadiah dengan jawaban 70 byte brain-flak!

FantaC
sumber
5
Saya lebih suka menyebut produk digital ini bukan nol . "root" menyarankan pengurangan menjadi satu digit, yang tidak selalu benar di sini.
Erik the Outgolfer
1
Bisakah kita mengambil input sebagai string? Atau (mendorongnya) array angka?
Shaggy
@EriktheOutgolfer Ya, namun, jika Anda mengulangi prosesnya cukup lama , tampaknya selalu pergi ke satu digit.
DJMcMayhem
Anda dapat mengambil input yang dikutip, tetapi tidak, Anda tidak dapat mengambil daftar digit yang sudah diuraikan sebelumnya jika itu yang Anda minta
FantaC
7
Jika kita harus mendukung hingga maksimal 100000000000saya sarankan test case 99999999999 => 31381059609, karena tidak cocok dengan integer 32-bit default. Mungkin lebih baik untuk menurunkan output maksimum ke maksimum 32-bit (2147483647).
Kevin Cruijssen

Jawaban:

3

Pyt , 3 byte

ąžΠ

Penjelasan:

ą       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

Cobalah online!

mudkip201
sumber
Terkejut bahwa bahasa golf yang relatif baru ini adalah satu-satunya yang tampaknya mampu menyelesaikan tantangan ini dalam 3 byte!
ETHproduk
Saya terkejut dengan itu juga!
mudkip201
Saya tidak melihat jawaban Anda ketika saya pertama kali menerima, tetapi ini adalah yang terpendek!
FantaC
11

Haskell , 27 byte

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

Cobalah online!

Tidak tergabung dengan UniHaskell dan-XUnicodeSyntax

import UniHaskell

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

Penjelasan

Saya akan mulai dengan apa yang awalnya saya miliki:

product.map(max 1.read.pure)

Ini adalah ekspresi bebas-titik yang mengevaluasi fungsi yang mengambil string (atau daftar karakter) s ( "301") sebagai argumen. Ini memetakan max 1.read.purelebih dari s , pada dasarnya mengambil setiap karakter i , menyuntikkannya ke daftar (yang membuatnya menjadi string) ( ["3", "0", "1"]), kemudian membacanya, yang mengevaluasi string ( [3, 0, 1]) dan akhirnya mengambil yang lebih besar dari i dan 1 ( [3, 1, 1]). Kemudian dibutuhkanproduct daftar bilangan bulat yang dihasilkan ( 3).

Saya kemudian memutarnya dengan byte dengan:

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

Ini berfungsi karena productsetara dengan foldr (*) 1. Alih-alih memetakan dan melipat, saya menggabungkan keduanya dengan melipat (*).max 1.read.pureyang mengambil setiap angka yang tidak nol dan mengalikannya dengan akumulator.

benar-benar manusiawi
sumber
7

Jelly , 4 byte

Do1P

Cobalah online! atau lihat test suite

Bagaimana itu bekerja

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
sumber
@tfbninja Memanggil tautan utama dengan masing-masing input
caird coinheringaahing
6

R , 40 byte

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

Cobalah online!

Karena input dijamin tidak lebih dari 12 digit, ini seharusnya bekerja dengan baik. Menghitung angka sebagai x(termasuk angka nol di depan), lalu menggantikan angka nol dengan 1dan menghitung produk.

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
sumber
Jadi ini adalah cara codegolf dengan R ... Bagus;) Masih mencoba mencari cara bagaimana ini bekerja!
Florian
1
@Florian Saya telah menambahkan penjelasan yang lebih jelas.
Giuseppe
Itu cara baru untuk membagi angka yang harus saya coba!
BLT
@ BLT itu salah satu tips
Giuseppe
5

C (gcc) , 39 byte

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

Perlu dikompilasi tanpa optimasi (yang merupakan pengaturan default untuk gcc).

Cobalah online!

Steadybox
sumber
Bahwa k=k;memasukkan kregister kembali secara tidak sengaja adalah kejahatan biasa. Anda mungkin harus menambahkan bahwa ini hanya berfungsi tanpa optimisasi pada kemungkinan hanya x86 / x64. +1.
perkawinan
1
@tommeding Agak mengherankan, ia bekerja pada arsitektur selain x86 . Tidak ada optimasi ( O0) adalah default untuk gcc, jadi tidak perlu secara eksplisit menggunakan flag itu. Saya kira saya akan menambahkan menyebutkannya ke posting.
Steadybox
Anda mungkin ingin menentukan versi persis GCC yang bekerja dengannya, untuk pemeriksaan di masa mendatang.
moonheart08
@ moonheart08 Saya ragu itu akan berhenti berfungsi setelah beberapa versi. Bagaimanapun, ini berfungsi dengan versi terbaru, sehingga waktu posting dapat digunakan untuk menemukan versi yang paling tidak berfungsi.
Steadybox
5

Brain-Flak , 74 72 70 byte

-2 Terima kasih kepada Nitrodon karena menyarankan untuk mendapatkan negasi dari nomor sehingga Anda hanya perlu menambah daripada mengurangi nanti

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

Cobalah online!

Mungkin ada beberapa cara untuk bermain golf ini lebih jauh, seperti mengulang perkalian untuk menghindari menginisialisasi total dengan 1. (-2 byte)

Bagaimana itu bekerja:

{ 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
sumber
1
Anda dapat bermain golf dua byte lagi dengan menghitung negasi dari digit sebenarnya, lalu menghitung hingga 0 bukannya turun ke 0.
Nitrodon
4

05AB1E , 4 byte

0KSP

Cobalah online!

Penjelasan

0K     # remove zeroes
  S    # split to list of digits
   P   # product
Emigna
sumber
Saya menerima jawaban ini karena itu adalah ikatan empat arah antara Jelly, sekam, dan 05AB1E, dan Anda menjawab lebih dulu.
FantaC
4

J , 17 14 13 byte

-4 byte milik @GalenIvanov

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

Cobalah online!

Mungkin bisa diperbaiki beberapa. Edit: dan begitulah.

Penjelasan

[: */ 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

&.-di bawah adalah kata keterangan bagus yang menerapkan kata kerja di sebelah kanan, lalu kata kerja di sebelah kiri, kemudian kebalikan dari kata kerja di sebelah kanan. Juga mengkonversi kembali ke angka secara teknis menggunakan eval ( ".-do).

cole
sumber
1
Anda dapat menyimpan satu byte dengan mengubahnya +0=]ke *#] Coba online
Galen Ivanov
1
[:*/0-.~,.&.":selama 14 byte. Cobalah online
Galen Ivanov
@ GalenIvanov Saya tahu bahwa signum akan berguna! Pikiran orisinal saya adalah (+-.@*), kira saya cenderung untuk menambahkan. Saya telah mencoba menggunakan '0'-.~asumsi sebuah string, tidak yakin mengapa itu tidak terlintas dalam pikiran saya untuk melakukannya pada digit yang terbagi. Terima kasih!
cole
1
1>.melakukan pekerjaan kurang dari 0-.~satu byte. [:*/1>.,.&.": Cobalah!
Galen Ivanov
3

Python 2 , 43 byte

lambda n:eval('*'.join(`n`.replace(*'01')))

Cobalah online!

tongkat
sumber
3

JavaScript (ES6), 28 byte

Dirancang untuk bilangan bulat 32-bit.

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

Uji kasus

Arnauld
sumber
3

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

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

Cobalah online!

Dennis
sumber
3

Brachylog , 5 byte

⊇ẹ×ℕ₁

Cobalah online!

Penjelasan

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

Ini berfungsi karena menyatukan dari himpunan bagian yang besar ke himpunan bagian yang kecil, sehingga yang pertama yang menghasilkan produk yang tidak nol adalah ketika semua nol dikecualikan dan tidak ada yang lain.

Fatalisasi
sumber
3

Perl 5 , 23 + 1 ( -p) = 24 byte

$\=1;s/./$\*=$&||1/ge}{

Cobalah online!

Xcali
sumber
3

Java 8, 55 54 53 51 byte

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

Port jawaban @Dennis 'Python 2 .
-1 byte terima kasih kepada @RiaD .

Coba di sini.

55 54 byte versi:

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

Cobalah online.

Kevin Cruijssen
sumber
1
Anda dapat menghemat orangtua seperti ini:long f(long n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}
RiaD
1
Maaf, saya mengklaim yang ini (45 byte) karena algoritmenya sangat berbeda ;-)
Olivier Grégoire
3

Julia 0,6, 26 byte

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

Contoh penggunaan:

julia> !54
20

Cobalah online!

Lyndon White
sumber
dapatkah Anda menambahkan contoh cara memanggil ini, serta jumlah byte? Anda bisa menggunakan TIO !
Giuseppe
@Giuseppe oops, saya terganggu. Saya menghitung panjangnya tetapi tidak menambahkannya. Huh TIO mendukung julia sekarang. Rapi.
Lyndon White
Faktanya, TIO mendukung Julia 0.4-0.6! sangat bagus, +1.
Giuseppe
3

JavaScript (Node.js) , 30 byte

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

Cobalah online!

Mengambil string sebagai input, memperlakukannya sebagai array, dan dengan merusak array memisahkan elemen pertama[a,...b] . +a||1mengembalikan digit yang sesuai dengan akarakter. Saya kira istirahat itu menjelaskan diri sendiri ..

zworek
sumber
3

Oktaf , 21 byte

Terima kasih kepada @Luis Mendo karena menyimpan byte dan terima kasih kepada @alephalpha karena telah menyimpan byte lain!

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

Mengambil input sebagai string angka.

Cobalah online!

30 byte:

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

Mengambil input sebagai angka.

Cobalah online!

Steadybox
sumber
2

Brain-Flak , 88 byte

Versi yang dapat dibaca:

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

Cobalah online!

DJMcMayhem
sumber
1
74 byte
Jo King
Saya benar-benar lupa saya memposting komentar itu, dan menulis ulang dari awal. Saya hanya akan memposting secara terpisah
Jo King
2

Clojure , 56 byte

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

Cukup mendasar. Ubah angka menjadi string, kemudian kurangi 48 dari setiap karakter untuk mengubahnya kembali menjadi angka. Kemudian menggantikan setiap 0 dengan 1, dan berlaku *untuk daftar nomor yang dihasilkan (yang berkurang* daftar). Dapat menerima nomor, atau nomor yang dikencangkan.

Cobalah 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
sumber
2

MATL , 5 byte

!UXzp

Input diambil sebagai string

Cobalah di MATL Online! Atau verifikasi kasus uji di Try It Online!

Penjelasan

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

Befunge, 23 22 byte

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

Cobalah online!

Penjelasan

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
sumber
2

JavaScript (Node.js) , 36 33 byte

Metode Javascript sederhana (ES6) yang mengambil input sebagai string angka, menyebarkannya ke dalam array, kemudian menguranginya melalui perkalian atau mengembalikan nilai jika hasilnya 0.

3 byte disimpan berkat Shaggy

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

Cobalah online!

Wilson Johnson Reta232
sumber
Simpan 3 byte dengan mengambil input sebagai string.
Shaggy
Saya tidak tahu mengapa saya pikir itu harus dikonversi, terima kasih: D
Wilson Johnson Reta232
2

Ruby, 42 40 35 32 27 byte

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

Diasumsikan tidak ada baris baru dalam input Pengaruh utama

-2 byte terima kasih kepada @GolfWolf

-5 byte terima kasih kepada @Conor O'Brien

Håvard Nygård
sumber
Bahkan lebih pendek dari tr: 32 byte
Cristian Lupascu
@GolfWolf Pandai :)
Håvard Nygård
Mungkinkah Anda menggunakannya *untuk bergabung? p eval (gets.chars-[?0])*?*?
Conor O'Brien
2

C # , 97 Bytes (Golf kode pertama)

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

Tidak yakin apakah saya harus membungkusnya dengan metode atau tidak jadi hanya memasukkannya agar aman.

Mengambil Int in, mengubahnya menjadi string dan mengembalikan kelipatan dari masing-masing karakter dengan mengabaikan 0's. Harus minus 48 karena program menggunakan nilai ascii saat membacanya sebagai char.

James m
sumber
2
Selamat datang di PPCG! Saya bukan apa-apa dari C #, tetapi ini akan membantu Anda memahami aturan untuk bermain golf di dalamnya.
H.PWiz
Terima kasih @ H.PWiz Saya benar-benar mulai menyukai tantangan kecil ini, pasti membuat saya mengubah pemrograman reguler saya menjadi lebih ringkas dan efisien.
James m
Selamat datang dan cobalah pertama yang menyenangkan: D Beberapa tips untuk jawaban Anda: Anda dapat menghapus var z=y.ToString();dan meletakkannya langsung di foreach, seperti:: foreach(var q in y.ToString()); dan untuk mendapatkan hasilnya, Anda dapat menyimpan lebih banyak byte dengan menggantinya {if(q!=48){r*=q-48;}}dengan r*=(q>48?q:1);, menghapus tanda kurung dan if.
auhmaan
1

Jelly , 6 , 5 byte

ṢU×\Ṁ

Cobalah online!

DJMcMayhem
sumber
5 menit, tidak buruk!
FantaC
DTịDPakan menghemat satu byte, tetapi ada cara yang lebih baik untuk menghapus nol atau menggantinya dengan yang lain.
Dennis
5
Root multiplikatif dengan ṢUṀ
Uriel