パンデジタル倍増


14

この CMCに触発された

0より大きい正の整数を指定して、次の操作を実行します。

  • 10桁すべての数字(1234567890)が少なくとも1回は数字に含まれている場合は、カウントを出力してプログラムを終了します
  • それ以外の場合は、数を2倍にして繰り返し、カウントを増やします。

カウントは0から始まり、入力が2倍になった回数です。たとえば、入力が617283945の場合、1234567890には10桁すべてが含まれているため、入力を1倍にする必要があります。

これはので、最短のコードが勝ちます。必要に応じて、入力を文字列として取得できます。

テストケース

input => output

617283945 => 1
2 => 67
66833 => 44
1234567890 => 0
100 => 51
42 => 55

入力を文字列として受け取ることはできますか?
スティーブン

@Stephenは、文字列として入力を受け取ることができます。
ケアニ共産主義者

3
パンデジタルでnあるkようなものが存在することが保証されていnkますか?証拠が見たいです。
shooqie

1
@bfontaineチャットミニチャレンジ
caird coinheringaahing

3
@shooqie証明!10と互いに素であるnに対しても10 ^ 10と互いに素であるため、nkが1 mod 10 ^ 10となるようなkが存在します。次に、1234567890 * nk = 1234567890 mod 10 ^ 10であるため、各数字は必ず少なくとも1回表示されます。そうでない場合は、必要に応じて2、5、または25を掛けて、最後の非ゼロ数字を10と互いに素にし、上記の証明の変形が機能します(正式には、n = 10 ^ m * p、ここでpは上記の条件を満たす、上記の1234567890 * p * kはpandigitalであるため、1234567890 * p * k * 10 ^ m = 1234567890 * k * nは)です。:)
B.メータ

回答:



4

J24 23バイト

(]1&(+$:)2**)10>#@~.@":

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

説明

(]1&(+$:)2**)10>#@~.@":  Input: integer n
                     ":  Format as string
                  ~.@    Unique
                #@       Length
             10>         Less than 10
           *             Multiply, gives n if previous was true, else 0
         2*              Multiply by 2
 ]                       Get the previous condition
  1&(   )                Execute this if true on 2n, else return 0
      $:                   Recurse
  1  +                     Add 1

いいね 結果の収集にこだわっていたので、そのような再帰関数の使用については考えませんでした。
コナーオブライエン

4

05AB1E11 10バイト

スコティネットのおかげで-1バイト

[D9ÝåË#·]N

オンラインでお試しください!またはテストスイートとして

[          // Start infinity loop
 D         // Duplicate current value (or input)
  9Ý       // Push [0,1,2,3,4,5,6,7,8,9]
    å      // Does each exist in the current value
     Ë#    // Break if all equal (if every digit exists)
       ·   // Else double the current value
        ]N // End loop and print the number of times through the loop


@scottinetありがとう!どうしてそれを見逃したのかわかりません。
ライリー

@rileyは言うつもりでしたがuse x、それも10です。いい答えです。思考xはを取り除くでしょうがD、それは同じ考えです。
マジックタコop Urn

3

Perl 631 28バイト(27文字)

@Joshuaのおかげで-3バイト

{($_,2×*...*.comb.Set>9)-1}

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

説明:リストを再帰的に生成するための同じ構成体です。最初の要素は指定された数値($_)で、次の各要素は前の2倍です(2×*—×を使用します。なぜなら、2バイト文字ですが、それでも1バイト安いため2 * *)の終了条件*.comb.unique>9が満たされるまでこれを行います、つまり、数字に9文字以上の一意の文字がある場合。(技術的には、文字列をで文字のリストに分解し.comb、で強制的にセットにし.Set(もちろん、各要素は一度だけ含まれます)、9と比較して、セットを数値コンテキストに強制します。要素の数。)

最後に、このリストから1を引きます。繰り返しますが、リストは数値コンテキストに強制されるため、返されるのはそのリストの長さよりも1少ない値です。


.Set代わりに.unique3バイトを節約できます。
ジョシュア

@ジョシュア、良い点!ありがとうございました。これは考えもしなかった。
ラミリーズ

3

JavaScript(ES6)+ big.js84 74 73 70バイト

bignumber.jsの代わりにbig.jsを提案して10バイトを節約してくれた@ ConorO'Brien
感謝します。-1バイトの@Rick Hitchcock
感謝します。-3バイトの@Shaggyに感謝します。

f=n=>[..."4"+2**29].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))

入力を文字列として受け取ります。そのポイントを超えると自動科学表記変換が行われるため、最大約2 69をサポートします。

テストスニペット

f=n=>[..."4"+2**29].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))

;[617283945, 2, 66833, 1234567890, 100, 42].forEach(t=>console.log(`f(${t}) = `+f(t)))
<script src="https://cdn.rawgit.com/MikeMcl/big.js/c6fadd08/big.min.js"></script>

無限の範囲、106 88 87 84バイト

構成オプションを使用して、数値を文字列に変換するときに科学表記法を効果的に無効にすることで、ほぼ無限の範囲を確保できます。


たぶん、big.jsBigNumberを使用してビットを短縮できますか?
コナーオブライエン

@ ConorO'Brienこれは間違いなく役立ちます。特にnew、その中のオプションであるためです。更新します、ありがとう!
ジャスティンマリナー

で1バイトを保存しますf=n=>[..."0123456789"].every(d=>RegExp(d).test(c=Big(n)))?0:1+f(c.mul(2))
リックヒッチコック

大きな整数を処理する必要がないため、必要に応じてbig.jsをドロップして、61バイトに減らすことができます。そして、あなたが数字の文字列を置換することによって、3つのバイトを保存することができます"4"+2**29tio.run/##BcGxDkAwEADQb2GQO41LNBZDbX7AKgbhKkSu0jZSX1/...
シャギー

2

ゼリー12、11のバイト

QLn⁵
ḤÇпL’

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

早く行かなきゃ!

説明:

        # Helper link, takes one argument 'z'
Q       # The unique digits of 'z'
 L      # Length
  n     # Does not equal
   ⁵    # 10
        #
        # Main link
  п    # While <condition> is true, run <body> and return all intermediate results
        # Condition:
 Ç      #   The helper link
        # Body:
Ḥ       #   Double the input
        # Now we have a list of all the 'z's that we passed to the helper link
    L   # Return it's length
     ’  # minus one




2

Haskell、44バイト

until(\c->all(`elem`show(n*2^c))['0'..'9'])(+1)0

2

Clojure、115 89 82バイト

-26バイト。文字列を使用して文字のリストを表すだけで(振り返ってみると)、再帰をからに変更loopすることで、いくつかの最適化を行うことができました。

の呼び出しを取り除くことにより、-7バイトbigint。どうやら、オーバーフローを引き起こさない入力のみを処理する必要があるようです。

#(loop[n % c 0](if(empty?(remove(set(str n))"1234567890"))c(recur(* 2 n)(inc c))))

プレゴルフ:

(defn pan [num]
  (loop [n num
         cnt 0]

    ; Remove all the characters from the stringified input
    ;  that are numeric. If the result is an empty list, all
    ;  the numbers were present.
    (if (empty? (remove (set (str n)) "1234567890"))
      cnt
      (recur (* 2 n) (inc cnt)))))

あなたは使って7つのバイトを保存することができますevery?代わりにempty? (remove …#(loop[n % c 0](if(every?(set(str n))"1234567890")c(recur(* 2 n)(inc c)))))
bfontaine

@bfontaineああ、あなたは正しい!ありがとう。後で修正します。ありがとう。
発がん性物質

2

網膜、85バイト

^\d*
$&¶$&
D`.(?=.*¶)
\d{10}¶\d+|\d*¶

[5-9]
#$&
T`d`EE
T`_d#`d_`\d#
#
1
}`\d\b
$&@
@

オンラインでお試しください!リンクにはテストケースが含まれます。ランタイム用にわずかに最適化されています。説明:

^\d*
$&¶$&

入力番号を複製します。

D`.(?=.*¶)

最初のコピーの数字を重複排除します。

\d{10}¶\d+|\d*¶

10桁が残っている場合は、両方の番号を削除します。それ以外の場合は、最初のコピーを削除します。両方の数値を削除すると、ループの残りの部分がノーオペレーションになることに注意してください。

[5-9]
#$&

置きます #大きな数字の前にます。

T`d`EE

各桁を2倍にします。

T`_d#`d_`\d#

キャリーを追加します。

#
1

主要なキャリーを扱う。

}`\d\b
$&@

を追加 @10桁すべてが見つかるまでandループをします。

@

@追加されたの数を出力します。


2

APL(Dyalog Unicode)、19 + 2 = 21バイト

0∘{∧/⎕D∊⍕⍵:⍺⋄⍺+12×⍵}

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

これはダイアディックDfnd irect f unctio n)であり、左の引数として0を取り、右の引数として整数を取ります。入力は整数のみであると想定されているため、引数に2バイトを追加しました0∘にバイトカウント。

f←それはないですから、バイト数には含まれていない必要。テストケースの作成が簡単になります。

使い方:

ヘッダー: APLルームでのチャットの後、バイトカウントからそれらを削除しました。関数が行うべきことを実行し、APLのREPLのデフォルト設定のために結果が正しくないためです。

⎕FR←1287設定FフロートのRの 128ビットの小数にepresentationを(7 APLのREPLの小数点のコードです)。 ⎕PP←34設定P RINT Pの recisionは34桁に。APLの大きな数に対するデフォルトの表現は、それらを科学表記法(例えば、3.14159265359E15)に変換するため、これらの両方が必要です。

0∘{∧/⎕D∊⍕⍵:⍺⋄⍺+12×⍵}  Dyadic Dfn
0                      Fixes 0 as the left argument  
          :             If
     D                 String representation of all digits [0, 9]
                       "is in"
        ⍕⍵              String representation of the input
   ∧/                   AND-reduction. Yields 1 (true) iff all digits are in the right argument.
                       return the left argument
                       Else
                 2×⍵    Double the right arg
             ⍺+1        increment the left arg
                       Recursively call this function with the new arguments.

2

Java 8、132 110 87 74バイト

n->{int c=0;for(;(n+"").chars().distinct().count()!=10;n*=2)c++;return c;}

@OlivierGrégoireに感謝-57バイト。

説明:

ここで試してみてください。(注:22 68で停止する必要があるため、テストケースは無効になっていますが、サイズはlong2 63 -1に制限されています。)

n->          // Method with long parameter and integer return-type
  int c=0;   //  Count-integer, starting at 0
  for(;(n+"").chars().distinct().count()!=10;
             //  Loop (1) as long as the unique amount of digits in the number are not 10
    n*=2)    //    After every iteration: multiply the input by 2
   c++;      //   Increase the count by 1
             //  End of loop (1) (implicit / single-line body)
  return c;  //  Return the counter
}            // End of method

入力と正規表現を使用した古い132バイトの回答String

n->f(n,0)int f(String n,int c){String t="";for(int i=0;i<10;t+="(?=.*"+i+++")");return n.matches(t+".*")?c:f(new Long(n)*2+"",c+1);}

ここで試してみてください。(注:のテストケース2わずかな再帰が原因でStackOverflowExceptionが発生するためは無効になっています。)

文字列に9桁すべてが含まれているかどうかを確認する正規表現の合計^(?=.*0)(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5)(?=.*6)(?=.*7)(?=.*8)(?=.*9).*$は、文字列全体に対して正の先読みを使用します。


1
111バイト(はい、バイトカウントは「ユニデジタル」です;
オリビエグレゴワール

2^68最初のpandigitalの数値として期待されるため、2は機能しませんが、Javaのlongはに制限されて2^63-1いることに注意してください。
オリビエグレゴワール

1
87バイト。おかげでreduce\ o /
オリビエグレゴワール

1
74バイト。ここで停止;-)
オリビエグレゴワール

1
@KevinCruijssen古い方法を削除したことは知っていますが、次の正規表現を使用して10桁すべてに一致できることを指摘したいだけです(?:.*?(\d)(?!.*\1)){10}
。– jaytea

1

、10バイト

←Vö>9Lud¡D

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

説明

        ¡D    Repeatedly double the input, collecting results in a list
 V            Return the first index where the following is true
     L          The length of
       d        the digits
      u         with duplicates removed
  ö>9           is greater than 9
←             Decrement (as Husk uses 1-indexing)

1

Mathematica、59 48 47 46 38バイト

Jenny_mathyのおかげで-9バイト。

If[!FreeQ[DigitCount@#,0],#0[2#]+1,0]&

Mathicsを使用してオンラインでお試しください!


2
46バイト:If [Tr [1 ^ Union @ IntegerDigits @#] <10、#0 [2#] + 1,0]&
J42161217

Mathematicaは匿名の再帰関数を許可します。:oありがとう!
完全に人間

2
38バイト:If [!FreeQ [DigitCount @#、0]、#0 [2#] + 1,0]&
J42161217

ああ、ありがとう!ところで、 ``はコードに使用できますが、先頭の空白は許可されません。a動作しますが、 `a`は動作しません。
完全に人間

!必ずところで、あなたはTIOにこのフッターを使用することができます Print/@f/@{617283945,2,66833,1234567890,100,42}
J42161217

1

R、74バイト

function(x){while(!all(0:9%in%el(strsplit(c(x,""),"")))){F=F+1;x=2*x};F*1}

オンラインでお試しください!f(2)言語が大きな整数を格納する方法の制限により、Rは間違った答えを与えることに注意してください。

説明:pandigitalityのテストでは、空の文字列と結合して入力を文字ベクトルに強制し、個々の数字に分割します。次に、結果のベクトルに0:9がすべて存在するかどうかを確認します。そうでない場合は、カウンターをインクリメントし、入力を2倍にして繰り返します。

カウンターは、Falseとして初期化されるFを使用します。強制的に数値に変換するために、戻る前に1倍します。


使用することc(x,"")は、きちんとしたトリックですel(strsplit(...))
ジュゼッペ

1

PowerShell70 69バイト

for($n=[bigint]$args[0];([char[]]"$n"|group).count-le9;$n*=2){$i++}$i

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

(Pythonの答えのほぼ2倍の長さ:-\)

入力を受け取り$args[0]、a としてキャストし、[bigint]に保存し$nます。入力しforたループを。各繰り返しは、我々は、かどうかに対してチェック$nアンバーは、その後に文字列に変換charする場合、-array Group-Object「一緒dは、持っている.count -lESSよりまたはeQUALにします9。つまり、10に等しい唯一の方法は、すべての数字の少なくとも1桁1234567890が存在する場合です。はいの場合、ループを終了します。そうでない場合は、$n*=2続行します。ループ内の各反復では、単にインクリメントしています$i。ループを抜けると、単に出力します$i

1234567890すべての数字がすでに考慮されているような入力の場合、これは何も出力しないことに注意してください。これはPowerShellの偽の値であり、0としてキャストされた場合と同等[int]です。それで問題ない場合+は、出力の前にa を置くだけで、$i明示的に整数としてキャストできます。

Roland Heathのおかげで1バイト節約できました。


ne10の代わりにle9を使用できますか?私はPowerShellに精通していませんが、それはバイトを節約するかもしれません。
ローランドヒース

@RolandHeath Indeed; 良い電話。ありがとう!
AdmBorkBork



0

Perl、43 + 1バイト

for$x(0..9){$_*=2,++$\,redo LINE if!/$x/}}{

-pフラグを使用します。これは、上記のXcaliが提供するソリューションに基づいています。


0

Swift 4、111バイト

func p(_ x:Int,_ c:Int=0)->Int{if !(String(Set(String(x)).sorted())=="0123456789"){return p(x*2,c+1)};return c}

注:オーバーフローのため、x = 2では機能しません。

説明-入力xは最初に文字列に型キャストされます。次に、Set()は繰り返し文字を削除します。次に、結果と一致するようにソートされます。一致しない場合、xは2倍になり、カウンターが増分されます。


1
varが64ビットであるため、動作しません。同じ問題に関する他の多くの答えがあります。
ナレシュ


これを許可する必要があると思われる場合は、OPで表示してください。これは、一般的な慣行が、OPが具体的におよびテストケースは、あなたが2をサポートする必要が示唆するように見える許されていないかもしれ
ポストロックGARFハンター

1
@FunkyComputerManは実際、言語の範囲外の数字を処理できない回答を許可しましたが、Shaggyはそれについて尋ねるコメントを削除したようです。この答えは結構です。
ケアニアンコヒーリングアーイング


0

Japt、15バイト

LÆ*2pXÃbì_â Ê¥A

それを試してみてください


説明

integerの暗黙的な入力U

LÆ    Ã

0to から整数の配列を作成し、99それぞれをX現在の要素である関数に渡します。

*2pX

U2のべき乗X

b

次の関数に渡されたときにtrueを返す最初の要素のインデックスを取得します。

ì_â

数字の配列に分割し、重複を削除します。

Ê¥A

配列の長さを取得し、と等しいかどうかを確認し10ます。


代替、15バイト

@*2pX)ìâ sÊ¥A}a

それを試してみてください


説明

integerの暗黙的な入力U

@            }a

で始まり0、次の関数を通過したときにtrueを返す最初の数値を返しますX。現在の数値です。

*2pX)

上記のように、U2の累乗を掛けXます。

ìâ

数字の配列に分割し、重複を削除して整数に再結合します。

文字列に変換し、長さを取得して整数に変換します。

¥A

と等しいかどうかを確認し10ます。


0

QBIC、48バイト、nc

{q=1[z|q=q*instr(!:$,!a-1$)]~q>0|_Xp\p=p+1┘b=b*2

これは理論的には機能するはずです。ただし、実際には、QBasicは10桁の数字(少なくともすべての数字を取得するために必要)を科学表記法にキャストするため、これは失敗します。そのため、競合しないとマークしました。

説明

{             DO ad infinitum
q=1           set q to 1
[z|           FOR a = 1 to 10
q=q*instr     multiply q by the position
(!:$             - in 'b' (read from cmd line at start) cast to string (! ... $)
,!a-1$)          - of the number a-1 [0-9] cast to string
]             NEXT
~q>0          IF any character was not found, instr gave a 0. If q != 0 all digits were present
|_Xp          THEN quit, printing  p (is 0 at start)
\p=p+1        ELSE increase step counter p
┘b=b*2        and double 'b'

0

GNU dc、61バイト

入力はスタックの一番上からコピーされます(そうでなければ空でなければなりません)。出力はスタックの一番上にプッシュされます。

[I~1r:ad0<s]ss[d1+r;a1=p]sp[d2*lfx]sh[0Sadlsxlpx11!=h]dsfxz1-

説明

配列変数を使用し、数字が存在aするa[d]場合は1を格納しd、そうでない場合は0にフォールバックします。GNU拡張機能を使用~して、1つのコマンドで商と剰余を取得します。

# populate a[0-9] from the digits
[I~1r:ad0<s]ss

# check pandigit
# return 1 more than lowest unset element of a[]
# start with stack=0
[d1+r;a1=p]sp

# Test for pandigit; double and repeat if needed
[dd+lfx]sh
[0Sadlsxlpx11!=h]dsfx

# We left one value on the stack for each doubling, plus the original
z1-

ボーナスとして、これは任意の基数(10進数だけでなく)で機能します。必要に応じて入力基数を設定するだけです(11定義の定数はその基数をf使用して読み取られるため、自動的に修正されます)。

テスト

for i in 617283945 2 66833 1234567890 100 42
do
    printf '%s => ' $i
    dc -e $i \
       -e '[I~1r:ad0<s]ss[d1+r;a1=p]sp[dd+lfx]sh[0Sadlsxlpx11!=h]dsfxz1-' \
       -e p
done
617283945 => 1
2 => 67
66833 => 44
1234567890 => 0
100 => 51
42 => 55


0

q / kdb +、33バイト

解決:

(#)1_{x*2 1 min!:[10]in 10 vs x}\

例:

q)(#)1_{x*2 1 min!:[10]in 10 vs x}\[100]
51
q)(#)1_{x*2 1 min!:[10]in 10 vs x}\[1234567890]
0
q)(#)1_{x*2 1 min!:[10]in 10 vs x}\[42]
55

説明:

すべてのバイトは平等であり、これをもう少し下までゴルフできるかもしれません。qのscan副詞を使用します。

count 1_{x*2 1 min til[10] in 10 vs x}\ / ungolfed solution
        {                            }\ / scan over this lambda until it yields same result
                              10 vs x   / convert to base 10
                           in           / left list in right list, returns boolean list
                   til[10]              / range 0..9
               min                      / return the minimum of the list, 0 or 1
           2 1                          / list (2;1) indexed into with 0 or 1
         x*                             / return x multiplied by either 2 or 1
      1_                                / 1 drop, drop one element from front of list
count                                   / count the length of the list

ノート:

kプロンプトにドロップすると、25バイトのソリューションが得られます。数値を文字のリストに変換します。

q)\
  #1_{x*2 1@&/($!10)in$$x}\[100]
51
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.