非ゼロデジタル製品の課題


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 (ゼロを無視するか、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
私はむしろこの非ゼロのデジタル製品と呼びたいです。「ルート」は、それが1桁に減少することを示唆しますが、ここでは必ずしもそうではありません。
エリックアウトゴルファー

1
入力を文字列として受け取ることはできますか?または(それを押して)数字の配列?
シャギー

@EriktheOutgolferはい、ただし、プロセスを十分に繰り返すと、常に1桁になるように見えます。
DJMcMayhem

引用符で囲まれた入力を取得できますが、いいえ、事前に解析された数字のリストを取得することはできません
-FantaC

7
最大値までサポートする必要がある場合は100000000000、テストケースをお勧めし99999999999 => 31381059609ます。これは、デフォルトの32ビット整数に収まらないためです。おそらく、32ビットの最大値(2147483647)に最大出力を下げる方が良いでしょう。
ケビン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

私が最初に受け入れたとき、私はあなたの答えを見ませんでしたが、これは最短です!
FantaC

11

Haskell、27バイト

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

オンラインでお試しください!

UniHaskellでゴルフをしていない-XUnicodeSyntax

import UniHaskell

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

説明

私が最初に持っていたものから始めましょう:

product.map(max 1.read.pure)

これは、文字列(または文字のリスト)s()を引数として取る関数に評価される、ポイントのない式です。それはsにマッピングされ、基本的に各文字iを取得し、それをリスト(文字列にする)に注入し()、それを読み取って文字列()を評価し、最後にi1の大きい方を取得します()。次に、結果の整数のリスト()を受け取ります。"301"max 1.read.pure["3", "0", "1"][3, 0, 1][3, 1, 1]product3

次に、次のように1バイトずつゴルフしました。

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

これは、productと同等であるため機能しfoldr (*) 1ます。マッピングと折り畳みの代わりに、折り畳みによって2つを結合します。折り畳み(*).max 1.read.pureでは、ゼロ以外の各桁を取得し、アキュムレーターで乗算します。




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

だからこれはRでコードゴルフをする方法です...素敵なもの;)まだこの1つがどのように機能するかを理解しようとしています!
フローリアン

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-Flak74 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までカウントすることにより、ゴルフ2以上のバイト
Nitrodon


4

J17 14 13バイト

-4バイト(@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=]*#] 、オンラインでそれを試してみてください
ガレン・イワノフ

1
[:*/0-.~,.&.":14バイト。オンラインで試す
ガレンイワノフ

@GalenIvanov signumが役に立つことはわかっていました!私の当初の考えは(+-.@*)、私が追加したいと思うことでした。'0'-.~文字列の入力を想定して使用しようとしましたが、なぜ分割数字でそれを行うのが私の心を交差させなかったのか分かりません。ありがとう!
コール

1
1>.0-.~1バイト少ない仕事を します。[:*/1>.,.&.": それを試してみてください!
ガレンイワノフ


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

Port of @Dennis 'Python 2 answer@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;}
。– RiaD

1
申し訳ありませんが、私はこれを主張しています(45バイト)アルゴリズムがまったく異なるためです ;
オリヴィエグレゴワール

3

ジュリア0.6、26バイト

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

使用例:

julia> !54
20

オンラインでお試しください!


これを呼び出す方法の例とバイト数を追加できますか?TIOを使用できます!
ジュゼッペ

@ジュゼッペおっと、気が散ってしまいました。長さを数えましたが、追加しませんでした。Huh TIOは現在ジュリアをサポートしています。きちんとした。
リンドンホワイト

実際、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
<>

オンラインでお試しください!



そのコメントを投稿したことを文字通り忘れて、ゼロから書き直しました。別々に投稿するつもりです
ジョーキング

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

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バイト

入力を数値文字列として受け取り、それを配列に展開し、乗算によって値を減らすか、結果が0の場合に値を返す単純なJavaScript(ES6)メソッド。

Shaggyのおかげで3バイト節約

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

オンラインでお試しください!


入力を文字列として取得して、3バイトを節約します。
シャギー

私はそれが変換されなければならなかった理由を知らない、ありがとう:D
ウィルソンジョンソン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値をcharとして読み取るプログラムを使用しているため、マイナス48になりました。


2
PPCGへようこそ!私はC#について何もしていませんが、これはゴルフのルールを理解するのに役立つはずです。
H.PWiz

@ H.PWizに感謝します。私はこれらの小さな挑戦を本当に愛し始めています。
ジェームズ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
オーマン




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.