Program Anda harus mencetak sejumlah spasi, diikuti dengan titik dan baris baru. Jumlah spasi adalah posisi x titik Anda yang ditentukan dengan 0 <x <30
Setiap baris baru berbelok. Program Anda berjalan selama 30 putaran. Program Anda dimulai dengan posisi x acak dan setiap belokan menggeser posisi ini secara acak oleh 1 ke kiri atau kanan, sambil tetap berada di dalam area yang ditentukan. Setiap belokan titik Anda harus mengubah posisinya sebesar 1.
Skor Anda adalah jumlah karakter. Anda mendapatkan 10 poin bonus, jika setiap baris yang dicetak terdiri dari tepat 30 karakter (dan baris baru). Anda mendapatkan 50 poin bonus, jika, sembari acak, program Anda cenderung tetap di tengah-tengah area yang ditentukan.
Sunting: 50 poin bonus dimaksudkan untuk menarik titik Anda ke tengah. Misalnya, ini berlaku jika titik Anda di x = 20 dan memiliki peluang 66% untuk belok kiri dan 33% untuk belok kanan. Ini harus independen dari titik awal dan seharusnya hanya terjadi dengan mengubah nilai persentase kiri / kanan secara dinamis.
Tidak ada input dalam bentuk apa pun yang diizinkan, output harus ada di konsol pelaksana!
Untuk pemahaman yang lebih baik, berikut adalah contoh yang dapat dibaca di java, yang akan memberi Anda skor 723:
public class DotJumper{
public static void main(String[] args){
int i = (int)(Math.random()*30);
int max = 29;
int step = 1;
int count = 30;
while(count>0){
if(i<=1){
i+=step;
}else if(i>=max){
i-=step;
}else{
if(Math.random() > 0.5){
i+=step;
}else{
i-=step;
}
}
print(i);
count--;
}
}
public static void print(int i){
while(i>0){
System.out.print(' ');
i--;
}
System.out.println('.');
}
}
int i = (int)(Math.random()*30);
seharusnya itu yang seharusnyaint i = 1 + (int)(Math.random()*29);
. Seperti, ia menghasilkan angka,0 >= x > 30
bukan0 > x > 30
.Jawaban:
APL, 39 - 10 - 50 = –21
Diuji pada Dyalog dengan
⎕IO←1
dan⎕ML←3
tetapi itu harus cukup portabel.Penjelasan
Pada setiap langkah, kode ini memutuskan apakah akan memindahkan titik ke kiri atau ke kanan tergantung pada probabilitas bahwa nomor acak yang dipilih di antara (1,5 2,5 ... 27,5 28,5) kurang dari posisi titik saat ini.
Oleh karena itu, ketika posisi titik saat ini (jumlah spasi ke kiri) adalah 1 kenaikan selalu +1 (semua angka-angka itu 1,5 ... 28,5 adalah> 1), ketika itu 29 selalu selalu -1 (semua angka-angka itu adalah <29); jika tidak dipilih secara acak antara +1 dan -1, dengan kemungkinan itu adalah interpolasi linier antara kedua ekstrim tersebut. Jadi titik selalu bergerak dan selalu lebih cenderung untuk bergerak ke tengah daripada ke sisi. Jika tepat di tengah, ia memiliki peluang 50% untuk pindah ke kedua sisi.
Pengurangan (lipat kanan) dari nilai yang direplikasi
{...}/a/b
hanyalah trik yang saya buat untuk mengulangi waktu fungsia-1
, dimulai dengan nilaib
dan memiliki hasil dari setiap iterasi menjadi⍵
argumen akumulator ( ) ke argumen berikutnya. Argumen masukan kedua dan selanjutnya (⍺
) serta hasil akhir diabaikan. Ternyata jauh lebih pendek dari panggilan rekursif biasa dengan penjaga.Contoh dijalankan
sumber
+/2×⍳9
dibaca "jumlah: dua kali: naturals hingga 9" tetapi dieksekusi dengan cara yang berlawanan.⎕←30↑...
akan mencetak 30 karakter plus baris baru, apa pun string yang ada...
Mathematica 138 - 10 - 50 = 78
Saya tidak memposting ini karena saya pikir ini golf yang sangat baik, tetapi untuk alasan lain. Ini menggunakan Proses Markov definisi dengan matriks transisi yang dirancang untuk membuat bola "terpusat".
Penggunaan proses Markov di Mathematica memungkinkan kita menghitung beberapa statistik yang berguna , seperti yang akan Anda lihat di bawah.
Pertama kode (spasi tidak diperlukan):
Beberapa output:
Matriks transisi yang saya gunakan adalah:
Tapi seperti yang saya katakan, bagian yang menarik adalah menggunakan
DiscreteMarkovProcess[]
memungkinkan kita untuk mengambil gambar yang bagus tentang apa yang terjadi.Mari kita lihat probabilitas bola berada
15
kapan sajat
mulai dari keadaan acak tertentu :Anda dapat melihatnya berfluktuasi antara 0 dan nilai dekat 0,3, itu karena tergantung pada kondisi awal Anda hanya dapat mencapai 15 pada jumlah langkah ganjil atau genap :)
Sekarang kita dapat melakukan hal yang sama, tetapi memberitahu Mathematica untuk mempertimbangkan statistik mulai dari semua keadaan awal yang mungkin. Berapa probabilitas berada
15
setelah suatu waktut
?Anda dapat melihatnya juga berosilasi ... mengapa? Jawabannya sederhana: dalam interval
[1, 29]
ada lebih ganjil daripada angka genap :)Osilasi hampir hilang jika kita meminta kemungkinan bola berada di
14 OR 15
:Dan Anda juga bisa meminta batas (dalam arti Cesaro) dari probabilitas negara:
Oh, well, mungkin saya pantas menerima beberapa downvotes untuk jawaban di luar topik. Merasa bebas.
sumber
Bash, skor 21 (81 byte - 50 bonus - 10 bonus)
Dalam jawaban ini, titik "ditarik" kembali ke tengah. Ini dapat diuji dengan hardcoding titik awal pada 0 atau 30.
sumber
{1..30}
oleh{P..m}
o
yang1
danRANDOM%30
kembali0
? Dan pada iterasi selanjutnya juga?Ruby
696664-60 = 4Sampel:
sumber
i=rand 30;
alih - alihi=rand(30);
.Smalltalk,
161159145-60 = 85semua kolom sepanjang 30char (beroperasi dalam string yang dapat berubah b);
kesempatan pergerakan acak disesuaikan dengan biasing nilai rnd dengan p (rnd (0..29) -p), mengambil tanda (-1/0/1) dan kemudian menyesuaikan ke (-1 / + 1) via (-1 | 1), yang diambil sebagai pindah delta (secara efektif menghitung: tanda x <= 0 ifTrue: -1 ifFalse: 1). Karena ST menggunakan pengindeksan berbasis 1, saya harus menyesuaikan semua referensi string dengan +1 (tolong menghargai hack fiddling -1 | 1 bit ;-)).
mencuri sebuah ide dari versi Ruby (thanx & Up @fipgr), saya dapat menghilangkan pemeriksaan min / max:
output: (Saya telah secara manual menambahkan col-number dan bar vertikal setelahnya; kode di atas tidak menghasilkan mereka)
sumber
C, 86
Dengan asumsi bahwa penyemaian
rand()
fungsi tidak diperlukan.Penjelasan:
Dalam C, di
"%*c"
dalam*
berarti bahwa panjang output akan memiliki panjang minimum, dan panjang minimum ini ditentukan oleh argumen dari fungsi panggilan (dalam hal ini, itu adalahi+=i==30?-1:i==1||rand()%2?1:-1
. Thec
sarana argumen berikutnya (46
) adalah karakter ( titik).Sedangkan untuk pemeriksaan batas, saya minta maaf bahwa saya lupa tentang itu. Saya sekarang telah menambahkan ini ke jawabannya, dengan biaya 15 karakter. Operator terner bekerja sebagai berikut:
boolean_condition?value_if_true:value_if_false
. Perhatikan bahwa dalam C true adalah 1 dan false adalah 0.sumber
printf("%*c\n",i+=rand()%2?1:-1,46)
mencetak spasi, serta bagaimana menjaga titik dari kemungkinan melewati 29. Terima kasih sebelumnya. (Maaf, saya bukan programmer C.)rand()%2
karena sangat mudah ditebak (ganjil / genap)? Saya mencoba Andarand()%2
dalam solusi PHP saya, dan menunjukkan perilaku yang sangat mudah ditebak ini (tidak sepertirand(0,1)
PHP. Karena PHP banyak menggunakan perpustakaan C (jika saya benar) saya bertanya-tanya apakah program C Anda memiliki 'cacat' yang sama .rand()
fungsinya. Dalam C jikarand()
tidak diunggulkan secara eksplisit, selalu menggunakan benih yang sama setiap kali. Itu sebabnya bisa diprediksi. Jika saya harussrand(time());
rand()
tidak perlu diunggulkansrand()
lagi, tetapi masih menunjukkan perilaku aneh ini .Jawa:
204183182176175 karakter - 10 - 50 = 115Pertama, posisi titik harus
0 < x < 30
, yaitu [1-29]. Ini menghasilkan angka antara 0 dan 28 terdistribusi secara seragam, dan untuk tujuan program ini [0-28] memiliki efek yang sama dengan [1-29]:Saya pribadi lebih suka jika biasanya didistribusikan sekitar 14, tetapi jawaban saya akan lebih lama:
Kedua, kode ini memastikan bahwa ia cenderung berada di tengah:
Probabilitas untuk mendapatkan +1 lebih besar karena nilai yang lebih kecil
i
, dan kami memiliki kebalikan dari -1. Jikai
0, probabilitas mendapatkan +1 adalah 100% dan probabilitas mendapatkan -1 adalah 0%. Jikai
28, kebalikan dari itu akan terjadi.Ketiga, dengan mengganti
32
di akhir dengan'_'
untuk melihat output lebih mudah, kita melihat bahwa setiap baris memiliki 30 karakter ditambah baris baru:Terima kasih kepada @VadimR (sekarang, user2846289) karena menunjukkan kesalahpahaman dalam versi sebelumnya.
Terima kasih kepada @KevinCruijssen karena telah mencukur 6 karakter, bahkan setelah lebih dari dua setengah tahun setelah jawaban ini awalnya diposting.
sumber
i
untuk0
menjadi ilegal, bukan?i
berada dalam kisaran [0-29]. Ini sama dengan [1-30] atau [288-317], hasilnya akan sama. Yang penting adalah bahwa ada 30 angka integer dalam interval [0-29].i
tidak mungkin0
. Saya mengerti ini semua tentang bersenang-senang tapi tetap saja menyedihkan.i
mendapat1
awalnya, dan pada iterasi pertamaMath.random()
adalah0
, kemudiani
mendapat0
. Tolong jangan salah paham, ini bukan tentang jawaban Anda . Alih-alih tentang ketidakmampuan saya untuk membaca sebagian besar bahasa selain C-like. Kemudian tanpa reaksi (kecuali untuk upvotes) tentang kesalahan, bagaimana saya bisa tahu mereka benar atau tidak?Mathematica 157-10-50 = 97
Angka acak dari 1-30 digunakan untuk memulai. Semua nomor kolom yang tersisa dari titik dipilih melalui
RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c
, yang diterjemahkan menjadi: "Jika nomor kolom sebelumnya lebih besar dari 15, pilih satu nomor dari himpunan {-1,1}, dengan -1 berbobot 2: 1 sehubungan dengan 1; jika tidak, balikkan bobot dan pilih dari set yang sama.ReplacePart
mengganti elemen dalam daftar 30 ruang kosong yang sesuai dengan kolom minat.sumber
RandomChoice[]
> <>, 358 - 10 = 348
Ini tidak akan menang di codegolf, tetapi berhasil. (Di windows 7 dengan juru bahasa ini , yang mengimplementasikan instruksi "p" secara berbeda dari halaman esolang mendefinisikannya)
Nama bahasa ini tidak dapat di-Google, jadi inilah artikel esolang untuk yang penasaran.
sumber
PHP,
118113112111 (, -10 poin bonus = 101)(percobaan kedua, dengan
rand()
perilaku yang dapat diprediksi mengerikan , dan sedikit lebih efisien)Hasil yang mungkin:
PHP, 130 (, -10 poin bonus = 120)
(percobaan pertama)
Ini mungkin masih bisa jauh lebih efisien:
Jika saya mengganti ruang dengan garis bawah (untuk tujuan tampilan), ini adalah hasil yang mungkin:
Anehnya, jika saya ganti
rand(0,1)
denganrand()%2
(PHP 5.4, pada Windows XP), hasil acak selalu beralih dari ganjil menjadi genap, dan sebaliknya, pada setiap iterasi berikutnya, membuatrand()
dapat diprediksi secara mengkhawatirkan, dalam arti itu, tiba-tiba. 'Bug' ini tampaknya adalah salah satu yang telah dikenal sejak 2004 . Tidak sepenuhnya yakin apakah itu 'bug' yang persis sama.sumber
J 42 karakter - 50 -10 = -18
Penjelasan, mulai dari kanan (beberapa pengetahuan tentang kereta berguna):
Kecenderungan tengah, -50, contoh lebih dari 1000 berjalan:
Contoh dijalankan, menghasilkan tepat 30 byte setiap baris
sumber
Python 2.7:
126109 -10-50 = 49Menyingkirkan titik awal hard-coded - sekarang dimulai pada titik acak. Karena itu, saya perlu randint, jadi saya memutuskan untuk menggunakan itu alih-alih pilihan untuk offset. Menggunakan trik bool (-1) ** untuk itu.
Beberapa jawaban bagus di sini. Upaya pertama dengan Python, memikirkan perbaikan. Tidak terbantu oleh kebutuhan impor.
-10 - ya 30 karakter + \ n pada setiap baris
-50 - semakin jauh dari pusat, semakin besar kemungkinan bergerak ke arah lain (dicapai dengan membangun daftar dengan jumlah offset + / i yang berbeda)
Upaya sebelumnya:
sumber
for
loop Anda dapat berada dalam satu baris, tetapi lebih baik lagifor i in[0]*30:
dan lebih baik lagieval"..."*30
.Java -
198183 karakterIni hanyalah contoh sederhana, langsung, dan tidak kreatif dari contoh yang Anda berikan dalam pertanyaan.
sumber
Batch - (288 Bytes - 10) 278
Tidak golf:
Untuk menghasilkan spasi, bukan garis bawah - 372 Bytes -
Mencari bantuan dengan logika berikut, tentunya ini bukan metode yang paling efisien ruang (! R! Akan diperluas menjadi 1 atau 2) -
Ini golf ke:
if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !r! LSS 30 (set/ap+=1)else set/ap-=1
sumber
J, 42 karakter, tidak ada bonus
Contoh dijalankan:
sumber
Python 2.7 (126 - 10 (panjang fix) - 50 (Tendensi Tengah) = 66)
Program berikut memiliki kecenderungan pusat terhadap sampel yang lebih besar
Demo
sumber
Javascript
125737260 (120 - 50 - 10)EDIT: Perbaiki untuk bonus 50 poin dan bonus 10 poin.
EDIT 2: Lebih singkat lagi!
sumber
r=Math.random;s=r()*30|0;for(i=0;i++<30;a=Array(30)){a[s=s>28?28:s?r()<s/30?s-1:s+1:1]='.';console.log(a.join(' '))}
for
working; harus menggunakan do sementara.D -
167,162, 144 (154 - 10)Golf :
Tidak golf :
EDIT 1 - Saya tidak yakin apakah kode saya memenuhi syarat untuk bonus -50 atau tidak.
i
tidak selalu memulai di tengah, tetapi selamafor
lingkaran, dot tidak pernah bergerak lebih dari seperti 3 tempat kedua arah, jadi ketikai
tidak mulai dekat tengah, semuanya cenderung untuk tinggal di sana juga.EDIT 2 - Kode sekarang memenuhi syarat untuk bonus -10, karena mencetak array 29 karakter diikuti oleh LF dengan total tepat 30 karakter per baris.
sumber
PowerShell, 77 - 10 - 50 = 17
Keluaran
sumber
$x=random 30;1..30|%{' '*($x+=,-1*$x+,1*(29-$x)|random)+'.'|% *ht 30}
. 66 byte - 10 - 50 = 6 poin skorR, 107 karakter - 60 poin bonus = 47
i
adalah indeks titik.a
adalah array 30 spasi. Titik awal adalah acak (seragam dari 1 hingga 29). Pada setiap iterasi, kami secara acak menambahkan -1 atau +1 kei
dengan probabilitas tertimbang:i-1
untuk-1
dan29-i
untuk+1
(nilai yang diumpankan sebagai probabilitas tidak perlu dijumlahkan menjadi satu), artinya cenderung mengarahkan titik ke pusat sambil mencegahnya dari bawah 1 atau di atas 29 (karena probabilitasnya jatuh ke 0 dalam kedua kasus).Contoh dijalankan dengan
_
alih alih spasi untuk keterbacaan:sumber
i
dapat menjadi salah satu0
atau30
tidak?s(1:29,1)
dengans(29,1)
.C # 184 - 10 - 50 = 123
Keluaran
spacediganti dengan _untuk keterbacaan.
sumber
if...else if...else
akhir kode Anda. Selanjutnya, hasil Anda membuat saya ragu bahwa itu cenderung di tengah, tetapi kode Anda tampaknya benar.r.Next(30)<p?-1:1;
membuat hal itu terjadi. Tidak yakin Anda bisa mengecil denganif
pernyataan itu.switch
besar karena wajibbreak
/return
dan finalelse
membutuhkandefault:{}
kasus dan itu juga lama.p
nol, makap+=r.Next(30)<p?-1:1;
akan selalu mendapatkan 1, jadi tidak perlu untukif(p==0)
. Ditto untukp==29
.p
tidak akan pernah berusia 30 tahun, jadi Anda dapat menyingkirkannyaelse if
.PHP
Dengan bonus centering: 82 - 50 = 32
Untuk versi ini (versi lama di bawah), hapus pengecekan min / max seperti yang dijaga dalam kode pemusatan.
rand(1,28)
menjadi penting di sini karena memungkinkan untuk$i++
mendorong dirinya hingga 29 (maks aktual).sunting: tanda kurung yang tidak perlu, pindahkan kode pergeseran
Algoritma sederhana untuk pemusatan: menghasilkan angka baru antara 0 dan 29 dan membandingkannya dengan yang sekarang. Mengambil keuntungan dari "probabilitas" untuk mendapatkan angka di sisi yang lebih besar untuk menarik ke tengah.
Hasil aktual: (penomoran baris ditambahkan setelahnya)
Diarsipkan:
$i=rand(0,29);for($c=0;$c++<30;){($i<1?$j=1:($i>28?$j=28:$j=rand(0,29)));($j<$i?$i--:$i++);echo pack("A$i",'').".\n";}
119 karakter$i=rand(0,29);for($c=0;$c++<30;){($i<1?$i++:($i>28?$i--:(rand(0,29)<$i?$i--:$i++)));echo pack("A$i",'').".\n";}
112 karaktersumber
JavaScript ES6 125 - 10 (30 garis karakter) - 50 (bergeser ke tengah) = 65
Saya memiliki epiphany yang naik ke unit saya, jadi saya harus turun sebelum meninggalkan ingatan saya ...
Pengocokan posisi variabel yang sedikit dan sedikit kreativitas untuk menghitung probabilitas pergeseran yang ditunjukkan oleh
x/t
... (Terima kasih Kostronor untuk menunjukkannya!) Sekarang saya mendapatkan bonus -50 untuk pergeseran ke tengah, dan saya juga membuat posisi awal dalam jangkauan penuh garis, yang memungkinkan saya untuk mencukur dua byte!sumber
15+r()*2
mana bisa berupa apa saja mulai dari 15 hingga 16.9999999998 atau lebih yang dapat membulatkan off ke 17. tambahanx+=r()<.5?-1:1
melempar keacakan sedikit lebih dengan membawanya ke kisaran 14 hingga 18, jadi secara teknis angka acak yang berada dalam definisi apa yang diminta ... Dengan menekuk aturan itu, flip (+1, -1) dalam banyak kasus akan membawanya kembali ke tengah ...;)k, 53 - 10 - 50 = -7
Solusi 1
Pemakaian
Solusi 2
sumber
Scala, 95 - 10 = 85 byte
Saya masih memikirkan bonus 50 byte.
Penjelasan:
sumber
Javascript, 125 (135 - 10)
Komentar dan saran dipersilahkan.
sumber
JavaScript
114 karakter - 10 (garis 30 karakter) - 50 (tarik titik ke tengah) = 54
Namun, saya perhatikan bahwa hadiah 10 karakter untuk mengisi garis hingga 30 karakter mungkin merupakan transaksi yang buruk; begitu:
102 karakter - 50 (tarik titik ke tengah) = 52
Kudos to @WallyWest untuk conditional direction direction yang disederhanakan
f()>k/29?1:-1
, draft pertama saya menggunakan dua conditional bersarang.sumber
Racket 227 byte (-10 untuk 30 karakter, -50 untuk pergeseran ke garis tengah = 167)
Pada setiap langkah, titik dua kali lebih mungkin untuk bergerak ke garis tengah daripada menjauh darinya:
Tidak Terkumpul:
Pengujian:
Keluaran:
sumber