Propinas de dados al azar


14

En un dado estándar (dado) los números están ordenados de modo que las caras opuestas sumen siete. Escriba el programa más corto posible en su idioma preferido que genere un lanzamiento aleatorio seguido de 9 propinas aleatorias. Una propina es un cuarto de vuelta del dado, por ejemplo, si el dado está orientado hacia 5, todas las posibles propinas son 1,3,4 y 6.

Ejemplo de salida deseada:

1532131356

Respuestas:


5

GolfScript, 26 caracteres

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

Una versión un poco más comprimida de Joey , básicamente trabajando en torno al problema de la indexación cero.


9

Rubí, 44

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

Encontré el truco [* 1..6] al experimentar con suerte.


1
Algunos buenos trucos aquí, grandes cosas. Golpeándome en la cabeza por perder el método de muestra Array #.
Lars Haugseth

4

JavaScript (71 caracteres)

Es posible que deba reemplazar printcon alerto algo más, dependiendo de su entorno JavaScript.

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

fusionar bucles incrementando condicionalmente el exterior cuando se encuentra un valor: for (b = n = 10; n; ab && a + b-7 && print (b = a, n -)) a = Math.random () * 6 + 1 | 0
soy

4

GolfScript, 28

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

3

Golpetazo

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

código de muestra: http://ideone.com/CCfro


El uso de ((var=expression))es muy agradable: pensé que el camino más corto era var=$((expression))Pero, ¿por qué lo usas solo una vez y desperdicias toneladas de caracteres en expr en backticks?
Peter Taylor

No hago gran parte de las secuencias de comandos de shell, pero por alguna razón ((var = expr)) en algunos lugares fallé (sí, extraño: P) Desde que comencé este script, de alguna manera lo completé. :)
Aman ZeeK Verma


2

Bash con solo un bucle: 100 99 98 96

para ((i = 10, f = RANDOM% 6 + 1; i -;)) do
printf $ f
((n = ALEATORIO% 4 + 1, m = f <4? f: 7-f, f = n <m || ++ n <7-m? n: n + 1))
hecho

http://ideone.com/XrZO7

La idea clave es que para elegir un número aleatorio en [1, x] que no sea igual a y, puede elegir un número aleatorio en [1, x-1] y luego incrementar si es> = y. Para este problema, queremos un número aleatorio en [1,6] que no sea igual a f o 7-f. Tenemos que hacer las dos pruebas en orden min (f, 7-f), max (f, 7-f).

Suponiendo que un entorno inicialmente vacío podría ahorrar 2 caracteres al no inicializar i y cambiar la condición del bucle a i++<10


2

Golpe: 97 94 92 90 89 87

Fuertemente golfizado de la respuesta de Aman ZeeK Verma:

para ((i = 10, f = 0; i -;)) hacer
para ((n = f; n == f || n + f == 7; f = RANDOM% 6 + 1)) hacer:
hecho
printf $ f
hecho

http://ideone.com/QiuTx

NB podría decirse que puede reducirse en 5 caracteres cambiando la primera línea a, for((;i++<10;))pero eso hace suposiciones que no siempre son válidas. Funcionaría bien en ideone, pero alguien que lo ejecute desde un shell podría tener io fexportar a algo que no sea cero.


Me gustaría hacer una versión sin el bucle interno, pero me temo que será más larga.
Peter Taylor

Esto es extremadamente increíble, estoy demasiado crudo para bash, supongo :)
Aman ZeeK Verma

@Aman, la mayor parte no es específica de bash. Son solo varias docenas de mejoras con pruebas después de cada una y reversiones cuando rompí algo. Lo único que es realmente un truco es el noop, que tuve que buscar. Sin embargo, si tiene tiempo para leer man bash, lo recomiendo. Una vez lo leí de principio a fin, y el solo hecho de tener una vaga idea de lo que es posible y vale la pena buscar me ha servido mucho.
Peter Taylor

2

Windows PowerShell, 45

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

Bastante trivial, en realidad. Genero una lista de posibles tiradas de dados 1..6y luego selecciono solo las que no son iguales a siete menos la última tirada y luego solo las que no son iguales a la última tirada. De la lista restante, luego selecciono un elemento aleatorio y se lo asigno $d. Ya que$d que inicialmente se trata como 0tira un dado normal la primera vez.

Script de prueba:

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
}

Historia:

  • 2011-02-18 11:57 (61) Primer intento.
  • 2011-02-18 11:58 (45) No necesito generar el primer número por separado.

TengoThe 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, por favor. El Get-Randomcmdlet no existía en v1.
Joey

2

J

Esto debería funcionar, pero desafortunadamente el generador aleatorio de J se atasca después de la tercera iteración:

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

6 4 5 4 5 4 5 4 5 4


De ninguna manera soy un experto en J, pero me parece por lo que sufrí al componer mi respuesta J a este hilo que (?4)tiende a enrollarse una vez y tratarse como una constante para las iteraciones posteriores si no tiene cuidado con él. Trabajé alrededor usando una (?@4:)construcción similar.
JB

2

Rubí

66 caracteres

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

2

J, 30 caracteres

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

6 2 3 5 4 2 4 1 3 6

Explicaciones (leer de derecha a izquierda):

  • ?6 devuelve un número aleatorio entre 0 y 5
  • ^:(<10)aplica una función 9 veces, acumulando los resultados a lo largo del camino. La función es:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- devuelve una matriz del número de entrada y su complemento a 5 (actualmente estamos manejando números basados ​​en 0, por lo que la suma de caras opuestas es 5)
    • (i. 6) -. los elimina del conjunto completo de enteros 0 a 5. Nos quedan todas las posiciones válidas después de una sola operación de volcado desde la posición de entrada.
    • ?@4: { elige uno de esos al azar.
  • >: incrementa toda la secuencia para devolver las cifras al intervalo de 1 a 6.

Buen pensamiento para ">:" al final.
Eelvex

1
@Eelvex No tengo idea de por qué los dados del mundo real son de 1 a 6 cuando todos los razonamientos razonables sobre ellos usan 0 a 5.: D
JB

2

GS2, 16 bytes

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

Así es como funciona

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

Creo que gs2 es más nuevo que este desafío.
lirtosiast

1

QBasic (71 caracteres)

Las dos nuevas líneas son necesarias e incluidas en el carácter cuentan como un carácter cada una.

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

Solución aburrida, pero es más corta que la revisión anterior. Aprovecho el hecho de que en una calculadora nueva, Ansse inicializa a cero.


No sé si es posible, pero daré 50 repeticiones a cualquiera que pueda encontrar una solución más corta.
lirtosiast

¿Cómo estás calculando 34?
recursivo el

Cada ficha aquí es un byte en memoria ; Es estándar que TI-BASIC se califique de esta manera. Si tiene una calculadora, escriba el programa, mire la pantalla de administración de memoria, reste 9 y reste la longitud del nombre del programa para obtener el tamaño del código.
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;}

Pruébalo aquí.

Como programa completo con método principal detallado, esto sería 178 bytes en su lugar:

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

Pruébalo aquí.

Semi-puerto de la respuesta Bash de @AmanZeeKVerma .

Explicación:

 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

Me alegra poder mostrar la xaleatorización de puntero de código de > <> ya que no recuerdo haberlo visto aquí.

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

Puede probarlo en este intérprete en línea (pegar código, enviar, iniciar).


Recibirás mi voto positivo una vez que arregles la solución.
lirtosiast

@ThomasKwa Listo, es posible que pueda jugar golf un poco, pero al menos ahora es funcional.
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]

Pruébalo en línea!

Hay una respuesta R más golfista, pero creo que este es un enfoque diferente de las respuestas presentadas hasta ahora.

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

Definitivamente se puede jugar al golf, pero actualmente no lo veo.

Pruébalo en línea.

Explicación:

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.