도전
양의 정수가 주어짐 사이 (K)
의 균일 한 난수를 출력합니다 .(Y)
[0, K)
경우 Y > 0
가정 K = Y
때까지이 과정을 반복 Y = 0
.
규칙
- 입력은 처음에 인쇄되어야합니다
- 원하는 출력 형식
- 프로그램이 완료되어야합니다.
0
최종 출력이어야합니다 (선택적으로 빈 줄).0
도전
양의 정수가 주어짐 사이 (K)
의 균일 한 난수를 출력합니다 .(Y)
[0, K)
경우 Y > 0
가정 K = Y
때까지이 과정을 반복 Y = 0
.
규칙
0
최종 출력이어야합니다 (선택적으로 빈 줄). 0
답변:
.uOW
.uOW 전체 프로그램. STDIN에서 정수를 가져 와서 목록을 STDOUT으로 출력합니다. .u 누적 고정 소수점. 주어진 초기 값으로 주어진 함수를 적용하십시오. 결과가 발생할 때까지 입력에 암시 적으로 할당됩니다. 이전이 발견되었습니다. 중간 결과 목록을 반환합니다. W 조건부 응용 프로그램. 논쟁 (현재 가치)이 진실이라면 아래 기능을 적용하십시오. 그렇지 않으면 변경하지 마십시오. O [0, N) 범위의 임의의 정수. IOW : .u를 반복 할 때마다 현재 값에 변수 N을 할당하여 시작 입력과 함께. N이 0이 아닌 경우 [0, N)에서 임의의 정수를 선택하십시오. N을 변경하지 않고 반환합니다. 우리가 0을 만날 때마다 다음 반복도 결과적으로 0이되고 루프는 거기서 멈 춥니 다.
f(_){printf("%d\n",_);(_=rand()%_)&&f(_);}
단락 논리를 사용합니다.
f(_){ // f(int _) {
printf("%d\n",_); // print argument and a newline
(_=rand()%_) // set _ to rand()%_
&&f(_);} // short-circuit AND to recursively call f if _ not zero
f(_){printf("%d\n",_=rand()%_);_&&f(_);}
단락 논리를 사용합니다.
f(_){ // f(int _) {
printf("%d\n", // print an integer and a newline
_= // The integer is _ which we set to...
rand()%_); // a random value modulo the input _
_&&f(_);} // short-circuit AND to recursively call f if _ not zero
rand()%_
균일하지 않음
>0
및 cat(n,"")
(빈 문자열) 의지도 작동합니다.
k=scan();while(x<-sample(1:k-1,1))k=c(x,k);cat(rev(k),0)
n=scan();while(print(n))n=sample(n,1)-1
`tYrqt
` % Do...while
t % Duplicate. Takes input (implicit) the first time
Yr % Uniform random integer from 1 to n, included
q % Subtract 1
t % Duplicate. This will be used as loop condition
% End (implicit). Proceeds with next iteration if non-zero
% Display stack (implicit)
Pepe는 사용자 Soaku가 만든 프로그래밍 언어 입니다.
REeErEErReEEreeEREEeEEree
설명:
REeErEErReEEreeEREEeEEree # full program
REeE # input as num, in stack 1
rEE # create loop in stack 2 with name 0
rReEE # - output and preserve the number in stack 1
reeE # - output a newline "\n"
REEeEE # - random number by 0 to input
ree # goto loop with name 0 if stack 1 is not equal
to stack 2
{$_,(^*).pick...0}
값 목록을 반환하는 익명 코드 블록 숫자가 범위를 신경 쓰지 않으면 다음을 수행 할 수 있습니다.
{^$_,^*.pick...0}
17 바이트 재미있게도, 또 다른 내장 임의 함수 인 roll
이 인스턴스에서 같은 양의 바이트에 대해 동일한 동작을합니다.
XƬ0
이것은 배열을 인쇄하고 0을 반환하는 모나드 링크 (함수)입니다 .
XƬ0 Monadic link. Argument: n
XƬ Pseudo-randomly pick (X) an integer k in [1, ..., n], set n = k, and repeat.
Do this 'til (Ƭ) the results are no longer unique and return the array of
unique results, including the initial value of n.
This stops once X returns k with argument k. The second k will be omitted
from the return value.
0 Print the resulting array and set the return value to 0.
ẉ?ℕ₁-₁ṙ↰
ẉ Write the input followed by a linebreak
?ℕ₁ The input must be in [1, …, +∞)
-₁ṙ Generate an integer in [0, …, input - 1] uniformly at random
↰ Recursive call with that random integer as the new input
재귀는 일단 ?ℕ₁
실패하면, 즉 입력이이면 중지됩니다 0
.
[:}:? ::]^:a:
지하철에서는 TIO 부족에 대해 사과드립니다 (정확히 부족하지는 않습니다).
값 목록을 출력합니다.
아마도 APL 접근 방식은 더 짧을 지 모르지만 이것이 내가 생각한 것입니다.
^:a:
수렴 할 때까지 반복해서 적용하여 중간 결과를 배열에 저장합니다.
?
범위의 임의의 정수 [0, K)
대 K
0 0보다 큰, 그것은 범위의 임의의 정수를 준다 (0,1)
. 부동 소수점 숫자의 경우 오류가 발생합니다.
::]
오류가 아닌 입력에 ?
오류가 발생하면 오류를 일으킨 입력을 출력하십시오.
}:
배열의 마지막 값을 제거하십시오 (부동 소수점 숫자가 출력되지 않도록하십시오).
?.
도 있지만, 나는 그것을 사용하고 있다고 생각하지 않습니다.
new Date%n
은 여기에서 실제로 작동하지 않습니다. 여러 개의 난수를 생성하는 데 유용 할 정도로 빠르게 변경되지 않기 때문입니다.
f(k){printf("%d ",k);k?f(rand()%k):0;}
언 골프
void f(int k){
printf("%d ",k);
if(k)
f(rand()%k);
}
W
~O
이것은 기본적으로 알고리즘을 구현합니다.
Pyth를 알고리즘으로 변환하기 위해 대부분 각 문자의 의미를 검사 할 수 있습니다. Pyth는 접두사 표기법으로 작성되므로* + 1 2 3
입니다 (1 + 2) * 3
) 우리가 가서 우리가 인수 왼쪽 채우기에서 시작할 수 있습니다.
W
전통적인 while 루프를 시작합니다. 그 이후의 첫 번째 명령문은 루프 조건이고 그 이후의 두 번째 명령문은 루프 본문입니다. 두 번째 진술이 비어 있으면 no-op가됩니다 됩니다. 이것은 파이썬과 똑같이 작동하므로 0이 아닌 정수는 True로, 0은 false로 평가합니다.
while 이후의 첫 번째 문장은 개행 문자로 시작합니다. 이것은 Pyth의 "인쇄 및 줄 바꿈으로 리턴"기능에 해당합니다. 이것은 하나의 인수를 취한 다음 인쇄되고 수정되지 않은 상태로 리턴됩니다. 이를 통해 필요한 단계를 수행하면서 중간 단계를 인쇄 할 수 있습니다.
이 인쇄 함수에 전달 된 인수 ~
는 약간 특수한 것으로 시작합니다 . 바로 뒤에 나오는 문자 ~
가 변수이면 두 개의 인수를 사용하고 그렇지 않으면 하나의 인수를 사용합니다. O
변수가 아니기 때문에 ~
하나의 인수 만 소비합니다. ~
기능처럼 조금 +=
가장 가까운 운전자가 후행 증가 연산자 것입니다하지만, 많은 기존의 언어 수행 ++
에서 C
. 당신은 알고 있습니다 x++
사용과 같은 것입니다 x
현재의 값으로, 그러나 그 이후 x
가 될 것입니다 x+1
. ~
같은 생각이지만 첫 번째 논쟁의 결과가 무엇이든 일반화됩니다. 할당 할 변수를 선택하는 방법은 나중에 설명합니다.
의 인수 ~
IS O
매우 간단합니다. 하나의 인수가 정수인 경우O
경우 임의의 정수로 균일하게 0에서 1보다 작은 값을 리턴합니다.
이제 당신은 O
논쟁이 없다는 것을 알았을 것 입니다. 여기서 Pyth 인터프리터는 친절하게 추측을 채 웁니다 Q
. 여기서는 변수 입니다. Q
Pyth에서 특별한 의미를 갖습니다. 프로그램에 존재할 때마다 Pyth 프로그램은 프로그램 Q
의 입력에 할당 을 시작 합니다. 이것이 ~
인수 에서 발생하는 첫 번째 변수이기 때문에 Q
이제는~
값을 지정할 합니다.
"읽을 수있는"프로그램을 요약하면 다음과 같습니다.
while print_and_return( assign_variable( Q, unif(0, Q-1) ) ):
pass
그리고 하나의 샘플 "run-through"는 다음과 같습니다.
O
3을 ~
반환하고 5를 \n
반환하고 5를 반환하고 인쇄합니다.O
0을 반환하고 ~
, 3을 \n
반환하고 , 3을 반환하고 인쇄합니다.O
관련없는 것을 반환하고 ~
, 0을 \n
반환하고 , 0을 반환하고 인쇄합니다.익명의 암묵적 접두사 기능. ⎕IO
( i ndex O rigin)을 0
많은 시스템에서 기본값 이라고 가정 합니다. 실행 중 인쇄 외에 최종 값 (0)을 반환합니다.
{⌊?⎕←⍵}⍣=
{
… }⍣=
안정 될 때까지 다음 기능을 적용하십시오.
⎕←⍵
인수를 출력
?
0에서 1 사이의 균일하게 분포 된 난수를 반환합니다. –1
⌊
반올림 ( ?0
(0,1) 부동 소수점을 제공 하기 때문에 )
일부 바보 는 초기 값을 먼저 인쇄하는 것을 잊었습니다.
f(K){while(K)printf("%d\n",K,K=rand()%K);}
당황하지 마십시오.
f(K){while(K)printf("%d\n",K),K=rand()%K;}
. 아직도 당신은 동등한 해결책을 위해 나의 +1을 얻었습니다!
f(K){while(K)printf("%d\n",K,K=rand()%K);}
f=lambda k:print(k)or f(hash('.'*k)%k)
아마도 가장 암호로 안전한 난수 생성기는 아니지만 사람의 눈에는 충분히 무작위로 보입니다 ...
k=0
것이 허용 된다고 가정합니다 .
hash()
하려고 하지만 보증하지는 않습니다 . 이 작업에는 random
모듈을 사용해야합니다 .
random.randrange()
.from random import*;f=lambda k:print(k)or f(randrange(k))
While Ans
Disp Ans
int(randAns
End
Ans
Misha Lavrov 에서 -4 바이트
다음과 Ans
같이 입력을받습니다.50:prgmNAME
받습니다.
TI-Basic은 토큰 화 된 언어입니다 입니다. 여기에 사용 된 모든 토큰은 1 바이트입니다.
설명:
While Ans # 3 bytes, While the number we hold is not zero:
Disp Ans # 3 bytes, Display it on its own line
int(randAns # 4 bytes, and replace it with a number randomly
# chosen from 0 to one less than it (inclusive)
End # 2 bytes, end While loop
Ans # 1 byte, Display (and return) zero
Misha Lavrov가 제안한 11 바이트 솔루션으로 enter
, 첫 번째 줄을 따라 각 줄마다 눌러야합니다 .
Ans
While Ans
Pause int(randAns
End
int(Ansrand
더 짧습니다. 또한 Pause
대신에를 사용 Disp
하여 루프의 유일한 명령문을 Pause int(Ansrand
업데이트 할 수 Ans
있습니다.
from random import*
k=input()
while k:print k;k=randrange(k)
저장되었습니다
while 1:print k;k=randint(0,~-k)
작동해야합니다 (끝에 오류가 있음)
while 1:print k;k=randrange(k)
두 개 를 구합니다.
#import<cstdio>
#import<cstdlib>
#define d printf("%i ",x
int p(int x){d);while(x>0)d=rand()%x);}
용법
int main() {
p(100);
}
이것은 나의 첫 번째 코드 골프 시도입니다. 모든 의견이나 의견을 환영합니다.
편집 : 유효하도록 제안 된 주요 기능을 제거했습니다.
-Dd='printf("%i,",x'
instead of the #define
would save you some bytes (-4), and is allowed as long as you count the bytes towards your result (because it is a non-standard preprocessor directive. You can also leave out the imports (at least with -std=c++98
and -w
, which don't count for bytes), and the variable types. So, you'd have p(x){d);while(x>0)d=rand()%x;}
and -Dd='printf("%i,",x'
.
:nao:0=?;0_1>:{:}(?\\
}(?!\$2*1>x~\$+1$*2/\~00:{{:@}
8+1.\~:{:}\+>$1+f
~~@~~47*0.\(a2*1@@?!.
+2B for -v flag
> <>의 유일한 무작위 소스는 명령 포인터의 방향을 임의의 값으로 설정하는 'x'명령어에서 비롯됩니다. 따라서 0에서 n까지의 난수를 생성하는 것은 쉽지 않습니다.
먼저 [0, n) 범위의 숫자를 나타내는 데 필요한 비트 수를 계산 한 다음 임의의 비트를 생성하여 임의의 숫자를 생성합니다. 이것은 n보다 약간 큰 숫자를 생성 할 가능성을 남겨두고,이 경우 그냥 버리고 다시 시도합니다.
:nao Print the current number followed by a newline
:0=?; If the current n is 0, terminate
Calculate how many random bits we need to be generating:
0 1 Initialise the variables for this loop:
numberOfBits = 0, maxValue = 1
:{:}(?\ If maxValue >= n, break out of the loop
*2 maxValue *= 2
$+1$ numberOfBits += 1
Generate the random number:
~ Delete maxValue
00 Initialise randomNumber = 0, i = 0
}(?!\ :{{:@} If i >= numberOfBits, break out of the (inner) loop
$2* randomNumber *= 2
_
1>x~\ The random bit: If the IP goes up or
\+> left, it'll be redirected back onto the 'x',
if it goes down, it adds one to randomNumber
If it goes right, it does nothing to randomNumber
$1+ increment i
8+1. f Jump back to the start of the inner loop
After we've generated our number, check that it's actually below n
~ Delete i
:{:} ( ? Test that the number is less than n
a2*1 . If it's not, jump back to the start
of the number generation section
@~~ Otherwise delete the old value of n, and numberOfBits
47*0. Then jump back to the start of the program
@(k)eval('while k;disp(k);k=randi(k)-1;end;0')
Sample output:
>> @(k)eval('while k;disp(k);k=randi(k)-1;end;0')
ans(5)
ans =
@(k)eval('while k;disp(k);k=randi(k)-1;end;0')
5
3
2
1
ans =
0
k=randi(k)-1
for a few bytes less.
.+
*
L$`.
$.`
+¶<)G?`
Try it online! Explanation:
+
Repeat until the value stops changing (i.e. 0).
¶<)
Print the value before each pass through the loop.
.+
*
Convert to unary.
L$`.
$.`
Create the range and convert to decimal.
G?`
Pick a random element.
QWQ=OQQ
+1 to print the initial input value.
While Q is truthy, set Q to be a random integer between 0 and Q and print Q.
Not the shortest Pyth answer but I'm just learning and only posting because of the recent discussion about no-one using Pyth any more :)
=
and ~
use the first variable of an expression as the variable that will be assigned if one isn't specified. For example ~hT
will set T
to 11 while returning 10. The only other fancy trick is that the newline character prints its input and then returns that value unmodified, so we can have an empty loop body. Let me know if something else is confusing :)
-3 bytes by actually doing what the specs say it should do.
import System.Random
f 0=pure[0]
f x=randomRIO(0::Int,x-1)>>=fmap(x:).f
-4 bytes thanks AdmBorkBork
filter f{$_;if($_){Random $_|f}}
Testscript:
filter f{$_;if($_){Random $_|f}}
100 |f
Output:
100
61
20
8
6
3
0
for($a="$args";$a;$a=Random $a){$a}
Full program. Takes input $args
, stores it into $a
, and enters a for
loop. Each iteration we're checking whether $a
is still positive (as 0
is falsey in PowerShell). Then we leave $a
on the pipeline and move to the next iteration, where we set $a
to be the result of Get-Random $a
, which returns an integer in the range 0..($a-1)
.
(Ab)uses the fact that PowerShell outputs an additional trailing newline in lieu of outputting the final zero (allowed by the rules as currently written).
"$args"
- nice. I was stuck on $args[0]
in this case