Dados aleatórios


14

Em um dado padrão (dado), os números são organizados de modo que faces opostas aumentem para sete. Escreva o programa mais curto possível no seu idioma preferido, que produz um lance aleatório seguido por 9 dicas aleatórias. Uma gorjeta é um quarto de volta dos dados, por exemplo, se os dados estão voltados para 5, todas as gorjetas possíveis são 1,3,4 e 6.

Exemplo de saída desejada:

1532131356

Respostas:


5

GolfScript, 26 caracteres

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

Uma versão um pouco mais compactada do Joey , basicamente, contornando o problema com a indexação zero.


9

Ruby, 44

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

Eu encontrei o truque [* 1..6] experimentando com sorte.


1
Alguns truques legais aqui, ótimas coisas. Batendo na cabeça por perder o método de amostra Array #.
Lars Haugseth,

4

JavaScript (71 caracteres)

Pode ser necessário substituir printpor alertou algo mais, dependendo do seu ambiente JavaScript.

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

mesclar loops incrementando condicionalmente o externo quando um valor é encontrado: para (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

Bater

#/!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 exemplo: http://ideone.com/CCfro


O uso de ((var=expression))é muito bom - eu pensei que o caminho mais curto era var=$((expression))Mas por que você usa isso apenas uma vez e desperdiça toneladas de caracteres em expr em backticks?
Peter Taylor

Eu não faço muito script de shell, mas por algum motivo ((var = expr)) em alguns lugares falhou (sim, esquisito: P) Desde que iniciei esse script, concluí de alguma forma. :)
Aman ZeeK Verma


2

Bash com apenas um loop: 100 99 98 96

para ((i = 10, f = RANDOM% 6 + 1; i -;)) faça
printf $ f
((n = RANDOM% 4 + 1, m = f <4? f: 7-f, f = n <m || ++ n <7-m? n: n + 1))
feito

http://ideone.com/XrZO7

A idéia principal é que, para escolher um número aleatório em [1, x] que não seja igual a y, você pode escolher um número aleatório em [1, x-1] e depois incrementar se for> = y. Para esse problema, queremos um número aleatório em [1,6] que não seja igual a f ou 7-f. Temos que fazer os dois testes na ordem min (f, 7-f), max (f, 7-f).

Supondo que um ambiente inicialmente vazio possa salvar 2 caracteres, não inicializando ie alterando a condição do loop para i++<10


2

Bash: 97 94 92 90 89 87

Golfe pesado com a resposta de Aman ZeeK Verma:

para ((i = 10, f = 0; i -;)) faça
para ((n = f; n == f || n + f == 7; f = RANDOM% 6 + 1)) faça:
feito
printf $ f
feito

http://ideone.com/QiuTx

NB, sem dúvida, pode ser reduzido em 5 caracteres, alterando a primeira linha para, for((;i++<10;))mas isso faz suposições que nem sempre são válidas. Funcionaria bem no ideone, mas alguém executando-o a partir de um shell poderia ter iou fexportado para algo diferente de zero.


Eu gostaria de fazer uma versão sem o loop interno, mas temo que seja mais longo.
Peter Taylor

Isto é extremamente incrível, estou muito cru para a festança eu acho :)
Aman Verma Zeek

@ Aman, a maior parte não é específica para o bash. São apenas algumas dezenas de refinamentos com testes após cada um e reversões quando quebrei alguma coisa. A única parte que realmente é um truque de festa é o noop, que eu tive que procurar. Se você tiver tempo para ler man bash, eu recomendo. Uma vez eu li de capa a capa, e apenas ter uma vaga idéia do que é possível e vale a pena procurar me serviu bem.
Peter Taylor

2

Windows PowerShell, 45

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

Bastante trivial, na verdade. Gero uma lista de possíveis jogadas de dados 1..6e, em seguida, seleciono apenas aquelas que não são iguais a sete menos o último jogo e, em seguida, apenas aquelas que não são iguais ao último jogo. Na lista restante, seleciono um item aleatório e o atribuo $d. Uma vez que $dé tratado inicialmente, 0ele lança um dado normal pela primeira vez.

Script de teste:

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
}

História:

  • 18/02/2011 11:57 (61) Primeira tentativa.
  • 2011-02-18 11:58 (45) Não preciso gerar o primeiro número separadamente.

Eu receboThe 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. O Get-Randomcmdlet não existia na v1.
Joey

2

J

Isso deve funcionar, mas infelizmente o gerador aleatório de J fica bloqueado após a 3ª iteração:

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

6 4 5 4 5 4 5 4 5 4


Não sou, de modo algum, um especialista em J, mas me parece que sofri ao compor minha resposta em J a esse segmento que (?4)tende a ser rolado uma vez e tratado como uma constante para iterações subseqüentes, se você não for cuidadoso com isso. Eu trabalhei em torno dele usando uma (?@4:)construção semelhante.
JB

2

Rubi

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

Explicações (leia da direita para a esquerda):

  • ?6 retorna um número aleatório entre 0 e 5
  • ^:(<10)aplica uma função 9 vezes, acumulando os resultados ao longo do caminho. A função é:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- retorna uma matriz do número de entrada e seu complemento para 5 (atualmente estamos lidando com números baseados em 0, então a soma das faces opostas é 5)
    • (i. 6) -. remove-os do conjunto completo de números inteiros de 0 a 5. Ficamos com todas as posições válidas após uma única operação de inclinação da posição de entrada.
    • ?@4: { escolhe um deles aleatoriamente.
  • >: incrementa a sequência inteira para retornar as figuras ao intervalo de 1 a 6.

Bom pensamento para ">:" no final.
Eelvex 15/02/11

1
@Eelvex Não tenho idéia de por que os dados do mundo real são de 1 a 6 quando todo o raciocínio sensato sobre eles usa de 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

Veja 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

Eu acho que o gs2 é mais novo que esse desafio.
lirtosiast

1

QBasic (71 caracteres)

As duas novas linhas são necessárias e incluídas na contagem de caracteres como um caractere cada.

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

Solução chata, mas é mais curta que a revisão anterior. Aproveito o fato de que, em uma calculadora nova, Ansé inicializado como zero.


Não sei se é possível, mas darei 50 representantes a quem puder encontrar uma solução mais curta.
Lirtosiast

Como você está calculando 34?
recursivo

Cada token aqui é um byte na memória ; é padrão que o TI-BASIC seja pontuado dessa maneira. Se você possui uma calculadora, digite o programa, veja a tela de gerenciamento de memória, subtraia 9 e subtraia o comprimento do nome do programa para obter o tamanho do 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;}

Experimente aqui.

Como programa completo com o método principal detalhado, seriam 178 bytes :

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

Experimente aqui.

Semi-porto da resposta Bash de @AmanZeeKVerma .

Explicação:

 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

Estou feliz por poder mostrar a xrandomização de ponteiro de código de > <>, pois não me lembro de vê-la aqui.

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

Você pode experimentá-lo neste intérprete online (colar código, enviar, iniciar).


Você receberá meu voto positivo depois de corrigir a solução.
lirtosiast

@ThomasKwa Feito, talvez eu consiga jogar um pouco mais, mas pelo menos agora está 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]

Experimente online!

Existe uma resposta de golfista R, mas acho que é uma abordagem diferente das respostas enviadas até agora.

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 posso jogar golfe, mas atualmente não estou vendo isso ..

Experimente online.

Explicação:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.