Saya membaca pertanyaan ini dan berpikir itu akan menjadi tantangan yang menyenangkan.
Tugas
Berikan input 0<n<10
dengan angka acak
- tepatnya n digit
- yang pertama bukan
0
- begitu
f(n)>10**(n-1)-1
- begitu
- digit berbeda
Kriteria menang
Ini adalah kode-golf sehingga kode terpendek menang.
Acak
Maksud saya merata secara acak. Jadi dari pandangan program, setiap angka yang mungkin memiliki peluang yang sama. Jika bahasa yang Anda gunakan memiliki penghasil angka acak yang aneh, tidak masalah untuk menggunakannya.
Contoh
Daftar nilai yang dipilih secara acak n=2
adalah:
[10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98]
code-golf
number
random
grid
game
king-of-the-hill
javascript
code-golf
arithmetic
statistics
code-golf
math
code-golf
math
code-golf
string
palindrome
code-golf
string
interactive
code-golf
quine
polyglot
code-golf
string
stack-exchange-api
code-golf
number-theory
decision-problem
code-golf
tips
code-golf
string
internet
code-golf
graphical-output
image-processing
fractal
code-golf
ascii-art
geometry
hexagonal-grid
code-golf
string
restricted-source
hello-world
code-golf
game
code-golf
cipher
code-golf
permutations
cops-and-robbers
permutations
cops-and-robbers
code-golf
internet
stack-exchange-api
code-golf
ascii-art
random
code-golf
tips
code-golf
ascii-art
code-golf
code-golf
kolmogorov-complexity
code-golf
string
unicode
code-golf
number
sequence
primes
palindrome
code-golf
game
decision-problem
code-golf
math
geometry
code-golf
graphical-output
interactive
code-golf
set-partitions
code-golf
number
arithmetic
restricted-source
code-golf
decision-problem
python
recursion
code-golf
ascii-art
code-golf
source-layout
code-golf
function
recursion
functional-programming
code-golf
game
combinatorics
permutations
code-golf
string
file-system
code-golf
string
hashing
code-golf
stack-exchange-api
code-golf
string
code-golf
math
number
arithmetic
polyglot
Roman Gräf
sumber
sumber
Jawaban:
Python 2 , 77 byte
Cobalah online!
Kocok daftar 10 digit hingga tidak dimulai dengan 0, lalu buat angka dengan
n
angka pertama yang tercantum.sumber
9
atau10
.[1::3]
kerjanya untuk mengubahnya dari daftar ke string? Saya belum pernah melihat itu sebelumnya.[
.[1::3]
mendapatkan karakter di indeks 1, lalu setiap ketiga. Sebab[1, 2, 3]
, itu memberi123
, melewatkan tanda kurung, koma, dan spasi.[1, 2, 3]
sudah dirangkai dan bahwa koma dan ruang perlu dilewati. Terima kasih!Brachylog ,
910 byteCobalah online!
Seperti biasa untuk Brachylog, ini adalah pengiriman fungsi. TIO link di atas telah diberikan argumen command-line untuk membuat fungsi menjadi program penuh.
Saya harus menambahkan byte tambahan dari versi pertama ini, berubah
ℕ
menjadiℕ₁
, untuk melarang output 0 (sesuatu yang sekarang telah diklarifikasi).Penjelasan
Cukup tidak efisien, karena penerjemah menghasilkan daftar semua nilai yang mungkin dan kemudian mengambilnya secara acak (itulah
ᶠṛ
artinya; Brachylog tidak memiliki opsi "pilih solusi acak" pada saat pertanyaan ini diajukan).Beberapa komentar pada pelabelan di sini: jika
≜
dihilangkan, bagian dalam kurung hanya menghasilkan satu nilai, kendala yang mewakili angka dengan properti yang kita inginkan; Oleh karena itu, memilih hasil acak memberi kita batasan, dan penerjemah mengeluarkan nilai absolut minimum yang memenuhi kendala (1, 10, 102, 1023, 10234, dll.), yang bukan yang kita inginkan. Karena itu kami harus memaksanya untuk membuat daftar melalui labelisasi eksplisit.Sebagian besar implementasi Prolog yang saya lihat memiliki builtin untuk menemukan hasil acak yang cocok dengan kendala, tetapi biasanya tidak dengan probabilitas yang seragam; Brachylog tidak memilikinya, (ada yang ditambahkan dalam menanggapi tantangan ini, tapi jelas saya tidak bisa menggunakannya karena aturan celah). Jika ya, dan jika kebetulan memberikan probabilitas yang seragam pada masalah ini, program ini hanya akan
~lℕ₁≠
diikuti oleh builtin itu, untuk kemungkinan panjang 6 byte.Brachylog , 8 byte, bekerja sama dengan @Fatalize
Cobalah online!
Ini adalah jenis trik tingkat rendah jenius yang hanya masuk akal dengan cara Prolog melakukan sesuatu, dan tidak masuk akal ketika dijelaskan secara matematis.
Seperti sebelumnya,
~lℕ₁≠
membangun nilai yang menggambarkan kendala ("panjang sama dengan input, bilangan alami, semua elemen berbeda"). Kemudian≜ᶠ
menghasilkan semua nilai yang mungkin yang memenuhi kendala. Intinya di sini adalah bahwa dengan urutan evaluasi Brachylog, tidak ada pilihan aktual yang dibuat sampai≜
muncul, sehingga operasi "temukan semua solusi" tidakᶠ
perlu berlaku apa pun selain operasi "nilai spesifik yang memenuhi kendala"≜
. Itu berarti tidak perlu bagi{…}
untuk memilih ruang lingkupnya, menghemat 2 byte.sumber
≜₁
sebelum saya menyadari bahwa itu ditambahkan karena tantangan iniJelly , 9 byte
Cobalah online! (tidak akan bekerja di TIO untuk n> 6 karena ketidakefisienan implementasi)
atau implementasi alternatif dari hal yang sama:
Bagaimana?
Ini sangat licik, dan sangat tidak efisien! Jelly melakukan beberapa hal berguna secara implisit ketika atom mengharapkan daftar tetapi menerima bilangan bulat (ini adalah desain).
Kode ini menggunakan beberapa tindakan implisit yang berguna ini:
Atom monadik
Ṗ
, "pop", ketika dipanggil dengan input integer secara implisit membuat rentang dari mana untuk pop, sehingga input dari n membuat pertama [1, 2, ..., n] , kemudian muncul, menghasilkan [1, 2 , ..., n-1] .Atom monadik
Q
, "de-duplikat" atau "unik", ketika dipanggil dengan input integer secara implisit membuat daftar desimal untuk menduplikat, jadi input dari n di mana:n = d k-1 × 10 k-1 + d k-2 × 10 k-2 + ... + d 1 × 10 + d 0
pertama membuat
[d k-1 , d k-2 , ..., d 1 , d 0 ]
dan kemudian menghasilkan nilai unik dengan penampilan pertama.
Jadi, misalnya, n = 5835518 akan menghasilkan [5, 8, 3, 1] .
Lebih lanjut, atom monadik
M
, "indeks elemen maksimal", mengembalikan indeks item maksimal dari daftar, ini menghemat dua byte dari alternatif pengujian kesetaraan yang jauh lebih jelas dengan input dan menemukan indeks kebenaran⁵*ṖQL$€=⁸TX
,, atau⁵*ṖðQL⁼ð€TX
Ini semua sangat tidak efisien, baik dalam waktu maupun memori: pertama daftar 10 n bilangan bulat dibuat dan satu dibuang, kemudian untuk masing-masing ini daftar n bilangan bulat (bukan objek 4-bit atau enum) dibuat dan kemudian diduplikasi. De-duplikasi ini memiliki implementasi yang sepenuhnya berbasis daftar (tidak ada set, diurutkan-set, atau kamus yang terlibat di bawah-the-hood, setiap digit diperiksa untuk keberadaan dalam daftar yang akhirnya mendapatkan output).
Offline n = 7 menggunakan ~ 0.5GB dan membutuhkan ~ 25 detik, sementara n = 8 menggunakan ~ 4GB dan membutuhkan ~ 5 menit - Saya tidak pernah repot menjalankan n = 9 karena saya hanya memiliki ram 16GB (saya kira itu akan memakan waktu ~ 45 menit ).
Implementasi alternatif hanya menggunakan built-in
ÐṀ
quick to filter-keep minimal (yang di sini hanya menambahkan sedikit overhead dalam manajemen untuk byte-count yang sama).sumber
Jelly , 11 byte
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6),
72717069 byteIni adalah fungsi rekursif yang mengambil jumlah digit x . Parameter kedua y , awalnya diatur ke string kosong, melacak nomor ketika kita menghasilkan digit demi digit.
Pertama kita menghasilkan angka acak z dengan
Math.random()*10|0
. Sekarang, kami ingin memeriksa bahwa y tidak mengandung z , dan bahwa y dan z tidak keduanya 0 .Kami dapat menghitung kondisi pertama dengan
!y.match(z)
.y.match(z)
mengembalikan array (selalu benar) jika y berisi z , null (falsy) sebaliknya; yang!
mengkonversi ini menjadi boolean dan membalikkannya.Kondisi kedua diperiksa dengan
y|z
. Meskipun y adalah string, JS secara implisit mengkonversinya menjadi integer saat menggunakan|
. Ini adalah bilangan bulat positif jika y sudah berisi angka, 0 sebaliknya. Hasil akhirnya adalahy|z
mengembalikan 0 jika y kosong dan z adalah 0 , atau bilangan bulat positif sebaliknya.Jika kedua kondisi ini benar, maka kami menambahkan digit ke y , mengurangi x , dan memulai proses dari awal lagi. Kalau tidak, kita cukup kembali ke awal dan berharap digit acak berikutnya berfungsi. Ketika x mencapai 0 , kita cukup mengembalikan string kosong untuk mengakhiri rekursi.
Versi sebelumnya:
Ini adalah fungsi rekursif yang mengambil jumlah digit. Parameter kedua yang awalnya tidak ditentukan, y , adalah tabel pencarian 10-bit yang memberitahu kita digit mana yang sudah kita miliki, disimpan dengan nyaman sebagai integer.
Pertama kita menghasilkan angka acak z dengan
Math.random()*10|0
. Sekarang, kita ingin memeriksa bahwa z 'th bit paling signifikan y tidak diatur, dan bahwa y dan z tidak baik 0 .Kami dapat menghitung kondisi pertama dengan
~y>>z&1
; balik y , pindahkan z bit ke kanan, dan ambil hanya bit yang paling tidak signifikan. Ini memberi 1 jika kita belum menghasilkan digit yang dimaksud, atau 0 sebaliknya.Kondisi kedua pada awalnya cukup sulit untuk diketahui (saya mencoba menggunakan
y/z
pada awalnya untuk menghasilkanNaN
jika keduanya 0), tetapi pada beberapa titik saya menyadari bahwa hanyay|z
akan melakukan trik. Hasilnya adalah 0 iff baik y dan z adalah 0 ; bilangan bulat positif sebaliknya.Jika kedua kondisi ini benar (
~y>>z&1&&y|z
), maka kami menghasilkan sisa bilangan dan ditambahkan dengan z . Sisa nomor dihasilkan dengan memanggil fungsi lagi denganx-1
dany|1<<z
( y , tetapi dengan bit pada indeks z diatur ke 1 ). Ketika x mencapai 0 , kita cukup mengembalikan string kosong untuk mengakhiri rekursi.sumber
ClojureScript,
8179 byteIni adalah fungsi anonim, jadi Anda harus menggunakannya seperti ini:
Tempat Anda mengganti
{arguments}
dengan argumen Anda.Anda dapat mencoba kode di sini (ClojureScript REPL).
Terima kasih
@cliffroot
telah mencukur 2 byte!Kode yang diperluas:
Penjelasan:
Saya akan pergi melalui baris satu per satu, menggunakan contoh input
8
.Cukup sederhana, ini mendefinisikan fungsi
random-digits
dengan satu argumen, yang disebutn
. Dalam jawaban saya, saya menggunakan fungsi anonim (#(...)
), untuk menyimpan byte.Mari kita periksa di dalam
let
, dari dalam ke luar:Dalam ClojureScript (dan Clojure),
(range n)
mirip dengan Pythonrange(n)
: ini memberi Anda daftar dengan setiap angka dari0
hinggan - 1
(9
dalam hal ini).shuffle
mengambil daftar, dan mengembalikan vektor (yang sedikit berbeda dari daftar) dengan semua elemennya dikocok. Jadi, menggunakan contoh kita, kita mendapatkan sesuatu seperti ini:(subvec vector start end)
mengambil vektor (hanya vektor), dan mengembalikan vektor yang memiliki semua elemen dari indeksstart
keend
. Dalam hal ini, kami mengambil elemen dari0
elemen ke argumen yang diberikanrandom-digits
. Jika kita menerapkan itu pada contoh kita, kita mendapatkan:if
Pernyataan ini memeriksa apakah elemen pertamanum-vector
adalah a0
.Jika ya
0
, maka kita memanggil fungsi lagi, dengan argumenn
, menggunakanrecur
.Jika tidak
0
:(apply function list)
mengambil daftar, dan meludahkannya ke dalam fungsi sebagai argumen. Sebagai contoh:Berubah menjadi:
Yang sama dengan
9
.(str items)
mengubah setiap itemitems
menjadi string, dan kemudian menggabungkannya.int
mengubah apa pun menjadi bilangan bulat. Jadi jika kita menerapkan ini pada contoh kita, kita mendapatkan:Yang merupakan jawaban terakhir kami.
sumber
(int string)
alih-alih(Integer/parseInt string)
:)read-string
di Clojure, tapi itu tidak jauh lebih baik ...#(let[a(subvec(shuffle(range 10))0 %)](if(=(a 0)0)(recur %)(int(apply str a))))
bergerakapply str
sebagian hingga akhir, memungkinkan untuk membandingkan0
alih-alih\0
dan menggunakansubvec
alih-alihtake
memungkinkan untuk menggunakan vektor sebagai fungsi dan dengan demikian menghapusfirst
shuffle
mengubah koleksi menjadivec
. Terima kasih! Akan harus menulis penjelasan baru, meskipun ...Python 2,
898180 byteCobalah online
sumber
99**n
, hanya untuk memastikan saya mendapatkan semuanya. : Dif`set(`i`)`[5*n:]]
.R, 45 Bytes
sumber
k=0
karena ini adalah vektor implisit dengan panjang satu, dan Anda dapat menggunakan i = scan () untuk mengambil input dari stdin sebagai angka. Saya juga tidak yakin bahwa daftar angka adalah pengiriman yang "benar", tetapi saya bukan hakim.while(!k[1])
berhasil menghemat 2 byte?Utilitas Bash + GNU, 46
Cobalah online .
Ini membutuhkan waktu lama untuk n yang lebih besar - sekitar 30 detik untuk n = 7, dan meningkat 10 kali untuk setiap kenaikan, jadi mungkin 8-9 jam untuk n = 10.
sumber
Java 7,
150147145134 byte-2 byte terima kasih kepada @TheLethalCoder
(lama) Penjelasan:
Kode uji:
Coba di sini.
Contoh output:
sumber
n->...
atau apakah itu Java 8+?for(int l,x;(l=r.length())<n;)
dan Anda harus menyimpan byte.n->...
adalah Java 8. Secara pribadi saya lebih suka codegolf di Java 7, meskipun 8 selalu lebih pendek.Perl 6 , 44 byte
Cobalah
Diperluas:
sumber
PHP, 67 Bytes
Versi Online
Semua versi berdasarkan pengocokan angka 0-9
71 Bytes
73 Bytes
sumber
MATL , 15 byte
Cobalah di MATL Online!
Penjelasan
sumber
Jelly , 12 byte
Saat ini satu byte di belakang jawaban Jelly saya yang lain, tapi saya sangat suka yang ini.
Cobalah online!
Bagaimana itu bekerja
sumber
APL (Dyalog) ,
271917 byteMembutuhkan
⎕IO←0
yang default pada banyak sistem.Cobalah online!
Kocok digit hingga valid:
10⊥
decode dari basis-10 digit ke angka reguler,⊢
kemudian↑
elemen pertama dari{
...}⍣{
...}
mengulangi fungsinya ...?⍨10
kocok sepuluh bilangan bulat positif pertamahingga ...
⊃⍺
digit pertama dari upaya terakhir×
adalah positifsumber
Python 2 ,
100939290 byteTerima kasih kepada @ mbomb007 untuk mencukur 2 byte
Mencoba angka dalam yang diperlukan sampai ditemukan dengan angka unik. Saya berani bertaruh ada cara yang lebih bersih untuk melakukan ini, tetapi tidak ada yang terlintas dalam pikiran.
sumber
return(n==len(set(`k`)))*k or f(n)
. Cobalah onlinePyth , 11 byte
Menggunakan algoritma yang sama dengan jawaban Dennis .
Cobalah online!
sumber
Perl, 48 byte
Penjelasan:
Berulang-ulang menghasilkan bilangan bulat acak dari 1 hingga 10 ** $ n-1, menolaknya sampai ada salah satu dari panjang yang benar (jadi setidaknya 10 ** ($ n-1)) tanpa digit berulang.
sumber
Batch, 156 byte
x
memelihara bitmask dari digit yang digunakan.f
menunjukkan jumlah digit yang tersedia (menghitung mundur dari 9). Digit acak dihasilkan hingga digit yang tidak digunakan ditemukan.n=10
dapat didukung untuk 165 byte:(
r
mengandung angka nol di depan karena itu golfier.) Pendekatan sebelumnya untuk 165 byte khusus-digit pertama, dan juga bekerja dengann=10
(versi numerik sebenarnya mengambil 166 byte!):Pendekatan asli untuk 170 byte juga bekerja untuk
n=10
:Menggunakan manipulasi string untuk mendeteksi digit duplikat.
sumber
Pesta , 66 byte
Cobalah online!
Lurus ke depan, gunakan shuf, xargs digunakan untuk bergabung dengan garis dan terus mencoba sementara kombinasi dimulai dengan 0.
Tidak bisa mengalahkan 46 char dari jawaban lain tetapi dengan demikian cepat!
sumber
Pyth,
1528 byteCoba di sini
sumber
0
, jadi saya pikir Anda akan ingin mengubah^TttQ
ke^TtQ
(-1 byte, bonus!). 2) semua digit dalam output harus unik, jadi Anda harus memaksakan itu terjadi.C #,
127132128126125 byteCobalah secara Online!
Meminjam ide dari jawaban @ KevinCruijssen untuk menginisialisasi acak
r
,, dalamif
pernyataan untuk menyimpan 2 byte.Cukup yakin ini bisa bermain golf lebih jauh tetapi saya tidak punya waktu saat ini.
Versi lama menggunakan
while
loop:sumber
0
, pertama kali akan mencobaif(s.Length<1&r>0)
yang palsu, tetapi kemudian akan melakukanif(!s.Contains(r+""))
yang benar dan masih append"0"
untuks
sebagai digit pertama..Next(10)
... dengan a;
. Jadi tidak ada perbaikan lebih lanjut di sana, tapi ide bagus.n=>{var s="";for(int l=0,r;l<n;l=s.Length)if((l<1&(r=new System.Random().Next(10))>0)|(l>0&!s.Contains(r+"")))r+=x;return s;};
:)C (gcc) ,
123122100951041039997 byteYang ini menghasilkan angka acak yang sebenarnya
Cobalah online!
C (gcc) ,
8785 byteIni dia mencetak serangkaian angka.
Cobalah online!
sumber
PHP,
6563 bytemenerima input dari STDIN; jalankan bersama
-nR
.buat angka acak antara
1
dan10^N
inklusif;ulangi sementara hitungan karakter yang berbeda adalah <
N
.sumber
while(count(count_chars($x=rand(1,10**$argn),1))<$argn);echo$x;
-2 BytesMathematica
6560 BytesIni adalah versi yang lebih cepat tetapi menambahkan 9 byte:
sumber
Java 9 JShell, 86 byte
Cobalah online!
Catatan: Saya tidak menghitung impor karena paket-paket itu diimpor secara default di JShell, tetapi tidak ada tautan Try-it-online yang saya ketahui untuk JShell, jadi saya telah menyediakan satu untuk Java 9 dengan kode header dan footer untuk membuatnya bekerja dalam konteks itu. Di JShell Anda bisa melakukan:
Lalu:
Bagaimana itu bekerja:
Kami mendefinisikan fungsi dari Integer ke Long dan membuat aliran tak terbatas dari long acak di kisaran 0-9, membatasi ke item n-1 pertama, kemudian menguranginya dengan int acak dari 1-9 sebagai nilai awal dan fungsi yang mengalikan nilai dengan 10 dan menambahkan nilai berikutnya dari aliran.
Saya menggunakan long jadi ini harus bekerja hingga sekitar 18 digit (n = 18).
sumber
C,
9693 byteInisialisasi Fisher-Yates mengocok inisialisasi hingga digit pertama tidak nol.
Berseragam, dengan asumsi
rand()%i
seragam. (Karena sebagian besar sayaRAND_MAX/i
meninggalkan sisa kecil, ada bias yang sangat kecil. Bias ini tumbuh lebih kecil karena RAND_MAX tumbuh lebih besar.)Lihat itu berfungsi online .
Lihat itu menghasilkan angka yang benar ketika n sama dengan 2, seperti yang ditunjukkan dalam pertanyaan .
sumber
Aksioma, 191 byte
ungolf itu, hasil tes
sumber
Ubur-ubur , 17 byte
Cobalah online!
Fork of Dennis 'Jelly menjawab .
sumber
Ruby,
5352 byteAcak hingga digit pertama bukan 0, lalu gabungkan digit dan konversikan ke integer.
Cobalah online!
sumber