Pembuat kode tiket acak


18

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 9354716208dalam 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).

3
Mengapa harus di Jawa atau PhP?
Fabinout

4
Secara umum, ada baiknya untuk mengizinkan bahasa apa pun, sesuai dengan deskripsi kode-golf .
Konrad Borowski

10
Bagaimana salah satu jawaban terpanjang dan paling tidak golf (jawaban SQL), bahkan tanpa hitungan char, berdiri sebagai jawaban yang diterima dalam kode-golf ketika orang-orang seperti @Howard memiliki 5 atau 8 jawaban karakter?
Darren Stone

1
Ya, @marinus memiliki solusi 4 byte (milik saya adalah 6 byte)
Timtech

4
-1 Pemilihan pemenang tidak tepat, mengingat ini adalah tantangan kode-golf.
DavidC

Jawaban:


41

J (4 byte)

Tidak bisa menolak.

?~10

Dalam J, jika Fdiad, F~ xsama dengan x F x.


3
+1 Saya pikir saya mungkin harus mencoba sesuatu yang sedikit lebih pendek daripada Python untuk mengalahkan ini.
Joachim Isaksson

Apakah ini memungkinkan untuk kata sandi yang dimulai dengan nol? Menurut aturan, program "harus dapat menghasilkan semua permutasi dari semua karakter yang diizinkan"
DavidC

@ Davidvidarraher: ya. Ini memilih 10 angka acak yang tidak berulang dari interval [0..10), sehingga pada dasarnya berarti permutasi acak '0123456789'.
marinus

1
Saya melihat. Saya mengangkat ini karena di sebagian besar bahasa, "angka", 0123456789, secara otomatis akan diedit ke bentuk 123456789. String, "0123456789", tetap tidak tersentuh. Jadi pertanyaan saya adalah ini: apakah output Anda berupa angka atau string?
DavidC

@ Davidvidarrarrer Ini adalah array.
desir

12

J, 5 karakter dan APL, 8 karakter

J

10?10

J memiliki operator kesepakatan bawaan ( ?). Dengan demikian, kita dapat mengambil 10 dari 10 ( 10?10).

APL

1-⍨10?10

APL memiliki operator yang sama yang sayangnya dimulai dengan satu alih-alih nol. Karena itu kami mengurangi satu dari setiap angka ( 1-⍨Xberarti X-1karena operator bolak-balik).


Oh, wow, bagus sekali.
Konrad Borowski

Jika OP akan meminta secara khusus untuk nomor bukan array, Anda harus mengubahnya ke nomor base10 juga, dengan10#.
desir

Anda dapat berasumsi demikian ⎕IO←0sehingga Anda tidak perlu mengurangi satu. Juga, untuk J dan APL, Anda dapat menggunakan komuter untuk menyimpan byte dengan ?~10dan ?⍨10karena aplikasi monadik dari fungsi turunan menggunakan argumen kanannya juga sebagai argumen kiri. Namun demikian, ini membuat kode J identik dengan Marinus .
Adám

9

Python 2.7 ( 64 63 57)

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;

from random import*
print''.join(sample("0123456789",10))

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;

from random import*
sample(range(10),10)

1
Anda dapat menggunakannya 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.
Konrad Borowski

@ Memperbaiki Ya, sayangnya modul-modul dengan Python agak bertele-tele untuk dibandingkan dengan :) Perbarui dengan perbaikan impor Anda, cukup baru untuk hal golf sehingga tidak sampai "par" pada idiom saya.
Joachim Isaksson

Anda dapat menyimpan lebih banyak karakter dengan mengambil sampel dari string "0123456789"daripada menggunakan rangedan memetakannya str.
Blckknght

@ Blckknght Terima kasih, diperbarui dengan saran Anda :)
Joachim Isaksson

8

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.


Anda mengalahkan saya untuk solusi ini.
Shaun Bebbers

8

Ruby, 18

Jalankan ini di irb:

[*0..9].shuffle*''

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:

$><<

Anda dapat mempersingkat (0..9).to_amenjadi [*0..9].
Howard

Dilakukan dan dilakukan, tuan. Terima kasih!
Darren Stone

Sama-sama. Tapi mengapa Anda tidak menggunakannya [*0..9].shuffle?
Howard

@ Howard, karena sudah larut dan saya bodoh. :) terima kasih!
Darren Stone

array pengembalian ini dengan nomor bukan angka

8

PHP - 37 Karakter

<?=join('',array_rand(range(0,9),10))

Saya punya solusi 18-karakter yang secara teori seharusnya berfungsi tetapi PHP aneh.

Atau, jika Anda menginginkan jawaban xkcd:

<?="5398421706" // Chosen by program above; guaranteed to be random ?>

EDIT: Terima kasih xfix, sekarang 5 karakter lebih pendek dan lengkap. EDIT LAGI: Contoh langsung .


Tulis program yang lengkap, bukan hanya bagian yang lengkap. Juga, echotidak perlu parens, dan jika echopernyataan pertama dalam program, Anda dapat menggantinya <?php echodengan <?=. Juga, joinadalah alias untuk implode.
Konrad Borowski

@ Memperbaiki Terima kasih, saya akan memperbaiki. :)
cjfaure

Anda bahkan tidak perlu <?=dan ?>. Itu kode PHP yang valid tanpa itu.
jeremy

@ Jeremy Golf mengharuskan nomor ditampilkan; selain itu, echo panjangnya sama dengan <?=dan ?>digabungkan, dan tanpa itu, tidak akan berfungsi di Codepad. Terimakasih Meskipun. : P
cjfaure

1
@ Jeremy Ah, PHP, di mana implementasi non-embedded selain terminal jarang. : P
cjfaure

8

Perl 6 (18 16 karakter)

print pick *,^10

Ini menghasilkan array yang berisi semua elemen acak ( pick *) dari 0ke 9dan menampilkan hasilnya ( print).

Output sampel:

$ perl6 -e 'print pick *,^10'
4801537269
$ perl6 -e 'print pick *,^10'
1970384265
$ perl6 -e 'print pick *,^10'
3571684902

+1 Saya pikir Anda tidak perlu spasi putih sebelumnya pick.
Howard

1
@ Howard: Saya benar-benar membutuhkannya. [~](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.
Konrad Borowski

1
@xfix: gunakan printsebagai ganti say [~]dan simpan 2 karakter :)
Ayiko

@Ayiko: Terima kasih atas perbaikannya :).
Konrad Borowski

7

GolfScript, 12 karakter

10,{;9rand}$

Cukup membuat daftar digit ( 10,) dan mengurutkannya {...}$berdasarkan beberapa kunci acak - yang menghasilkan urutan acak digit.

Contoh (coba online ):

4860972315

0137462985

Saya akan memposting ini: P
Gagang Pintu

Itu semacam omong kosong, meskipun: misalnya, angka pertama adalah sekitar tiga kali lebih mungkin menjadi 0 daripada 1. Mengganti 9randdengan 99randakan (kebanyakan) memperbaikinya; praktis9.?rand akan sempurna .
Ilmari Karonen

1
@IlmariKaronen, saya tahu, tapi pertanyaannya tidak mengatakan apa-apa tentang distribusi seragam.
Howard

6

R (23 karakter)

cat(sample(0:9),sep="")

Output sampel:

> cat(sample(0:9),sep="")
3570984216
> cat(sample(0:9),sep="")
3820791654
> cat(sample(0:9),sep="")
0548697132

6

TI-BASIC, 5 byte

randIntNoRep(1,10

Menampilkan daftar daripada angka. Anda sedang mencari randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans.
lirtosiast

2
Saya tidak berpikir tantangan ini membutuhkan tipe bilangan bulat, hanya bahwa "Nomor yang dihasilkan harus ditampilkan di layar" yang mana.
Timtech

Hmm, saya pikir pertanyaannya adalah meminta nomor (seperti yang dilakukan orang lain tetapi tampaknya maksud penulis tantangan tidak pernah diklarifikasi. Beberapa solusi lain menampilkan sebagai daftar (J dan APL) dalam kasus apa pun.
lirtosiast

Yah, saya tidak akan menganggap itu kecuali saya yakin, karena metode ini lebih pendek.
Timtech

5

Oktaf (14)

randperm(10)-1

randperm sayangnya membuat pilihan dari 1..n, jadi harus mengurangi 1 di akhir untuk mendapatkan 0-9.


5

Di server sql

DECLARE @RandomNo varchar(10)
SET @RandomNo = ''

;WITH num as (
SELECT 0 AS [number]
Union 
select 1
Union 
select 2
Union 
select 3
Union 
select 4
Union 
select 5
Union 
select 6
Union 
select 7
Union 
select 8
Union 
select 9
)
SELECT Top 9 @RandomNo = COALESCE(@RandomNo + '', '') + cast(n.number AS varchar(1))
FROM numbers n
ORDER BY NEWID()

SELECT cast(@RandomNo AS numeric(10,0))

Lihat Demo

ATAU sesuatu yang serupa (milik @manatwork) menggunakan rekursi dan xml.

with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('')

1
Sobat, kau suka CTE ... Tapi karena ini tantangan kode-golf , lebih baik persingkat sebanyak mungkin. Terbaik saya adalah 186 karakter: 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 itu newid().)
manatwork

1
Oke, kamu benar. Lebih pendek dengan CTE. 106 karakter: with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('').
manatwork

Anda dapat menyederhanakan cte dengan(VALUES (1),(2),...)
ypercubeᵀᴹ

5

Javascript ( 79 78 68 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)


Anda dapat menghemat 1 byte menggunakan ||evaluasi hubung singkat, bukan ifseperti: for(a="";!a[9];){b=Math.floor(Math.random()*10);~a.indexOf(b)||(a+=b)}alert(a)
Steven Palinkas

1
@ SebelasPalinkas Terima kasih, ide bagus! Saya telah memperbarui posnya.
scribblemaniac

Kita juga bisa menyimpan 2 byte dengan sedikit penataan ulang dalam kode:for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas

Kita dapat menyimpan 8 byte tambahan menggunakan "steno" untuk Math.floor seperti:for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas

4

Mathematica, 27

Row@RandomSample@Range[0,9]

masukkan deskripsi gambar di sini


Cara yang bagus untuk menghindari dawai!
DavidC

4

Shell / Coreutils, 23

shuf -i0-9|paste -sd ''

Jika kami tidak memerlukan baris baru, Anda dapat mencukurnya hingga 20 denganshuf -i0-9|tr -d \\n
joeytwiddle

bagaimana denganshuf -zi0-9
marcosm

@marcosm: Itu memberi Anda garis yang diakhiri dengan nol, yang agak aneh.
Hasturkun

4

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

a=[0,1,2,3,4,5,6,7,8,9],l=11,t="";while(--l){r=Math.floor(Math.random()*l);t+=a[r];a.splice(r,1);}alert(t)

Versi yang dapat dibaca:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], l = 10,t = "";
while(l--) {
  r = Math.floor(Math.random() * l);
  t += a[r];
  a.splice(r, 1);
}
alert(t);

Versi yang lebih baik (90 karakter):

a="0123456789".split(t=""),l=11;while(--l)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t)

Versi terakhir (82 karakter):

a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)

JSFiddle: http://jsfiddle.net/gthacoder/qH3t9/ .


1
Aku golfed bawah metode Anda untuk 90 karakter: 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.
Rob W

@RobW Terima kasih atas tipsnya. Saya memperbarui jawaban saya. PS Saya kira Anda maksud Math.floor(x) === 0|x.
gthacoder

1
Ini selalu memiliki 9 di akhir. Untuk memperbaiki, menginisialisasi l=11dan mengalihkan kondisi loop sementara Anda kewhile(--l)
Greg

@Greg Poin bagus. Terima kasih. Saya memperbarui jawabannya.
gthacoder

1
82 Karakter: 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. The rvariabel berlebihan.
George Reith

4

C #, 145 byte

Tidak disatukan

using System;
using System.Linq;
class P
{
    static void Main()
    {
        Enumerable.Range(0,10).OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);
    }
}

Golf

using System;using System.Linq;class P{static void Main(){Enumerable.Range(0,10).OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);}}

1
Anda dapat menggunakan Enumerable.Range(0,10), dan Anda tidak perlu kurung keriting di foreachloop.
Rik

3

JavaScript (80 karakter)

alert("0123456789".split("").sort(function(){return .5-Math.random()}).join(""))

JS-Fiddle: http://jsfiddle.net/IQAndreas/3rmza/


3
Perhatikan bahwa ini dapat di-golf lebih lanjut dengan menggunakan fungsi panah (yang saat ini hanya berfungsi di FF, tetapi akan segera hadir untuk penerjemah di mana saja):alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
apsillers

1
Anda tidak perlu ruang antara returndan.5
Tibos

1
@Greg Shhhh! Apakah Anda tahu berapa banyak karakter yang dibutuhkan fungsi pengocokan nyata ? ;)
IQAndreas

1
@Greg Ini adalah distribusi acak (dengan asumsi Math.random cukup acak), itu bukan yang seragam.
SuperJedi224

1
Posting blog asli hilang, menambahkan arsip internet untuk anak cucu: web.archive.org/web/20150212083701/http://sroucheray.org/blog/…
Greg

3

K / Kona (6)

-10?10

Seperti halnya J, ?adalah operator kesepakatan; yang -kekuatan nilai-nilai untuk tidak mengulangi.


3

Mathematica 40

Angka tersebut dibuat sebagai string sehingga memungkinkan nol untuk ditampilkan sebagai karakter pertama, saat diperlukan.

""<>RandomSample["0"~CharacterRange~"9"]

Contoh keluaran

"0568497231"
"6813029574"

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. Misalnya RandomSample[list, 4]akan mengembalikan sampel acak 4 karakter, tanpa mengulangi.


Tetapi mengapa menampilkan 0 sebagai karakter pertama?
Ankush

Menurut OP, program "harus dapat menghasilkan semua permutasi dari semua karakter yang diizinkan".
DavidC

@Ankush Itu notasi infiks, jadi "0" tidak selalu karakter pertama.
Ajasja

Ajasja benar. Program dapat menghasilkan permutasi apa pun. Saya menambahkan beberapa komentar di atas untuk memperjelas hal ini.
DavidC


2

Keempat, 72

needs random.fs : r ': '0 do i loop 9 for i 1+ random roll emit next ; r

Mungkin masih ada ruang untuk bermain golf, tetapi Forth membuat ini sulit. Kupikir.


2

Prolog, 177/302 karakter

Saya seorang pemula di Prolog, jadi mungkin ini bukan kode yang paling kental.

:- use_module(library(clpfd)).
sort(N) :-
    N = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
    domain([N0],1,9),
    domain([N1,N2,N3,N4,N5,N6,N7,N8,N9],0,9),
    all_different(N),
    labeling([],N).

Pengembalian:

| ?- sort2(N).                                         
N = [1,0,2,3,4,5,6,7,8,9] ? ;
N = [1,0,2,3,4,5,6,7,9,8] ? ;
N = [1,0,2,3,4,5,6,8,7,9] ? ;
N = [1,0,2,3,4,5,6,8,9,7] ? ;
N = [1,0,2,3,4,5,6,9,7,8] ? 
yes

Jika Anda ingin mengembalikan integer:

:- use_module(library(clpfd)).
sort(M) :-
    N = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
    domain([N0],1,9),
    domain([N1,N2,N3,N4,N5,N6,N7,N8,N9],0,9),
    all_different(N),
    labeling([],N),
    M is (N0*1000000000)+(N1*100000000)+(N2*10000000)+(N3*1000000)+
         (N4*100000)+(N5*10000)+(N6*1000)+(N7*100)+(N8*10)+N9.

Pengembalian:

| ?- sort(N).
N = 1023456789 ? ;
N = 1023456798 ? ;
N = 1023456879 ? ;
N = 1023456897 ? ;
N = 1023456978 ? 
yes

Menggunakan sebaliknya:

labeling([down],N)

Memberikan angka dalam urutan yang berlawanan:

| ?- sort(N).                                        
N = 9876543210 ? n
N = 9876543201 ? n
N = 9876543120 ? n
N = 9876543102 ? n
N = 9876543021 ? 
yes

Tidak seperti beberapa kode lain yang diposting, ini mengembalikan semua kemungkinan (tanpa pengulangan).




2

Clojure, 42

(println (apply str (shuffle (range 10))))

6209847315


Nomor yang dihasilkan harus ditampilkan di layar, bukan bagiannya.
Sylwester

2

Javascript, 83 karakter

a=[];while(!a[9]){b=Math.floor(Math.random()*10);!a.includes(b)&&a.push(b)}alert(a)

Saat berjalan hingga array memiliki 10 elemen.

Menghasilkan angka acak dari 0 - 9 lalu memeriksa apakah array! Menyertakan nomor ini dan menambahkannya ke array.


1
Selamat datang di situs ini! :)
DJMcMayhem

1

Ini tidak jauh lebih kecil dari jawaban JMK, tetapi inilah solusi C # yang sedikit lebih kecil (135):

using System;
using System.Linq;
class P { 
    static void Main() 
    { 
        Console.Write(string.Join("", "0123456789".OrderBy(g => Guid.NewGuid()))); 
    } 
}

Dipadatkan (134):

using System;using System.Linq;class P{static void Main(){Console.Write(string.Join("", "0123456789".OrderBy(g => Guid.NewGuid())));}}

Versi alternatif (135):

using System;
using System.Linq;
class P { 
    static void Main() 
    { 
        "0123456789".OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write); 
    } 
}

Kompak:

using System;using System.Linq;class P{static void Main(){"0123456789".OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);}}

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


1

LOGO , 64 karakter

make "d 1234567890
repeat 10 [
    make "n pick d
    show n
    make "d butmember n d
]

pilih pengembalian item acak dari daftar yang disediakan. butmember mengembalikan daftar dengan semua kemunculan item yang ditentukan dihapus. Catatan: Tidak semua butmemberperintah dukungan implementasi Logo .


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.