MUDAH untuk menghafal angka

41

Angka yang mudah diingat namun secara teoritis tidak mudah dibuat

Tantangan Anda adalah membuat program / fungsi dalam bahasa apa pun yang menghasilkan angka acak seragam yang sesuai dengan kriteria ini:

  1. Panjangnya adalah 5 digit

  2. Ada dua pasangan digit berulang yang terpisah

  3. Satu set angka berulang adalah di awal atau akhir dan digit di sebelah satu sama lain

  4. Angka ganjil keluar dikelilingi oleh pasangan digit lainnya

  5. Pasangan dua digit dan angka lainnya semuanya harus unik

  6. Program Anda dapat mendukung angka dengan angka nol di depan atau tidak, sesuai kebijakan Anda. Jika nol terdepan didukung, mereka harus dimasukkan dalam output: 06088, bukan 6088. Jika nol terkemuka tidak didukung, maka angka-angka seperti 06088 tidak boleh dihasilkan sama sekali.

Uji Kasus

Output yang Diterima:

55373
55494
67611
61633
09033
99757
95944
22808
65622
22161

Output tidak diterima:

55555
77787
85855
12345
99233
12131
abcde
5033

Kasus uji yang lebih dapat diterima dapat ditemukan di tautan pastebin ini .

Ini dibuat dengan program python ini:

impor acak
untuk saya dalam kisaran (100):

    if random.randint (0,100)> = 50: #Pasangan menyentuh pada awalnya jika benar
        temp = [] # array pekerjaan
        temp.append (random.randint (0,9)) # tambahkan digit acak
        temp.append (temp [0]) # tambahkan digit yang sama lagi

        x = random.randint (0,9)
        sementara x == temp [0]:
            x = random.randint (0,9)
        temp.append (x) #append digit unik lainnya

        y = random.randint (0,9)
        sementara y == temp [0] atau y == temp [2]:
            y = random.randint (0,9)
        temp.append (y) # tambahkan digit unik lain, dan digit unik sebelumnya
        temp.append (x)

    lain: #Pas menyentuh pasangan di akhir
        temp = [] # array pekerjaan  
        temp.append (random.randint (0,9)) # tambahkan digit acak

        #Sementara tidak unik, coba lagi
        x = random.randint (0,9)
        sementara x == temp [0]:
            x = random.randint (0,9)
        temp.append (x) #append digit unik lainnya


        temp.append (temp [0]) # tambahkan digit ke-0 yang sama lagi


        y = random.randint (0,9)
        sementara y == temp [0] atau y == temp [1]:
            y = random.randint (0,9)
        temp.append (y) # tambahkan digit unik lain dua kali
        temp.append (y)

    tempstr = ""
    untuk saya dalam temp:
        tempstr + = str (i)
    cetak tempstr

Ini , jadi jawaban tersingkat dalam byte menang!

drham
sumber
5
Saya menyarankan "Output yang mungkin (probabilitas> 0)" dan "Output yang tidak mungkin (probabilitas = 0)" daripada "Truthy" dan "Falsy" - ini tampaknya lebih sesuai dengan apa yang saya pikir Anda tanyakan (dan dengan Python ).
Khuldraeseth na'Barya
9
Apakah kita harus mencetak output seperti 09033 dengan nol di depan?
xnor
3
Jika probabilitasnya seragam, dapatkah Anda menentukannya dalam pertanyaan. Secara default, randomtidak berarti secara seragam begitu
Jo King
3
mungkin menambahkan 99233, untuk conveniewnce untuk memahami
l4m2
3
Selamat datang di PPCG! Tantangan pertama yang bagus.
Jonathan Allan

Jawaban:

21

05AB1E , 11 byte

žh.r3£ûÁÂ)Ω

Cobalah online!

Penjelasan

žh            # push "0123456789"
  .r          # random shuffle
    3£        # take the first 3
              # EX: 152
      û       # palendromize
              # EX: 15251
       Á      # rotate right
              # EX: 11525
        Â)    # pair with its reverse
              # EX: [11525, 52511]
          Ω   # pick one at random
Emigna
sumber
Saya ingin tahu apakah Emigna ha ... melihat jawaban teratas +1.
Magic Gurita Guci
9

CJam (16 byte)

YmrG*98+ZbA,mrf=

Demo online

Catatan: Saya berasumsi bahwa dengan OP "unik" benar-benar berarti "berbeda".

Juga untuk 16 byte:

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

Pembedahan

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"

Varian lain menghasilkan penggunaan [1 0 1 2 2]dan kemudian memilih hasil atau kebalikannya.

Peter Taylor
sumber
9

Perl 5 , 81 63 56 byte

Potong 7 byte dengan inspirasi dari @DomHastings

Membangun nomor dari pola yang sesuai.

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

Cobalah online!


Perl 5 , 89 byte

Pilihan acak 5 angka angka sampai menemukan yang memenuhi kriteria.

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

Cobalah online!

Xcali
sumber
Trik yang bagus menggunakan kunci hash untuk keacakan! Saya pikir ini setara dengan -8, walaupun saya mungkin melewatkan case edge ... Cobalah online!
Dom Hastings
1
Pengacakan hash. Cemerlang! lebih pendek
Ton Hospel
Pertanyaannya adalah apakah time%2cukup acak, karena itu, dalam arti tertentu, di bawah kendali pengguna.
Xcali
@Xcali Tampaknya konsensus bahwa itu baik-baik saja selama Anda hanya menggunakannya sekali jadi saya pikir Anda harus baik.
FryAmTheEggman
8

Python 2 , 80 byte

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

Cobalah online!

Menghasilkan daftar digit.

Python 2 , 83 byte

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

Cobalah online!

Output adalah angka.

ovs
sumber
Jika keacakan yang tidak seragam diizinkan secara default (pertanyaan tidak menentukan), Anda dapat menyimpan byte dengan mengambil sampel pembalikannya: Coba online! Sunting: Sudahlah, saya melihat keseragaman telah diedit ke dalam spesifikasi. Saya bertanya-tanya apakah pendekatan ini masih bisa diselamatkan.
xnor
7

APL (Dyalog Unicode) , 22 21 20 18 17 byte

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

Cobalah online!

Jika dapat diterima untuk menampilkan angka selalu dalam format yang sama, ini dapat disingkat menjadi 12 byte, baik 1⌽1↓,∘⌽⍨3?10atau 3⌽1↓,∘⌽⍨3?10.

Menyimpan byte dengan menghapus yang tidak perlu .

Menyimpan satu byte berkat H.PWiz, dan kemudian 2 byte lagi karena tip mereka.

Disimpan satu byte berkat ngn.

Fungsi ini mengasumsikan ⎕IO←0( I ndex O rigin).


Bagaimana?

(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.
J. Sallé
sumber
Masukan tidak dapat diberikan
drham
@drham tidak ada input ke fungsi. Dalam hal ini, bidang TIO Inputdigunakan untuk memanggil fungsi g. Juga, g←tidak dihitung dalam jumlah byte karena itu tidak perlu, itu hanya digunakan untuk memanggil fungsi.
J. Sallé
Fakta yang gdisebut di bagian input hanyalah kekhasan bagaimana APL diatur untuk berjalan di TIO
H.PWiz
(4∨?2)menghemat satu byte lebih1 4[?2]
H.PWiz
1
Anda juga dapat menyimpan byte dengan tidak menetapkan f dan menggunakan kereta. Saya akan meninggalkan itu untuk Anda :)
H.PWiz
6

Java 8, 145 136 125 119 byte

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

-9 byte terima kasih kepada @ OlivierGrégoire.
-11 byte terima kasih kepada @RickHitchcock .
-6 byte terima kasih kepada @Nevay .

Penjelasan:

Cobalah online.

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
Kevin Cruijssen
sumber
136 bytes
Olivier Grégoire
@ OlivierGrégoire Apakah Anda memposting ini pada tantangan yang benar? ..: S Itu memang terlihat familier, tapi jelas bukan tantangan ini ..
Kevin Cruijssen
Sesuatu yang sedikit merusak tautan saya ... Bagaimanapun, ini golfnya:v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
Olivier Grégoire
1
Saya pikir regex Anda dapat disingkat menjadi (.).*\\1(.).*\\2, menghemat 11 byte.
Rick Hitchcock
1
119 byte:v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Nevay
5

Jelly , 23 byte

⁵Ḷṗ3⁼Q$ÐfXµḢ;`;ŒBW;U$µX

Cobalah online!

HyperNeutrino
sumber
Bagus, saya akan mendukung, tetapi saya tidak bisa
drham 9'18
7
@drham :) terima kasih. Anda seharusnya bisa segera, setelah sebagian besar anggota aktif membangunkan pertanyaan Anda, mungkin akan mendapatkan banyak peningkatan. tantangan pertama yang baik dan selamat datang di PPCG!
HyperNeutrino
5

Jelly , 12 11 byte

ØDẊ⁽0yṃ,U$X

Cobalah online!


Penjelasan


Ø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.

(*) Argumen yang tepat adalah daftar ['0','1','2',...,'9'], acak, memiliki 10 elemen. Jadi nomor 13122tersebut akan dikonversi menjadi basis bijektif 10 ( [1,3,1,2,2]) dan indeks ke dalam daftar (jadi jika daftar adalah l, nilai pengembalian atom adalah [l[1],l[3],l[1],l[2],l[2]], di mana Jelly menggunakan pengindeksan berbasis 1)

pengguna202729
sumber
(ide yang sama dengan jawaban 05AB1E, muncul dengan mandiri)
user202729
... 05AB1E mendapatkan 6 upvotes karena dapat mengikat Jelly, Jelly hanya mendapatkan 2 upvotes karena tidak dapat memenangkan 05AB1E?
user202729
2
saya membatalkan jawaban Anda. -> SPEECH 100 <---
L_Church
4

JavaScript (ES6), 79 byte

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

Cobalah online!

Bagaimana?

Math.random()memberikan float acak dalam [0..1) . Kami menggunakan +funtuk memaksa paksaan ke string. Kami mengabaikan nol awal dan titik desimal dengan melakukan [,,( menghancurkan penugasan dua karakter pertama menjadi nol) dan mengumpulkan 4 digit desimal pertama menjadi d , a , b , dan c .

Jika a , b dan c adalah 3 bilangan bulat yang berbeda, kami membangun hasil akhir dalam format AABCB atau BCBAA (menggunakan paritas d untuk memutuskan). Kalau tidak, kami coba lagi sampai tiba.

Dalam hal yang sangat mustahil untuk Math.random()mengembalikan nilai tanpa tempat desimal yang cukup, setidaknya c akan ditetapkan ke karakter non-digit, memaksa tes gagal dan panggilan rekursif terjadi. Jika a , b dan c adalah bilangan bulat yang valid maka d dijamin juga bilangan bulat yang valid, jadi yang ini tidak perlu diuji.

Arnauld
sumber
Keduanya &&bisa &. Juga, bagaimana cara [,,a,b,c,d]kerjanya? Saya belum pernah melihat input seperti [,,sebelumnya.
Kevin Cruijssen
1
@KevinCruijssen Bitwise DAN akan gagal misalnya karena a=4, b=2, c=1karena 4-2&4-1&2-1 == 2&3&1 == 0. Saya telah menambahkan penjelasan singkat tentang penugasan variabel.
Arnauld
Ah tentu saja. Aku hanya mencoba &&untuk &di TIO dan itu memberi output yang benar, sehingga aku menduga itu mungkin. Tidak menyadari &bukannya &&akan menyaring output yang valid. Dan terima kasih atas penjelasan tambahan tentang penugasan penghancuran, tidak pernah melihatnya sebelumnya.
Kevin Cruijssen
Ini luar biasa +1
Luis felipe De jesus Munoz
4

Perl 6 , 42 byte

[~] (^10).pick(3)[0,|(<0 2 1>,<1 0 2>).pick,2]

Cobalah online!

Sean
sumber
2

Kotor , 33 byte

Menggunakan --numeric-outputbendera sehingga dapat dibaca, jika tidak akan menghasilkan serangkaian karakter kontrol dengan titik kode yang sesuai dengan digit.

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

Cobalah online!

Dijelaskan:

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
Suram
sumber
2

Arang , 34 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

  χ                                 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
Neil
sumber
2

Retina , 40 byte


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

Cobalah online!

Dapat mencetak string dengan nol di depan.

Penjelasan


10*

Menginisialisasi string menjadi 10 garis bawah.

Y`w`d

Transliterasi karakter kata secara siklis ke digit. Ini agak aneh. The wdan dpendek untuk string berikut, masing-masing:

w: _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
d: 0123456789

Transliterasi siklik berarti bahwa pertama, kedua string diulangi dengan panjang LCM mereka:

_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_012345...
0123456789012345678901234567890123456789012345678901234567890123456789...

Karena panjang string 53 dan 10 adalah koprime, setiap salinan _dipasangkan dengan digit yang berbeda. Dan sekarang transliterasi siklik akan menggantikan saya th menyalin dari _dengan i pasangan th dalam daftar diperluas. Jadi kita berakhir dengan string berikut:

0369258147

Semua itu untuk menghemat satu byte lebih dari string literal 0369258147, jadi ya saya kira? : D

Ngomong-ngomong, kami punya string semua 10 digit sekarang.

V?`

Ini mengocok digit. Jadi tiga digit pertama akan menjadi pilihan acak yang seragam dari tiga digit yang berbeda.

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

Kami mencocokkan string ...ABCdan mengubahnya menjadi BABCC. Cara kami melakukan ini agak gila meskipun dan sekali lagi hanya menghemat satu byte dibandingkan dengan pendekatan yang lebih mudah. Kami pertama-tama mencocokkan semua pasangan karakter yang tumpang tindih ( v), mengambil yang kedua ( .(.)). Kemudian kami hanya mempertahankan pertandingan ke-8 ( 7, berbasis nol) yang ada ABdi ...ABC. Kemudian kita ganti ( $) dengan: B( $1), ABC( $<'yang merupakan akhiran dari sisa pemisah pertandingan), C( $'yang merupakan akhiran dari pertandingan itu sendiri).

O?`...?

Akhirnya, kami mencocokkan 3 atau 2 karakter dan mengocok pertandingan, memberi kami baik BABCCatau CCBABsecara acak.

Martin Ender
sumber
2

R , 78 byte

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

Cobalah online!

samplemengambil 3 nilai acak dari 0:9, yang ditempatkan di vektor seperti: a b a c c. Sekarang kita memiliki peluang 50/50 untuk membalikkan vektor ini, lalu menggabungkan dan mencetak.

JAD
sumber
Sangat bagus! 62 byte ; Sepertinya Anda sedikit keluar dari latihan;)
Giuseppe
Saya melihat menggunakan rt, tetapi untuk beberapa alasan saya pikir itu lebih lama ....
JAD
Dan (sebagai no-op adalah menemukan yang baik :)
JAD
@ Giuseppe asnwer Anda dapat di-golf hingga 55 byte ... TIO
JayCe
2

PHP, 73 72 66 byte

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

Sunting: 66 bytes berkat saran @David.

Cobalah online!

retrowaver
sumber
@ David Sayangnya solusi Anda melanggar aturan 5. Bisa jadi seperti rand(0,3).rand(4,6).rand(7,9), tapi sekali lagi tidak "acak seragam". Btw. Saya tidak terbiasa dengan itu rand()%2, jadi komentar Anda membantu saya sedikit memperbaiki solusi saya.
retrowaver
1
ah, ya, kamu benar. Saya tidak melihat aturan itu. Aku punya satu yang bekerja sekarang, di 66 bytes: <?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));. Anda dapat menguji bahwa array_randparameter kedua hanya mengembalikan hasil unik di sini (menguji lebih dari 10.000 iterasi).
Davіd
@ David terima kasih, baru saja memperbarui posting saya!
retrowaver
1

Merah , 147, 146 125 byte

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

Cobalah online!

Tidak Disatukan:

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 
]
Galen Ivanov
sumber
1

Ruby , 60 59 byte

->{a,b,c=[*0..9].sample 3;[[a,a,b,c,b],[b,c,b,a,a]].sample}

Cobalah online!

Ini mengembalikan daftar digit.

Eric Duminil
sumber
1

Python 3 + numpy, 69 byte

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

Penjelasan

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
pengguna2699
sumber
1

C (gcc) , 126 119 byte

-6 byte dari @ceilingcat

#define R time(0)%10
b,n,m,k;f(){b=R^8;for(n=R;m==n|k==m|k==n;m=R,k=R);printf("%d%d%d%d%d",b?n:m,b?n:k,m,b?k:n,b?m:n);}

Cobalah online!

ay
sumber
0

J , 35 byte

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

Cobalah online!

Saya yakin itu bisa bermain golf lebih jauh.

Penjelasan:

  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
Galen Ivanov
sumber