Thử thách sản phẩm kỹ thuật số khác không


26

Ban đầu là gốc số nhân

Thử thách

Về cơ bản làm những gì tiêu đề nói

phương pháp

Cho số nguyên dương 1 <= N <= 100000000 thông qua một trong các phương thức nhập tiêu chuẩn của chúng tôi , nhân mọi chữ số với nhau, bỏ qua các số không.

Vd Lấy một số, nói 361218402:

  • 3* 6=18
  • 18 * 1=18
  • 18 * 2=36
  • 36 * 1=36
  • 36 * 8=288
  • 288 * 4=1152
  • 1152 * 1 (bỏ qua các số 0 hoặc biến chúng thành các số) =1152
  • 1152 * 2=2304

Đầu ra cho 3612184022304

Các trường hợp thử nghiệm

1 => 1
mỗi chữ số khác> 0 => chính nó
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

Các lỗ hổng tiêu chuẩn không được phép và đây là , vì vậy số byte ngắn nhất sẽ thắng!

Xin chúc mừng Jo King , người đã nhận được tiền thưởng với câu trả lời cân não 70 byte của mình!


5
Tôi muốn gọi sản phẩm kỹ thuật số khác không này . "root" cho thấy nó giảm xuống một chữ số, điều này không phải lúc nào cũng đúng ở đây.
Erik the Outgolfer

1
Chúng ta có thể lấy đầu vào như một chuỗi? Hoặc (đẩy nó) một mảng các chữ số?
Xù xì

@EriktheOutgolfer Có, tuy nhiên, nếu bạn lặp lại quá trình đủ số lần , nó dường như luôn luôn đi đến một chữ số.
DJMcMayhem

Bạn có thể lấy đầu vào được trích dẫn, nhưng không, bạn không thể lấy danh sách các chữ số được phân tích trước nếu đó là những gì bạn đang hỏi
FantaC

7
Nếu chúng tôi phải hỗ trợ tối đa 100000000000tôi đề xuất trường hợp thử nghiệm 99999999999 => 31381059609, vì nó không phù hợp với số nguyên 32 bit mặc định. Có lẽ tốt hơn là hạ thấp đầu ra tối đa xuống tối đa 32 bit (2147483647).
Kevin Cruijssen

Câu trả lời:


3

Pyt , 3 byte

ąžΠ

Giải trình:

ą       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

Hãy thử trực tuyến!


Ngạc nhiên là lang chơi golf tương đối mới này là người duy nhất dường như có khả năng giải quyết thử thách này trong 3 byte!
Sản phẩm ETH

Tôi cũng ngạc nhiên vì điều đó!
Mudkip201

Tôi đã không nhìn thấy câu trả lời của bạn khi tôi lần đầu tiên chấp nhận, nhưng đây là câu trả lời ngắn nhất!
FantaC

11

Haskell , 27 byte

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

Hãy thử trực tuyến!

Ung dung với UniHaskell-XUnicodeSyntax

import UniHaskell

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

Giải trình

Tôi sẽ bắt đầu với những gì ban đầu tôi có:

product.map(max 1.read.pure)

Đây là một điểm miễn biểu hiện mà đánh giá lại để một chức năng tham gia một chuỗi (hoặc một danh sách các nhân vật) s ( "301") như một cuộc tranh cãi. Nó ánh xạ max 1.read.purequa s , về cơ bản lấy từng ký tự i , đưa nó vào một danh sách (làm cho nó thành một chuỗi) ( ["3", "0", "1"]), sau đó đọc nó, để đánh giá chuỗi ( [3, 0, 1]) và cuối cùng lấy số lớn hơn của i1 ( [3, 1, 1]). Sau đó, nó lấy productdanh sách kết quả của số nguyên ( 3).

Sau đó tôi đánh gôn nó bằng một byte với:

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

Điều này hoạt động vì producttương đương với foldr (*) 1. Thay vì ánh xạ và gấp, tôi kết hợp cả hai bằng cách gấp với (*).max 1.read.puremỗi chữ số khác không và nhân nó với bộ tích lũy.




6

R , 40 byte

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

Hãy thử trực tuyến!

Vì đầu vào được đảm bảo không có quá 12 chữ số, nên điều này sẽ hoạt động tốt. Tính các chữ số dưới dạng x(bao gồm các số 0 đứng đầu), sau đó thay thế các số không bằng 1và tính toán sản phẩm.

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

Vì vậy, đây là cách để codegolf với R ... Nice one;) Vẫn đang cố gắng tìm ra cách thức hoạt động của cái này!
Florian

1
@Florian Tôi đã thêm một lời giải thích dài dòng hơn.
Giuseppe

Đó là một cách mới để phân chia các chữ số mà tôi sẽ phải thử!
BLT

@BLT đó là một trong những mẹo chơi golf
Giuseppe

5

C (gcc) , 39 byte

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

Cần phải được biên dịch mà không cần tối ưu hóa (dù sao đó cũng là cài đặt mặc định cho gcc).

Hãy thử trực tuyến!


Việc vô tình k=k;đưa kvào sổ đăng ký trở lại chỉ là tà ác. Bạn có thể nên thêm rằng điều này chỉ hoạt động mà không tối ưu hóa có thể chỉ x86 / x64. +1.
tomsmeding

1
@tomsmeding Một điều đáng ngạc nhiên, nó hoạt động trên các kiến ​​trúc khác ngoài x86 . Không tối ưu hóa ( O0) là mặc định cho gcc, vì vậy không cần sử dụng cờ đó một cách rõ ràng. Tôi đoán tôi sẽ thêm một đề cập đến nó vào bài viết nào.
Steadybox

Bạn có thể muốn chỉ định phiên bản chính xác của GCC mà nó hoạt động với, để chứng minh trong tương lai.
moonheart08

@ moonheart08 Tôi nghi ngờ rằng nó sẽ ngừng hoạt động sau một số phiên bản. Dù sao, nó hoạt động với phiên bản mới nhất, vì vậy thời gian đăng có thể được sử dụng để tìm phiên bản mà ít nhất nó hoạt động.
Steadybox

5

Brain-Flak , 74 72 70 byte

-2 cảm ơn Nitrodon vì đã gợi ý cách phủ định số để bạn chỉ phải tăng lên chứ không phải giảm sau

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

Hãy thử trực tuyến!

Có thể có một vài cách để chơi gôn hơn nữa, chẳng hạn như làm lại phép nhân để tránh phải khởi tạo tổng số bằng 1. (-2 byte)

Làm thế nào nó hoạt động:

{ 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
Bạn có thể chơi thêm hai byte bằng cách tính toán phủ định của chữ số thực, sau đó đếm đến 0 thay vì xuống 0.
Nitrodon

4

05AB1E , 4 byte

0KSP

Hãy thử trực tuyến!

Giải trình

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

Tôi đã chấp nhận câu trả lời này bởi vì đó là sự ràng buộc bốn chiều giữa Jelly, trấu và 05AB1E, và bạn đã trả lời trước.
FantaC

4

J , 17 14 13 byte

-4 byte lịch sự của @GalenIvanov

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

Hãy thử trực tuyến!

Có lẽ có thể được cải thiện một số. Chỉnh sửa: và nó đã được như vậy.

Giải trình

[: */ 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 là một trạng từ tiện lợi áp dụng động từ bên phải, sau đó là động từ bên trái, sau đó là động từ nghịch đảo của động từ bên phải. Ngoài ra, chuyển đổi trở lại số là về mặt kỹ thuật bằng cách sử dụng eval ( ".-do).


1
Bạn có thể lưu một byte bằng cách thay đổi +0=]thành *#] Dùng thử trực tuyến
Galen Ivanov

1
[:*/0-.~,.&.": cho 14 byte. Dùng thử trực tuyến
Galen Ivanov

@GalenIvanov Tôi biết rằng dấu hiệu sẽ hữu ích! Suy nghĩ ban đầu của tôi là (+-.@*), tôi đoán là tôi muốn thêm vào. Tôi đã thử sử dụng '0'-.~giả sử đầu vào của một chuỗi, không biết tại sao nó không vượt qua tâm trí của tôi để làm điều đó trên các chữ số tách. Cảm ơn!
cole

1
1>.thực hiện công việc của 0-.~một byte ít hơn. [:*/1>.,.&.": Thử nó!
Galen Ivanov


3

JavaScript (ES6), 28 byte

Được thiết kế cho số nguyên 32 bit.

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

Các trường hợp thử nghiệm



3

Brachylog , 5 byte

⊇ẹ×ℕ₁

Hãy thử trực tuyến!

Giải trình

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

Điều này hoạt động vì thống nhất từ ​​các tập con lớn đến các tập con nhỏ, do đó, tập hợp đầu tiên sẽ dẫn đến một sản phẩm khác không là khi tất cả các số 0 được loại trừ và không có gì khác.



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

Cổng của câu trả lời Python 2 của @Dennis .
-1 byte nhờ @RiaD .

Hãy thử nó ở đây.

Phiên bản 55 54 byte:

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

Hãy thử trực tuyến.


1
bạn có thể lưu parens như thế này:long f(long n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}
Rịa

1
Xin lỗi, tôi yêu cầu cái này (45 byte) vì thuật toán hoàn toàn khác nhau ;-)
Olivier Grégoire

3

Julia 0,6, 26 byte

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

Ví dụ sử dụng:

julia> !54
20

Hãy thử trực tuyến!


bạn có thể thêm một ví dụ về cách gọi này, cũng như số byte không? bạn có thể sử dụng TIO !
Giuseppe

@Giuseppe ôi, tôi bị phân tâm. Tôi đã đếm chiều dài nhưng không thêm nó. Huh TIO hỗ trợ julia ngay bây giờ. Khéo léo.
Lyndon White

Trên thực tế, TIO hỗ trợ Julia 0,4-0,6! rất đẹp, +1.
Giuseppe

3

JavaScript (Node.js) , 30 byte

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

Hãy thử trực tuyến!

Lấy chuỗi làm đầu vào, coi nó là mảng và bằng cách phá hủy mảng sẽ tách phần tử đầu tiên [a,...b]. +a||1trả về chữ số tương ứng với aký tự. Tôi đoán rằng phần còn lại là tự giải thích ..



2

Brain-Flak , 88 byte

Phiên bản dễ đọc:

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

Hãy thử trực tuyến!



Tôi thực sự quên tôi đã đăng bình luận đó, và viết lại từ đầu. Tôi sẽ đăng bài riêng
Jo King

2

Clojure , 56 byte

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

Khá cơ bản. Biến số thành một chuỗi, sau đó trừ 48 từ mỗi ký tự để biến chúng trở lại thành số. Sau đó, nó thay thế mỗi 0 bằng 1 và áp dụng *cho danh sách số kết quả (làm giảm *danh sách). Có thể chấp nhận một số, hoặc một số chuỗi.

Hãy thử trực tuyến!

(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

Befunge, 23 22 byte

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

Hãy thử trực tuyến!

Giải trình

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 byte

Phương pháp Javascript đơn giản (ES6) lấy đầu vào dưới dạng chuỗi số, trải rộng nó thành một mảng, sau đó giảm nó thông qua phép nhân hoặc trả về giá trị nếu kết quả là 0.

3 byte được lưu nhờ Shaggy

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

Hãy thử trực tuyến!


Lưu 3 byte bằng cách lấy đầu vào dưới dạng chuỗi.
Xù xì

Tôi không biết tại sao tôi nghĩ nó phải được chuyển đổi, cảm ơn: D
Wilson Johnson Reta 232



2

C # , 97 Byte (Golf mã đầu tiên)

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

Không chắc chắn nếu tôi phải bọc nó trong một phương pháp hay không nên chỉ bao gồm nó để được an toàn.

Đưa một Int vào, chuyển đổi nó thành một chuỗi và trả về bội số của mỗi ký tự bỏ qua 0. Phải trừ 48 do chương trình sử dụng giá trị ascii khi nó đọc nó dưới dạng char.


2
Chào mừng đến với PPCG! Tôi không có gì về C #, nhưng điều này sẽ giúp bạn hiểu các quy tắc chơi golf trong đó.
H.PWiz

Cảm ơn @ H.PWiz Tôi thực sự bắt đầu yêu thích những thử thách nhỏ này, chắc chắn khiến tôi thay đổi chương trình thường xuyên để ngắn gọn và hiệu quả hơn.
James m

Chào mừng và thử đầu tiên tốt đẹp: D Một số mẹo cho câu trả lời của bạn: bạn có thể xóa var z=y.ToString();và đặt nó trực tiếp vào foreach, như vậy : foreach(var q in y.ToString()); và để có được kết quả, bạn có thể lưu nhiều byte hơn bằng cách thay thế {if(q!=48){r*=q-48;}}bằng r*=(q>48?q:1);, cạo sạch dấu ngoặc và dấu if.
auhmaan




Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.