Perusahaan lotere ingin menghasilkan jumlah tiket lotre acak dengan panjang 10 karakter.
Tulis kode dalam bahasa apa pun untuk membuat angka di mana setiap digit hanya datang satu kali misalnya 9354716208
dalam angka ini semua bilangan bulat dari 0 hingga 9 hanya datang sekali. Nomor ini harus berupa angka acak.
- Nomor yang dihasilkan harus ditampilkan di layar.
- Itu harus dapat menghasilkan semua permutasi dari semua karakter yang diijinkan.
- Kode ini harus sekecil mungkin (dalam byte).
Jawaban:
J (4 byte)
Tidak bisa menolak.
Dalam J, jika
F
diad,F~ x
sama denganx F x
.sumber
[0..10)
, sehingga pada dasarnya berarti permutasi acak '0123456789'.J, 5 karakter dan APL, 8 karakter
J
J memiliki operator kesepakatan bawaan (
?
). Dengan demikian, kita dapat mengambil 10 dari 10 (10?10
).APL
APL memiliki operator yang sama yang sayangnya dimulai dengan satu alih-alih nol. Karena itu kami mengurangi satu dari setiap angka (
1-⍨X
berartiX-1
karena operator bolak-balik).sumber
10#.
⎕IO←0
sehingga Anda tidak perlu mengurangi satu. Juga, untuk J dan APL, Anda dapat menggunakan komuter untuk menyimpan byte dengan?~10
dan?⍨10
karena aplikasi monadik dari fungsi turunan menggunakan argumen kanannya juga sebagai argumen kiri. Namun demikian, ini membuat kode J identik dengan Marinus .Python 2.7 (
646357)Tidak ada kesempatan di sini dibandingkan dengan operator bahasa yang berat dan karena kurangnya default dimuat secara acak :) Ini adalah yang terpendek yang bisa saya buat;
Ini menciptakan rentang dan sampel 10 angka dari itu tanpa penggantian.
(Terima kasih kepada @xfix untuk perbaikan format impor yang lebih pendek dan @blkknght untuk menunjukkan rentang pengambilan sampel yang agak rumit).
Python 2.7 (40)
Jika Anda menjalankannya dari prompt interaktif dan dapat membaca koma yang dipisahkan, Anda dapat mencukurnya menjadi 40, tetapi rasanya agak seperti melanggar semangat aturan;
sumber
from random import*
untuk menyimpan satu karakter. Ini terlihat seperti solusi Perl 6 saya, tetapi lebih banyak bertele-tele, tetapi sangat bagus untuk melihat bahwa sesuatu seperti ini dapat bekerja dengan Python, bahkan jika lebih bertele-tele."0123456789"
daripada menggunakanrange
dan memetakannyastr
.PHP, 29 karakter
<?=str_shuffle('0123456789');
Dengan PHP, tag penutup tidak diperlukan. Tetapi jika itu melanggar aturan, maka Anda dapat mengganti; dengan?> untuk 1 kenaikan bersih.
sumber
Ruby, 18
Jalankan ini di
irb
:Jika Anda ingin ini menjadi program yang berdiri sendiri, dengan output ke
stdout
(aturan tampaknya tidak mengharuskan ini), kemudian tambahkan 4 karakter ini di awal:sumber
(0..9).to_a
menjadi[*0..9]
.[*0..9].shuffle
?PHP - 37 Karakter
Saya punya solusi 18-karakter yang secara teori seharusnya berfungsi tetapi PHP aneh.
Atau, jika Anda menginginkan jawaban xkcd:
EDIT: Terima kasih xfix, sekarang 5 karakter lebih pendek dan lengkap. EDIT LAGI: Contoh langsung .
sumber
echo
tidak perlu parens, dan jikaecho
pernyataan pertama dalam program, Anda dapat menggantinya<?php echo
dengan<?=
. Juga,join
adalah alias untukimplode
.<?=
dan?>
. Itu kode PHP yang valid tanpa itu.echo
panjangnya sama dengan<?=
dan?>
digabungkan, dan tanpa itu, tidak akan berfungsi di Codepad. Terimakasih Meskipun. : PPerl 6 (
1816 karakter)Ini menghasilkan array yang berisi semua elemen acak (
pick *
) dari0
ke9
dan menampilkan hasilnya (print
).Output sampel:
sumber
pick
.[~]
(yang diuraikan sebagai listop, menurut tata bahasa Perl 6) memerlukan spasi putih (atau paren) setelahnya jika berisi argumen. Kalau tidak, kompiler Perl 6 mengeluh tentang "dua istilah berturut-turut". Itu tidak diperlukan di versi lama dari Perl 6, tapi ini adalah masa lalu. Perl 6 masih dikerjakan.print
sebagai gantisay [~]
dan simpan 2 karakter :)GolfScript, 12 karakter
Cukup membuat daftar digit (
10,
) dan mengurutkannya{...}$
berdasarkan beberapa kunci acak - yang menghasilkan urutan acak digit.Contoh (coba online ):
sumber
9rand
dengan99rand
akan (kebanyakan) memperbaikinya; praktis9.?rand
akan sempurna .R (23 karakter)
Output sampel:
sumber
TI-BASIC, 5 byte
sumber
randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans
.Oktaf (14)
randperm
sayangnya membuat pilihan dari 1..n, jadi harus mengurangi 1 di akhir untuk mendapatkan 0-9.sumber
Di server sql
Lihat Demo
ATAU sesuatu yang serupa (milik @manatwork) menggunakan rekursi dan xml.
sumber
select i+0from(select 0i union select 1union select 2union select 3union select 4union select 5union select 6union select 7union select 8union select 9)f order by newid()for xml path('')
. (BTW, trik hebat itunewid()
.)with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('')
.(VALUES (1),(2),...)
Javascript (
797868 karakter)Daripada membuat array dengan angka 0-9 dan menyortirnya, saya memutuskan untuk menghasilkan angka acak. Ketika muncul dengan nomor yang belum ada dalam array kemudian menambahkannya. Ini mengulangi sepuluh kali dan kemudian memperingatkan output.
for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
sumber
||
evaluasi hubung singkat, bukanif
seperti:for(a="";!a[9];){b=Math.floor(Math.random()*10);~a.indexOf(b)||(a+=b)}alert(a)
for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
Mathematica, 27
sumber
Shell / Coreutils, 23
sumber
shuf -i0-9|tr -d \\n
shuf -zi0-9
JavaScript, 82 karakter
EDIT: Berkat Rob W , panjang kode dikurangi hingga 90 karakter.
EDIT: Berkat George Reith , panjang kode dikurangi menjadi 82 karakter (menggunakan untuk loop).
Cara yang cukup mudah: pilih elemen acak
[0,1,2,3,4,5,6,7,8,9]
array dan tambahkan ke output, lalu kurangi array dan putar ulang.Versi lama (106 karakter):
Versi yang dapat dibaca:
Versi yang lebih baik (90 karakter):
Versi terakhir (82 karakter):
JSFiddle: http://jsfiddle.net/gthacoder/qH3t9/ .
sumber
a='0123456789'.split(t=''),l=10;while(l--)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t)
. Penghemat besar:Math.random(x)
===0|x
. Ganti kurung kurawal dan titik koma dengan koma. Langsung menggunakan hasil penugasan sebagai nilai, alih-alih menggunakan variabel perantara. Akhirnya, inisialisasi array awal menggunakan.split(r='')
. Ini lebih pendek daripada membuat array menggunakan literal array dan menetapkan nilai string dalam ekspresi terpisah.Math.floor(x) === 0|x
.l=11
dan mengalihkan kondisi loop sementara Anda kewhile(--l)
a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)
- Kode Anda sangat cocok dengan argumen inisialisasi loop, kondisi dan ekspresi. Ther
variabel berlebihan.C #, 145 byte
Tidak disatukan
Golf
sumber
Enumerable.Range(0,10)
, dan Anda tidak perlu kurung keriting diforeach
loop.JavaScript (80 karakter)
JS-Fiddle: http://jsfiddle.net/IQAndreas/3rmza/
sumber
alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
return
dan.5
K / Kona (6)
Seperti halnya J,
?
adalah operator kesepakatan; yang-
kekuatan nilai-nilai untuk tidak mengulangi.sumber
Mathematica 40
Angka tersebut dibuat sebagai string sehingga memungkinkan nol untuk ditampilkan sebagai karakter pertama, saat diperlukan.
Contoh keluaran
Penjelasan
"0"~CharacterRange~"9"
adalah notasi infix untuk `CharacterRange [" 0 "," 9 "]". Keduanya mengembalikan daftar, {"0", "1", "2", "3", "4", "5", " 6 "," 7 "," 8 "," 9 "}.RandomSample[list]
secara default mengembalikan permutasi daftar. (Ini juga dapat digunakan untuk jenis pengambilan sampel lainnya, ketika parameter dimasukkan. MisalnyaRandomSample[list, 4]
akan mengembalikan sampel acak 4 karakter, tanpa mengulangi.sumber
Scala, 37
sumber
Keempat, 72
Mungkin masih ada ruang untuk bermain golf, tetapi Forth membuat ini sulit. Kupikir.
sumber
Prolog, 177/302 karakter
Saya seorang pemula di Prolog, jadi mungkin ini bukan kode yang paling kental.
Pengembalian:
Jika Anda ingin mengembalikan integer:
Pengembalian:
Menggunakan sebaliknya:
Memberikan angka dalam urutan yang berlawanan:
Tidak seperti beberapa kode lain yang diposting, ini mengembalikan semua kemungkinan (tanpa pengulangan).
sumber
q / kdb [6 karakter]
akan menghasilkan 10 angka acak unik.
sumber
√ å ı ¥ ® Ï Ø ¿ , 4 byte
sumber
Clojure, 42
sumber
Javascript, 83 karakter
Saat berjalan hingga array memiliki 10 elemen.
Menghasilkan angka acak dari 0 - 9 lalu memeriksa apakah array! Menyertakan nomor ini dan menambahkannya ke array.
sumber
Ini tidak jauh lebih kecil dari jawaban JMK, tetapi inilah solusi C # yang sedikit lebih kecil (135):
Dipadatkan (134):
Versi alternatif (135):
Kompak:
Panjangnya sama, tetapi itu benar-benar hanya tergantung pada apakah Anda ingin menggunakan fungsi ForEach Linq atau fungsi String's Join. Saya dapat menghapus 10 karakter panjangnya dengan mengeja kisaran "0123456789" dalam sebuah string alih-alih menggunakan Enumerable.Range (0, 10).
sumber
LOGO , 64 karakter
pilih pengembalian item acak dari daftar yang disediakan. butmember mengembalikan daftar dengan semua kemunculan item yang ditentukan dihapus. Catatan: Tidak semua
butmember
perintah dukungan implementasi Logo .sumber
Raket
4543sumber