비제로 디지털 제품 과제


26

원래 곱셈 디지털 루트

도전

기본적으로 제목이 말하는 것을 수행

방법

표준 입력 방법 중 하나를 통해 양의 정수 1 <= N <= 100000000이 주어지면 0을 무시하고 모든 숫자를 곱하십시오.

예 : 다음 과 같이 말합니다 361218402.

  • 3* 6=18
  • 18* 1=18
  • 18* 2=36
  • 36* 1=36
  • 36* 8=288
  • 288* 4=1152
  • 1152* 1 (0을 무시하거나 1로 바꿈) =1152
  • 1152* 2=2304

에 대한 출력 3612184022304

테스트 사례

1 => 1
다른 모든 자릿수> 0 => 자체
10 => 1
20 => 2
100 => 1
999 => 729
21333 => 54
17801 => 56
4969279 => 244944
100000000 => 1

표준 허점 은 허용되지 않으며 이것은 이므로 가장 짧은 바이트 수가 이깁니다!

70 바이트의 두뇌 반응으로 현상금을받은 조 킹 에게 축하를 전합니다 !


5
오히려이 0아닌 디지털 제품 이라고 부릅니다 . "root"는 한 자리수로 줄어든다는 것을 나타내며, 항상 여기에 해당되는 것은 아닙니다.
Outgolfer Erik

1
입력을 문자열로 할 수 있습니까? 아니면 숫자 배열 (푸시)?
얽히고 설킨

@EriktheOutgolfer 예, 그러나 프로세스를 충분히 반복하면 항상 한 자리 수로 표시됩니다.
DJMcMayhem

당신은 인용 입력을 할 수 있지만, 아니, 당신은 당신이 요구하는 경우 미리 구문 분석 된 자릿수 목록을 취할 수 없습니다
FantaC

7
최대 32를 지원 해야하는 100000000000경우 99999999999 => 31381059609기본 32 비트 정수에 맞지 않기 때문에 테스트 사례를 제안합니다 . 최대 출력을 최대 32 비트 (2147483647)로 낮추는 것이 좋습니다.
케빈 크루이 센

답변:


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

처음 수락했을 때 귀하의 답변을 보지 못했지만 이것이 가장 짧은 답변입니다!
FantaC

11

하스켈 , 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 ( )를 인수 로 사용하는 함수로 평가 되는 포인트없는 표현식입니다 . 이것은 매핑 위에 본질적 각 문자를 가지고, I를 ,리스트로 주입 (IT (문자열 수 있음) ), 다음을 읽고, 문자열 (평가 된 ) 마지막으로 더 큰 복용 1 ( ). 그런 다음 결과 정수 목록 ( )을 가져옵니다 ."301"max 1.read.pure["3", "0", "1"][3, 0, 1][3, 1, 1]product3

그런 다음 바이트 단위로 골프를 쳤습니다.

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

이것은 product에 해당하기 때문에 작동 합니다 foldr (*) 1. 매핑과 접기 대신, (*).max 1.read.pure0이 아닌 각 숫자를 가져와 누산기와 곱하여 두 개를 결합 했습니다.




6

R , 40 바이트

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

온라인으로 사용해보십시오!

입력은 12 자리를 넘지 않아야하기 때문에 잘 작동합니다. 숫자를 x앞에 1오는 0을 포함 하여 계산 한 다음 0을 곱하고 제품을 계산합니다.

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

그래서 이것은 R로 codegolf하는 방법입니다 ... Nice one;) 여전히 이것이 어떻게 작동하는지 알아 내려고 노력하고 있습니다!
Florian

1
@ Florian 나는 더 자세한 설명을 추가했습니다.
주세페

그것은 시도해야 할 숫자를 나누는 새로운 방법입니다!
BLT


5

C (gcc) , 39 바이트

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

최적화없이 컴파일해야합니다 (gcc의 기본 설정 임).

온라인으로 사용해보십시오!


그건 k=k;넣어 k반환 레지스터에 실수로 그냥 평범한 악이다. 아마도 x86 / x64에서만 최적화하지 않고 작동 한다고 덧붙여 야 할 것입니다 . +1.
tomsmeding

1
@tomsmeding 놀랍게도 x86 이외의 아키텍처에서 작동합니다 . O0gcc의 기본값은 최적화 ( )가 없으므로 해당 플래그를 명시 적으로 사용할 필요가 없습니다. 어쨌든 게시물에 언급을 추가 할 것입니다.
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까지 세어 두 바이트를 추가로 골프를


4

J , 17 14 13 바이트

@GalenIvanov 제공 -4 바이트

[:*/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'-.~문자열의 입력을 가정 하여 사용하려고 시도했지만 왜 분할 숫자에서 그것을하지 않는지 확신하지 못했습니다. 감사!
cole

1
1>.의 직무 수행 0-.~바이트 이하에 대한합니다. [:*/1>.,.&.": 시도 해봐!
Galen Ivanov


3

자바 스크립트 (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, +∞)

이는 큰 하위 집합에서 작은 하위 집합으로 통합되므로 0이 아닌 제품을 만드는 첫 번째 항목은 모든 0이 제외되고 다른 항목이없는 경우입니다.



3

자바 8, 55 54 53 51 바이트

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

@Dennis 포트의 Python 2 답변 . @RiaD
덕분에 -1 바이트 .

여기에서 시도하십시오.

55 54 바이트 버전 :

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

온라인으로 사용해보십시오.


1
다음과 같이 long f(long n){return n>0?(n%10>0?n%10:1)*f(n/10):1;}
파 렌스를

1
죄송합니다, 알고리즘이 완전히 다르기 때문에이 (45 바이트)를 주장하고 있습니다 ;-)
Olivier Grégoire

3

줄리아 0.6, 26 바이트

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

사용 예 :

julia> !54
20

온라인으로 사용해보십시오!


이것을 호출하는 방법과 바이트 수의 예를 추가 할 수 있습니까? 당신은 TIO 를 사용할 수 있습니다 !
주세페

@ 주세페 죄송합니다. 길이를 세었지만 추가하지 않았습니다. 허 TIO는 지금 줄리아를 지원합니다. 산뜻한.
Lyndon White

실제로 TIO는 Julia 0.4-0.6을 지원합니다! 아주 좋아요, +1
주세페



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

클로저 , 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

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

자바 스크립트 (Node.js) , 36 33 바이트

입력을 숫자 문자열로 가져 와서 배열로 펼친 다음 곱셈을 통해 줄이거 나 결과가 0이면 값을 리턴하는 단순 Javascript (ES6) 메소드입니다.

Shaggy 덕분에 3 바이트 절약

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

온라인으로 사용해보십시오!


입력을 문자열로 사용하여 3 바이트를 절약하십시오.
얽히고 설킨

나는 그것이 왜 변환되어야하는지 알지 못했습니다. 감사합니다 : D
Wilson Johnson Reta232



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을 무시하는 각 문자의 배수를 반환합니다. 프로그램이 문자로 읽을 때 ascii 값을 사용하여 마이너스 48을 냈습니다.


2
Welcome to PPCG! I no nothing of C#, but this should help you understand the rules for golfing in it.
H.PWiz

Thanks @H.PWiz I really am starting to love these little challenges, definitely making me change my regular programming to be more concise and efficient.
James m

Welcome and nice first try :D Some tips for your answer: you can remove the var z=y.ToString(); and place it directly in the foreach, like so: foreach(var q in y.ToString()); and to get the result you can save more bytes by replacing {if(q!=48){r*=q-48;}} with r*=(q>48?q:1);, shaving off the brackets and the if.
auhmaan




당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.