数字を覚えやすい


41

覚えやすいが、理論的には簡単に作成できない数字

あなたの課題は、これらの基準に適合する一様な乱数を生成する任意の言語でプログラム/関数を作成することです。

  1. 長さ5桁です

  2. 2つの別々の繰り返される数字のペアがあります

  3. 繰り返される数字の1つのセットは先頭または末尾にあり、数字は隣り合っています

  4. 奇数番号は他の数字のペアで囲まれています

  5. 2桁のペアと他の番号はすべて一意でなければなりません

  6. あなたのプログラムは、あなたの裁量で、先頭にゼロを付けても付けなくてもかまいません。先行ゼロがサポートされている場合、出力に含める必要があります:6088ではなく06088。先行ゼロがサポートされていない場合、06088などの数値はまったく生成されません。

テストケース

受け入れられる出力:

55373
55494
67611
61633
09033
99757
95944
22808
65622
22161

受け入れられない出力:

55555
77787
85855
12345
99233
12131
アブデ
5033

このpastebinリンクより受け入れられるテストケースを見つけることができます。

これらは、このpythonプログラムで作成されました。

ランダムにインポート
範囲(100)のiの場合:

    if random.randint(0,100)> = 50:#trueの場合、最初にペアをタッチする
        temp = [] #working array
        temp.append(random.randint(0,9))#ランダムな数字を追加
        temp.append(temp [0])#同じ数字を再度追加

        x = random.randint(0,9)
        一方、x == temp [0]:
            x = random.randint(0,9)
        temp.append(x)#別の一意の数字を追加

        y = random.randint(0,9)
        一方、y == temp [0]またはy == temp [2]:
            y = random.randint(0,9)
        temp.append(y)#別の一意の数字と前の一意の数字を追加
        temp.append(x)

    その他:#最後にタッチペアを置く
        temp = [] #working array  
        temp.append(random.randint(0,9))#ランダムな数字を追加

        #一意ではありませんが、再試行してください
        x = random.randint(0,9)
        一方、x == temp [0]:
            x = random.randint(0,9)
        temp.append(x)#別の一意の数字を追加


        temp.append(temp [0])#同じ0番目の数字を再度追加します


        y = random.randint(0,9)
        一方、y == temp [0]またはy == temp [1]:
            y = random.randint(0,9)
        temp.append(y)#別の一意の数字を2回追加する
        temp.append(y)

    tempstr = ""
    一時的なiの場合:
        tempstr + = str(i)
    印刷tempstr

これはなので、バイト単位の最短回答が勝ちです!


5
私は、「真実」と「偽」ではなく、「可能性のある出力(確率> 0)」と「不可能な出力(確率= 0)」をお勧めします。 )。
クルドラエセスナバルヤ

9
09033のような出力を先行ゼロで印刷する必要がありますか?
-xnor

3
確率が均一であれば、質問でそれを指定できますか。デフォルトでrandomは、一様に意味するわけではありません
ジョーキング

3
conveniewnceを理解するために、多分、99233を追加する
l4m2

3
PPCGへようこそ!素敵な最初の挑戦。
ジョナサンアラン

回答:



9

CJam(16バイト)

YmrG*98+ZbA,mrf=

オンラインデモ

注:「一意の」OPは、実際には「個別」を意味すると想定しています。

また、16バイトの場合:

98ZbA,mrf=W2mr#%
98ZbA,mrf=_W%]mR

解剖

Ymr    e# Select a random number from [0 1]
G*98+  e# Multiply by 16 and add 98 to get 98 or 114
Zb     e# Base conversion in base 3 to get [1 0 1 2 2] or [1 1 0 2 0]
A,mr   e# Shuffle the numbers from 0 to 9
f=     e# Map "select the item at this index"

他のバリアントはを使用[1 0 1 2 2]して生成し、結果またはその逆を選択します。


9

Perl 5の81の 63 56バイト

@DomHastingsからインスピレーションを得て7バイトをカット

適切なパターンから数値を作成します。

@q{0..9}++;say+(keys%q)[.5>rand?(2,2,0,1,0):(0,1,0,2,2)]

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


Perl 5、89バイト

基準を満たす番号が見つかるまで、ランダムな5桁の番号を選択します。

$_=sprintf'%05d',0|rand 1E5until(/(.)\1(.)(.)\2/||/(.)(.)\1(.)\3/)&&$1-$2&$2-$3&$1-$3;say

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


ランダム性のためにハッシュキーを使用する素晴らしいトリック!これは-8に相当すると思いますが、エッジケースを見逃しているかもしれません... オンラインで試してみてください!
ドムヘイスティングス

1
ハッシュランダム化。ブリリアント!短い
トンホスペル

問題はtime%2、ある意味ではユーザーの制御下にあるため、十分にランダムであるかどうかです。
Xcali

@Xcali 一度だけ使用すれば問題ないというのはコンセンサスのようです。
FryAmTheEggman

8

Python 2、80バイト

from random import*
a,b,c=sample(range(10),3)
print[a,a,b,c,b][::choice((-1,1))]

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

数字のリストを出力します。

Python 2、83バイト

from random import*
a,b,c=sample('0123456789',3)
print(a*2+b+c+b)[::choice((-1,1))]

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

出力は数値です。


不均一なランダム性がデフォルトで許可されている場合(質問では指定されていません)、リバースをサンプリングすることでバイトを節約できます。オンラインで試してください!編集:気にせず、均一性が仕様に組み込まれたようです。このアプローチはまだ救われるのだろうか。
xnor

7

APL(Dyalog Unicode)22 21 20 18 17バイト

(3∨?2)⌽1↓,∘⌽⍨3?10

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

それは同じ形式で数値は常に出力に許容できるなら、これは12バイト、のいずれかに短縮することができます1⌽1↓,∘⌽⍨3?103⌽1↓,∘⌽⍨3?10

不要なを削除してバイトを保存しました

H.PWizのおかげで1バイト節約し、その後、ヒントによりさらに2バイト節約しました。

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

関数は⎕IO←0I ndex O rigin)想定しています。


どうやって?

(3∨?2)⌽1↓,∘⌽⍨3?10  Anonymous function.
              3?10   Deal 3 (distinct) random numbers from 0 to 9. (Assume 1 2 3)
                   Use that as both arguments for:
          ,∘⌽       Rotate (⌽), then concatenate (,).
                    Yields 3 2 1 1 2 3.
        1          Drop the first element. Our vector is now 2 1 1 2 3
                   Rotate the vector to the left using as argument:
(  ?2)              Roll 0 or 1 and...
 3                 Do the GCD between 3 and the result. (30=3; 31=1.)
                    This yields either 1 1 2 3 2 or 2 3 2 1 1.

入力を指定できません
-drham

@drham関数への入力はありません。この場合、TIOフィールドInputを使用して関数を呼び出しますg。また、これg←は必要ではないため、バイトカウントにはカウントされません。関数の呼び出しにのみ使用されます。
J.サール

実際gの入力部に呼ばれているがAPLがTIO上で実行するように設定されている方法の単なる気まぐれである
H.PWiz

(4∨?2)バイトを節約1 4[?2]
-H.PWiz

1
fトレインに割り当てずにトレインを使用することで、バイトを節約することもできます。私はそれをあなたに任せます:)
H.PWiz

6

ジャワ8、145の 136 125 119バイト

v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}

@OlivierGrégoireのおかげで-9バイト@RickHitchcockの
おかげで-11バイト。@Nevayの おかげで-6バイト。

説明:

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

v->{            // Method with empty unused parameter and String return-type
  String r;     //  Result-String
  for(;!(r=(int)(Math.random()*1e5)+"")
                //  Generate a random number in the range [0; 100000) and set it to `r`
        .matches("(.).*\\1(.).*\\2")
                //   And continue doing this as long as it doesn't match the regex above,
       |r.chars().distinct().count()<3;);
                //   or doesn't have three distinct digits
  return r;}    //  Return the result


?OlivierGrégoire@あなたは...正しい挑戦でこれを投稿しました:それは一見なじみのないS、それは確かにこの課題ではありません...
ケビンCruijssen

ちょっとしたことが私のリンクを壊しました...とにかく、ここにゴルフがあります:v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
オリビエグレゴワール

1
あなたの正規表現はに短縮でき(.).*\\1(.).*\\2、11バイト節約できると思います。
リックヒッチコック

1
119バイト:v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
ネヴァイ


5

ゼリー12 11バイト

ØDẊ⁽0yṃ,U$X

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


説明


ØDẊ⁽0yṃ,U$X    Niladic link, generate a random string.
ØD             List of digits, ['0','1','2',...,'9'].
  Ẋ            Random shuffle.
   ⁽0y         Number 13122.
      ṃ        Base decompression. (*)
       ,U$     Pair with its upend (reverse).
          X    Choose one (it or its reversed) randomly.

(*)の正しい引数は、ランダムにシャッフルされた10個の要素を持つリスト['0','1','2',...,'9']です。そのため、数値13122は全単射10に変換され([1,3,1,2,2])、リストにインデックスが付けられます(リストがの場合l、アトムの戻り値は[l[1],l[3],l[1],l[2],l[2]]になり、Jellyは1ベースのインデックス付けを使用します)


(05AB1Eの答えと同じ考えで、独自に思いついた)
-user202729

... 05AB1Eはゼリーを結ぶことができるため6つのアップ投票を得ますが、ゼリーは05AB1Eに勝つことができないため2つのアップ投票しか得られませんか?
user202729

2
私はあなたの答えを支持しました。->スピーチ100 <---
L_Church

4

JavaScript(ES6)、79バイト

f=([,,d,a,b,c]=[...Math.random()+f])=>a-b&&a-c&&b-c?d&1?a+a+b+c+b:b+c+b+a+a:f()

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

どうやって?

Math.random()[0..1)にランダムなフロートを与えます。+f強制的に文字列に強制するために使用します。先行ゼロと小数点を無視し[,,(最初の2文字の割り当てを何にも分割しない)、最初の4つの10進数をdab、およびcに収集します

場合は、BCは、 3つの異なる整数であり、我々は、いずれかで最終的な出力構築AABCBまたはBCBAA(のパリティ使ってフォーマットをDを決定します)。そうでない場合は、それらが見つかるまで再試行します。

Math.random()小数点以下の桁数が十分にない値を返すという非常にありそうもないイベントでは、少なくともcが数字以外の文字に設定され、テストが失敗し、再帰呼び出しが発生します。場合は、BCは有効な整数であり、そしてDは、この1つはテストする必要はありませんので、有効な整数であることが保証されるだけでなく。


どちらも&&可能です&。また、どのように機能し[,,a,b,c,d]ますか?[,,以前のような入力を見たことがありません。
ケビンクルーイッセン

1
@KevinCruijssenたとえば、ビット単位のANDは、のa=4, b=2, c=1ために失敗します4-2&4-1&2-1 == 2&3&1 == 0。変数の割り当てに関する簡単な説明を追加しました。
アーナウルド

ああ、もちろん。TIOで試してみた&&ところ&、正しい出力が得られたため、可能だと想定しました。他の方法で有効な出力を除外する&代わりに気づかなかった&&。そして、これまでに見たことのない、破壊の割り当てに関する説明を追加してくれてありがとう。
ケビンクルーッセン



2

汚い、33バイト

--numeric-outputフラグを使用して読み取り可能にします。それ以外の場合は、数字に対応するコードポイントを持つ制御文字の文字列を出力します。

10⭧[1w#%D⅋№3⤱≠1ẅ&]1wẂ⭿⭣1u∅#1∧◌ŪW‼

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

説明:

10⭧              put 10 on the right stack
[1w#%D⅋№3⤱≠1ẅ&] loop until there are 3 distinct positive numbers below 10 in the top stack
1wẂ              clean-up the right and top stacks
⭿               copy the top and bottom of the top stack to each-other
⭣                swap the first two elements of the top stack
1u               rotate the top stack by 1
∅#1∧◌ŪW          reverse the top stack half of the time
‼                print the top stack

2

、34バイト

≔‽χθ≔‽Φχ⁻ιθη↑I⟦θθη‽Φχ×⁻ιθ⁻ιηη⟧¿‽²‖

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

  χ                                 Predefined variable 10
 ‽                                  Random element from implicit range
≔  θ                                Assign to variable `q`
       χ                            Predefined variable 10
      Φ                             Filter on implicit range
         ι                          Current value
          θ                         Variable `q`
        ⁻                           Subtract
     ‽                              Random element
    ≔      η                        Assign to variable `h`
                    χ               Predefined variable 10
                   Φ                Filter on implicit range
                       ι  ι         Current value
                        θ           Variable `q`
                           η        Variable `h`
                      ⁻  ⁻          Subtract
                     ×              Multiply
                  ‽                 Random element
               θθ                   Variable `q`
                 η          η       Variable `h`
              ⟦              ⟧      Wrap 5 values into array
             I                      Cast array elements to string
            ↑                       Make array print horizontally
                                ²   Literal 2
                               ‽    Random element from implicit range
                              ¿     If
                                 ‖  Reflect

2

網膜、40バイト


10*
Y`w`d
V?`
Lv$7`.(.)
$1$<'$'
O?`...?

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

先頭にゼロを付けて文字列を印刷できます。

説明


10*

文字列を10個の下線に初期化します。

Y`w`d

単語の文字を数字に周期的に音訳します。これは少し変です。wそしてd、それぞれ、以下の文字列のために不足しています:

w: _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
d: 0123456789

周期的な音訳は、最初に、両方の文字列がLCMの長さまで繰り返されることを意味します。

_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_012345...
0123456789012345678901234567890123456789012345678901234567890123456789...

文字列の長さ53と10は互いに素であるため、の各コピーは_異なる数字とペアになります。そして今、巡回音訳が置き換えられます、私のコピー番目_その展開されたリストに目ペアリングを。したがって、次の文字列になります。

0369258147

そのすべてがリテラル文字列0369258147で1バイトを保存するので、そうだと思いますか?:D

とにかく、10桁すべての文字列ができました。

V?`

これにより、数字がシャッフルされます。したがって、最初の3桁は、3つの異なる数字の一様にランダムな選択になります。

Lv$7`.(.)
$1$<'$'

文字列を照合し、...ABCそれをに変換しBABCCます。しかし、これを行う方法はややクレイジーで、より簡単なアプローチと比較して1バイトしか節約しません。最初に重複するすべての(v)ペアの文字を照合し、2番目の文字()をキャプチャし.(.)ます。次に、にある8番目の一致(7、ゼロベース)のみを保持AB...ABCます。次に、($)を次のように置き換えます:B$1)、ABC$<'これは、マッチの左側のマッチ区切り文字の接尾辞です)、C$'これは、マッチ自体の接尾辞です)。

O?`...?

最後に、3文字または2文字のいずれかを照合し、照合をシャッフルして、いずれかBABCCまたはCCBABランダムに行います。


2

R、78バイト

z=sample(0:9,3)[c(2,1:3,3)];cat(paste(`if`(runif(1)>.5,z,rev(z)),collapse=''))

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

sampleから3つのランダムな値を選択します0:9。これらは次のようにベクトルに配置されますa b a c c。これで、このベクトルを50/50で反転させ、連結して印刷することができます。


非常に素晴らしい!62バイト。あなたは少し練習から外れているように見えます;)
ジュゼッペ

を使用することを検討しましたrtが、何らかの理由でもっと長いと思いました
。...-JAD

そして、(no-opは良い発見です:)
JAD

@Giuseppeあなたのasnwerはさらに55バイトまでゴルフできます... TIO
JayCe

2

PHP、73 72 66バイト

<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));

編集: @Davidの提案のおかげで66バイト。

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



@David残念ながら、あなたのソリューションはルール5に違反しています。それはのようなものかもしれrand(0,3).rand(4,6).rand(7,9)ませんが、やはり「一様にランダム」ではありません。ところで 私はに詳しくなかったrand()%2ので、あなたのコメントは、とにかく私のソリューションをわずかに改善するのに役立ちました。
retrowaver

1
ああ、はい、あなたは正しいです。私はそのルールを見ませんでした。66バイトで動作するようになりました<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));ここでarray_randは、2番目のパラメーターが一意の結果のみを返すことをテストできます(10000回の繰り返しでテスト済み)。
ダビッド

@Davidありがとう、私の投稿を更新しました!
retrowaver

1

147、146125バイト

func[][b: copy[]d:[1 1 2 3 2]if 1 = random 2[d: reverse d]while[4 > length? b][alter b(random 10)- 1]foreach a d[prin b/(a)]]

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

ゴルフをしていない:

f: func[] [                       function with no arguments
    b: copy []                    an empty list
    d: [1 1 2 3 2]                preset digits at positons
    if 1 = random 2 [             generate 1 or 2 
        d: reverse d]             based on this choose to reverse the positions list
    while [4 > length? b] [       while we haven't chosen 3 different digits
        alter b (random 10) - 1   pick a random digit, if it's not in the list already
                                  append it to the list, otherwise remove it
    ]
    foreach a d [                 for each position
       prin b/(a)]                print the corresponding digit 
]



1

Python 3 + numpy、69バイト

from pylab import*
r=choice
i=r(2)
print(r(10,3,0)[[1-i,0,1,2,-1-i]])

説明

from pylab import*     
r=choice               # `choice` takes a range, number of samples, and wether repetition is allowed
i=r(2)                 # Single value in [0,1] to specify if repeated digits come on right or left
print(r(10,3,0)[[1-i,0,1,2,-1-i]])    # Construct output using index list and 3 random integers


0

J、35バイト

[:u:48+[:|.^:(?&2:)2 2 1 0 1{3?10"_

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

もっとゴルフができると確信しています。

説明:

  3?10             - generates 3 different digits
7 0 3

  2 2 1 0 1{       - constructs a list using digits positions 0, 1 and 2

  2 2 1 0 1{3?10   
3 3 0 7 0

  |.^:(?&2:)       - generates 0 or 1 and if 1, reverses the list 

  |.^:(?&2:)2 2 1 0 1{3?10
0 7 0 3 3

   u:48+              - converts to char by adding 48 to each digit
   u:48+|.^:(?&2:)2 2 1 0 1{3?10
07033
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.