Tentang Seri
Pertama, Anda dapat memperlakukan ini seperti tantangan golf kode lainnya, dan menjawabnya tanpa khawatir tentang seri sama sekali. Namun, ada papan peringkat di semua tantangan. Anda dapat menemukan papan peringkat bersama dengan beberapa informasi lebih lanjut tentang seri di posting pertama .
Lubang 8: Acak daftar yang tak terbatas
Anda harus menulis fungsi atau program yang menggunakan daftar tak terbatas sebagai input dan mengembalikan versi acak dari daftar itu.
Tentang infinite I / O
Ada beberapa cara Anda dapat mengambil input dan menghasilkan output untuk tantangan ini:
- Anda dapat mengambil daftar bilangan bulat positif, atau representasi stringnya, atau string atau daftar karakter ASCII yang dapat dicetak (0x20 hingga 0x7E, inklusif). Format output harus sesuai dengan format input. Saya hanya akan merujuk data sebagai "daftar" mulai sekarang, terlepas dari opsi mana yang Anda pilih.
- Anda dapat membaca daftar dari aliran input standar tak terbatas dan menulis output terus menerus ke aliran keluaran standar tak terbatas. Solusinya tidak harus bergantung pada nilai atau urutan nilai tertentu untuk memastikan bahwa aliran output secara tertulis dan memerah (misalnya Anda tidak bisa hanya menulis output setiap kali ada
5
dalam daftar input). Tentu saja, jika Anda membaca representasi string dari daftar, tidak apa-apa untuk menunggu sampai bertemu dengan pemisah daftar. - Dalam bahasa yang mendukungnya, Anda dapat menulis fungsi yang mengambil dan mengembalikan daftar atau string malas yang tak terbatas.
- Dalam bahasa yang mendukungnya, Anda dapat mengimplementasikan generator tanpa batas yang menggunakan generator lain sebagai input.
- Atau, Anda dapat menulis fungsi yang tidak menggunakan argumen dan mengembalikan satu nilai output setiap kali dipanggil. Dalam hal ini, Anda dapat mengasumsikan bahwa suatu fungsi telah didefinisikan yang tidak menggunakan argumen dan mengembalikan nilai input berikutnya setiap kali dipanggil. Anda dapat dengan bebas memilih nama fungsi itu.
Anda dapat mengasumsikan bahwa program Anda berjalan selamanya dan bahwa memori tak terbatas tersedia. (Dimungkinkan untuk menyelesaikan ini dengan jumlah memori yang terbatas, tetapi artinya ini adalah Anda diizinkan untuk membocorkan memori.)
Tentang keacakan
Untuk setiap nilai v yang dibaca pada posisi i dari input infinite, harus ada probabilitas positif untuk berakhir di posisi i-9 hingga i + 9 dari output infinite (kecuali posisi itu akan negatif ). Probabilitas ini tidak harus sama untuk posisi output yang berbeda atau bahkan untuk posisi input yang berbeda. Tidak masalah jika solusi Anda juga dapat mengocok nilai ke posisi lain yang lebih jauh.
Oleh karena itu, tidak perlu solusi Anda dapat mengocok nilai pertama sangat jauh ke bawah dalam daftar, atau bahwa itu dapat mengocok nilai yang sangat terlambat hingga ke posisi pertama, meskipun tidak apa-apa jika itu terjadi, selama semua posisi 9 langkah dari input dimungkinkan.
Misalnya jika Anda mengambil string berikut sebagai input, ini ___
mengindikasikan semua posisi yang X
harus dapat diakhiri dalam output:
___________________
abcdefghijklmnopqrstuvwxyzXabcdefghijklmnopqrstuvwxyz...
Jika bahasa Anda tidak memiliki penghasil angka acak bawaan atau Anda tidak ingin menggunakannya, Anda dapat mengambil nilai seed tambahan sebagai input, dan mengimplementasikan RNG Anda sendiri yang sesuai menggunakan seed. Halaman ini mungkin bermanfaat untuk itu.
Terlepas dari distribusi aktual yang digunakan solusi Anda, hampir pasti harus menghasilkan nilai berikutnya setelah waktu yang terbatas (tapi sewenang-wenang).
Harap sertakan penjelasan singkat tentang bagaimana implementasi Anda memenuhi persyaratan ini.
Mencetak gol
Ini adalah kode-golf , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.
Papan peringkat
Posting pertama dari seri menghasilkan leaderboard.
Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Bahasa saat ini tidak ditampilkan, tetapi cuplikan memang membutuhkan dan menguraikannya, dan saya dapat menambahkan leaderboard berdasarkan bahasa di masa mendatang.)
sumber
Jawaban:
Python 3 , 78 byte
Cobalah online!
Mengambil input dari STDIN (satu per baris), mencetak ke STDOUT.
Menyimpan buffer
l
hingga 10 elemen. Buffer dikocok dengan setiap langkah. Ketika panjangnya 10, elemen terakhir dicetak dan dihapus.Jika sebuah elemen kebetulan dicetak segera setelah dimasukkan, elemen tersebut telah melompati 9 elemen lainnya yang menunggu dalam buffer, sehingga nampak 9 titik tersisa. Suatu elemen dapat menunggu dalam buffer secara sewenang-wenang, sehingga posisinya dapat memindahkan jumlah berapapun dengan benar.
Tampaknya tidak ada cara yang baik untuk menghasilkan dan menghapus elemen acak dari daftar. Mengocok sepertinya berlebihan. Ini 2 byte lebih lama untuk digunakan
l.pop(randint(0,9))
(yang menggunakan daftar memiliki 10 elemen).Ini tidak lebih baik untuk dilakukan
x=choice(l);l.remove(x)
. Bahasa denganpoprandom
sukabisa sangat bersih lakukan
sumber
Befunge ( rasa quirkster ), 4 byte
,
membaca karakter dari aliran dan mendorongnya ke tumpukan.~
muncul karakter teratas dari tumpukan (jika ada) dan mencetaknya.?
mengacak perintah mana yang dieksekusi selanjutnya. Jadi algoritme di sini adalah "Dalam loop tak terbatas, dengan probabilitas yang sama baik mendorong karakter atau pop karakter." Saya pikir ini memenuhi persyaratan: karakter dapat melihat banyak karakter yang ditambahkan secara sewenang-wenang di atasnya dalam tumpukan, sehingga dapat bergerak sewenang-wenang jauh ke kanan, dan itu dapat dicetak ketika tumpukan secara sewenang-wenang besar, sehingga dapat bergerak sewenang-wenang jauh ke kiri.sumber
>> document.getElementById("output").innerHTML = "a\0b"
>> document.getElementById("output").innerHTML
"ab"
C (gcc) , 94 byte
Cobalah online!
Oke, tautan TIO tidak masuk akal. Untuk kemudahan pengujian, saya membuat program C berikut yang akan menampilkan karakter ascii acak, atau mengulangi string tanpa batas.
Program ini akan disebut sebagai
iro
.Kebenaran program
Apa yang saya lakukan di sini adalah membaca
9
nilai ke dalam buffer. Setelah ini, indeks acak dipilih dari array ini dan dikeluarkan, lalu diganti dengan karakter berikutnya dalam aliran.sumber
SILOS , 149 byte
Cobalah online!
Pada dasarnya ia terus mengambil input (pada penerjemah online melalui argumen, tetapi pada penerjemah resmi offline itu akan memungkinkan Anda mengetik ke konsol (tanpa batas)) dalam blok 15 pada satu waktu (30 blok pertama).
Ini memuat input ke antrian sementara dan mengambil lucky 15 (secara acak, tetapi tidak terdistribusi secara merata dalam hal kemungkinan atau distribusi).
Sisanya tetap sebagai input baru mengisi antrian, input pertama bisa dikocok sampai akhir, (pada dasarnya saya pikir karakter mengikuti distribusi normal). Sangat menarik untuk dicatat bahwa program ini hanya dua kali lebih verbose dari python dan mungkin "golfier" daripada Java.
Untuk melihat hasil lebih baik, saya memiliki versi tidak sesuai yang mengambil input sebagai string (namun hanya dapat menampung sekitar 8.000 karakter).
Cobalah online!
Hanya untuk bersenang-senang, di sini adalah posting ini diumpankan melalui versi string.
sumber
Aceto , 24 byte, tidak bersaing
Non-bersaing karena saya harus memperbaiki bug pada juru bahasa.
Mengambil aliran garis tanpa batas dan menghasilkannya dalam urutan acak. Setiap elemen memiliki peluang terjadi pada titik acak apa pun.
Kita mulai dengan
?
di sudut kiri bawah, yang menggerakkan kita ke arah acak. Jika itu turun atau kiri, kita didorong kembali.Jika kita bergerak ke atas, kita
r
mendapatkan nilai, mengocok tumpukan (Y
), dan melompat kembali keO
rigin.Jika kita bergerak ke kanan, kita
d
menaikkan nilai tumpukan teratas, mendorong0
dan menguji kesetaraan (karena kita membaca string, kita tidak akan pernah memiliki bilangan bulat 0). Jika nilainya sama, itu berarti kami telah mencapai bagian bawah tumpukan (dari mana kami tidak ingin mencetak). Kami meniadakan perbandingan (!
), danp
mematahkan hanya jika (`
) semuanya tidak sama. Lalu kami juga melompat kembali keO
rigin.sumber
Ruby, 43 byte
Jawaban asli saya menggunakan daftar tak terbatas yang dievaluasi malas, tetapi ini lebih pendek. Baiklah.
sumber
MATL , 11 byte
Cobalah online!
Port jawaban histokrat Befunge .
Penjelasan: (Terima kasih kepada Luis Mendo untuk -1 byte)
Output ini hampir pasti dalam waktu yang terbatas, dan hampir pasti hanya membutuhkan memori yang terbatas .
Untuk kelengkapan, berikut adalah versi 15-byte yang menyimpan buffer 10-elemen dan mengeluarkan elemen acak dari itu:
Saya suka versi ini untuk yang sangat idiomatis (sejauh bahasa golf bisa idiomatis)
tn...Yr&)
, yang mengeluarkan elemen acak dari daftar dan mengembalikan daftar tanpa elemen itu. Namun, logistik khusus dari tantangan ini menambah banyak byte (yang diperlukanw
untuk tampilan,t9>?
untuk memeriksa apakah daftar sudah cukup penuh ...).sumber
Alice , 7 byte
Cobalah online!
Ini seharusnya bekerja pada input yang tidak terbatas dengan waktu dan memori yang tidak terbatas, tetapi dalam praktiknya tidak begitu mudah :)
Penjelasan
Pada setiap iterasi, 10 karakter dibaca dari input dan hanya satu yang menuju ke output, sehingga penggunaan memori meningkat secara linear selama eksekusi. Dengan input terbatas, ini dengan cepat mencapai EOF, dari mana sepuluh -1 akan didorong ke stack di setiap iterasi. Mencoba mengeluarkan -1 sebagai karakter tidak berpengaruh, tetapi tidak mungkin semua karakter dari input akan dicetak dalam jumlah waktu yang wajar.
Posisi i dari output dapat diambil oleh karakter apa pun di input hingga posisi 10i , ini sesuai dengan tantangan yang membutuhkan setidaknya rentang dari i-9 hingga i + 9 .
sumber
C, 214 byte
Bagaimana itu bekerja
Coba Online (UNIX)
sumber
Vi
ditukar denganVj
tempatj = RAND [ i-9, i+9 ]
untuk memenuhi kriteria pertanyaanv which is read at a position i of the infinite input, there must be a positive probability for it to end up in any of the positions i-9 to i+9 of the infinite output
05AB1E , 13 byte
Cobalah online! (dimodifikasi untuk mengambil 20 elemen)
sumber
Bash , 17 byte
Cobalah online!
xargs terus menerus mengambil 9 huruf dari STDIN dan mengirimkannya untuk acak
daftar tak terbatas dapat dihasilkan oleh:
yang mencetak abcde .. z kali tak terbatas.
Tes dapat dilakukan dengan:
sumber
xargs shuf -e
memenuhi persyaratanR, 70 byte
Mulai dengan vektor kosong
x
. Dalam infinite loop, dibutuhkan nilai baru dari STDIN, lalu mengocok vektor. Kemudian memeriksa apakah panjang daftar yang dibangun adalah 10 atau lebih tinggi. Jika ya, ia dapat mulai mencetak. Dengan cara ini vektor memiliki buffer 10 input, masing-masing dikocok dalam setiap iterasi. Jadi dimungkinkan untuk input dicetak 10 tempat sebelumnya, dan tak terhingga banyak tempat kemudian (mengikuti distribusi geometris denganp=1/10
). Ketika buffer cukup panjang, elemen pertama dicetak dan dihapus dari vektor.sumber
Javascript, 78 byte
Menggunakan metode yang sama dengan jawaban xnor.
sumber
Perl 5 , 39 byte
Kode +
-n
bendera 38 byte .Cobalah online!
Tambahkan setiap elemen ke
@F
array (denganpush@F,$_
). Ketika@F
berisi 10 elemen (push
mengembalikan jumlah elemen dalam array, karenanya9<push...
), elemen acak dihapus dan dicetak (splice@F,rand 10,1
untuk menghapus elemen,print
untuk mencetaknya).Output mulai terjadi setelah elemen ke 10 telah dibaca. Oleh karena itu, setiap elemen dapat mulai muncul setidaknya 9 posisi sebelum yang asli, dan dapat digeser ke kanan tanpa batas.
sumber
SmileBASIC,
6158 byteSetiap karakter dari daftar tak terbatas ditambahkan ke akhir buffer. Ketika panjang buffer adalah 11, karakter acak dicetak dan dihapus.
Fungsi
R
menghasilkan karakter berikutnya.sumber
Prolog, 70 byte
sumber