Rastgele zar devrilme


14

Standart bir zarda (kalıp) sayılar, zıt yüzler yediye eklenecek şekilde düzenlenir. Mümkün olan en kısa programı, rastgele bir atış ve ardından 9 rastgele devrilme sağlayan tercih ettiğiniz dilde yazın. Bir devrilme, zarın çeyrek turudur, örneğin zar 5'e bakacak olursa, olası tüm devrilmeler 1,3,4 ve 6'dır.

İstenen çıktı örneği:

1532131356

Yanıtlar:


5

GolfScript, 26 karakter

0{(.6,5@--\-.,rand=).}10*;

Joey'nin biraz daha sıkıştırılmış bir versiyonu , temelde sıfır endeksleme ile ilgili sorun etrafında çalışıyor.


9

Yakut, 44

c=0;10.times{$><<c=([*1..6]-[c,7-c]).sample}

Şanslı denemelerle [* 1..6] hile buldum.


1
Burada bazı güzel numaralar, harika şeyler. Array # sample yöntemini kaçırdığım için kafama vurmak.
Lars Haugseth

4

JavaScript (71 karakter)

Sen değiştirmeniz gerekebilir printile alertveya JavaScript ortamına bağlı başka bir şey.

for(C=L=T=0;C++<10;print(L=T))while(!(T-L&&T+L-7))T=Math.random()*6+1|0

bir değer bulunduğunda dış olanı koşullu olarak artırarak döngüleri birleştirin: for (b = n = 10; n; ab && a + b-7 && print (b = a, n -)) a = Math.random () * 6 + 1 | 0
imma

4

GolfScript, 28

0:|;{7,[0|7|-]-.,rand=:|}10*

3

darbe

#/!bin/bash
f=`expr $RANDOM % 6` 
f=`expr $f + 1`
printf "$f"
for ((i=0; i<9; i++))
do
   ((bad=7-$f))
   next=`expr $RANDOM % 6`
   next=`expr $next + 1`
   while [ $next -eq $bad ] || [ $next -eq $f ]
   do
      next=`expr $RANDOM % 6`
      next=`expr $next + 1`
   done
printf "$next"
f=$next
done

örnek kod: http://ideone.com/CCfro


Kullanımı ((var=expression))çok güzel - en kısa yol olduğunu düşündüm var=$((expression))Ama neden bunu sadece bir kez kullanıyorsunuz ve tonlarca karakteri geri dönüşlerde ifade ediyorsun?
Peter Taylor

Çok fazla kabuk komut dosyası yapmıyorum, ancak bazı nedenlerden dolayı ((var = expr)) bazı yerlerde başarısız oldu (evet garip: P) Bu senaryoya başladığımdan beri, bir şekilde tamamladım. :)
Aman ZeeK Verma


2

Sadece bir döngü ile bas: 100 99 98 96

için ((ı 10, Rf = RASGELE% 6 + 1 = i -;)) do
printf $ f
((N = RASGELE% 4 + 1, m = <4 f f: 7-f, f = n <m || ++ n <7-m, n: n + 1))
tamam

http://ideone.com/XrZO7

Ana fikir, [1, x] 'de y'ye eşit olmayan rastgele bir sayı seçmek için [1, x-1]' de rastgele bir sayı seçebilir ve> = y ise artırabilir. Bu problem için [1,6] 'da f veya 7-f'ye eşit olmayan rastgele bir sayı istiyoruz. İki testi min (f, 7-f), max (f, 7-f) şeklinde yapmak zorundayız.

Başlangıçta boş bir ortamın, i'yi başlatmadan ve döngü koşulunu i++<10


2

Bash: 97 94 92 90 89 87

Aman ZeeK Verma'nın cevabından ağır golf:

((I 10, f = 0 dır; i -;)) yapmak
((n = f; n == f || n + f == 7; f = RASTGELE% 6 + 1)) şunları yapar:
tamam
printf $ f
tamam

http://ideone.com/QiuTx

NB, ilk satırı değiştirerek 5 karakterle küçültülebilir, for((;i++<10;))ancak bu her zaman geçerli olmayan varsayımlar yapar. İdeal olarak işe yarayacaktır, ancak onu bir kabuktan çalıştıran biri sıfır olmayan bir şeye sahip olabilir iveya fihraç edebilir.


İç döngü olmadan bir versiyon yapmak istiyorum, ama daha uzun olacağından korkuyorum.
Peter Taylor

Bu son derece harika, sanırım bash için çok
hamim

@Aman, çoğu bash'a özgü değil. Her birinden sonra testlerle birkaç düzine ayrıntılandırma ve bir şeyi kırdığımda geri dönüşler. Gerçekten bash hilesi olan tek bit, aramak zorunda olduğum noop. Eğer okumak için zamanınız varsa man bash, ben tavsiye ederim. Bir zamanlar örtbas etmek için kapağı okudum ve neyin mümkün ve aramaya değer olduğuna dair belirsiz bir fikre sahip olmak bana iyi hizmet etti.
Peter Taylor

2

Windows PowerShell, 45

-join(0..9|%{($d=1..6-ne(7-$d)-ne$d|random)})

Aslında oldukça önemsiz. Olası zar atışlarının bir listesini oluşturuyorum 1..6ve sonra sadece son rulosu yedi eksi eşit olmayanları ve sonra sadece son rulosuna eşit olmayanları seçiyorum. Kalan listeden rastgele bir öğe seçip atarım $d. Yana $dbaşlangıçta tedavi edilir 0normal bir bir kalıp ilk kez ruloları.

Test komut dosyası:

for($i=0;$i-lt20;$i++){
    $o=@(./tipping.ps1)
    if ($i-gt0-and$o-eq$o2) { throw "Must have random output" }
    if ($o.count-ne1) { throw "Must only have one line of output" }
    if ($o[0]-match'[^1-6]'){ throw "Invalid characters" }
    if($o[0].length-ne10){ throw "Wrong length: $($o[0].length)" }
    $r=[char[]]($o[0])|%{$_-48}
    for ($x=1;$x-lt$r.count;$x++){
        if ($r[$x-1]+$r[$x]-eq7) { throw "Not a tipping: $($r[$x-1]) and $($r[$x])" }
    }
    $o2=$o
}

Tarih:

  • 2011-02-18 11:57 (61) İlk deneme.
  • 2011-02-18 11:58 (45) İlk sayıyı ayrı ayrı oluşturmam gerekmiyor.

AnladımThe term 'random' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
Peter Taylor

@Peter: PowerShell v2, lütfen. Get-RandomCmdlet'in v1 içinde yoktu.
Joey

2

J

Bu işe yaramalı ama ne yazık ki J'nin rastgele jeneratörü 3. tekrardan sonra sıkıştı:

a=:>:i.6
f=:a#~1-(+&(a=])7&-)
((,(?4)&{@f@(_1&{))^:9)>:?6

6 4 5 4 5 4 5 4 5 4


Ben hiçbir şekilde bir J uzmanı değilim, ama bana bir (?4)kez yuvarlanma eğilimindedir ve bu konuda dikkatli değilseniz sonraki iterasyonlar için bir sabit olarak muamele eğilimi bu konuya J cevabımı oluştururken ne acı çekiyor gibi görünüyor . (?@4:)Benzer bir yapı kullanarak onun etrafında çalıştım .
JB

2

Yakut

66 karakter

(0..9).reduce([]){|m|m<<((1..6).to_a-[d=m[-1]||0,7-d]).shuffle[0]}

2

J, 30 karakter

>:(?@4:{(i.6)-.],5&-)^:(<10)?6

6 2 3 5 4 2 4 1 3 6

Açıklamalar (sağdan sola okunur):

  • ?6 0 ile 5 arasında rastgele bir sayı döndürür
  • ^:(<10)sonuçları bir arada uygulayarak sonuçları yol boyunca toplar. İşlev:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- giriş numarasının bir dizisini ve tamamlayıcısını 5 olarak döndürür (şu anda 0 tabanlı sayıları işliyoruz, bu nedenle karşı yüzlerin toplamı 5'tir)
    • (i. 6) -. 0 ile 5 arasındaki tam sayı kümesinden kaldırır. Giriş konumundan tek bir devrilme işleminden sonra geçerli tüm konumlarla kalırız.
    • ?@4: { bunlardan birini rastgele seçer.
  • >: rakamları 1 ila 6 aralığına getirmek için tüm sekansı arttırır.

Güzel ">:" diye düşündü sonunda.
Eelvex

1
@Eelvex Gerçek dünyadaki zarların neden 1 ila 6 olduğu hakkında hiçbir fikrim yok, onlar hakkında mantıklı akıl yürütme 0 ila 5 kullanıyorsa: D
JB

2

GS2, 16 bayt

16 2f 25 08 41 20 17 30 16 2f 31 31 25 09 19 32

İşte böyle

16 2f 25     # make range from 1 to 6 and push random element
08           # start block
    41       # duplicate top of stack twice
    20 17 30 # negate top of stack and add 7
    16 2f    # push range from 1 to 6
    31 31    # do set-wise difference with each of the two previous numbers
    25       # push a random element from the list
09           # end block
19 32        # repeat block 9 times

Bence gs2 bu meydan okumadan daha yeni.
lirtosiast

1

QBasic (71 karakter)

İki yeni satır gereklidir ve karakter sayısına her biri bir karakter olarak dahil edilir.

RANDOMIZE:FOR I=0TO 9
1N=INT(RND*6)+1:IF L=N OR L+N=7THEN 1
?N:L=N:NEXT

1

TI-BASIC, 38 34

For(I,1,9
Ans→X
Repeat Ans≠X and Ans≠7-X
randInt(1,6
End
Disp Ans
End

Sıkıcı bir çözüm, ancak önceki revizyondan daha kısa. Yeni bir hesap makinesinde Anssıfıra başlatılmış olmasından faydalanıyorum .


Mümkün olup olmadığını bilmiyorum, ancak daha kısa bir çözüm bulabilen herkese 50 temsil edeceğim.
lirtosiast

34'ü nasıl hesaplıyorsunuz?
özyinelemeli

Buradaki her simge bellekteki bir bayttır ; TI-BASIC'in bu şekilde puanlanması standarttır. Bir hesap makineniz varsa, programı yazın, bellek yönetimi ekranına bakın, sonra 9'u çıkarın ve kod boyutunu almak için program adının uzunluğunu çıkarın.
lirtosiast

1

Java 8, 130 bayt

v->{int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));return r;}

Burada deneyin.

Ayrıntılı ana yöntemle tam program olarak bunun yerine 178 bayt olur :

interface M{static void main(String[]a){int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));System.out.print(r);}}

Burada deneyin.

@AmanZeeKVerma'nın Bash cevabının yarı-limanı .

Açıklama:

 v->{              // Method with empty unused parameter and String return-type
   int d=(int)(Math.random()*6+1),
                   //  Random dice-roll 1-6
       i=10,       //  Counter-integer, starting at 10
       p;          //  Temp integer to store new side
   String r=""+d;  //  Result-String, starting at the first dice-roll
   for(;i-->0;     //  Loop (1) 10 times:
       r+=d)       //    After every iteration, append the result with a random side
     for(p=d;      //   Set the new side to the current side
         p==d      //   Loop (2) as long as the new side and current side are the same
         |p+d==7;  //   or as long as both combined are exactly 7:
       d=(int)(Math.random()*6+1)
                   //    Set the new side to a random side 1-6
     );            //   End of loop (2)
                   //  End of loop (1) (implicit / single-line body)
  return r;        //  Return the result-String
}                  // End of method


0

> <> , 71 bayt

Burada gördüğüm xhatırlamıyorum gibi <> 'ın işaretçi rasgeleleştirme vitrin olabilir sevindim .

a&0 v
 /2v
1x3v 
>x< <<
6x4v
 \5v ~
:{:/ ^?=}
:{:/ ^?=7+}
:~$<^&;!?:-1&n

Bu çevrimiçi yorumlayıcıda deneyebilirsiniz (yapıştırma kodu, gönderme, başlatma).


Çözümü düzelttikten sonra benim oyumu alacaksın.
lirtosiast

@ThomasKwa Bitti, biraz golf oynayabilirim ama en azından şimdi işlevsel.
Aaron

0

R , 67 bayt

c(3,5,1,4,2,6)[(sample(1:6,1)+cumsum(sample((-2:2)[-3],9,T)))%%6+1]

Çevrimiçi deneyin!

Orada bir golfier R cevap ama sanırım bu bugüne kadar sunulan cevaplar farklı bir yaklaşımdır.

c(3,5,1,4,2,6)                                                     #A dice and its facets
               (sample(1:6,1)                                      #Initial dice roll
                             +cumsum(sample((-2:2)[-3],9,T)))      #9 tippings in c(-2,-1,1,2)
                                                             %%6+1 #converts to values in [0,6]
              [                                                   ]#

0

05AB1E , 23 bayt

6LΩUTFX?6LʒDXÊsX+7Ê*}ΩU

Kesinlikle golf olabilir, ama şu anda görmüyorum ..

Çevrimiçi deneyin.

Açıklama:

6LΩ              # Pick a random value from the range [1,6]
                 #  i.e. [1,2,3,4,5,6] → 3
   U             # Save this random value in variable `X`
TF               # Loop 10 times:
  X?             #  Print `X` without newline to STDOUT
  6Lʒ     }      #  Create a range [1,6] again, and filter it by:
     DXÊ         #   Check if the current value is not equal to `X`
                 #    i.e. 1 and 3 → 1 (truthy)
                 #    i.e. 3 and 3 → 0 (falsey)
     sX+         #   Sum the current value with `X`
                 #    i.e. 1 and 3 → 4
                 #    i.e. 3 and 3 → 6
        7Ê       #   And check if it's not equal to 7
                 #    i.e. 4 and 7 → 1 (truthy)
                 #    i.e. 6 and 7 → 1 (truthy)
     *           #   If both checks are truthy, keep it in the filtered list
                 #    i.e. 1 and 1 → 1 (truthy)
                 #    i.e. 0 and 1 → 0 (falsey)
           Ω     #  Pick a random value from the filtered list
                 #   i.e. [1,2,5,6] → 1
            U    #  And save it in variable `X` for the next iteration of the loop
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.