ความท้าทายของผลิตภัณฑ์ดิจิตอลที่ไม่เป็นศูนย์


26

เดิมทีรูตดิจิตอลแบบหลายค่า

ท้าทาย

โดยพื้นฐานแล้วทำในสิ่งที่ชื่อกล่าว

วิธี

รับจำนวนเต็มบวก 1 <= N <= 100000000ผ่านหนึ่งในวิธีการป้อนข้อมูลมาตรฐานของเราคูณทุกหลักด้วยกันโดยไม่สนใจเลขศูนย์

ตัวอย่าง:ใช้ตัวเลขพูดว่า361218402:

  • 3* 6=18
  • 18* 1=18
  • 18* 2=36
  • 36* 1=36
  • 36* 8=288
  • 288* 4=1152
  • 1152* 1 (ไม่สนใจเลขศูนย์หรือเปลี่ยนเป็นศูนย์) =1152
  • 1152* 2=2304

ผลลัพธ์สำหรับ361218402คือ2304

กรณีทดสอบ

1 => 1
ตัวเลขอื่น ๆ ทุกตัว> 0 => ตัวมันเอง
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

ช่องโหว่มาตรฐานไม่ได้รับอนุญาตและนี่คือดังนั้นการนับไบต์ที่สั้นที่สุดจึงชนะ!

ขอแสดงความยินดีกับโจคิงที่ได้รับรางวัลด้วยคำตอบที่สะกิดด้วยสมองขนาด 70 ไบต์!


5
ฉันอยากจะเรียกผลิตภัณฑ์ดิจิตอลที่ไม่ใช่ศูนย์นี้ "root" แนะนำให้ลดขนาดเป็นเลขหลักเดียวซึ่งไม่เป็นความจริงเสมอไป
Erik the Outgolfer

1
เราสามารถรับอินพุตเป็นสตริงได้หรือไม่? หรือ (ผลักดัน) อาร์เรย์ของตัวเลขหรือไม่
ขนปุย

@EriktheOutgolfer ใช่ แต่ถ้าคุณทำซ้ำขั้นตอนมากพอมันจะปรากฏเป็นหลักเดียวเสมอ
DJMcMayhem

คุณสามารถป้อนข้อมูลที่ยกมา แต่ไม่คุณไม่สามารถใช้รายการของตัวเลขที่แยกวิเคราะห์ล่วงหน้าได้หากนั่นคือสิ่งที่คุณต้องการถาม
FantaC

7
หากเราต้องสนับสนุนให้มากที่สุด100000000000ฉันขอแนะนำให้ใช้กรณีทดสอบ99999999999 => 31381059609เนื่องจากมันไม่พอดีกับจำนวนเต็ม 32 บิตเริ่มต้น บางทีอาจจะดีกว่าถ้าจะลดเอาต์พุตสูงสุดให้สูงสุด 32 บิต (2147483647)
Kevin Cruijssen

คำตอบ:


3

Pyt , 3 ไบต์

ąžΠ

คำอธิบาย:

ą       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

ลองออนไลน์!


แปลกใจที่การเล่นกอล์ฟที่ค่อนข้างใหม่นี้เป็นสิ่งเดียวที่ดูเหมือนจะสามารถแก้ไขความท้าทายนี้ใน 3 ไบต์!
ETHproductions

ฉันก็ประหลาดใจด้วยเช่นกัน!
mudkip201

ฉันไม่เห็นคำตอบของคุณเมื่อฉันยอมรับครั้งแรก แต่นี่เป็นคำตอบที่สั้นที่สุด!
แฟนต้า

11

Haskell , 27 ไบต์

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

ลองออนไลน์!

Ungolfed กับUniHaskellและ-XUnicodeSyntax

import UniHaskell

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

คำอธิบาย

ฉันจะเริ่มต้นด้วยสิ่งที่ฉันมีในตอนแรก:

product.map(max 1.read.pure)

นี่เป็นนิพจน์ที่ไม่มีจุดซึ่งประเมินค่าฟังก์ชันที่รับสตริง (หรือรายการอักขระ) s ( "301") เป็นอาร์กิวเมนต์ มันแผนที่max 1.read.pureมากกว่าsหลักสละตัวละครแต่ละตัวฉันฉีดลงในรายการ (ซึ่งทำให้สตริง) ( ["3", "0", "1"]) แล้วอ่านมันซึ่งประเมินสตริง ( [3, 0, 1]) และในที่สุดการที่มากขึ้นของฉันและ1 ( [3, 1, 1]) จากนั้นใช้productรายการผลลัพธ์ของจำนวนเต็ม ( 3)

จากนั้นฉันก็เล่นกอล์ฟด้วยไบต์ด้วย:

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

งานนี้เพราะจะเทียบเท่ากับproduct foldr (*) 1แทนที่การแมปและการพับผมรวมทั้งสองเข้าด้วยกันโดยการพับ(*).max 1.read.pureซึ่งจะใช้แต่ละหลักที่ไม่เป็นศูนย์และคูณด้วยการสะสม



7

เยลลี่ขนาด 4 ไบต์

Do1P

ลองออนไลน์! หรือดูชุดทดสอบ

มันทำงานอย่างไร

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

@tfbninja เรียกลิงค์หลักกับอินพุตแต่ละตัว
caird coinheringaahing

6

R , 40 ไบต์

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

ลองออนไลน์!

เนื่องจากอินพุตมีการรับประกันว่าจะมีไม่เกิน 12 หลักจึงควรใช้งานได้ดี คำนวณตัวเลขเป็นx(รวมถึงศูนย์นำหน้า) จากนั้นแทนที่ศูนย์ด้วย1และคำนวณผลิตภัณฑ์

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

ดังนั้นนี่คือวิธีการ codegolf กับ R ... Nice one;) ยังคงพยายามคิดว่าอันนี้ใช้ได้อย่างไร!
Florian

1
@ Florian ฉันได้เพิ่มคำอธิบายที่ละเอียดยิ่งขึ้นแล้ว
Giuseppe

นั่นเป็นวิธีใหม่ในการแยกตัวเลขที่ฉันต้องลอง!
BLT

@BLT นั่นเป็นหนึ่งในเคล็ดลับ
Giuseppe

5

C (gcc) , 39 ไบต์

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

จำเป็นต้องรวบรวมโดยไม่มีการเพิ่มประสิทธิภาพ (ซึ่งเป็นการตั้งค่าเริ่มต้นสำหรับ gcc อยู่แล้ว)

ลองออนไลน์!


ที่k=k;ใส่kในการลงทะเบียนกลับมาโดยไม่ได้ตั้งใจเป็นเพียงความชั่วร้ายธรรมดา คุณควรอาจจะเพิ่มที่ว่านี้จะทำงานเฉพาะโดยไม่ต้อง optimisations บนอาจจะเป็นเพียง x86 / x64 +1
tomsmeding

1
@tomsmeding ค่อนข้างน่าแปลกใจที่มันไม่ทำงานบนสถาปัตยกรรม x86 ไม่มีการเพิ่มประสิทธิภาพ ( O0) เป็นค่าเริ่มต้นสำหรับ gcc ดังนั้นจึงไม่จำเป็นต้องใช้แฟล็กนั้นอย่างชัดเจน ฉันเดาว่าฉันจะเพิ่มการกล่าวถึงลงในโพสต์ต่อไป
Steadybox

คุณอาจต้องการระบุเวอร์ชันที่แน่นอนของ GCC ที่ใช้งานได้เพื่อพิสูจน์อักษรในอนาคต
moonheart08

@ moonheart08 ฉันสงสัยว่ามันจะหยุดทำงานหลังจากบางรุ่น อย่างไรก็ตามมันใช้งานได้กับเวอร์ชันล่าสุดดังนั้นเวลาของการโพสต์สามารถใช้ในการค้นหาเวอร์ชันที่ใช้งานได้เป็นอย่างน้อย
Steadybox

5

Brain-Flak , 74 72 70 ไบต์

-2 ต้องขอบคุณ Nitrodon ที่แนะนำให้ลบตัวเลขเพื่อที่ว่าคุณจะต้องเพิ่มขึ้นแทนที่จะลดลงในภายหลัง

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

ลองออนไลน์!

อาจมีวิธีสองสามวิธีในการเล่นกอล์ฟต่อไปเช่นการทำซ้ำการคูณเพื่อหลีกเลี่ยงการเริ่มต้นผลรวมด้วย 1 (-2 ไบต์)

มันทำงานอย่างไร:

{ 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
คุณสามารถเล่นกอล์ฟอีกสองไบต์ด้วยการคำนวณตัวเลขจริงที่ลบทิ้งแล้วนับได้สูงสุด 0 แทนที่จะเป็น 0
Nitrodon

4

05AB1E , 4 ไบต์

0KSP

ลองออนไลน์!

คำอธิบาย

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

ฉันยอมรับคำตอบนี้เพราะมันผูกติดกันสี่ทางระหว่างเจลลี่แกลบและ 05AB1E และคุณตอบก่อน
FantaC

4

J , 17 14 13 ไบต์

-4 bytes มารยาทของ @GalenIvanov

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

ลองออนไลน์!

อาจมีการปรับปรุงบางอย่าง แก้ไข: และมันก็เป็นเช่นนั้น

คำอธิบาย

[: */ 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 เป็นคำวิเศษณ์ที่ดีที่ใช้คำกริยาทางด้านขวาแล้วกริยาทางด้านซ้ายแล้วผกผันของคำกริยาทางด้านขวา การแปลงกลับเป็นตัวเลขด้วยเทคนิคการใช้ eval ( ".-do)


1
คุณสามารถบันทึกไบต์ได้โดยเปลี่ยน+0=]เป็น*#] ลองออนไลน์
Galen Ivanov

1
[:*/0-.~,.&.":สำหรับ 14 ไบต์ ลองออนไลน์
Galen Ivanov

@ GalenIvanov ฉันรู้ว่า signum จะเป็นประโยชน์! ความคิดดั้งเดิมของฉันคือ(+-.@*)เดาว่าฉันอยากจะเพิ่ม ฉันลองใช้โดย'0'-.~สมมติว่าอินพุตเป็นสตริงไม่แน่ใจว่าทำไมมันถึงไม่คิดที่จะทำกับตัวเลขที่แยก ขอบคุณ!
โคล

1
1>.การทำงานของ 0-.~ไบต์น้อยลง [:*/1>.,.&.": ลองมัน!
Galen Ivanov


3

JavaScript (ES6), 28 ไบต์

ออกแบบมาสำหรับจำนวนเต็ม 32 บิต

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

กรณีทดสอบ



3

Brachylogขนาด 5 ไบต์

⊇ẹ×ℕ₁

ลองออนไลน์!

คำอธิบาย

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

วิธีนี้ใช้งานได้เพราะรวมกันจากชุดย่อยขนาดใหญ่ไปเป็นชุดย่อยขนาดเล็กดังนั้นชุดแรกที่จะส่งผลให้ผลิตภัณฑ์ไม่เป็นศูนย์คือเมื่อศูนย์ทั้งหมดถูกแยกออกและไม่มีอะไรอื่น



3

Java 8, 55 54 53 51 ไบต์

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

ท่าเรือ@Dennis 'งูใหญ่ 2 คำตอบ
-1 ไบต์ขอบคุณ@RiaD @RiaD

ลองที่นี่

รุ่น55 54 ไบต์:

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

ลองออนไลน์


1
คุณสามารถบันทึก parens เช่นนี้long f(long n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}
Riad

1
ขออภัยฉันอ้างสิทธิ์ตัวนี้ (45 ไบต์) เนื่องจากอัลกอริทึมนั้นแตกต่างกันอย่างสิ้นเชิง ;-)
Olivier Grégoire

3

Julia 0.6, 26 ไบต์

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

ตัวอย่างการใช้งาน:

julia> !54
20

ลองออนไลน์!


คุณสามารถเพิ่มตัวอย่างของวิธีการโทรนี้เช่นเดียวกับการนับไบต์? คุณสามารถใช้TIO !
Giuseppe

@ Giuseppe อุ๊ปส์ฉันฟุ้งซ่าน ฉันนับความยาว แต่ไม่ได้เพิ่ม Huh TIO สนับสนุนจูเลียแล้ว เรียบร้อย
Lyndon White

ในความเป็นจริง TIO สนับสนุน Julia 0.4-0.6! ดีมาก +1
Giuseppe

3

JavaScript (Node.js)ขนาด 30 ไบต์

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

ลองออนไลน์!

รับค่าสตริงเป็นอินพุตถือว่าเป็นอาร์เรย์และโดยการทำลายอาร์เรย์จะแยกองค์ประกอบแรก[a,...b]ออก +a||1ส่งคืนตัวเลขที่สอดคล้องกับaอักขระ ฉันเดาว่าส่วนที่เหลือเป็นการอธิบายตัวเอง ..


3

อ็อกเทฟ 21 ไบต์

ขอบคุณ @Luis Mendo สำหรับการบันทึกไบต์และขอบคุณ @alephalpha สำหรับการบันทึกไบต์อื่น!

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

รับอินพุตเป็นสตริงของตัวเลข

ลองออนไลน์!

30 ไบต์:

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

รับอินพุตเป็นตัวเลข

ลองออนไลน์!



2

Brain-Flak , 88 ไบต์

รุ่นที่อ่านได้:

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

ลองออนไลน์!



ฉันลืมไปเลยว่าฉันโพสต์ความคิดเห็นนั้นและเขียนใหม่ตั้งแต่ต้น ฉันเพิ่งจะโพสต์แยกกัน
Jo King

2

Clojure , 56 ไบต์

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

ค่อนข้างธรรมดา เปลี่ยนตัวเลขเป็นสตริงจากนั้นลบ 48 จากอักขระแต่ละตัวเพื่อเปลี่ยนกลับเป็นตัวเลข จากนั้นก็เข้ามาแทนที่แต่ละ 0 กับ 1 และนำไปใช้*กับรายการผลลัพธ์ของตัวเลข (ซึ่งจะช่วยลด*กว่ารายการ) สามารถรับหมายเลขหรือหมายเลขที่เป็นสตริงได้

ลองออนไลน์!

(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 ไบต์

!UXzp

อินพุตถูกใช้เป็นสตริง

ลองที่MATL Online! หรือตรวจสอบกรณีทดสอบใน Try It Online!

คำอธิบาย

!     % 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 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

Simple Javascript (ES6) วิธีการที่นำเข้าเป็นสตริงตัวเลขกระจายลงในอาร์เรย์แล้วลดลงผ่านการคูณหรือส่งกลับค่าถ้าผลที่ได้คือ 0

บันทึกได้ 3 ไบต์ด้วยShaggy

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

ลองออนไลน์!


บันทึก 3 ไบต์โดยการป้อนข้อมูลเป็นสตริง
Shaggy

ฉันไม่รู้ว่าทำไมฉันจึงคิดว่าจะต้องกลับใจใหม่ขอบคุณ: D
Wilson Johnson Reta232

2

Ruby, 42 40 35 32 27 ไบต์

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

จะไม่มีการขึ้นบรรทัดใหม่ในอินพุต อิทธิพลหลัก

-2 ไบต์ต้องขอบคุณ @GolfWolf

-5 ไบต์ขอบคุณ @Conor O'Brien


ยิ่งสั้นกว่า tr : 32 ไบต์
Cristian Lupascu

เคลฟเวอร์ @GolfWolf :)
HåvardNygård

บางทีคุณอาจใช้*เพื่อเข้าร่วม? p eval (gets.chars-[?0])*?*?
Conor O'Brien


2

C # , 97 ไบต์ (กอล์ฟรหัสแรก)

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

ไม่แน่ใจว่าฉันต้องห่อมันด้วยวิธีหรือไม่รวมอยู่ด้วยเพื่อความปลอดภัย

รับ Int เข้ามาแปลงเป็นสตริงและส่งกลับอักขระหลายตัวของแต่ละตัวโดยไม่สนใจ 0 ต้องลบ 48 เนื่องจากโปรแกรมใช้ค่า ascii เนื่องจากมันอ่านว่าเป็นถ่าน


2
ยินดีต้อนรับสู่ PPCG! ฉันไม่มีของ C # แต่สิ่งนี้จะช่วยให้คุณเข้าใจกฎสำหรับการเล่นกอล์ฟในนั้น
H.PWiz

ขอบคุณ @ H.PWiz ฉันเริ่มที่จะรักความท้าทายเล็กน้อยเหล่านี้ทำให้ฉันเปลี่ยนโปรแกรมปกติของฉันให้กระชับและมีประสิทธิภาพมากขึ้น
James m

ยินดีต้อนรับและลองครั้งแรก: D เคล็ดลับบางอย่างสำหรับคำตอบของคุณ: คุณสามารถลบvar z=y.ToString();และวางไว้ในโดยตรงforeachเช่น:: foreach(var q in y.ToString()); และเพื่อให้ได้ผลที่คุณสามารถบันทึกไบต์มากขึ้นโดยการแทนที่{if(q!=48){r*=q-48;}}ด้วยโกนหนวดปิดวงเล็บและr*=(q>48?q:1); if
auhmaan




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.