Titik bergeser

16

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('.');
    }
}
reggaemuffin
sumber
Dalam contoh Anda, saya pikir int i = (int)(Math.random()*30);seharusnya itu yang seharusnya int i = 1 + (int)(Math.random()*29);. Seperti, ia menghasilkan angka, 0 >= x > 30bukan 0 > x > 30.
Victor Stafusa
Saya pikir kode asli sudah benar.
pengguna2846289
itu benar, karena saya menggeser lebih dulu dan mencetak. jadi bahkan jika nilai acak melebihi batas, jika pertama kali akan benar dan kemudian mencetak.
reggaemuffin
@Kostronor Tetapi ini menyiratkan bahwa posisi titik awal tidak mengikuti distribusi yang seragam, posisi pertama dua kali lebih mungkin daripada posisi lain. OTOH, didistribusikan secara seragam bukanlah persyaratan juga.
Victor Stafusa
Sepertinya akan lebih sulit untuk membuat program di mana titik melompat lebih banyak. Jadi mengapa ada bonus untuk membatasi pergerakannya?
Chris Laplante

Jawaban:

18

APL, 39 - 10 - 50 = –21

0/{⎕←30↑'.',⍨⍵↑''⋄⍵+¯1*⍵>.5+?28}/31/?29

Diuji pada Dyalog dengan ⎕IO←1dan ⎕ML←3tetapi itu harus cukup portabel.

Penjelasan

                   ?29  take a random natural from 1 to 29
                31/     repeat it 31 times
              }/        reduce (right-fold) the list using the given function:
          ⍵↑''          . make a string of ⍵ (the function argument) spaces
     '.',⍨              . append a dot to its right
⎕←30↑                   . right-pad it with spaces up to length 30 and output
                ◇       . then
             ?28        . take a random natural from 1 to 28
          .5+           . add 0.5, giving a number ∊ (1.5 2.5 ... 27.5 28.5)
        ⍵>              . check whether the result is <⍵ (see explanation below)
     ¯1*                . raise -1 to the boolean result (0 1 become resp. 1 -1)
   ⍵+                   . add it to ⍵ and return it as the new accumulator value
0/{                     finally ignore the numeric result of the reduction

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/bhanyalah trik yang saya buat untuk mengulangi waktu fungsi a-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

0/{⎕←30↑'.',⍨⍵↑''⋄⍵+¯1*⍵>.5+?28}/31/?29
                   .          
                    .         
                   .          
                  .           
                 .            
                .             
               .              
                .             
               .              
                .             
               .              
              .               
             .                
              .               
             .                
              .               
               .              
              .               
               .              
                .             
                 .            
                  .           
                 .            
                  .           
                 .            
                  .           
                 .            
                .             
               .              
                .             
Tobia
sumber
apl adalah bahasa yang bagus untuk golf (sulit dibaca untuk saya); NAIK!
blabla999
@ blabla999 APL memiliki banyak simbol umum dan beberapa yang aneh, tetapi begitu Anda mempelajari fungsinya, bahasa tersebut mudah dibaca dan ditulis. Tentu saja lebih mudah daripada ASCII yang mengeluarkan bahasa 'golf', tapi saya berani mengatakan itu lebih mudah daripada bahasa biasa. Sintaksnya sangat teratur, Anda hanya memiliki satu aturan: ekspresi dieksekusi dari kanan ke kiri, sehingga mereka dapat dibaca dari kiri ke kanan: +/2×⍳9dibaca "jumlah: dua kali: naturals hingga 9" tetapi dieksekusi dengan cara yang berlawanan.
Tobia
Apakah saya atau ada 31 karakter per baris di sini?
Gusdor
Saya mendapatkan 30, baik dengan menyalin-paste baris dari contoh yang dijalankan di atas ke dalam editor, dan dengan memeriksa kode lagi. ⎕←30↑...akan mencetak 30 karakter plus baris baru, apa pun string yang ada...
Tobia
12

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

r = Range@28/28;
s = DiagonalMatrix;
ListPlot[RandomFunction[DiscreteMarkovProcess[RandomInteger@#, r~ s ~ -1 + s[29/28- r, 1]], 
                                              #], PlotRange -> #] &@{1, 29}

Beberapa output:

Grafik Mathematica

Matriks transisi yang saya gunakan adalah:

MatrixPlot[s[r, -1] + s[29/28 - r, 1]]

Grafik Mathematica

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 15kapan saja t mulai dari keadaan acak tertentu :

d = DiscreteMarkovProcess[RandomInteger@29, s[r, -1] + s[29/28 - r, 1]];
k[t_] := Probability[x[t] == 15, x \[Distributed] d]
ListLinePlot[Table[k[t], {t, 0, 50}], PlotRange -> All]

Grafik Mathematica

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 15setelah suatu waktu t?

d = DiscreteMarkovProcess[Array[1 &, 29]/29, s[r, -1] + s[29/28 - r, 1]];
k[t_] := Probability[x[t] == 15, x \[Distributed] d]
ListLinePlot[Table[k[t], {t, 0, 100}], PlotRange -> All]

Grafik Mathematica

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:

Grafik Mathematica

Dan Anda juga bisa meminta batas (dalam arti Cesaro) dari probabilitas negara:

ListLinePlot@First@MarkovProcessProperties[d, "LimitTransitionMatrix"]

Grafik Mathematica

Oh, well, mungkin saya pantas menerima beberapa downvotes untuk jawaban di luar topik. Merasa bebas.

Belisarius
sumber
2
Ini bukan yang terpendek tapi sangat keren.
Kasra Rahjerdi
Terpilih, dan sekarang skor Anda tidak lagi 2.222 ...
cormullion
@cullullion Terima kasih! Anda dapat membatalkannya dengan menurunkan :):
Dr. belisarius
7

Bash, skor 21 (81 byte - 50 bonus - 10 bonus)

o=$[RANDOM%28];for i in {D..a};{ printf " %$[o+=1-2*(RANDOM%29<o)]s.%$[28-o]s
";}

Dalam jawaban ini, titik "ditarik" kembali ke tengah. Ini dapat diuji dengan hardcoding titik awal pada 0 atau 30.

digital Trauma
sumber
Solusi bagus! Tapi tolong jangan hardcode titik awal;)
reggaemuffin
1
@Kostronor - oops - Saya melewatkannya, dan sekarang telah memperbaikinya.
Digital Trauma
2
simpan char dengan mengganti {1..30}oleh{P..m}
Geoff Reedy
Bagaimana jika oyang 1dan RANDOM%30kembali 0? Dan pada iterasi selanjutnya juga?
user2846289
@ Sadim - Saya pikir syarat batas sudah diperbaiki sekarang.
Trauma Digital
5

Ruby 69 66 64-60 = 4

i=rand(30);30.times{a=' '*30;a[i]=?.;puts a;i+=rand>i/29.0?1:-1}

Sampel:

            .             
           .              
            .             
           .              
          .               
           .              
            .             
             .            
              .           
             .            
              .           
               .          
              .           
               .          
              .           
             .            
            .             
             .            
              .           
             .            
              .           
             .            
            .             
             .            
            .             
             .            
            .             
           .              
          .               
           .              
fgp
sumber
Anda dapat menyimpan byte dengan i=rand 30;alih - alih i=rand(30);.
Jordan
5

Smalltalk, 161 159 145-60 = 85

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

p:=((r:=Random)next*29)rounded.(b:=String new:30)at:p+1put:$..0to:29do:[:i|b at:p+1put:$ .p:=(p+(((r next*29)-p)sign-1|1))min:29max:0.b at:p+1put:$..b printCR]

mencuri sebuah ide dari versi Ruby (thanx & Up @fipgr), saya dapat menghilangkan pemeriksaan min / max:

p:=((r:=Random)next*29)rounded.(b:=String new:30)at:p+1put:$..1to:30 do:[:i|b at:p+1put:$ .p:=p+((r next-(p/29))sign-1|1).b at:p+1put:$.;printCR]

output: (Saya telah secara manual menambahkan col-number dan bar vertikal setelahnya; kode di atas tidak menghasilkan mereka)

 012345678901234567890123456789
|                     .        |
|                    .         |
|                   .          |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                .             |
|                 .            |
|                .             |
|               .              |
|                .             |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                .             |
|               .              |
|                .             |
|               .              |
|                .             |
|               .              |
|              .               |
|               .              |
|              .               |
 012345678901234567890123456789
blabla999
sumber
4

C, 86

Dengan asumsi bahwa penyemaian rand()fungsi tidak diperlukan.

k=30;main(i){i=rand()%k;while(k--){printf("%*c\n",i+=i==30?-1:i==1||rand()%2?1:-1,46);}}

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 adalah i+=i==30?-1:i==1||rand()%2?1:-1. The csarana 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.

pengguna12205
sumber
Bisakah Anda memperluas apa yang terjadi dalam kode Anda? Saya mengalami kesulitan memahami bagaimana 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.)
Decab Dabbler
@fireeyedboy selesai, harap Anda mengerti :)
user12205
Aaaah, aku agak merasa kamu selingkuh sedikit di sana. ;-) Tapi sisanya jelas sekarang. Terima kasih! Dan solusi yang bagus! Apakah C juga memiliki perilaku aneh rand()%2karena sangat mudah ditebak (ganjil / genap)? Saya mencoba Anda rand()%2dalam solusi PHP saya, dan menunjukkan perilaku yang sangat mudah ditebak ini (tidak seperti rand(0,1)PHP. Karena PHP banyak menggunakan perpustakaan C (jika saya benar) saya bertanya-tanya apakah program C Anda memiliki 'cacat' yang sama .
Layak amatir
@fireeyedboy Saya tidak melakukan seeding pada rand()fungsinya. Dalam C jika rand()tidak diunggulkan secara eksplisit, selalu menggunakan benih yang sama setiap kali. Itu sebabnya bisa diprediksi. Jika saya harus srand(time());
menaburnya
Tetapi apakah itu bisa ditebak sehingga beralih dari aneh ke genap pada setiap panggilan berikutnya juga? Klaim PHP rand()tidak perlu diunggulkan srand()lagi, tetapi masih menunjukkan perilaku aneh ini .
Decent Dabbler
4

Jawa: 204 183 182 176 175 karakter - 10 - 50 = 115

class K{public static void main(String[]y){int k,j=0,i=(int)(29*Math.random());for(;j++<30;i+=Math.random()*28<i?-1:1)for(k=0;k<31;k++)System.out.print(k>29?10:k==i?'.':32);}}

Pertama, 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]:

i=(int)(29*Math.random());

Saya pribadi lebih suka jika biasanya didistribusikan sekitar 14, tetapi jawaban saya akan lebih lama:

i=0;for(;j<29;j++)i+=(int)(2*Math.random());

Kedua, kode ini memastikan bahwa ia cenderung berada di tengah:

i+=Math.random()*28<i?-1:1

Probabilitas untuk mendapatkan +1 lebih besar karena nilai yang lebih kecil i, dan kami memiliki kebalikan dari -1. Jika i0, probabilitas mendapatkan +1 adalah 100% dan probabilitas mendapatkan -1 adalah 0%. Jika i28, kebalikan dari itu akan terjadi.

Ketiga, dengan mengganti 32di 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.

Victor Stafusa
sumber
Tetapi iuntuk 0menjadi ilegal, bukan?
pengguna2846289
@ Sadim, bagi saya iberada 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].
Victor Stafusa
"Jumlah spasi adalah posisi x dari titik Anda yang ditentukan dengan 0 <x <30" Yaitu jumlah ruang (atau posisi titik berbasis 0) adalah 1..29. itidak mungkin 0. Saya mengerti ini semua tentang bersenang-senang tapi tetap saja menyedihkan.
pengguna2846289
@ Sadim, Oh, terima kasih. Tetap. Ini berarti bahwa titik tidak akan pernah berada di posisi paling kanan, tetapi bagaimanapun, itulah yang ditentukan.
Victor Stafusa
Maaf, tapi itu tidak memperbaiki apa pun. Bayangkan imendapat 1awalnya, dan pada iterasi pertama Math.random()adalah 0, kemudian imendapat 0. 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?
user2846289
3

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.

f@c_ := Switch[d = RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c, 1, 2, 30, 29, d, d]
Row@ReplacePart[Array["_" &, 29], # -> "."] & /@ NestList[f, RandomInteger@29+1, 30] // TableForm

dot

DavidC
sumber
Penggunaan yang bagus dariRandomChoice[]
Dr. belisarius
3

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

1v        >a"                              "v
v<      0<} vooooooooooooooooooooooooooooooo<
&  _>   v : >$" "@p1+:2f*(?v;
  |x1>  v^}!               <
  |xx2> v p
  |xxx3>v  
  |xxxx4v $
>!|xxx< v }
  |xxxx6v }
  |xxx7>v @
  |xx8> v :
  |x9v  < @>  5)?v$:67*)?vv
   _>>&?v!@^     >$:b(?v v
  v }"."< :        v+ 1<  <
  >a+b+00}^0}}${"."< <- 1<

Nama bahasa ini tidak dapat di-Google, jadi inilah artikel esolang untuk yang penasaran.

SirCxyrtyx
sumber
Bisakah Anda membuat kode persyaratan untuk -50 dalam waktu kurang dari 50 karakter?
Victor Stafusa
1
@ Viktor Mungkin, tetapi> <> adalah rasa sakit yang hebat untuk dikodekan (rasa sakit raksasa yang menyenangkan), jadi saya perlu istirahat darinya.
SirCxyrtyx
@ SirCxyrtyx ini membuat saya tertawa. Pak golf dengan baik.
Gusdor
3

PHP, 118 113 112 111 (, -10 poin bonus = 101)

(percobaan kedua, dengan rand()perilaku yang dapat diprediksi mengerikan , dan sedikit lebih efisien)

for($n=30,$i=rand(1,29),$t=$s=pack("A$n",'');$n--;$i+=$i<2|rand()%2&$i<28?1:-1,$t=$s){$t[$i-1]='.';echo"$t\n";}

Hasil yang mungkin:

______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________

PHP, 130 (, -10 poin bonus = 120)

(percobaan pertama)

Ini mungkin masih bisa jauh lebih efisien:

for($n=30,$i=rand(1,29),$t=$s=str_repeat(' ',$n)."\n";$n--;$i=$i<2?2:($i>28?28:(rand(0,1)?$i+1:$i-1)),$t=$s){$t[$i-1]='.';echo$t;}

Jika saya mengganti ruang dengan garis bawah (untuk tujuan tampilan), ini adalah hasil yang mungkin:

________._____________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
______._______________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_______.______________________
______._______________________
_____.________________________
____._________________________
_____.________________________
____._________________________
___.__________________________

Anehnya, jika saya ganti rand(0,1)dengan rand()%2(PHP 5.4, pada Windows XP), hasil acak selalu beralih dari ganjil menjadi genap, dan sebaliknya, pada setiap iterasi berikutnya, membuat rand()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.

Dabbler yang Layak
sumber
3

J 42 karakter - 50 -10 = -18

'_.'{~(|.~((I.%<:@#)*@-?@0:))^:(<@#)1=?~30

Penjelasan, mulai dari kanan (beberapa pengetahuan tentang kereta berguna):

init=: 0=?~30          NB. where is the 0 in the random permutation of [0,29]
rep =: ^:(<@#)         NB. repeat as many times as the array is long, showing each step

rnd =: ?@0:            NB. discards input, generates a random number between 0 and 1

signdiff =: *@-        NB. sign of the difference (because this works nicely with
                       NB. the shift later on).

left_prob =: (I.%<:@#) NB. probability of shifting left. The position of the one (I.) divided by the length -1.

shift =: |.~           NB. x shift y , shifts x by y positions to the left.

output =: {&'_.'       NB. for selecting the dots and bars.

NB. Piecing things together:
output (shift (left_prob signdiff rnd))rep init

Kecenderungan tengah, -50, contoh lebih dari 1000 berjalan:

NB. Amounts of ones in each column (sum)
   ]a=:+/ (|.~((I.%<:@#)*@-?@0:))^:(<1000)0=?30
0 0 0 0 0 0 2 6 10 12 25 60 95 121 145 161 148 99 49 27 19 13 6 1 1 0 0 0 0 0
   +/a NB. check the number of ones in total
1000
   |. |:(<.a%10) #"0 1] '*' NB. plot of those values
           *              
           *              
          ***             
          ***             
         ****             
         ****             
         ****             
        ******            
        ******            
        ******            
       *******            
       *******            
       ********           
       ********           
      **********          
    **************        

Contoh dijalankan, menghasilkan tepat 30 byte setiap baris

_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________
_____________.________________
____________._________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________
jpjacobs
sumber
Solusi yang sangat bagus!
reggaemuffin
Tantangan yang sangat bagus juga!
jpjacobs
3

Python 2.7: 126 109 -10-50 = 49

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

from random import randint as r;p=r(0,29)
for i in range(30):
 print' '*p+'.'+' '*(29-p);p+=(-1)**(r(0,29)<p)

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:

from random import choice;p,l=15,[]
for i in range(30):
 q=29-p;l+=[' '*p+'.'+' '*q];p+=choice([1]*q+[-1]*p)
print'\n'.join(l)
psion5mx
sumber
Semua forloop Anda dapat berada dalam satu baris, tetapi lebih baik lagi for i in[0]*30:dan lebih baik lagi eval"..."*30.
mbomb007
2

Java - 198 183 karakter

Ini hanyalah contoh sederhana, langsung, dan tidak kreatif dari contoh yang Anda berikan dalam pertanyaan.

class A{public static void main(String[]y){int c,j,i=(int)(Math.random()*30);for(c=30;c>0;c--)for(j=i+=i<2?1:i>28?-1:Math.random()>0.5?1:-1;j>=0;j--)System.out.print(j>0?" ":".\n");}}
Victor Stafusa
sumber
2

Batch - (288 Bytes - 10) 278

@echo off&setlocal enabledelayedexpansion&set/ap=%random%*30/32768+1&for /l %%b in (1,1,30)do (set/ar=!random!%%2&if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !p! LSS 30 (set/ap+=1)else set/ap-=1
for /l %%c in (1,1,30)do if %%c==!p! (set/p"=."<nul)else set/p"=_"<nul
echo.)

Tidak golf:

@echo off
setlocal enabledelayedexpansion
set /a p=%random%*30/32768+1
for /l %%b in (1,1,30) do (
    set /a r=!random!%%2
    if !r!==1 (
        if !p! GTR 1 (set /a p-=1) else set /a p+=1
    ) else if !p! LSS 30 (set /a p+=1) else set /a p-=1
    for /l %%c in (1,1,30) do if %%c==!p! (set /p "=."<nul) else set /p "=_"<nul
    echo.
)

Untuk menghasilkan spasi, bukan garis bawah - 372 Bytes -

@echo off&setlocal enabledelayedexpansion&for /f %%A in ('"prompt $H &echo on&for %%B in (1)do rem"')do set B=%%A
set/ap=%random%*30/32768+1&for /l %%b in (1,1,30)do (set/ar=!random!*2/32768+1&if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !p! LSS 30 (set/ap+=1)else set/ap-=1
for /l %%c in (1,1,30)do if %%c==!p! (set/p"=."<nul)else set/p"=.%B% "<nul
echo.)

Mencari bantuan dengan logika berikut, tentunya ini bukan metode yang paling efisien ruang (! R! Akan diperluas menjadi 1 atau 2) -

if !r!==1 (
    if !p! GTR 1 (set /a p-=1) else set /a p+=1
) else if !p! LSS 30 (set /a p+=1) else set /a p-=1

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

hapus clemeat
sumber
2

J, 42 karakter, tidak ada bonus

' .'{~(i.30)=/~29<.0>.+/\(-0&=)?(,2#~<:)30

Contoh dijalankan:

          ' .'{~(i.30)=/~29<.0>.+/\(-0&=)?(,2#~<:)30
                       .
                      .
                     .
                      .
                     .
                      .
                     .
                      .
                       .
                      .
                     .
                    .
                     .
                    .
                     .
                    .
                     .
                      .
                       .
                        .
                       .
                        .
                       .
                      .
                     .
                      .
                       .
                      .
                     .
                    .
Gareth
sumber
2

Python 2.7 (126 - 10 (panjang fix) - 50 (Tendensi Tengah) = 66)

Program berikut memiliki kecenderungan pusat terhadap sampel yang lebih besar

s=id(9)%30
for e in ([[0,2][s>15]]*abs(s-15)+map(lambda e:ord(e)%2*2,os.urandom(30)))[:30]:
    s+=1-e;print" "*s+"."+" "*(28-s)

Demo

         .           
        .            
       .             
      .              
     .               
      .              
       .             
        .            
         .           
          .          
           .         
          .          
           .         
          .          
         .           
        .            
       .             
        .            
       .             
      .              
     .               
      .              
       .             
      .              
     .               
    .                
   .                 
    .                
   .                 
    .              
Abhijit
sumber
Seperti s = id (9)% 30 untuk seeding. os perlu mengimpor, sih? Dan apakah ini mencakup rentang 1-30 penuh? Oh, tunggu ... * baca kembali ketidaksetaraan di atas halaman *
psion5mx
2

Javascript 125 73 72 60 (120 - 50 - 10)

i=0;r=Math.random;s=r()*30|0;do{a=Array(30);a[s=s>28?28:s?r()<s/30?s-1:s+1:1]='.';console.log(a.join(' '))}while(++i<30)

EDIT: Perbaiki untuk bonus 50 poin dan bonus 10 poin.

EDIT 2: Lebih singkat lagi!

aebabis
sumber
dapatkah Anda menjelaskan, di mana Anda mendapatkan bonus 50 poin? Saya tidak mengerti saat ini ...
reggaemuffin
@Kostronor Saya baru saja melihat hasil edit untuk persyaratan. Sepertinya saya belum mendapatkan 50 poin.
aebabis
@acbabis, bagus sekali! Anda dapat menyimpan beberapa byte (116):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(' '))}
Michael M.
@Michael Terima kasih atas tipsnya. Namun, tidak bisa mendapatkan array init di dalam forworking; harus menggunakan do sementara.
aebabis
2

D - 167, 162, 144 (154 - 10)

Golf :

import std.stdio,std.random;void main(){int i=uniform(1,30),j,k;for(;k<30;++k){char[30]c;c[i]='.';c.writeln;j=uniform(0,2);i+=i==29?-1:i==0?1:j==1?1:-1;}}

Tidak golf :

import std.stdio, std.random;

void main()
{
    int i = uniform( 1, 30 ), j, k;

    for(; k < 30; ++k )
    {
        char[30] c;
        c[i] = '.';
        c.writeln;
        j = uniform( 0, 2 );
        i += i == 29 ? -1 : i == 0 ? 1 : j == 1 ? 1 : -1;
    }
}

EDIT 1 - Saya tidak yakin apakah kode saya memenuhi syarat untuk bonus -50 atau tidak. itidak selalu memulai di tengah, tetapi selama forlingkaran, dot tidak pernah bergerak lebih dari seperti 3 tempat kedua arah, jadi ketika i 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.

Tony Ellis
sumber
karena mencetak array 29 karakter diikuti oleh LF - Ini harus 30 karakter diikuti oleh LF.
Victor Stafusa
@ Viktor ahh, terima kasih atas koreksinya, saya salah mengartikan pos utama.
Tony Ellis
2

PowerShell, 77 - 10 - 50 = 17

$x=random 30
1..30|%{$x+=random(@(-1)*$x+@(1)*(29-$x))
'_'*$x+'.'+'_'*(29-$x)}

Keluaran

_.____________________________
__.___________________________
___.__________________________
____._________________________
___.__________________________
____._________________________
_____.________________________
______._______________________
_______.______________________
______._______________________
_____.________________________
______._______________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
___________.__________________
__________.___________________
_________.____________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_________.____________________
__________.___________________
Berasal
sumber
Acak pintar. Anda dapat menggunakan versi golf $x=random 30;1..30|%{' '*($x+=,-1*$x+,1*(29-$x)|random)+'.'|% *ht 30}. 66 byte - 10 - 50 = 6 poin skor
mazzy
2

R, 107 karakter - 60 poin bonus = 47

s=sample;i=s(29,1);for(j in 1:30){a=rep(' ',30);i=i+s(c(-1,1),1,p=c(i-1,29-i));a[i]='.';cat(a,'\n',sep='')}

iadalah indeks titik. aadalah array 30 spasi. Titik awal adalah acak (seragam dari 1 hingga 29). Pada setiap iterasi, kami secara acak menambahkan -1 atau +1 ke idengan probabilitas tertimbang: i-1untuk -1dan29-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:

> s=sample;i=s(1:30,1);for(j in 1:30){a=rep('_',30);i=i+s(c(-1,1),1,p=c(i-1,29-i));a[i]='.';cat(a,'\n',sep='')}
_______________________.______
______________________._______
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
____________________._________
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
____________________._________
___________________.__________
____________________._________
___________________.__________
__________________.___________
_________________.____________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________
plannapus
sumber
Jika saya tidak salah membaca kode Anda, i dapat menjadi salah satu 0atau 30tidak?
user2846289
Ya Anda benar, bisa 30 (tidak lebih), saya akan mengubahnya.
plannapus
1
Sudah diperbaiki sekarang. Probabilitas untuk beralih dari 1 ke 0 atau pergi dari 29 menjadi 30 sekarang menjadi 0. Titik awal acak sekarang antara 1 dan 29.
plannapus
Petunjuk: Anda dapat menyimpan 2 karakter lebih banyak dengan menggantinya s(1:29,1)dengan s(29,1).
Sven Hohenstein
@Venvenohenstein kau benar, aku selalu lupa tentang itu
plannapus
2

C # 184 - 10 - 50 = 123

using System;namespace d{class P{static void Main(){var r=new Random();int p=r.Next(30);for(int i=0;i<30;i++){Console.WriteLine(".".PadLeft(p+1).PadRight(29));p+=r.Next(30)<p?-1:1;}}}}

Keluaran

spacediganti dengan _untuk keterbacaan.

____________.________________
___________._________________
__________.__________________
___________._________________
____________.________________
_____________._______________
______________.______________
_____________._______________
______________.______________
_______________._____________
______________.______________
_______________._____________
______________.______________
_______________._____________
______________.______________
_____________._______________
____________.________________
___________._________________
____________.________________
_____________._______________
______________.______________
_____________._______________
____________.________________
___________._________________
____________.________________
___________._________________
____________.________________
___________._________________
__________.__________________
___________._________________
Gusdor
sumber
Saya cukup yakin bahwa mungkin untuk mendapatkan kode yang lebih kecil di if...else if...elseakhir kode Anda. Selanjutnya, hasil Anda membuat saya ragu bahwa itu cenderung di tengah, tetapi kode Anda tampaknya benar.
Victor Stafusa
Lupa memperbarui output ketika saya mengedit kode. The r.Next(30)<p?-1:1;membuat hal itu terjadi. Tidak yakin Anda bisa mengecil dengan ifpernyataan itu. switchbesar karena wajib break/ returndan final elsemembutuhkan default:{}kasus dan itu juga lama.
Gusdor
@ Viktor, terima kasih atas masukannya. saya melakukan beberapa pengeditan.
Gusdor
Jika pnol, maka p+=r.Next(30)<p?-1:1;akan selalu mendapatkan 1, jadi tidak perlu untuk if(p==0). Ditto untuk p==29. ptidak akan pernah berusia 30 tahun, jadi Anda dapat menyingkirkannya else if.
Victor Stafusa
@ Viktor grand. saya akan melakukan perubahan itu. Ta.
Gusdor
1

PHP

Dengan bonus centering: 82 - 50 = 32

$i=rand(0,29);for($c=0;$c++<30;rand(0,28)<$i?$i--:$i++)echo pack("A$i",'').".\n";

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)

01|        .
02|       .
03|        .
04|         .
05|          .
06|           .
07|            .
08|           .
09|            .
10|             .
11|              .
12|             .
13|            .
14|             .
15|            .
16|             .
17|            .
18|             .
19|              .
20|               .
21|              .
22|             .
23|              .
24|               .
25|                .
26|               .
27|                .
28|                 .
29|                .
30|               .

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 karakter

Yoda
sumber
Saya sedikit terkesan bahwa saya mencukur 49 karakter sejak versi pertama saya ...
Yoda
mencukur 44 karakter sekarang. Yang pasti 39 kali terakhir.
Yoda
1

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

z=(j=Array(t=29).join`_`)+"."+j;x=(r=Math.random)()*t;for(i=30;i--;)console.log(z.substr(x=(x+=r()<x/t?-1:1)>t?t:x<0?0:x,30))

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!

....5....0....5....0....5....0 <-- Ruler
_.____________________________
__.___________________________
___.__________________________
__.___________________________
___.__________________________
__.___________________________
_.____________________________
__.___________________________
___.__________________________
__.___________________________
___.__________________________
____._________________________
_____.________________________
______._______________________
_______.______________________
________._____________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________
WallyWest
sumber
Bukankah keacakan posisi titik awal di sini terbatas pada 2 atau 3 kemungkinan? Dan itulah yang menjaga titik di tengah (karena jumlah berjalan sangat pendek = 30) dan karenanya bernilai -50?
user2846289
Mengutip teks OP : "Program Anda dimulai dengan posisi x acak dan setiap belokan menggeser posisi ini secara acak dengan 1 ke kiri atau ke kanan" Kode saya awalnya didefinisikan di 15+r()*2mana bisa berupa apa saja mulai dari 15 hingga 16.9999999998 atau lebih yang dapat membulatkan off ke 17. tambahan x+=r()<.5?-1:1melempar 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 ...;)
WallyWest
Nah, pada hal acak, Anda mendapatkan saya ... Itu dimaksudkan untuk menjadi 'posisi acak dari semua posisi yang mungkin' tetapi itu memberi Anda tidak banyak keuntungan, karena 50 poin jelas tidak berlaku! Baca kembali penjelasan tentang bonus ini, 0,5 persen tetap tidak mengerti!
reggaemuffin
Poin yang valid, saya akan mengulang skor saya sesuai ...
WallyWest
@Kostonor Code diperbarui dengan solusi yang tepat, skor diperbarui sesuai!
WallyWest
1

k, 53 - 10 - 50 = -7

Solusi 1

{{a:30#" ";a[x]:".";a}'{x+$[*x<1?!30;1;-1]}\[x;*1?x]}

Pemakaian

{{a:30#" ";a[x]:".";a}'{x+$[*x<1?!30;1;-1]}\[x;*1?x]}30

"      .                       "
"       .                      "
"      .                       "
"       .                      "
"      .                       "
"       .                      "
"        .                     "
"         .                    "
"        .                     "
"         .                    "
"        .                     "
"         .                    "
"          .                   "
"           .                  "
"            .                 "
"             .                "
"              .               "
"               .              "
"              .               "
"             .                "
"            .                 "
"           .                  "
"          .                   "
"         .                    "
"        .                     "
"       .                      "
"        .                     "
"         .                    "
"          .                   "
"         .                    "
"          .                   "

Solusi 2

{r::x;{a:r#" ";a[x]:".";a}'{a:r#0b;a[x?r]:1b;x+$[a@*1?r;-1;1]}\[x;*1?x]}[30]
nyi
sumber
1

Scala, 95 - 10 = 85 byte

def r=math.random
Seq.iterate(r*30,30){n=>println(("#"*30)updated(n.toInt,'.'))
(r*2-1+n)round}

Saya masih memikirkan bonus 50 byte.

Penjelasan:

def r=math.random //define a shortcut for math.random, which returns a number 0 <= n < 1
Seq.iterate(      //build a sequence,
  r*30,             //starting with a random number bewteen 0 and 29
  30                //and containing 30 elements.
){n=>             //Calculate each element by applying this function to the previous element
  println(        //print...
    (" "*30)             //30 spaces
    updated(n.toInt,'.') //with the n-th char replaced with a dot
  )               //and a newline.
                  //The next element is
  (r*2-1+n)       //an random number between -1 and 1 plus n
  round           //rounded to the nearest integer.
}
corvus_192
sumber
1

Javascript, 125 (135 - 10)

q=Math.random,p=~~(q()*31)+1;for(i=0;i++<30;){s='',d=j=1;for(;j++<31;)s+=j==p?'.':" ";p+=q()<.5?1:-1;p-=p>28?2:p<2?-2:0;console.log(s)}

Komentar dan saran dipersilahkan.

Gaurang Tandon
sumber
Sayangnya, solusi Anda tidak memenuhi syarat, bandingkan output Anda dengan output dari solusi lain. Geser titik dengan satu karakter.
reggaemuffin
@Kostronor Oh! oh! Saya mohon maaf! Saya lupa membaca bagian dari pertanyaan itu! Saya akan mencoba mengembangkan versi baru segera. Terima kasih telah menunjukkan!
Gaurang Tandon
@Kostronor Program diedit.
Gaurang Tandon
1

JavaScript

114 karakter - 10 (garis 30 karakter) - 50 (tarik titik ke tengah) = 54

for(f=Math.random,a=[],i=30,j=k=f()*i|0;i--;a[j]='.',a[j+=29-k]='\n',j+=k+=f()>k/29?1:-1);console.log(a.join('-'))

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

for(f=Math.random,a=[],i=30,j=k=f()*i|0;i;i--,a[j]='.\n',j+=k+=f()>k/29?1:-1);console.log(a.join('-'))

Kudos to @WallyWest untuk conditional direction direction yang disederhanakan f()>k/29?1:-1, draft pertama saya menggunakan dua conditional bersarang.

codeporn
sumber
1

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:

(let lp((r(random 1 31))(c 0)(g(λ(n)(make-string n #\space))))(set! r
(cond[(< r 1)1][(> r 30)30][else r]))(printf"~a~a~a~n"(g r)"*"(g(- 29 r)))
(when(< c 30)(lp(+ r(first(shuffle(if(> r 15)'(-1 -1 1)'(1 1 -1)))))(add1 c)g)))

Tidak Terkumpul:

(define (f)
    (let loop ((r (random 1 31))
               (c 0)
               (g (λ (n) (make-string n #\space))))
      (set! r (cond
                [(< r 1) 1]
                [(> r 30) 30]
                [else r] ))
      (printf "~a~a~a~n" (g r) "*" (g (- 29 r)))
      (when (< c 30)
        (loop (+ r
                 (first
                  (shuffle
                   (if (> r 15)
                       '(-1 -1 1)
                       '(1 1 -1)))))
              (add1 c)
              g))))

Pengujian:

(println "012345678901234567890123456789")
(f)

Keluaran:

"012345678901234567890123456789"
                       *       
                      *        
                       *       
                        *      
                         *     
                        *      
                       *       
                      *        
                     *         
                      *        
                     *         
                    *          
                     *         
                      *        
                     *         
                    *          
                   *           
                  *            
                 *             
                *              
               *               
                *              
                 *             
                *              
                 *             
                *              
                 *             
                *              
                 *             
                *              
               *               
juga
sumber
Solusi bagus! Racket sangat menarik. Anda dapat memberi diri Anda sendiri 50 poin bonus dan memeriksa apakah Anda mengajukan 10 tambahan :-)
reggaemuffin