Zufälliges Würfeln


14

In einem Standardwürfel sind die Zahlen so angeordnet, dass sich gegenüberliegende Flächen zu sieben addieren. Schreiben Sie das kürzestmögliche Programm in Ihrer bevorzugten Sprache, das einen zufälligen Wurf gefolgt von 9 zufälligen Tipps ausgibt. Ein Tipp ist eine Vierteldrehung des Würfels. Wenn der Würfel z. B. auf 5 zeigt, sind alle möglichen Tipps 1,3,4 und 6.

Beispiel für die gewünschte Ausgabe:

1532131356

Antworten:


5

GolfScript, 26 Zeichen

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

Eine etwas komprimiertere Version von Joey , die im Grunde genommen das Problem mit der Nullindizierung umgeht.


9

Rubin, 44

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

Ich habe den [* 1..6] Trick durch glückliches Experimentieren gefunden.


1
Einige nette Tricks hier, tolles Zeug. Schlag mir auf den Kopf, weil ich die Array # -Beispielmethode verpasst habe.
Lars Haugseth

4

JavaScript (71 Zeichen)

Unter Umständen müssen Sie ersetzen printmit alertoder etwas anderem, abhängig von Ihrer JavaScript - Umgebung.

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

Zusammenführen von Schleifen durch bedingtes Inkrementieren der äußeren Schleife, wenn ein Wert gefunden wird | 0
imma

4

GolfScript, 28

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

3

Bash

#/!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

Beispielcode: http://ideone.com/CCfro


Die Verwendung von ((var=expression))ist sehr nett - ich dachte, der kürzeste Weg wäre. var=$((expression))Aber warum benutzt du das nur einmal und verschwendest Tonnen von Zeichen für Ausdruck in Backticks?
Peter Taylor

Ich mache nicht viel mit Shell-Skripten, aber aus irgendeinem Grund ((var = expr)) ist dies an einigen Stellen fehlgeschlagen (yeah weird: P). Seit ich dieses Skript gestartet habe, habe ich es irgendwie abgeschlossen. :)
Aman ZeeK Verma


2

Bash mit nur einer Schleife: 100 99 98 96

for ((i = 10, f = RANDOM% 6 + 1; i -)) do
printf $ f
((n = ZUFÄLLIG% 4 + 1, m = f <4? f: 7-f, f = n <m || ++ n <7-m? n: n + 1))
erledigt

http://ideone.com/XrZO7

Die Schlüsselidee ist, dass Sie eine Zufallszahl in [1, x], die nicht y entspricht, in [1, x-1] auswählen und dann inkrementieren können, wenn sie> = y ist. Für dieses Problem wollen wir eine Zufallszahl in [1,6], die nicht gleich f oder 7-f ist. Wir müssen die beiden Tests in der Reihenfolge min (f, 7-f), max (f, 7-f) durchführen.

Unter der Annahme, dass die Umgebung anfangs leer ist, könnten 2 Zeichen gespart werden, indem i nicht initialisiert und die Schleifenbedingung auf geändert wird i++<10


2

Bash: 97 94 92 90 89 87

Aus Aman ZeeK Vermas Antwort:

für ((i = 10, f = 0; i -;)) tun
für ((n = f; n == f || n + f == 7; f = RANDOM% 6 + 1)) mache:
erledigt
printf $ f
erledigt

http://ideone.com/QiuTx

NB: Möglicherweise kann es durch Ändern der ersten Zeile in um 5 Zeichen verkleinert werden, for((;i++<10;))aber dies führt zu Annahmen, die nicht immer gültig sind. In ideone würde es funktionieren, aber jemand, der es von einer Shell aus ausführt, könnte es haben ioder fin etwas exportieren, das nicht Null ist.


Ich würde gerne eine Version ohne die innere Schleife machen, aber ich befürchte, dass sie länger wird.
Peter Taylor

Das ist extrem genial, ich bin zu roh für die
Prügelei,

@Aman, das meiste ist nicht bash-spezifisch. Es sind nur ein paar Dutzend Verfeinerungen mit Tests nach jedem und Umkehrungen, wenn ich etwas kaputt gemacht habe. Das einzige, was wirklich ein Trick ist, ist der Noop, den ich nachschlagen musste. Wenn Sie Zeit zum Lesen man bashhaben, empfehle ich es. Ich habe es einmal von vorne bis hinten gelesen, und nur eine vage Vorstellung davon zu haben, was möglich und es wert ist, nachzuschlagen, hat mir gut getan.
Peter Taylor

2

Windows PowerShell, 45

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

Eigentlich ziemlich trivial. Ich erstelle eine Liste möglicher Würfelwürfe 1..6und wähle dann nur diejenigen aus, die nicht gleich sieben minus dem letzten Wurf sind, und dann nur diejenigen, die nicht gleich dem letzten Wurf sind. Aus der restlichen Liste wähle ich dann einen zufälligen Eintrag aus und ordne ihn zu $d. Da $dwird anfänglich behandelt, wie 0es ein normaler Würfel beim ersten Mal würfelt.

Testskript:

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
}

Geschichte:

  • 2011-02-18 11:57 (61) Erster Versuch.
  • 2011-02-18 11:58 (45) Ich muss die erste Nummer nicht separat generieren.

Ich bekommeThe 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, bitte. Das Get-RandomCmdlet war in Version 1 nicht vorhanden.
Joey

2

J

Dies sollte funktionieren, aber leider bleibt Js Zufallsgenerator nach der 3. Iteration hängen:

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

6 4 5 4 5 4 5 4 5 4


Ich bin in keinster Weise ein J-Experte, aber es scheint mir, als hätte ich es gelitten, meine J-Antwort auf diesen Thread zu verfassen, der (?4)in der Regel einmal gerollt und als Konstante für nachfolgende Iterationen behandelt wird, wenn Sie nicht vorsichtig sind. Ich habe es mit einem (?@4:)ähnlichen Konstrukt umgangen.
JB

2

Rubin

66 Zeichen

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

2

J 30 Zeichen

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

6 2 3 5 4 2 4 1 3 6

Erläuterungen (von rechts nach links gelesen):

  • ?6 Gibt eine Zufallszahl zwischen 0 und 5 zurück
  • ^:(<10)Wendet eine Funktion neunmal an und sammelt dabei die Ergebnisse. Die Funktion ist:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- gibt ein Array der eingegebenen Zahl und deren Komplement zu 5 zurück (wir verarbeiten derzeit 0-basierte Zahlen, die Summe der gegenüberliegenden Flächen beträgt also 5)
    • (i. 6) -. Entfernt sie aus dem vollständigen Satz von Ganzzahlen von 0 bis 5. Nach einer einzigen Kippoperation von der Eingabeposition bleiben alle gültigen Positionen übrig.
    • ?@4: { wählt zufällig eine davon aus.
  • >: Inkrementiert die gesamte Sequenz, um die Zahlen auf das Intervall von 1 bis 6 zurückzusetzen.

Netter Gedanke an ">:" am Ende dann.
Eelvex,

1
@Eelvex Ich habe keine Ahnung, warum echte Würfel 1 bis 6 sind, wenn bei allen vernünftigen Überlegungen 0 bis 5 verwendet werden.: D
JB

2

GS2, 16 Bytes

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

So funktioniert das

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

Ich denke, gs2 ist neuer als diese Herausforderung.
Lirtosiast

1

QBasic (71 Zeichen)

Die beiden Zeilenumbrüche sind notwendig und werden in die Zeichenanzahl als jeweils ein Zeichen einbezogen.

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

Langweilige Lösung, aber es ist kürzer als die vorherige Revision. Ich nutze die Tatsache, dass auf einem neuen Rechner Ansauf Null initialisiert wird.


Ich weiß nicht, ob es möglich ist, aber ich gebe jedem, der eine kürzere Lösung findet, 50 Wiederholungen.
Lirtosiast

Wie berechnest du 34?
rekursiver

Jedes Token hier ist ein Byte im Speicher . Es ist Standard, dass TI-BASIC auf diese Weise bewertet wird. Wenn Sie einen Taschenrechner haben, geben Sie das Programm ein, sehen Sie sich den Speicherverwaltungsbildschirm an, subtrahieren Sie dann 9 und subtrahieren Sie die Länge des Programmnamens, um die Codegröße zu erhalten.
Lirtosiast

1

Java 8, 130 Bytes

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

Probieren Sie es hier aus.

Als vollständige Programm mit ausführlicher Haupt-Methode , dies wäre 178 Bytes statt:

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

Probieren Sie es hier aus.

Semi-Port von @AmanZeeKVermas Bash-Antwort .

Erläuterung:

 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 Bytes

Ich bin froh, dass ich die xCode-Pointer-Randomisierung von > <> präsentieren konnte, da ich mich nicht erinnere, sie hier gesehen zu haben.

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

Sie können es mit diesem Online-Interpreter ausprobieren (Code einfügen, senden, starten).


Sie erhalten meine Zustimmung, sobald Sie die Lösung behoben haben.
Lirtosiast

@ThomasKwa Fertig, ich könnte vielleicht ein bisschen Golf spielen, aber zumindest ist es jetzt funktionsfähig.
Aaron

0

R , 67 Bytes

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

Probieren Sie es online!

Es gibt eine Golfier R Antwort aber ich denke , ist ein anderer Ansatz von den bisher vorgelegten Antworten.

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 Bytes

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

Kann auf jeden Fall Golf spielen, aber ich sehe es momentan nicht.

Probieren Sie es online aus.

Erläuterung:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.