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:
Panjangnya adalah 5 digit
Ada dua pasangan digit berulang yang terpisah
Satu set angka berulang adalah di awal atau akhir dan digit di sebelah satu sama lain
Angka ganjil keluar dikelilingi oleh pasangan digit lainnya
Pasangan dua digit dan angka lainnya semuanya harus unik
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 kode-golf , jadi jawaban tersingkat dalam byte menang!
random
tidak berarti secara seragam begituJawaban:
05AB1E , 11 byte
Cobalah online!
Penjelasan
sumber
CJam (16 byte)
Demo online
Catatan: Saya berasumsi bahwa dengan OP "unik" benar-benar berarti "berbeda".
Juga untuk 16 byte:
Pembedahan
Varian lain menghasilkan penggunaan
[1 0 1 2 2]
dan kemudian memilih hasil atau kebalikannya.sumber
Perl 5 ,
816356 bytePotong 7 byte dengan inspirasi dari @DomHastings
Membangun nomor dari pola yang sesuai.
Cobalah online!
Perl 5 , 89 byte
Pilihan acak 5 angka angka sampai menemukan yang memenuhi kriteria.
Cobalah online!
sumber
time%2
cukup acak, karena itu, dalam arti tertentu, di bawah kendali pengguna.Python 2 , 80 byte
Cobalah online!
Menghasilkan daftar digit.
Python 2 , 83 byte
Cobalah online!
Output adalah angka.
sumber
APL (Dyalog Unicode) ,
22 21 20 1817 byteCobalah online!
Jika dapat diterima untuk menampilkan angka selalu dalam format yang sama, ini dapat disingkat menjadi 12 byte, baik
1⌽1↓,∘⌽⍨3?10
atau3⌽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?
sumber
Input
digunakan untuk memanggil fungsig
. Juga,g←
tidak dihitung dalam jumlah byte karena itu tidak perlu, itu hanya digunakan untuk memanggil fungsi.g
disebut di bagian input hanyalah kekhasan bagaimana APL diatur untuk berjalan di TIO(4∨?2)
menghemat satu byte lebih1 4[?2]
f
dan menggunakan kereta. Saya akan meninggalkan itu untuk Anda :)Java 8,
145136125119 byte-9 byte terima kasih kepada @ OlivierGrégoire.
-11 byte terima kasih kepada @RickHitchcock .
-6 byte terima kasih kepada @Nevay .
Penjelasan:
Cobalah online.
sumber
v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
(.).*\\1(.).*\\2
, menghemat 11 byte.v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Jelly , 23 byte
Cobalah online!
sumber
Jelly ,
1211 byteCobalah online!
Penjelasan
(*) Argumen yang tepat
ṃ
adalah daftar['0','1','2',...,'9']
, acak, memiliki 10 elemen. Jadi nomor13122
tersebut akan dikonversi menjadi basis bijektif 10 ([1,3,1,2,2]
) dan indeks ke dalam daftar (jadi jika daftar adalahl
, nilai pengembalian atom adalah[l[1],l[3],l[1],l[2],l[2]]
, di mana Jelly menggunakan pengindeksan berbasis 1)sumber
JavaScript (ES6), 79 byte
Cobalah online!
Bagaimana?
Math.random()
memberikan float acak dalam [0..1) . Kami menggunakan+f
untuk 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.sumber
&&
bisa&
. Juga, bagaimana cara[,,a,b,c,d]
kerjanya? Saya belum pernah melihat input seperti[,,
sebelumnya.a=4, b=2, c=1
karena4-2&4-1&2-1 == 2&3&1 == 0
. Saya telah menambahkan penjelasan singkat tentang penugasan variabel.&&
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.Perl 6 , 42 byte
Cobalah online!
sumber
Kotor , 33 byte
Menggunakan
--numeric-output
bendera sehingga dapat dibaca, jika tidak akan menghasilkan serangkaian karakter kontrol dengan titik kode yang sesuai dengan digit.Cobalah online!
Dijelaskan:
sumber
Arang , 34 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
sumber
Retina , 40 byte
Cobalah online!
Dapat mencetak string dengan nol di depan.
Penjelasan
Menginisialisasi string menjadi 10 garis bawah.
Transliterasi karakter kata secara siklis ke digit. Ini agak aneh. The
w
dand
pendek untuk string berikut, masing-masing:Transliterasi siklik berarti bahwa pertama, kedua string diulangi dengan panjang LCM mereka:
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:Semua itu untuk menghemat satu byte lebih dari string literal
0369258147
, jadi ya saya kira? : DNgomong-ngomong, kami punya string semua 10 digit sekarang.
Ini mengocok digit. Jadi tiga digit pertama akan menjadi pilihan acak yang seragam dari tiga digit yang berbeda.
Kami mencocokkan string
...ABC
dan mengubahnya menjadiBABCC
. 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 adaAB
di...ABC
. Kemudian kita ganti ($
) dengan:B
($1
),ABC
($<'
yang merupakan akhiran dari sisa pemisah pertandingan),C
($'
yang merupakan akhiran dari pertandingan itu sendiri).Akhirnya, kami mencocokkan 3 atau 2 karakter dan mengocok pertandingan, memberi kami baik
BABCC
atauCCBAB
secara acak.sumber
R , 78 byte
Cobalah online!
sample
mengambil 3 nilai acak dari0: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.sumber
rt
, tetapi untuk beberapa alasan saya pikir itu lebih lama ....(
sebagai no-op adalah menemukan yang baik :)PHP,
737266 byteSunting: 66 bytes berkat saran @David.
Cobalah online!
sumber
<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
rand(0,3).rand(4,6).rand(7,9)
, tapi sekali lagi tidak "acak seragam". Btw. Saya tidak terbiasa dengan iturand()%2
, jadi komentar Anda membantu saya sedikit memperbaiki solusi saya.<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));
. Anda dapat menguji bahwaarray_rand
parameter kedua hanya mengembalikan hasil unik di sini (menguji lebih dari 10.000 iterasi).Merah ,
147, 146125 byteCobalah online!
Tidak Disatukan:
sumber
Bahasa Wolfram (Mathematica) , 59 byte
Cobalah online!
sumber
Ruby ,
6059 byteCobalah online!
Ini mengembalikan daftar digit.
sumber
Python 3 + numpy, 69 byte
Penjelasan
sumber
C (gcc) ,
126119 byte-6 byte dari @ceilingcat
Cobalah online!
sumber
J , 35 byte
Cobalah online!
Saya yakin itu bisa bermain golf lebih jauh.
Penjelasan:
sumber