最初に0ではなく、個別の数字でランダムなn桁の数字を取得します


22

私はこの質問を読みそれがいい挑戦になると思った。

仕事

入力0<n<10で乱数を生成する

  • 正確にn桁
  • 最初ではない 0
    • そう f(n)>10**(n-1)-1
  • 個別の数字

受賞基準

これはので、最短のコードが優先されます。

ランダム

ランダムに均等に分散されるということです。そのため、プログラムの観点からは、考えられる各数字には同じチャンスがあります。あなたが書いている言語が奇妙な乱数ジェネレーターを持っているなら、それを使用しても大丈夫です。

ランダムに選択する値のリストn=2は次のとおりです。

[10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98]
code-golf  number  random  grid  game  king-of-the-hill  javascript  code-golf  arithmetic  statistics  code-golf  math  code-golf  math  code-golf  string  palindrome  code-golf  string  interactive  code-golf  quine  polyglot  code-golf  string  stack-exchange-api  code-golf  number-theory  decision-problem  code-golf  tips  code-golf  string  internet  code-golf  graphical-output  image-processing  fractal  code-golf  ascii-art  geometry  hexagonal-grid  code-golf  string  restricted-source  hello-world  code-golf  game  code-golf  cipher  code-golf  permutations  cops-and-robbers  permutations  cops-and-robbers  code-golf  internet  stack-exchange-api  code-golf  ascii-art  random  code-golf  tips  code-golf  ascii-art  code-golf  code-golf  kolmogorov-complexity  code-golf  string  unicode  code-golf  number  sequence  primes  palindrome  code-golf  game  decision-problem  code-golf  math  geometry  code-golf  graphical-output  interactive  code-golf  set-partitions  code-golf  number  arithmetic  restricted-source  code-golf  decision-problem  python  recursion  code-golf  ascii-art  code-golf  source-layout  code-golf  function  recursion  functional-programming  code-golf  game  combinatorics  permutations  code-golf  string  file-system  code-golf  string  hashing  code-golf  stack-exchange-api  code-golf  string  code-golf  math  number  arithmetic  polyglot 

4
分布を指定せずにランダム性を要求することは避けてください。
-flawr

はい、文字列ではなく整数として返されますか?
ジュゼッペ

@Giuseppe は乱数を生成します
mbomb007

4
誰かが乱数の質問をするたびにこれを考えますxkcd.com/221
Thunda

1
@ ais523「入力0 <n <10で乱数を生成する」
-cleblanc

回答:


17

Python 2、77バイト

from random import*
r=range(10)
while[1]>r:shuffle(r)
print`r`[1:input()*3:3]

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

0で始まらない限り10桁のリストをシャッフルし、最初のn桁がリストされた数字を作成します。


9またはの入力用のメモリが少なく、確実に高速に実行されます10
mbomb007

きちんとしたソリューション![1::3]リストから文字列に変換する仕組みを説明できますか?私はそれを見たことがありません。
ジュリアン・ウルフ

@JulianWolfリストの各要素が同じ長さの場合にのみ機能します。リストの文字列表現を実際に取得し、最初の文字をスキップした後、3文字ごとにそれをスライスし[ます。
mbomb007

@JulianWolf [1::3]は、インデックス1で文字を取得し、3番目ごとに取得します。以下のために[1, 2, 3]与えることを、123括弧、カンマ、スペースをスキップし、。
デニス

撃て、大丈夫-それは理にかなっています。[1, 2, 3]すでに文字列化されていて、カンマとスペースをスキップする必要があることを忘れていました。ありがとう!
ジュリアンウルフ

10

Brachylog9 10バイト

{~lℕ₁≜≠}ᶠṛ

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

Brachylogの場合と同様に、これは関数サブミッションです。上記のTIOリンクには、関数を完全なプログラムにするためのコマンドライン引数が与えられています。

この最初のバージョンから余分なバイトを追加し、に変更してℕ₁、出力0(現在は明確になっているもの)を禁止する必要がありました。

説明

{~lℕ₁≜≠}ᶠṛ
{      }ᶠṛ  Pick a random value with these properties:
 ~l           it has length equal to the input;
   ℕ₁         it's a positive integer;
     ≜        it's a specific value (not a constraint);
      ≠       all its elements (digits in this case) are different.

インタープリターはすべての可能な値のリストを生成し、ランダムに1つを選択するため、かなり非効率です(つまりᶠṛ、この質問が行われた時点でBrachylogには「ランダムなソリューションを選択する」オプションがありませんでした)。

ここでのラベル付けに関するいくつかのコメント:が省略された場合、中括弧内のセクションは1つの値のみを生成します。これは、必要なプロパティを持つ数値を表す制約です。したがって、ランダムな結果を選択すると制約が得られ、インタープリターは制約を満たす最小の絶対値(1、10、102、1023、10234など)を出力しますが、これは望んでいないものです。したがって、明示的なラベル付けによってリストを作成するように強制する必要があります。

私が見たほとんどのProlog実装には、制約に一致するランダムな結果を見つけるためのビルトインがありますが、通常は一様な確率ではありません。ただし、Brachylogには1つもありませんでした(このチャレンジに対応して1つ追加されましたが、抜け穴のルールのために明らかに使用できません)。もしそうなら、そしてこの問題に対して偶然確率を与えた場合、このプログラムの~lℕ₁≠後には、おそらく6バイトの長さの組み込みが続きます。

Brachylog、8バイト、@ Fatalizeとのコラボレーション

~lℕ₁≠≜ᶠṛ

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

これは一種の天才的な低レベルのトリックであり、Prologが物事を行う方法でのみ意味を持ち、数学的に説明するとあまり意味がありません。

前と同様に、~lℕ₁≠制約(「入力に等しい長さ、自然数、すべての要素が異なる」)を記述する値を作成します。次に≜ᶠ、制約を満たすすべての可能な値を生成します。ここでのポイントは、Brachylogの評価シーケンスでは、表示されるまで実際の選択は行われないため、「すべてのソリューションを見つける」操作は「制約を満たす特定の値」操作にのみ適用される必要があるということです。つまり{…}、スコープを選択する必要がなく、2バイトを節約できます。


私は解決策を投稿するつもりだった≜₁私は、それが原因で、この課題を添加したことを実現する前に
関係のない文字列の

8

ゼリー、9 バイト

⁵*ṖQL$€MX

オンラインでお試しください!(実装の非効率性のため、 n> 6の間 TIOで動作しません)

または同じものの代替実装:

⁵*ṖQL$ÐṀX

どうやって?

これはかなり卑劣で、非常に非効率的です!Jellyは、アトムがリストを期待しているが整数を受け取ったときに、暗黙的にいくつかの有用なことを行います(これは仕様によるものです)。
このコードは、これらの便利な暗黙のアクションをいくつか使用します。

  • モナドアトム"pop"は、整数入力で呼び出されると暗黙的にポップする範囲を作成するため、nの入力は最初に[1、2、...、n]を作成し、次にポップして[1、2を生成します、...、n-1]

  • モナディックアトムQ"de-duplicate"または "unique"は、整数入力で呼び出されると暗黙的に10進数リストを重複排除するため、nの入力は次のとおりです
    。n = d k-1 ×10 k-1 + d k-2 ×10 k-2 + ... + d 1 ×10 + d 0は、
    最初に
    [d k-1、d k-2、...、d 1、d 0 ]を作成し
    、次に一意の値を生成します。第一印象。
    したがって、たとえば、n = 5835518[ 5、8、3、1 ]を生成します。

さらにモナド原子M、「最大の要素のインデックスは」、リストから最大のアイテムのインデックスを返し、これはセーブ2つの、入力と平等のためのテストとtruthyインデックスを見つけるはるかに明白な選択肢の上にバイトを⁵*ṖQL$€=⁸TX、または⁵*ṖðQL⁼ð€TX

⁵*ṖQL$€MX - Main link: n                       e.g. 2
⁵         - literal 10
 *        - exponentiate: 10^n                      100
  Ṗ       - pop (make range 1 to 10^n, then pop)    [1  ,2  ,...,21   ,22 ,23   ,...,97   ,98   ,99]
     $€   - last two links as a monad for €ach:
   Q      -   unique (makes a decimal list first)   [[1],[2],...,[2,1],[2],[2,3],...,[9,7],[9,8],[9]]
    L     -   length                                [1  ,1  ,...,2    ,1  ,2    ,...,2    ,2    ,1  ]
       M  - indexes of maximal elements             [        ...,21       ,23,   ...,97   ,98       ]
          -                                         - i.e. all n-digit numbers with n-distinct digits.
        X - pick a random element from that list

これはすべて、時間とメモリの両方で非常に非効率的です:最初に10 n個の整数のリストが作成され、1つが破棄され、次にこれらのそれぞれに対してn個の整数のリスト(いくつかの派手な4ビットオブジェクトまたは列挙型ではありません)が作成されますその後、重複排除されます。この重複排除には完全にリストベースの実装があります(セット、ソート済みセット、または辞書は内部で関与せず、各数字は最終的に出力を取得するリストに存在するかどうかがチェックされます)。
オフラインn = 7は〜0.5GBを使用し、〜25秒かかりますが、n = 8は〜4GBを使用し、〜5分かかります-16 GBのRAMしか持っていないので、n = 9を実行していません(〜45分かかると思います) )。

別の実装では、組み込みのÐṀクイックフィルターミニマムを使用します(ここでは、同じバイト数の管理に少しオーバーヘッドが追加されます)。


ああすごい。私はこのようなことを試みていましたが、値を個別に保存するのではなく、リストのインデックスに返す値を保存するトリックを逃しました(リストを適切にパディングすることにより)。これは、Jellyでかなり頻繁に役立つトリックであり、私はいつもそれを逃しているようです。

7

ゼリー、11バイト

9Xœ|⁵ḶẊ¤ḣ¹Ḍ

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

使い方

9Xœ|⁵ḶẊ¤ḣ¹Ḍ  Main link. Argument: n

9            Set the return value to 9.
 X           Pick; pseudo-randomly select an integer from [1, ..., 9].
       ¤     Combine the three preceding links into a niladic chain.
    ⁵          Yield 10.
     Ḷ         Unlength; yield [0, ..., 9].
      Ẋ        Shuffle; pseudo-randomly select a permutation of [0, ..., 9].
  œ|         Multiset OR; prepend the selected integer to the selected permutation
             and remove the second occurrence of the first element.
         ¹   Identity; yield n.
        ḣ    Head; keep the first n digits of the permutation.
          Ḍ  Undecimal; convert from base 10 to integer.

それは...、重複を除去するために非常に巧妙な方法です
漏れ修道女

7

JavaScript(ES6)、72 71 70 69バイト

f=(x,y="")=>x?!y.match(z=Math.random()*10|0)&&y|z?f(x-1,y+z):f(x,y):y

これは、桁数xを受け取る再帰関数です。最初に空の文字列に設定された2番目のパラメーターyは、数字を1桁ずつ生成するときに番号を追跡します。

まず、でランダムな数字zを生成しMath.random()*10|0ます。今、私たちがいることを確認したいyが含まれていないZを、そのYZが両方ではありません0

で最初の条件を計算できます!y.match(z)yzを含むy.match(z)場合は配列(常に真)を返し、そうでない場合はnull(偽)を返します。これはブール値と反転、それに変換されます。!

2番目の条件はでチェックされy|zます。がyは文字列であり、JSは、暗黙的に使用して整数に変換します|。これは、yがすでに数字を含んでいる場合は正の整数で、そうでない場合は0です。最終的な結果は、yが空でz0の場合に0y|z返し、そうでない場合は正の整数を返します。

これらの条件の両方が真である場合、yに数字を追加し、xを減分して、プロセスを再び始めます。それ以外の場合は、単に最初に戻り、次のランダムな数字が機能することを望みます。ときxが到達した0を、我々は単純に再帰を終了するには、空の文字列を返します。


前のバージョン:

f=(x,y)=>x?~y>>(z=Math.random()*10|0)&1&&y|z?z+f(x-1,y|1<<z):f(x,y):""

これは、桁数を取得する再帰関数です。最初に定義されていない2番目のパラメーターyは、10ビットのルックアップテーブルで、既に持っている数字を示し、整数として格納されています。

まず、でランダムな数字zを生成しMath.random()*10|0ます。次に、yz番目の最下位ビットが設定されていないこと、およびyzが両方とも0でないことを確認します

で最初の条件を計算できます~y>>z&1yを反転し、zビットを右にシフトし、最下位ビットのみを取得します。問題の数字をまだ生成していない場合は1、それ以外の場合は0になります。

2番目の条件は、最初は把握するのがかなり困難でした(両方とも0である場合y/z、最初に生成に使用してみましたNaN)が、ある時点で、単純y|zにトリックを実行できることに気付きました。結果は0の両方IFF Y及びZである0。それ以外の場合は正の整数。

これらの条件の両方が真(~y>>z&1&&y|z)の場合、残りの数値を生成してzを付加します。残りの数値は、x-1and y|1<<zy、ただしインデックスzのビットが1に設定されている)で関数を再度呼び出すことにより生成されます。ときxが到達した0を、我々は単純に再帰を終了するには、空の文字列を返します。


5

ClojureScript、81 79バイト

#(let[a(subvec(shuffle(range 10))0 %)](if(=(a 0)0)(recur %)(int(apply str a))))

これは匿名関数なので、次のように使用する必要があります。

(#(...) {arguments})

{arguments}引数で置き換える場所。

ここでコードを試すことができます(ClojureScript REPL)。

@cliffroot2バイトを削ってくれてありがとう!


拡張コード:

(defn random-digits [n]
  (let [num-vector
        (subvec
          (shuffle (range 10))
          0 n)]
    (if (= (num-vector 0) 0)
      (recur n)
      (int (apply str num-vector)))))

説明:

の入力例を使用して、1行ずつ説明します8


(defn random-digits [n] ...)

非常に簡単です。これはrandom-digits、という1つの引数で関数を定義しますn。私の答えでは、#(...)バイトを節約するために匿名関数()を使用しました。


(let [num-vector ...] ...)

内側letから外側を調べてみましょう:

(shuffle (range 10))

ClojureScript(およびClojure)では、(range n)Pythonの場合と似ていrange(n)ます。to 0からn - 19この場合)までのすべての数字のリストを提供します。

shuffleリストを受け取り、すべての要素がシャッフルされたベクトル(リストとは少し異なります)を返します。したがって、この例を使用すると、次のような結果が得られます。

[1 0 8 3 6 7 9 2 4 5]

(subvec {see above} 0 n)

(subvec vector start end)ベクター(ベクターのみ)を取り、インデックスからすべての要素有するベクター返しstartにしますend。この場合、0th要素からに与えられた引数に要素を取りますrandom-digits。これを例に適用すると、次のようになります。

[1 0 8 3 6 7 9 2]

(if (= (num-vector 0) 0)
  (recur n)
  (int (apply str num-vector)))

このifステートメントは、の最初の要素がnum-vectorであるかどうかを確認します0

の場合、を使用0して、引数nを使用して関数を再度呼び出しますrecur

そうでない場合0


(int (apply str num-vector))

(apply function list)リストを取り、それらを引数として関数に吐き出します。例えば:

(apply + [2 3 4])

に変わる:

(+ 2 3 4)

それは等しい9

(str items)すべてのアイテムをitems文字列に変換し、それらを連結します。int何かを整数に変換します。したがって、これを例に適用すると、次のようになります。

   (int (apply str [1 0 8 3 6 7 9 2]))
=> (int (str 1 0 8 3 6 7 9 2))
=> (int "10836792")
=> 10836792

これが最終的な答えです。


2
:)の(int string)代わりに許可するためにClojureScriptを愛さなければならない(Integer/parseInt string)
クリフルート

1
@cliffrootつまりread-string、Clojureでできることですが、それほど良くはありません
...-clismique

保存された2バイト#(let[a(subvec(shuffle(range 10))0 %)](if(=(a 0)0)(recur %)(int(apply str a))))apply str部分を最後に移動し、0代わりに比較を\0使用し、subvec代わりにtakeベクトルを関数として使用して削除することを可能にしますfirst
クリフルート

@cliffroot Huh、それshuffleがコレクションをに変えたことを知りませんでしたvec。ありがとう!ただし、新しい説明を書く必要があります
...-clismique

5

Python 2、89 81 80バイト

from random import*
lambda n:choice([i for i in range(10**n)if`set(`i`)`[5*n:]])

オンラインで試す


範囲の開始値は必要ないと思います。
デニス

いいね!それは遅くなります。:D残念ですが、リストの代わりにジェネレータを使用することはできません。
mbomb007

11%のみ。コードゴルフ用のバケツにドロップします。
デニス

ええ、私は99**nそれらをすべて確実に取得するために、を使用する必要があります。:D
mbomb007

私もこの方法で見ましたが、を使用して80を得ましたif`set(`i`)`[5*n:]]
ジョナサンアラン

5

R、45バイト

k=0
i=scan()
while(!k[1])k=sample(0:9)[1:i]
k

k=0長さ1の暗黙のベクトルなので、設定するだけでよいと思います。また、i = scan()を使用して、stdinからの入力を数値として取得できます。また、数字のリストが「正しい」提出であるかどうかはわかりませんが、私は裁判官ではありません。
ジュゼッペ

@Giuseppe入力をありがとう、両方の投稿の両方の提案を更新しました、ありがとう。
ニール

while(!k[1])2つのバイトを保存するために動作しますか?
BLT

@BLT更新、ありがとう。
ニール

3

Bash + GNU utils、46

seq 1e$[$1-1] 1e$1|egrep -v '(.).*\1'|shuf -n1

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

これは、nが大きい場合は長い時間がかかり、n = 7の場合は約30秒で、増分ごとに10倍増加するため、n = 10の場合はおそらく8-9時間かかります。


質問ごとに、n = 10は動作すらする必要はなく、はるかに速くはありません
ysth

3

ジャワ7、150の 147 145 134バイト

String c(int n){String r="";for(int l,x;(l=r.length())<n;)if(l<1&(x=(int)(Math.random()*10))>0|(l>0&!r.contains(""+x)))r+=x;return r;}

@TheLethalCoderのおかげで-2バイト

(古い)説明:

String c(int n){                           // Method with integer parameter and String return-type
  String r="";                             //  Result-String
  for(int l=0,x;l<n;l=r.length()){         //  Loop until the length of the result-String is equal to the parameter integer
    x=new java.util.Random().nextInt(10);  //   Random digit
    if((l<1&x>0)                           //   If the length is zero and the random digit is not zero
       |(l>0&!r.contains(""+x)))           //     or the length is at least 1, and the result-String does not contain this random digit yet
      r+=x;                                //    Append the random digit to the result-String
  }                                        //  End of for-loop
  return r;                                //  Return result-String
}                                          // End of method

テストコード:

ここで試してみてください。

class M{
  String c(int n){String r="";for(int l,x;(l=r.length())<n;)if(l<1&(x=(int)(Math.random()*10))>0|(l>0&!r.contains(""+x)))r+=x;return r;}

  public static void main(String[] a){
    M m = new M();
    System.out.println(m.c(4));
    System.out.println(m.c(10));
  }
}

出力例:

7194
8672953041

ここでラムダ式を使用できませんか?すなわち、n->...またはそのJava 8+ですか?
TheLethalCoder

1
また、私の答えで使用したばかりのトリックを借りて、比較チェックで長さを設定することもできfor(int l,x;(l=r.length())<n;)ます。つまり、バイトを保存する必要があります。
TheLethalCoder

1
@TheLethalCoderああ、もちろんありがとう。素晴らしいチームワーク!;)はい、n->...Java 8です。個人的には、8は常に短くなりますが、Java 7でコードゴルフをすることを好みます。
ケビンCruijssen

2

Perl 6、44バイト

{(->{+[~] (^10).pick($_)}...*>9 x$_-1).tail}

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

拡張:

{  # bare block with implicit parameter 「$_」
  (

    ->{  # pointy block lambda with no parameters

      +                # turn the following into a numeric
      [~]              # concatenate the following

        (^10).pick($_) # grab $_ digits at random from 0..9
    }

    ...                # keep doing that until

    * > 9 x $_-1       # one of them is big enough

  ).tail # return the last one (only valid one)
}

2

PHP、67バイト

オンライン版

0から9までの数字をシャッフルするすべてのバージョン

for($a=range(0,9);!$a[0];)shuffle($a);for(;$i<$argn;)echo$a[+$i++];

71バイト

for($s="0123456789";!$s[0];)$s=str_shuffle($s);echo substr($s,0,$argn);

73バイト

for($a=range(0,9);!$a[0];)shuffle($a);echo join(array_slice($a,0,$argn));

2

MATL、15バイト

`4Y2GZr1)48=]8M

MATL Online試しください

説明

`        % Do...while
  4Y2    %   Push predefined literal '0123456789'
  G      %   Push input n
  Zr     %   Random sample of n unique characters from that string
  1)     %   Pick the first
  48=    %   Is it 48? This is the loop condition
]        % End. If top of the stack evaluates to true: next iteration
8M       % Push the latest random sample. Implicitly display

2

ゼリー、12バイト

9×!X+!Œ?’ḣƓḌ

現在、他のJellyの回答の1バイト後ろにありますが、私はこれが本当に好きです。

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

使い方

9×!X+!Œ?’ḣƓḌ  Main link. No arguments.

9             Set the argument and the return value to 9.
  !           Yield 9!
 ×            Compute 9 × 9!.
   X          Pick; pseudo-randomly select an integer j from [1, ..., 9 × 9!].
     !        Yield 9!
    +         Compute k := j + 9!.
              The result will belong to [9! + 1, 10!].
      Œ?      Get the permutation P of R := [1, ..., r], with minimal r, such that
              P is the lexicographically k-th permutation of R.
              Since k belongs to [9! + 1, 10!], r = 10 and this generates a per-
              mutation between [2,1,3,4,5,6,7,8,9,10] and [10,9,8,7,6,5,4,3,2,1].
        ’     Subtract 1 from all integers in P.
          Ɠ   Read an integer n from STDIN and yield it.
         ḣ    Head; keep the first n digits of the permutation.
           Ḍ  Undecimal; convert from base 10 to integer.

2

APL(Dyalog)27 19 17バイト

⎕IO←0多くのシステムでデフォルトである必要があります。

10⊥⊢↑{?⍨10}⍣{×⊃⍺}

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

有効になるまで数字をシャッフルします。

10⊥ 10進数から通常の数字にデコードします。

 n

 の最初の要素

{... }⍣{... } ...の機能を繰り返す
?⍨10 最初の10個の正の整数をシャッフル
するまで...
⊃⍺ 最後の試みの最初の数字が
× 正であります


1

パイソン2100の 93 92 90バイト

2バイトを削る@ mbomb007に感謝

from random import*
def f(n):k=randint(10**~-n,10**n-1);return(n==len(set(`k`)))*k or f(n)

一意の数字を持つ数字が見つかるまで、必須の数字を試します。これを行うためのはるかにクリーンな方法があると思いますが、どれも思い浮かびません。


return(n==len(set(`k`)))*k or f(n)オンラインで試してください
mbomb007


1

Perl、48バイト

1until$_=1+int rand 10**$n-1,/.{$n}/&&!/(.).*\1/

説明:

1から10 ** $ n-1までのランダムな整数を繰り返し生成し、数字が繰り返されず、正しい長さ(少なくとも10 **($ n-1))になるまで拒否します。


1

バッチ、156バイト

@set/af=9,r=x=0
@for /l %%i in (1,1,%1)do @call:c
@echo %r%
@exit/b
:c
@set/a"d=9-%random%%%f,e=x>>d&1
@if %e%==1 goto c
@set/a"r=r*10+d,f=10,x|=1<<d

x使用される数字のビットマスクを維持します。f使用可能な桁数を示します(9からカウントダウン)。ランダムな数字は、未使用の数字が見つかるまで生成されます。n=10165バイトでサポートできます:

@set/af=9,r=x=0
@for /l %%i in (1,1,%1)do @call:c
@echo %r:~1%
@exit/b
:c
@set/a"d=9-%random%%%f,e=x>>d&1
@if %e%==1 goto c
@set r=%r%%d%
@set/a"f=10,x|=1<<d

rそのようにゴルファーであるため、余分な先行ゼロが含まれています。)165バイトの以前のアプローチは、最初の数字を特殊なケースにし、またたまたま動作しましたn=10(数値バージョンは実際に166バイトかかりました!):

@set/ar=%random%%%9+1,x=0
@for /l %%i in (2,1,%1)do @set/a"x|=1<<d"&call:c
@echo %r%
@exit/b
:c
@set/a"d=%random%%%10,e=x>>d&1
@if %e%==1 goto c
@set r=%r%%d%

170バイトの元のアプローチは次の場合にも有効でしたn=10

@set/ar=%random%%%9+1
@for /l %%i in (2,1,%1)do @call:c
@echo %r%
@exit/b
:c
@set/ad=%random%%%10
@call set s=%%r:%d%=%%
@if not "%s%"=="%r%" goto c
@set r=%r%%d%

文字列操作を使用して、重複する数字を検出します。



1

Pyth、15 28バイト

=+YhO9VtQ#KOTI!hxYK=+YKB;jkY

ここで試してみてください


1
PPCGへようこそ、そして素晴らしい仕事バットゴルフの言語の権利を使用して:-)私は2つの小さな問題:1参照)を、第2桁は常にあるようだ0、私はあなたが変更したいと思うよう^TttQ^TtQ(-1バイト、ボーナス!)。2)出力のすべての数字は一意である必要があるため、何らかの方法で強制的に発生させる必要があります。
-ETHproductions

@ETHproductions Arg !! それを指摘してくれてありがとう。私はそれを修正しました。
マリア

1

C位、127の 132 128 126 125バイト

n=>{var s="";for(int l,r;(l=s.Length)<n;)if((l<1&(r=new System.Random().Next(10))>0)|(l>0&!s.Contains(r+"")))s+=r;return s;};

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

アイデアを借用KevinCruijssenの答え@、ランダムに初期化するためにr、中if 2バイトを節約ステートメント。

これはさらにゴルフができると確信していますが、現時点では時間がありません。


whileループを使用した古いバージョン:

n=>{var s="";while(s.Length<n){int r=new System.Random().Next(10);if(s.Length<1&r>0)s+=r;else if(!s.Contains(r+""))s+=r;}return s;};

これは正しいとは思わない。最初のランダムな整数が0であるとしましょう。最初にif(s.Length<1&r>0)どれが偽かを試してみますが、その後はif(!s.Contains(r+""))どちらが真かを試し"0"s、最初の数字として追加します。
ケビンCruijssen

@KevinCruijssen修正し、さらにゴルフ
TheLethalCoder

1
@KevinCruijssenああ、私はそれを解決しました、あなたの例では.Next(10)...で終わることはありません;。そこで、それ以上の改善はありませんが、良いアイデアです。
TheLethalCoder

1
投稿しました。:そしておっと、あなたは右の私はセミコロンを逃している..あなたはこのかかわらようなゴルフそれをまだすることができn=>{var s="";for(int l=0,r;l<n;l=s.Length)if((l<1&(r=new System.Random().Next(10))>0)|(l>0&!s.Contains(r+"")))r+=x;return s;};:)
ケビンCruijssen

1
@KevinCruijssenあなたがそのコメントを書いていたとき、私はあなたの答えからアイデアを借りました!素晴らしい改善のおかげで
-TheLethalCoder


1

PHP、65 63バイト

while(count(count_chars($x=rand(1,10**$argn),1))<$argn);echo$x;

STDINから入力を受け取ります。と走る-nRます。

間の乱数を作成1し、10^N包括的。
異なる文字のカウントが<である間に繰り返しNます。


1
while(count(count_chars($x=rand(1,10**$argn),1))<$argn);echo$x;-2バイト
ヨルクヒュルサーマン

0

Mathematica 65 60バイト

0For[a=11,Max@DigitCount@a>1,a=RandomInteger[10^{#-1,#}]]+a&

これはより高速なバージョンですが、9バイト追加されます。

FromDigits@Join[f=(s=RandomSample)[r=Range@9,1],s[r/.f[[1]]->0,#-1]]&

0

Java 9 JShell、86バイト

n->new Random().longs(0,10).limit(n-1).reduce(new Random().nextInt(9)+1,(a,b)->a*10+b)

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

注:これらのパッケージはデフォルトでJShellにインポートされるため、インポートはカウントしませんが、JShellについて知っているTry-it-onlineリンクがないため、Java 9にヘッダーとフッターコードを提供しましたそのコンテキストで動作するようにします。JShellでは、次のことができます。

jshell> Function<Integer,Long> f =
   ...> n->new Random().longs(0,10).limit(n-1).reduce(new Random().nextInt(9)+1,(a,b)->a*10+b)
f ==> $Lambda$27/633070006@5702b3b1

その後:

jshell> f.apply(6)
$26 ==> 746202

使い方:

関数をIntegerからLongに定義し、0-9の範囲でランダムlongの無限ストリームを作成し、最初のn-1アイテムに制限してから、1-9のランダムintで初期値として減らし、値に10を掛け、ストリームから次の値を追加する関数。

ロングを使用したので、これは約18桁(n = 18)まで機能します。


0

C、96 93バイト

f(n){char d[11],i=0,r;for(;i++^10;d[i-1]=d[r=rand()%i],d[r]=47+i);*d^48?d[n]=0,puts(d):f(n);}

Fisher-Yatesは、最初の数字がゼロになるまで初期化をシャッフルします。

均一であると仮定するrand()%iと、均一です。(ほとんどのiのRAND_MAX/i残りは小さいため、非常に小さいバイアスがあります。このバイアスは、RAND_MAXが大きくなるにつれて小さくなります。)

オンラインでご覧ください。

質問に示されているように、nが2に等しい場合に正しい数値を生成することを参照してください。


0

公理、191バイト

g(a:NNI):Complex INT==(a<1 or a>9=>%i;r:List NNI:=[];b:=a;repeat(a=0=>break;d:=random()$INT rem 10;a=b and d=0=>0;~member?(d,r)=>(a:=a-1;r:=cons(d,r)));reduce(+,[r.i*10^(i-1)for i in 1..#r]))

ungolf it、テスト結果

-- Return one number of 'a' different random digits if 0<a<10
f(a:NNI):Complex INT==
    a<1 or a>9=>%i
    r:List NNI:=[];b:=a
    repeat
       a=0=>break
       d:=random()$INT rem 10
       a=b and d=0  =>0
       ~member?(d,r)=>(a:=a-1;r:=cons(d,r))
    reduce(+,[r.i*10^(i-1)for i in 1..#r])

(4) -> [[i,g(i)] for i in 0..10]
   (4)
   [[0,%i], [1,9], [2,76], [3,135], [4,6810], [5,48675], [6,415768],
    [7,7461539], [8,98421537], [9,825046739], [10,%i]]
                                          Type: List List Complex Integer
(5) -> [[i,g(i)] for i in [3,3,3,3,3,3,3,3,3]]
   (5)
   [[3,653],[3,128],[3,254],[3,268],[3,914],[3,594],[3,276],[3,240],[3,398]]


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