Değişen nokta


16

Programınızın bir dizi boşluk ve ardından bir nokta ve bir yeni satır yazdırması gerekir. Boşluk sayısı, noktanızın 0 <x <30 ile tanımlanan x konumudur

Her yeni çizgi bir dönüş. Programınız 30 tur boyunca çalışır. Programınız rastgele bir x konumu ile başlar ve her tur tanımlanan konumun içinde kalırken bu konumu rastgele 1 sola veya sağa kaydırır. Noktanızın her dönüşü konumunu 1 değiştirmek zorundadır.

Puanınız karakter sayısıdır. Yazdırılan her satır tam olarak 30 karakterden (ve yeni satırdan) oluşuyorsa 10 bonus puanı kazanırsınız. Programınız tanımlanan alanın ortasında kalma eğilimindeyse, 50 bonus puanı kazanırsınız.

Düzenleme: 50 bonus puanı, noktanızı ortaya çekmek için tasarlanmıştır. Örneğin, noktanız x = 20 ise ve% 66 sola gitme ve% 33 sağa gitme şansına sahipse bu geçerlidir. Bu başlangıç ​​noktasından bağımsız olmalıdır ve sadece sol / sağ yüzde değerini dinamik olarak değiştirerek gerçekleşmelidir.

Hiçbir girişe izin verilmez, çıkış yürütme konsolunda olmalıdır!

Daha iyi anlamak için, Java'da size 723 puanı verecek okunabilir bir örnek:

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('.');
    }
}

Örneğinizde, bunun yerine int i = (int)(Math.random()*30);olması gerektiğini düşünüyorum int i = 1 + (int)(Math.random()*29);. Olduğu gibi, bunun 0 >= x > 30yerine bir sayı üretir 0 > x > 30.
Victor Stafusa

Orijinal kodun doğru olduğunu düşünüyorum.
user2846289

bu doğru, çünkü ben önce ve baskıyı kaydırıyorum. böylece rastgele değer sınırı aşsa bile, önce düzelir ve sonra yazdırır.
reggaemuffin

@Kostronor Ancak bu, başlangıç ​​noktası konumunun düzgün bir dağılımı takip etmediğini, ilk konumun muhtemelen diğer konumlardan iki kat daha fazla olduğunu ima eder. Aynı şekilde dağıtılan OTOH da bir gereklilik değildi.
Victor Stafusa

Noktanın daha fazla atladığı bir program oluşturmak daha zor gibi görünüyor. Öyleyse neden hareketini kısıtlamak için bir bonus var?
Chris Laplante

Yanıtlar:


18

APL, 39-10-50 = –21

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

İle Dyalog üzerinde test edildi ⎕IO←1 ve ⎕ML←3oldukça taşınabilir olmalı.

açıklama

                   ?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

Her adımda, bu kod (1.5 2.5 ... 27.5 28.5) arasından seçilen rastgele bir sayının geçerli nokta konumundan daha az olma olasılığına bağlı olarak noktayı sola veya sağa hareket ettirmeye karar verir.

Bu nedenle, geçerli nokta konumu (soldaki boşluk sayısı) 1 olduğunda, artış daima +1'dir (bu 1,5 ... 28,5 sayılarının tümü> 1'dir), 29 olduğunda her zaman -1'dir (bu sayıların tümü) <29); Aksi takdirde, +1 ile -1 arasında rastgele seçilir, bu uçlar arasında doğrusal enterpolasyon olasılığı vardır. Bu yüzden nokta her zaman hareket eder ve her zaman merkeze doğru yanlara göre hareket etme olasılığı daha yüksektir. Tam ortadaysa, her iki tarafa da% 50 şansı vardır.

Çoğaltılmış bir değerin azaltılması (sağ katlama), bir {...}/a/bişlev a-1sürelerini tekrarlamak için bulduğum bir hile , değerle başlayıp bher yinelemenin sonucunun bir sonraki akümülatör ( ) argümanı olması. İkinci ve sonraki girdi argümanları ( ) ile nihai sonuç yok sayılır. Bekçi ile düzenli bir yinelemeli çağrıdan çok daha kısa olduğu ortaya çıkıyor.

Örnek çalışma

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

apl golf için harika bir dildir (benim için okumak zor olsa da); UP!
blabla999

@ blabla999 APL'nin birçok ortak sembolü ve bazı garip sembolleri vardır, ancak işlevlerini öğrendikten sonra dilin okunması ve yazılması kolaydır. Kesinlikle daha kolay 'golf' dillerin ASCII gürültü, ama normal dillerden daha kolay olduğunu söylemeye cesaret ediyorum. Sözdizimi çok düzenli, sadece bir kuralınız var: ifadeler sağdan sola yürütülür, böylece soldan sağa +/2×⍳9okunabilir: "toplamı: iki kez: 9'a kadar doğal" okunur, ancak tersine idam.
Tobia

Burada mıyım yoksa her satırda 31 karakter var mı?
Gusdor

30'u alıyorum, hem yukarıdaki örnekte yer alan bir satırı kopyalayıp bir düzenleyiciye yapıştırarak hem de kodu tekrar kontrol ederek. ⎕←30↑...hangi dize olursa olsun, 30 karakter artı bir yeni satır yazdıracaktır...
Tobia

12

Mathematica 138-10-50 = 78

Bunu çok iyi golf oynadığını düşünüyorum, çünkü başka nedenlerle. Topu "ortalamak" için tasarlanmış bir geçiş matrisine sahip bir Markov Process tanımı kullanır .

Mathematica'da bir Markov işleminin kullanılması, aşağıda göreceğiniz gibi bazı yararlı istatistikleri hesaplamamızı sağlar .

Önce kod (boşluk gerekli değildir):

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

Bazı çıktılar:

Mathematica graphics

Kullandığım geçiş matrisi:

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

Mathematica graphics

Ama dediğim gibi ilginç olan nokta, kullanımın DiscreteMarkovProcess[]olup bitenler hakkında iyi bir resim çekmemize izin vermesidir.

Topun belirli bir rastgele durumdan başlayarak15 herhangi bir zamanda olma olasılığını görelim :t

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]

Mathematica graphics

0 ile 0.3 arasında bir değerde dalgalandığını görebilirsiniz, çünkü başlangıç ​​durumuna bağlı olarak sadece tek veya çift sayıda adımda 15'e ulaşabilirsiniz :)

Şimdi aynı şeyi yapabiliriz, ancak Mathematica'ya olası tüm başlangıç ​​durumlarından başlayarak istatistiği düşünmesini söyleriz. En olmanın olasılığı nedir 15bir süre sonra 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]

Mathematica graphics

Salındığını da görebilirsiniz ... neden? Cevap basit: aralıkta [1, 29]çift ​​sayılardan daha garip var :)

Topun şu anda olma olasılığını sorarsak, salınım neredeyse bitmiştir 14 OR 15:

Mathematica graphics

Ayrıca devlet olasılıklarının sınırını da (Cesaro anlamda) isteyebilirsiniz:

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

Mathematica graphics

Oh, belki de konu dışı bir cevap için bazı iniş çıkışları hak ediyorum. Çekinmeyin.


2
Bu en kısa değil ama gerçekten harika.
Kasra Rahjerdi

Oy verildi ve skorunuz artık 2.222 ...
cormullion

@cormullion Teşekkürler! Bunu sert indirerek geri alabilirsiniz :)
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
";}

Bu cevapta, nokta ortaya geri "çekilir". Bu, başlangıç ​​noktasının 0 veya 30'da kodlanmasıyla test edilebilir.


Güzel çözüm! Ancak lütfen başlangıç ​​noktasını
kodlamayın

1
@Kostronor - ayy - bunu özledim ve şimdi düzelttim.
Dijital Travma

2
değiştirerek Bir karakterin kaydetmek {1..30}tarafından{P..m}
Geoff Reedy

Ya oolduğunu 1ve RANDOM%30döner 0? Ve bir sonraki yinelemede de mi?
user2846289

@VadimR - Sanırım sınır koşulları şimdi düzeltildi.
Dijital Travma

5

Yakut 69 66 64-60 = 4

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

Örneklem:

            .             
           .              
            .             
           .              
          .               
           .              
            .             
             .            
              .           
             .            
              .           
               .          
              .           
               .          
              .           
             .            
            .             
             .            
              .           
             .            
              .           
             .            
            .             
             .            
            .             
             .            
            .             
           .              
          .               
           .              

Sen bir byte kaydedebilirsiniz i=rand 30;yerine i=rand(30);.
Ürdün

5

Smalltalk, 161 159 145-60 = 85

tüm sütunlar 30 karakter uzunluğundadır (değiştirilebilir dizge b'de çalışır);

rasgele hareket şansı, p (rnd (0..29) -p) ile rnd değerine ağırlık vererek, (-1/0/1) işaretini alarak ve (-1 | 1), hareket deltası olarak alınır (etkili bir şekilde hesaplar: x işareti <= 0 ifTrue: -1 ifFalse: 1). ST 1 tabanlı indeksleme kullandığından, tüm dize ref'leri +1 ile ayarlamak zorundayım (plz -1 | 1 bit fiddling kesmek ;-) takdir).

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]

Ruby sürümünden bir fikir çalmaktan (thanx & Up @fipgr), min / max kontrolünden kurtulabilirim:

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: (Daha sonra col-numbers ve dikey çubukları manuel olarak ekledim; yukarıdaki kod onları oluşturmaz)

 012345678901234567890123456789
|                     .        |
|                    .         |
|                   .          |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                .             |
|                 .            |
|                .             |
|               .              |
|                .             |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                .             |
|               .              |
|                .             |
|               .              |
|                .             |
|               .              |
|              .               |
|               .              |
|              .               |
 012345678901234567890123456789

4

C, 86

rand()Fonksiyonun tohumlanmasının gerekli olmadığı varsayılarak .

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

Açıklama:

C bölgesi çıkış uzunluğu, en az bir uzunluğa sahip olacak ve bu minimum uzunluğu bu durumda işlev çağrısının (argümanı belirlenir bu aygıtın, bunun . Araçlarının yanındaki bağımsız değişken ( ) bir karakter ( nokta)."%*c"*i+=i==30?-1:i==1||rand()%2?1:-1c46

Sınır kontrolüne gelince, bunu unuttuğum için özür dilerim. Şimdi bunu cevaba 15 karakterlik maliyetle ekledim. Aşağıdaki gibi üçlü operatör çalışır: boolean_condition?value_if_true:value_if_false. C de true değerinin 1 ve false değerinin 0 olduğuna dikkat edin.


Kodunuzda neler olup bittiğini genişletebilir misiniz? printf("%*c\n",i+=rand()%2?1:-1,46)Boşlukları nasıl yazdırdığını ve noktanın 29'u muhtemelen geçmesini nasıl önlediğini anlamakta sorun yaşıyorum . Şimdiden teşekkürler. (Üzgünüm, ben C programcısı değilim.)
Decent Dabbler

@fireeyedboy bitti, umarım anlarsın :)
user12205

Aaaah, orada biraz hile yaptığınızı hissettim. ;-) Ama gerisi gerçekten açık. Teşekkür ederim! Ve güzel bir çözüm! C'nin garip davranışı rand()%2da çok öngörülebilir olması (tek / çift dönüşler) mi? rand()%2PHP çözümümde denedim ve bu çok öngörülebilir davranışı sergiledi (aksine) rand(0,1)PHP C kütüphanelerini çok kullandığından (eğer doğruysam) C programınızın aynı 'kusur' olup olmadığını merak ediyordum .
İyi Dabbler

@fireeyedboy rand()Fonksiyonu tohumlamadım . C de rand()açıkça tohumlanmazsa, her seferinde aynı tohumu kullanır. Bu yüzden tahmin edilebilir. Eğer tohumlamak zorunda olsaydım srand(time());14 karakter maliyeti yapabilirim
user12205

Ama o kadar öngörülebilir mi ki, sonraki her çağrıda da garip olandan hatta değişecek mi? PHP iddialarının artık rand()tohumlanması gerekmiyor srand(), ancak yine de bu garip davranışı gösteriyor .
Terbiyeli Dabbler

4

Java: 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);}}

İlk olarak nokta konumu 0 < x < 30, yani [1-29] olmalıdır. Bu, eşit olarak dağıtılmış 0 ile 28 arasında bir sayı üretir ve bu programın amaçları doğrultusunda [0-28], [1-29] ile aynı etkiye sahiptir:

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

Şahsen normalde 14 civarında dağıtılmasını tercih ettim, ancak cevabım daha uzun olurdu:

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

İkincisi, bu kod ortada olma eğiliminde olmasını sağlar:

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

+1 alma olasılığı, değeri küçük olduğu için daha büyüktür ive -1 için tersi vardır. Eğer i, 0, +1 yakalanma ihtimali% 100 ve yakalanma ihtimali -1% 0'dır. Eğer i28 olduğu, buna zıt şey olmaz.

Üçüncüsü, çıktıyı daha kolay görmek 32için sonuna kadar değiştirerek, '_'her satırda 30 karakter ve yeni bir satır olduğunu görüyoruz:

__________.___________________
_________.____________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_________.____________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
____________._________________
_____________.________________
______________._______________
_____________.________________
______________._______________
_______________.______________
______________._______________
_____________.________________

@VadimR (şimdi, user2846289), önceki sürümdeki bir yanlış anlamaya işaret ettiği için teşekkürler.

@KevinCruijssen'e, bu cevabın ilk olarak gönderilmesinden iki buçuk yıl sonra bile 6 karakter tıraş ettiği için teşekkürler.


Ama igitmek 0yasa dışı, değil mi?
user2846289

@VadimR, benim iiçin [0-29] aralığında. Bu, [1-30] veya [288-317] 'ye eşdeğerdir, çıkış aynı olacaktır. Önemli olan, [0-29] aralığında 30 tamsayı sayısının olmasıdır.
Victor Stafusa

"Boşluk sayısı 0 <x <30 ile tanımlanan noktanızın x konumudur" Yani boşluk sayısı (veya 0 tabanlı nokta konumu) 1..29'dur. iolamaz 0. Her şeyin eğlenmekle ilgili olduğunu biliyorum ama yine de üzücü.
user2846289

@VadimR, Oh, teşekkürler. Sabit. Bu, noktanın asla en sağdaki pozisyonda olmayacağı anlamına gelir, ancak her neyse, belirtilen budur.
Victor Stafusa

Üzgünüm, ama hiçbir şey düzeltmedi. Imagine ialır 1başlangıçta ve ilk yineleme üzerinde Math.random()olduğunu 0, daha sonra ialır 0. Lütfen beni yanlış anlamayın, bu sizin cevabınızla ilgili değil . Aksine C benzeri diller dışında pek çok dili okuyamam. Sonra hatalar hakkında hiçbir tepki olmadan (upvotes hariç), doğru olup olmadıklarını nasıl bilebilirim?
user2846289

3

Mathematica 157-10-50 = 97

Başlamak için 1-30 arası rastgele bir sayı kullanılır. Noktadan kalan tüm sütun numaraları, RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c , bu da şu anlama gelir: "Önceki sütun numarası 15'den büyükse, -1 -1,1 kümesinden, -1 ağırlıklı 2: 1 değerine göre bir sayı seçin. 1; aksi takdirde, ağırlıkları çevirin ve aynı setten seçim yapın.

ReplacePart öğeyi, ilgili sütuna karşılık gelen 30 boş alan içeren bir listede değiştirir.

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


Güzel kullanımRandomChoice[]
Dr. belisarius

3

> <>, 358-10 = 348

Bu codegolf'ta kazanmaz, ama işe yarar. ( "P" komutunu esolang sayfasının tanımladığından farklı şekilde uygulayan bu yorumlayıcı ile birlikte Windows 7'de )

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<

Bu dilin adı googled olamaz, bu yüzden meraklılar için esolang makalesi .


-50 gereksinimini 50 karakterden az olarak kodlayabilir misiniz?
Victor Stafusa

1
@Victor Muhtemelen, ama> <> kodlamak için dev bir ağrı (eğlenceli bir dev ağrı), bu yüzden ondan bir mola vermeliyim.
SirCxyrtyx

@ SirCxyrtyx bu beni kıkırdadı. İyi golfçü efendim.
Gusdor

3

PHP 118 113 112 111 (-10 prim puanları = 101)

(korkunç bir şekilde tahmin edilebilir rand()davranış ve biraz daha fazla verimlilik ile ikinci deneme )

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";}

Olası sonuç:

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

PHP, 130 (, -10 bonus puanı = 120)

(ilk deneme)

Bu muhtemelen çok daha verimli olabilir:

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;}

Alanı bir alt çizgi ile değiştirirsem (görüntüleme amacıyla), bu olası bir sonuçtur:

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

Garip bir şekilde, (Windows XP'de PHP 5.4) rand(0,1)ile değiştirirsem rand()%2, rastgele sonuç her zamanki yinelemede tuhaftan çifte veya tam tersine geçer, rand()bu anlamda aniden endişe verici bir şekilde öngörülebilir hale gelir . Bu 'böcek' 2004'ten beri bilinen bir hata gibi görünüyor . Yine de aynı 'hata' olup olmadığını tamamen emin değilim.


3

J 42 karakter - 50-10 = -18

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

Açıklama, sağdan başlayarak ( trenler hakkında bazı bilgiler işe yarar):

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

Merkez eğilimi, -50, 1000'den fazla çalışma örneği:

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

Örnek satır, her satırda tam olarak 30 bayt çıktı

_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________
_____________.________________
____________._________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________

Çok iyi bir çözüm!
reggaemuffin

Çok iyi bir meydan okuma!
jpjacobs

3

Python 2.7: 126 109 -10-50 = 49

Sabit kodlanmış başlangıç ​​noktasından kurtuldum - şimdi rastgele noktadan başlıyor. Bu nedenle, ışıltıya ihtiyacım vardı, bu yüzden ofset için seçim yerine kullanmaya karar verdim. Bunun için (-1) ** bool hilesi kullanıldı.

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)

Burada bazı harika cevaplar. Python'daki ilk girişim, gelişmeler hakkında düşünüyor. İçe aktarma gereği yardımcı olmadı.

-10 - evet her satırda 30 karakter + \ n

-50 - merkezden ne kadar uzakta olursa, başka bir yöne hareket etme olasılığı o kadar artar (farklı sayıda + / i ofseti olan bir liste oluşturarak gerçekleştirilir)

Önceki deneme:

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)

Kişisel fordöngü tamamı tek satırda olabilir, ama daha iyi for i in[0]*30:daha iyisi ve eval"..."*30.
mbomb007

2

Java - 198 karakter

Bu, soruda verdiğiniz örneğin basit, basit, doğrudan ve yaratıcı olmayan bir golfüdür.

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");}}

2

Parti - (288 Bayt - 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.)

Un-golfed:

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

Alt çizgi yerine boşluk çıktısı almak için - 372 Bayt -

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

Aşağıdaki mantıkla ilgili yardım arıyorsanız, bu kesinlikle alan açısından en etkili yöntem değildir (! R! 1 veya 2'ye genişleyecektir) -

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

Aşağıya golf oynuyor: 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


2

J, 42 karakter, bonus yok

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

Örnek çalışma:

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

2

Python 2.7 (126-10 (sabit uzunluk) - 50 (Merkez Eğilim) = 66)

Aşağıdaki program daha büyük bir numuneye göre merkez eğilimindedir

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)

gösteri

         .           
        .            
       .             
      .              
     .               
      .              
       .             
        .            
         .           
          .          
           .         
          .          
           .         
          .          
         .           
        .            
       .             
        .            
       .             
      .              
     .               
      .              
       .             
      .              
     .               
    .                
   .                 
    .                
   .                 
    .              

Tohumlama için s = id (9)% 30 gibi. os ithal edilmesi gerekiyor, ama? Ve bu 1-30'un tamamını kapsıyor mu? Ah bekle ... * sayfanın üstündeki eşitsizliği tekrar
okuyor

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)

DÜZENLE: 50 puan bonus ve 10 puan bonus için düzeltme.

EDIT 2: Daha da kısa!


50 puan bonusu nereden bulabilir misin? Şu anda
alamadım

@Kostronor Gereksinim için düzenlemeyi yeni gördüm. Görünüşe göre henüz 50 puan alamadım.
aebabis

@ acbabis, aferin! Bazı baytlar kaydedebilirsiniz (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 İpuçları için teşekkürler. forGerçi dizi çalışma içinde init alınamadı ; bir süre kullanmak zorunda kaldı.
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;}}

Golf hariç :

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 - Kodum -50 bonus için uygun olup olmadığından emin değilim. iher zaman ortada başlamaz, ancak fordöngü sırasında, nokta asla her iki yönde de 3 yerden daha fazla hareket i etmez , bu yüzden ortaya yakın başladığında, her şey orada da kalma eğilimindedir.

DÜZENLEME 2 - Kod şimdi -10 ikramiyeye hak kazanır, çünkü 29 karakterden oluşan bir dizi ve ardından satır başına tam olarak 30 karakter için LF gelir.


29 karakterlik bir diziyi ve ardından LF'yi yazdırdığı için - 30 karakter ve ardından bir LF olmalıdır.
Victor Stafusa

@Victor ahh, düzeltme için teşekkür ederim, ana yazıyı yanlış yorumladım.
Tony Ellis

2

PowerShell, 77-10-50 = 17

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

Çıktı

_.____________________________
__.___________________________
___.__________________________
____._________________________
___.__________________________
____._________________________
_____.________________________
______._______________________
_______.______________________
______._______________________
_____.________________________
______._______________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
___________.__________________
__________.___________________
_________.____________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_________.____________________
__________.___________________

Akıllı rastgele. Golfçü bir versiyon kullanabilirsiniz $x=random 30;1..30|%{' '*($x+=,-1*$x+,1*(29-$x)|random)+'.'|% *ht 30}. 66 bayt - 10 - 50 = 6 puan
mazzy

2

R, 107 karakter - 60 puan 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='')}

inoktanın dizinidir. a30 boşluk dizisidir. Başlangıç ​​noktası rastgele (1'den 29'a kadar eşit olarak). Her yinelemede rastgele +1 eklemek 1 veya iağırlıklı olasılıkları: i-1için -1ve 29-i için+1 (olasılık olarak beslenen değerlerin bir toplamı gerekmez), yani noktayı aşağıdan önlerken merkeze yönlendirme eğilimindedir. 1 veya üstü 29 (her iki durumda da olasılıkları 0'a düştüğü için).

_Okunabilirlik için boşluk yerine çalıştırılan örnek :

> 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='')}
_______________________.______
______________________._______
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
____________________._________
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
____________________._________
___________________.__________
____________________._________
___________________.__________
__________________.___________
_________________.____________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________

Ben kodunuzu okuma yanılmıyorsam, i olabilir haline ya 0ya 30hayır?
user2846289

Evet haklısın 30 olabilir (daha fazla değil), bunu değiştireceğim.
plannapus

1
Şimdi düzeltildi. 1'den 0'a gitme veya 29'dan 30'a gitme olasılığı 0'dır. Rastgele başlangıç ​​noktası 1 ile 29 arasında.
plannapus

İpucu: Eğer değiştirerek 2 daha fazla karakter kaydedebilirsiniz s(1:29,1)ile s(29,1).
Sven Hohenstein

@SvenHohenstein haklısın Bunu hep unuturum
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;}}}}

Çıktı

space_okunaklılık için ile değiştirildi .

____________.________________
___________._________________
__________.__________________
___________._________________
____________.________________
_____________._______________
______________.______________
_____________._______________
______________.______________
_______________._____________
______________.______________
_______________._____________
______________.______________
_______________._____________
______________.______________
_____________._______________
____________.________________
___________._________________
____________.________________
_____________._______________
______________.______________
_____________._______________
____________.________________
___________._________________
____________.________________
___________._________________
____________.________________
___________._________________
__________.__________________
___________._________________

Ben kodun if...else if...elsesonunda daha küçük bir kod almak mümkün olmalıdır eminim . Ayrıca, çıktınız ortada olma eğiliminde olduğundan şüphe duymamı sağlıyor, ancak kodunuz doğru görünüyor.
Victor Stafusa

Kodu düzenlediğimde çıktıyı güncellemeyi unuttum. Bunu r.Next(30)<p?-1:1;yapar. ifİfadelerle daha küçük olabileceğinizden emin değilim . switchzorunlu olması nedeniyle büyük break/ returnve final elsebir default:{}dava gerektiriyor ve bu da uzun.
Gusdor

@Victor giriş için teşekkürler. bazı düzenlemeler yaptım.
Gusdor

Eğer psıfır ise p+=r.Next(30)<p?-1:1;, her zaman 1 alacak, bu yüzden gerek yok if(p==0). Aynen p==29. pasla 30 olmayacak, böylece kurtulabilirsiniz else if.
Victor Stafusa

@Victor grand. bu değişiklikleri yapacağım. Ta.
Gusdor

1

PHP

Merkezleme bonusu ile: 82 - 50 = 32

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

Bu sürüm için (aşağıdaki eski sürümler), merkezleme kodunda halledildiği için min / maks kontrolünü kaldırın. rand(1,28)burada önemli olduğu için$i++ kendini 29'a (gerçek maks) kadar itmeye .

düzenleme: gereksiz parantez, taşınan değişen kod


Merkezleme için basit algoritma: 0 ile 29 arasında yeni bir sayı oluşturur ve mevcut sayı ile karşılaştırır. Merkeze doğru çizmek için daha büyük tarafta bir sayı alma olasılığından yararlanır.

Gerçek sonuç: (daha sonra satır numaralandırma eklendi)

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

Arşivlendi:

$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


İlk versiyonumdan bu yana 49 karakteri traş ettiğim için biraz etkilendim ...
Yoda

şimdi 44 karakter traş. Bu da son 39 olduğu anlamına gelmeli.
Yoda

1

JavaScript ES6 125-10 (30 karakter satırı) - 50 (ortaya doğru kayıyor) = 65

Üniteme asansörle çıkarken bir epifani vardı, bu yüzden hafızamdan ayrılmadan önce onu almam gerekiyordu ...

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

Biraz değişken konumsal karıştırma ve ile gösterilen kaydırma olasılığını hesaplamak için biraz yaratıcılık x/t... iki bayt tıraş etmeme izin veren tüm seri!

....5....0....5....0....5....0 <-- Ruler
_.____________________________
__.___________________________
___.__________________________
__.___________________________
___.__________________________
__.___________________________
_.____________________________
__.___________________________
___.__________________________
__.___________________________
___.__________________________
____._________________________
_____.________________________
______._______________________
_______.______________________
________._____________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________

Buradaki başlangıç ​​nokta konumunun rastgele olması 2 veya 3 olasılıkla sınırlı değil mi? Ve bu noktayı ortada tutuyor (çok az sayıda koşu = 30 olduğu için) ve bu yüzden -50 değerinde mi?
user2846289

OP metninden alıntı : "Programınız rastgele bir x konumu ile başlar ve her dönüş bu konumu rastgele 1'e sola veya sağa kaydırır"15+r()*2 Kodum başlangıçta 15'den 16.9999999998'e kadar herhangi bir şey olabileceği tanımlanır. ek x+=r()<.5?-1:1, 14 ila 18 aralığına getirerek biraz daha fazla rastgele sonuç verir, bu yüzden teknik olarak sorulan şeyin tanımındaki rastgele bir sayı ... Bu kuralı bükerek, flip (+1, -1) çoğu durumda tekrar ortaya getirecektir ...;)
WallyWest

Rastgele şeyde, beni yakaladın ... Bu, 'olası tüm konumlardan rastgele bir konum' anlamına geliyordu, ancak 50 puan açıkça uygulanmadığı için size çok fazla avantaj vermiyor! Lütfen bu bonusdaki açıklamayı tekrar okuyunuz, sabit bir yüzde 0,5 almazsınız!
reggaemuffin

Geçerli nokta, puanımı buna göre tekrar yapacağım ...
WallyWest

@Kostonor Kodu uygun çözüm ile güncellendi, buna göre puan güncellendi!
WallyWest

1

k, 53-10-50 = -7

Çözüm 1

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

kullanım

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

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

Çözüm 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]

1

Scala, 95-10 = 85 bayt

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

Hala 50 bayt bonusu düşünüyorum.

Açıklama:

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

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

Görüş ve önerilerinizi bekliyoruz.


Ne yazık ki, çözümünüz uygun değil, çıktılarınızı diğer çözümlerin çıktılarıyla karşılaştırın. Noktayı bir karakter kaydır.
reggaemuffin

@Kostronor Oh! ah! Çok üzgünüm! Sorunun bu kısmını okumayı unuttum! Yakında yeni bir sürüm geliştirmeye çalışacağım. İşaret ettiğiniz için teşekkürler!
Gaurang Tandon

@Kostronor Programı düzenlendi.
Gaurang Tandon

1

JavaScript

114 karakter - 10 (30 karakter satırı) - 50 (noktayı ortaya doğru çekin) = 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('-'))

Ancak, çizgileri 30 karaktere doldurmak için 10 karakterlik bir ödülün kötü bir anlaşma olabileceğini fark ettim; yani:

102 karakter - 50 (noktayı ortaya doğru çekin) = 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('-'))

Basitleştirilmiş çekme yönü koşulu için @WallyWest'e güvendiğim f()>k/29?1:-1ilk taslağımda iki iç içe koşul kullanıldı.


1

Raket 227 bayt (30 karakter için -10, orta hatta kaydırma için -50 = 167)

Her adımda, nokta orta çizgiye doğru ondan uzağa doğru iki kat daha fazla hareket eder:

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

Ungolfed:

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

Test yapmak:

(println "012345678901234567890123456789")
(f)

Çıktı:

"012345678901234567890123456789"
                       *       
                      *        
                       *       
                        *      
                         *     
                        *      
                       *       
                      *        
                     *         
                      *        
                     *         
                    *          
                     *         
                      *        
                     *         
                    *          
                   *           
                  *            
                 *             
                *              
               *               
                *              
                 *             
                *              
                 *             
                *              
                 *             
                *              
                 *             
                *              
               *               

Güzel çözüm! Raket gerçekten ilginç. Kendinize 50 bonus puanı verebilir ve ekstra 10 için başvuru yapıp
yapmadığınızı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.