임의의 주사위 팁


14

표준 주사위 (다이)에서 숫자는 반대쪽면이 7 개가되도록 배열됩니다. 원하는 언어로 가장 짧은 프로그램을 작성하여 무작위 던지기와 9 개의 무작위 팁을 출력하십시오. 팁핑은 주사위의 1/4 회전입니다. 예를 들어 주사위가 5를 향한 경우 가능한 모든 팁은 1,3,4 및 6입니다.

원하는 출력 예 :

1532131356

답변:


5

GolfScript, 26 자

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

약간 더 압축 된 Joey 버전은 기본적으로 제로 인덱싱 문제를 해결합니다.


9

루비, 44

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

운이 좋은 실험으로 [* 1..6] 트릭을 찾았습니다.


1
여기에 몇 가지 멋진 트릭이 있습니다. Array # sample 메소드가 누락되어 머리에 닿았습니다.
Lars Haugseth

4

자바 스크립트 (71 자)

당신은 교체해야합니다 print으로 alert또는 자바 스크립트 환경에 따라 다른 것.

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

값을 찾을 때 조건부 바깥 쪽을 조건부로 증가시켜 병합 루프 : for (b = n = 10; n; ab && a + b-7 && print (b = a, n-)) a = Math.random () * 6 + 1 | 0
imma

4

골프 스크립트, 28

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

3

세게 때리다

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

샘플 코드 : http://ideone.com/CCfro


사용 ((var=expression))이 매우 좋습니다-가장 짧은 방법이라고 생각했습니다. var=$((expression))그러나 왜 한 번만 사용하고 역학으로 expr에 톤의 문자를 낭비합니까?
피터 테일러

나는 많은 쉘 스크립팅을하지 않지만 어떤 이유로 어떤 곳에서 ((var = expr)) 실패했습니다 (yeah weird : P)이 스크립트를 시작한 후, 나는 어떻게 든 완성되었습니다. :)
Aman ZeeK Verma


2

하나의 루프 만있는 배쉬 : 100 99 98 96

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

http://ideone.com/XrZO7

핵심 아이디어는 y와 같지 않은 [1, x]에서 난수를 선택하려면 [1, x-1]에서 난수를 선택한 다음> = y이면 증가시킬 수 있다는 것입니다. 이 문제의 경우 [1,6]에서 f 또는 7-f와 다른 난수를 원합니다. min (f, 7-f), max (f, 7-f) 순서로 두 가지 테스트를 수행해야합니다.

초기에 비어있는 환경에서 i를 초기화하지 않고 루프 조건을 i++<10


2

배쉬 : 97 94 92 90 89 87

Aman ZeeK Verma의 답변에서 엄청나게 골프를 쳤습니다.

for ((i = 10, f = 0; i-;)) do
for ((n = f; n == f || n + f == 7; f = RANDOM % 6 + 1)) do :
끝난
printf $ f
끝난

http://ideone.com/QiuTx

NB는 첫 번째 줄을 변경하여 5 문자로 축소 할 수 for((;i++<10;))있지만 항상 유효한 것은 아니라는 가정을합니다. 그것은 아이디어에서 잘 작동하지만 쉘에서 실행하는 사람은 0이 아닌 것으로 가져 i오거나 f내보낼 수 있습니다 .


내부 루프가없는 버전을 만들고 싶지만 더 길어질 까 걱정됩니다.
피터 테일러

이것은 매우 굉장합니다, 나는 bash를 위해 너무 생생합니다 :)
Aman ZeeK Verma

@Aman, 대부분은 bash에 국한되지 않습니다. 각 테스트 후 테스트와 수십 번의 개선으로 인해 무언가를 깨뜨릴 수 있습니다. 실제로 배쉬 트릭 인 유일한 비트는 noop입니다. 그래도 읽을 시간이 있다면 man bash권합니다. 나는 한 번 그것을 커버하기 위해 그것을 읽었고, 가능하고 찾을 가치가있는 것에 대한 모호한 생각을 갖는 것이 저에게 잘 도움이되었습니다.
피터 테일러

2

윈도우 PowerShell, 45

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

사실 아주 사소합니다. 가능한 주사위 롤 목록을 생성 한 1..6다음 마지막 롤에서 7을 뺀 것과 마지막 롤을 뺀 것을 선택합니다. 나머지 목록에서 임의의 항목을 선택하고에 할당합니다 $d. 이후$d처음 0에 일반 주사위를 굴릴 때 처음 처리되기 때문입니다.

테스트 스크립트 :

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
}

역사:

  • 2011-02-18 11:57 (61) 첫 번째 시도.
  • 2011-02-18 11:58 (45) 첫 번째 숫자를 따로 생성 할 필요가 없습니다.

나는The term 'random' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
피터 테일러

@Peter : PowerShell v2입니다. Get-Randomcmdlet은 V1에 존재하지 않았다.
Joey

2

제이

이것은 작동하지만 불행히도 J의 랜덤 생성기는 세 번째 반복 후에 중단됩니다.

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

6 4 5 4 5 4 5 4 5 4


나는 J 전문가가 아니지만, 나는이 스레드에 대한 J 답변을 작성하는 데 어려움을 겪었던 것으로 보인다 (?4). 나는 (?@4:)비슷한 구조를 사용하여 해결했습니다 .
JB


2

J, 30 자

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

6 2 3 5 4 2 4 1 3 6

설명 (오른쪽에서 왼쪽으로 읽음) :

  • ?6 0에서 5 사이의 난수를 반환합니다.
  • ^:(<10)기능을 9 번 적용하여 그 결과를 누적합니다. 기능은 다음과 같습니다
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- 입력 숫자의 배열과 5의 보수를 반환합니다 (현재 0부터 시작하는 숫자를 처리하고 있으므로 반대면의 합은 5입니다)
    • (i. 6) -. 정수 0에서 5까지의 정수 세트에서 그것들을 제거합니다. 입력 위치에서 한 번의 팁 조작 후에 모든 유효한 위치가 남습니다.
    • ?@4: { 그중 하나를 무작위로 선택합니다.
  • >: 전체 시퀀스를 증가시켜 수치를 1-6 간격으로 되돌립니다.

그런 다음 "> :"에 대한 좋은 생각.
Eelvex

1
@Eelvex 나는 실제 주사위가 왜 1에서 6인지에 대해 전혀 모른다. 그들에 대한 모든 합리적인 추론이 0에서 5를 사용할 때 : D
JB

2

GS2, 16 바이트

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

작동 방식은 다음과 같습니다.

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

나는 gs2가이 도전보다 새로운 것이라고 생각한다.
lirtosiast

1

Q 기본 (71 자)

두 줄 바꿈이 필요하며 문자에 포함되어 각각 한 문자로 간주됩니다.

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

지루한 솔루션이지만 이전 버전보다 짧습니다. 나는 신선한 계산기에서 Ans0으로 초기화 된다는 사실 을 이용합니다.


가능한지 모르겠지만 더 짧은 해결책을 찾을 수있는 사람에게 50 명의 담당자를 줄 것입니다.
lirtosiast

34는 어떻게 계산합니까?
재귀 적

여기서 각 토큰은 메모리에서 1 바이트입니다 . TI-BASIC은 이런 방식으로 점수를 매기는 것이 표준입니다. 계산기가있는 경우 프로그램을 입력하고 메모리 관리 화면을 확인한 다음 9를 빼고 프로그램 이름의 길이를 빼서 코드 크기를 얻으십시오.
lirtosiast

1

자바 8, 130 바이트

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

여기에서 시도하십시오.

장황한 main-method를 사용하는 전체 프로그램으로서 이것은 178 바이트입니다 .

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

여기에서 시도하십시오.

@AmanZeeKVerma 의 Bash 답변의 세미 포트 .

설명:

 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 바이트

x여기에서 본 것을 기억 나지 않기 때문에> <>의 코드 포인터 무작위 화를 보여줄 수있어서 기쁘다 .

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

이 온라인 통역사 (코드 붙여 넣기, 제출, 시작) 에서 사용해 볼 수 있습니다 .


솔루션을 수정하면 공감대를 얻게됩니다.
lirtosiast

@ThomasKwa Done, 나는 약간 아래로 골프를 칠 수는 있지만 적어도 이제는 기능적입니다.
Aaron Aaron

0

R , 67 바이트

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

온라인으로 사용해보십시오!

golfier의 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 바이트

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

확실히 골프를 칠 수는 있지만 현재는 볼 수 없습니다 ..

온라인으로 사용해보십시오.

설명:

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.