답변:
세게 때리다
#/!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에 톤의 문자를 낭비합니까?
for(i in 0:9)cat(F<-sample(setdiff(1:6,c(F,7-F)),1))
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)) 끝난
핵심 아이디어는 y와 같지 않은 [1, x]에서 난수를 선택하려면 [1, x-1]에서 난수를 선택한 다음> = y이면 증가시킬 수 있다는 것입니다. 이 문제의 경우 [1,6]에서 f 또는 7-f와 다른 난수를 원합니다. min (f, 7-f), max (f, 7-f) 순서로 두 가지 테스트를 수행해야합니다.
초기에 비어있는 환경에서 i를 초기화하지 않고 루프 조건을 i++<10
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 끝난
NB는 첫 번째 줄을 변경하여 5 문자로 축소 할 수 for((;i++<10;))
있지만 항상 유효한 것은 아니라는 가정을합니다. 그것은 아이디어에서 잘 작동하지만 쉘에서 실행하는 사람은 0이 아닌 것으로 가져 i
오거나 f
내보낼 수 있습니다 .
man bash
권합니다. 나는 한 번 그것을 커버하기 위해 그것을 읽었고, 가능하고 찾을 가치가있는 것에 대한 모호한 생각을 갖는 것이 저에게 잘 도움이되었습니다.
-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
}
역사:
The term 'random' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
Get-Random
cmdlet은 V1에 존재하지 않았다.
>:(?@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 간격으로 되돌립니다.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
For(I,1,9
Ans→X
Repeat Ans≠X and Ans≠7-X
randInt(1,6
End
Disp Ans
End
지루한 솔루션이지만 이전 버전보다 짧습니다. 나는 신선한 계산기에서 Ans
0으로 초기화 된다는 사실 을 이용합니다.
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
a=randi(6)
for i=1:9;b=1:6;b([a,7-a])=[];a=b(randi(4))
end
x
여기에서 본 것을 기억 나지 않기 때문에> <>의 코드 포인터 무작위 화를 보여줄 수있어서 기쁘다 .
a&0 v
/2v
1x3v
>x< <<
6x4v
\5v ~
:{:/ ^?=}
:{:/ ^?=7+}
:~$<^&;!?:-1&n
이 온라인 통역사 (코드 붙여 넣기, 제출, 시작) 에서 사용해 볼 수 있습니다 .
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]
[ ]#
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