Tạo một chương trình ngẫu nhiên bằng ngôn ngữ yêu thích của bạn [đã đóng]


21

Chúng ta đều nghe nói về trình biên dịch thử nghiệm sử dụng đầu vào được tạo ngẫu nhiên. Nhiệm vụ của bạn là viết một chương trình để tạo ra một chương trình hợp lệ (bao gồm không có hành vi không xác định) bằng ngôn ngữ yêu thích của bạn. Ngôn ngữ chương trình tạo không nhất thiết phải giống với ngôn ngữ chương trình đã tạo.

Chương trình của bạn sẽ nhận được một số nguyên làm đối số mà bạn có thể sử dụng làm hạt giống cho trình tạo số ngẫu nhiên của mình. Các chương trình được tạo nên có cấu trúc khác nhau (được cung cấp các hạt khác nhau) không chỉ các tên biến hoặc hằng khác nhau.

Ví dụ:

$ ./generate 1
int main() { return 0; }

$ ./generate 2
#include <math.h>
int main() { return (int) pow(4, 3); }

Vui lòng bao gồm một vài kết quả đầu ra trong câu trả lời của bạn.

Giải pháp ngắn nhất sẽ thắng. Tôi sẽ cho một phần thưởng nhỏ dựa trên số phiếu bầu, vì vậy hãy bỏ phiếu cho các giải pháp sáng tạo nhất.


2
Nhiệm vụ hoàn hảo để phát triển các thuật toán di truyền với sự tiến hóa kết thúc mở. Tôi đã luôn tự hỏi làm thế nào nó có thể được thực hiện.
mellamokb

1
Tôi nghĩ rằng việc thiếu một đặc điểm kỹ thuật cố định làm cho điều này trở thành một câu hỏi tồi. "Cấu trúc khác nhau" là mở để giải thích, và trong một số giải thích, đây là một vấn đề cực kỳ đơn giản.
Peter Taylor

1
Tất cả những gì thực sự cần làm là chơi golf một chương trình có thể tạo ra một câu ngẫu nhiên từ một ngữ pháp BNF nhất định (đây là chuyện nhỏ). Sau đó, chỉ cần cắm ngữ pháp cho bất kỳ ngôn ngữ lập trình và poof nào khác : một chương trình hợp lệ trong ngôn ngữ đó. Điều này sẽ làm việc cho bất kỳ ngôn ngữ không ngữ cảnh (không may loại trừ Perl).
ESultanik

2
main(seed) { return 4; // Chosen by dice roll - Guaranteed to be random } Tham khảo
Neil

1
Neil: Chỉ cần lưu ý: Có lẽ tất cả mọi người ở đây đều biết xkcd, đặc biệt là liên kết. Có lẽ họ cũng biết Dilbert một về số ngẫu nhiên. Và nó không có liên quan ở đây vì nó yêu cầu một chương trình có cấu trúc ngẫu nhiên, không chỉ là một số ngẫu nhiên.
Joey

Câu trả lời:


18

Python → Brainf * ck (185 223 233 255 285 287 303 ký tự)

import random as r,sys
r.seed(int(sys.argv[1]))
c=list('<>.,+-')+['']
n=9/r.random()
def b():
 global n
 s=''
 while n>0:n-=1;o=r.choice(c);s+=o if o else'[%s]'%b()
 return s
print b()
  • 303 → 287 Ký tự : Đã xóa math.ceil(không thực sự cần thiết).
  • 287 → 285 Ký tự : Chuyển sang một chuỗi trống để biểu thị toán tử nhánh.
  • 285 → 255 Ký tự : Ngưng câu lệnh if trong vòng lặp while.
  • 255 → 233 Nhân vật : Đã thực hiện các đề xuất của JBernardo từ các bình luận.
  • 233 → 223 Nhân vật : Đã thực hiện đề xuất của tjko từ các bình luận.
  • 223 → 185 Ký tự : Đã triển khai một số đề xuất giảm khoảng trắng từ các bình luận.

Ví dụ

$ python generate.py 1
-->,,+-<<-,-<,->[[<<,[.>.<>,,>>>,.<-,+>[[<.-+[.-+.+[-,+<>-.>,++.,,-,.,<<+[+]]]]]]]]
$ python generate.py 2
[<<--+.+++>]
$ python generate.py 3
,.++<<->>[,-,+>+[,-+<-+.<[,-[+[.-,[[<<>[,+.]]]]]]]]

Trên thực tế để tìm ra những gì các chương trình BF kết quả làm là trái như một bài tập cho người đọc.


bạn cũng có thể sử dụngif o: s+=0(NL)else: s+='['+b()+']'
Alexandru

@Alexandru: Cảm ơn! Tôi bỏ lỡ điều đó. Mã của bạn dường như không hoạt động chính xác, nhưng nó giúp tôi rút ngắn hơn.
ESultanik

3
Điều này bằng cách nào đó có nghĩa là Brainfuck là ngôn ngữ yêu thích của bạn?
zneak

1
Không phải đây là một vấn đề, nhưng mã xuất ra có thể sẽ gây ra một vòng lặp vô hạn.
Peter Olson

6
@Peter, đúng, nhưng tránh sử dụng phương pháp tạo ngẫu nhiên này có khả năng tương đương với việc giải quyết vấn đề Dừng!
ESultanik

17

Python -> Piet, 385 345 char

Có thể tạo bất kỳ chương trình Piet nào với điều này. Tôi chỉ có thể dừng lại ở các pixel ngẫu nhiên, nhưng tôi muốn tạo ra các chương trình "thú vị". Hàm này mvẽ một pixel một màu và đệ quy từng bước vào từng pixel đó. Có nhiều cách tốt hơn để vẽ các đốm màu ngẫu nhiên, nhưng điều này được điều chỉnh để chấm dứt trong một số bước hợp lý, vì vậy nó đủ tốt để chơi gôn. Hàm này R(w,h,n)vẽ n đốm màu ngẫu nhiên lên hình ảnh trắng ( w x h ) và in kết quả ở định dạng PPM.

Tôi đặc biệt tự hào về cách tôi tạo ra màu sắc - cho một sự lựa chọn ngẫu nhiên 0 <= c < 20,

`[0,192,255][int(x)]`for x in'0002212220200101121100'[c:c+3]

là mã thập phân cho một màu hợp lệ trong bảng màu Piet bằng mã Gray theo dõi đơn . Nghĩa là, mỗi màu được biểu thị bằng 3 bit liền kề và mỗi lát cắt '0003...0'[c:c+3]đại diện cho một màu khác nhau. Vì đây không phải là danh sách đầy đủ gồm 27 từ trên 3 chữ cái, tôi thực sự may mắn khi tìm được mã Gray.

from random import*
r=randint
def R(w,h,n):
 M=[6]*h*w
 def m(x,y,c,d):M[y%h*w+x%w]=c;t=r(0,15)*(r(0,d)<2);t&8and m(x+1,y,c,d+1);t&4and m(x-1,y,c,d+1);t&2and m(x,y+1,c,d+1);t&1and m(x,y-1,c,d+1)
 while n:m(r(0,w),r(0,h),r(0,19),0);n-=1
 print"P3 %s %s 255 "%(w,h)+' '.join(`[0,192,255][int(x)]`for c in M for x in'0002212220200101121100'[c:c+3])

Đầu ra mẫu, được tạo bởi lệnh R(30,40,500)

chương trình ngẫu nhiên

Không cần nhập, tôi cũng có thể viết nó dưới dạng 1-liner thích hợp (không có dấu chấm phẩy):

import random
R=(lambda P,I,E,T:lambda w,h,n:E(w,h,I(w,h,n,lambda z,c,d,t:sum((((z,c),)*t*T(0,1)or m((z[0]+a,z[1]+b),c,d+1,T(0,d)>1)for a,b in((0,1),(1,0),(-1,0),(0,-1))),()))))(range,lambda w,h,n,m:dict(sum((m((T(0,w),T(0,h)),T(0,19),0,0)for _ in P(n)),())),lambda w,h,M:"P3 %s %s 255 "%(w,h)+' '.join(' '.join(`(x&1)*255+(x&2)*96`for x in map(int,'0001121110100202212200'[c:c+3]))for c in(M[z]if z in M else 6for z in((x,y)for y in P(h)for x in P(w)))),random.randint)

nhưng nó chậm đến mức nực cười (và dài hơn 100 ký tự) ... mặc dù tôi không hoàn toàn chắc chắn tại sao (và không có khuynh hướng khủng khiếp để tìm hiểu).


9

Python -> Python, 135 ký tự

import random,sys
random.seed(int(sys.argv[1]))
R=range(9)
print'print 1'+''.join(random.choice('+*')+'%d'%random.choice(R)for x in R)

Tạo các đánh giá biểu thức ngẫu nhiên nhỏ, như thế này:

> ./genprogram.py 1
print 1+7*2+4*7+0*3*0+6+8
> ./genprogram.py 2
print 1*8+0*6*2*5*1+3*8*4
> ./genprogram.py 3
print 1+4+5*0+7+2*4*4*1*7
> ./genprogram.py 4
print 1+0+1+3*7*1*2+0+8*7

8

Python -> HQ9 +: 108 ký tự

import random
def g(): return ''.join([random.choice(['H','Q','9','+']) for x in range(random.randint(1,9))])

6

PHP, 352 ký tự

Tạo mã PHP trong PHP.

Tôi quyết định tôi không quan tâm nhiều đến chiều dài, nhưng thay vào đó muốn có một bộ giải pháp thú vị và đa dạng. Đây là câu trả lời của tôi cho điều đó.

<?php mt_srand(0+$argv[1]);$r=mt_rand(1,100);$s="\$i=rand(1,$r);";while($r>0){$s.='$i';if(!($r%10))$s.='*=2;';if(!($r%9))$s.='++;';if(!($r%8))$s.='=pow($i,rand(1,$i));';if(!($r%7))$s.='--;';if(!($r%6))$s.='=substr($i,0,2);';if(!($r%5))$s.='/=2;';if(!($r%4))$s.='+=4;';if(!($r%3))$s.='*=-1;';$r-=mt_rand(1,5);}$s.='var_dump($i);';echo"<?php $s
";

Ung dung

<?php
mt_srand(0+$argv[1]);
$r = mt_rand(1,100);
$s = "\$i=rand(1,$r);";
while ($r > 0)
{
    if (!($r%10)) $s .= '$i*=2;';
    if (!($r%9))  $s .= '$i++;';
    if (!($r%8))  $s .= '$i=pow($i,rand(1,$i));';
    if (!($r%7))  $s .= '$i--;';
    if (!($r%6))  $s .= '$i=substr($i,0,2);';
    if (!($r%5))  $s .= '$i/=2;';
    if (!($r%4))  $s .= '$i+=4;';
    if (!($r%3))  $s .= '$i*=-1;';
    $r -= mt_rand(1,5);
}
$s .= 'var_dump($i);';
echo "<?php $s
";

Thí dụ

> php r.php 1
<?php $i=rand(1,58);$i*=-1;$i=pow($i,rand(1,$i));$i=substr($i,0,2);$i+=4;$i*=-1;$i=pow($i,rand(1,$i));$i=substr($i,0,2);$i+=4;$i*=-1;$i*=2;$i/=2;$i+=4;$i/=2;$i*=-1;$i*=2;$i/=2;$i=substr($i,0,2);$i*=-1;var_dump($i);
> php r.php 2
<?php $i=rand(1,57);$i*=-1;$i+=4;$i--;$i=substr($i,0,2);$i*=-1;$i*=-1;$i--;$i+=4;$i/=2;$i++;$i=substr($i,0,2);$i*=-1;$i=pow($i,rand(1,$i));$i+=4;$i--;$i=substr($i,0,2);$i+=4;$i*=-1;$i--;$i+=4;var_dump($i);

2
Bạn có thể vui lòng bao gồm một ví dụ đầu ra?
Alexandru

5

scala: 1543 (scala => scala)

Tôi có các biến (x, y, z), hàm (mul, add, neg, abs), giá trị và dấu ngoặc đơn cân bằng.

<!--code:language-scala-->
object FormelBauer {
    val fun = List (" mul10 (", " add1 (", " neg (", " abs (")
    val ops = List (" * ", " + ", " - ", " / ")
    def c(maxLen: Int, m: Int) : String = {
        def f()= new StringBuffer (fun (r.nextInt (fun.length)))
        def w()= new StringBuffer ("" + (r.nextInt (180) - 90))
        def v()= new StringBuffer ("" + ('x' + r.nextInt (3)).toChar)
        def o()= new StringBuffer (ops (r.nextInt (ops.length)))
        def g(t: Int, b: Int, d: List [Char]) : StringBuffer ={
            var a = d.filterNot (x => if (b > 0) x == '.' else x == ')')
            if (b > m) a = a.filterNot (_ == 'k')
            if (b > m) a = a.filterNot (_ == 'f')
            if (t > maxLen) a = a.filterNot (_ == '+')
            val elem = r.nextInt (a.length)
            val start = a(elem)
            start match {
                case '.' => new StringBuffer ("")
                case 'f' => f.append(g (t + 1, b + 1, List ('(', '8', 'x')))
                case '(' => new StringBuffer ("(").append   (g (t + 1, b + 1, List ('(', '8', 'x')))
                case '8' => w.append(g (t + 1, b, List ('.', ')', '+')))
                case 'x' => v.append(g (t + 1, b, List ('.', ')', '+')))
                case ')' => new StringBuffer (") ").append  (g (t + 1, b -1, List ('.', ')', '+')))
                case '+' => o.append(g (t + 1, b, List ('f', '(', '8', 'x')))
        }}
        (g (0,0,List('f','(','8','x'))).toString
    }
import util._
  var r : Random = _    
    def main (as: Array [String]) : Unit = {
      val s=as(0).toInt
        r=new Random(s) 
        "xyz".map(c=>println("val "+c+"="+(c+r.nextInt(s))))
        println("""def mul10(i:Int)=10*i
def add1(i:Int)=i+1
def neg(i:Int)= -i
def abs(i:Int)=if(i<0)-i else i
"""+c(45,5))}
}

Như bạn thấy, nó không được chơi gôn lắm. Bởi vì, nó sẽ không đưa tôi đến gần với các giải pháp khác, nhưng một vấn đề là, biến thể đó có chi phí cao hơn. 3 biến, 4 hàm có thể dễ dàng giảm xuống còn hai, chẳng hạn.

Tạo một số mẫu:

for i in {1..7} ; do scala FormelBauer $i; echo; done

val x=120
val y=121
val z=122
def mul10(i:Int)=10*i
def add1(i:Int)=i+1
def neg(i:Int)= -i
def abs(i:Int)=if(i<0)-i else i
(y)  / 79

val x=121
val y=121
val z=123
def mul10(i:Int)=10*i
def add1(i:Int)=i+1
def neg(i:Int)= -i
def abs(i:Int)=if(i<0)-i else i
 add1 ((((78 +  neg (z * z) )  / x) ) )  + -23 - ((-83)  * y) 

val x=122
val y=123
val z=122
def mul10(i:Int)=10*i
def add1(i:Int)=i+1
def neg(i:Int)= -i
def abs(i:Int)=if(i<0)-i else i
x / -71 - (y) 

val x=122
val y=124
val z=125
def mul10(i:Int)=10*i
def add1(i:Int)=i+1
def neg(i:Int)= -i
def abs(i:Int)=if(i<0)-i else i
x

val x=122
val y=123
val z=126
def mul10(i:Int)=10*i
def add1(i:Int)=i+1
def neg(i:Int)= -i
def abs(i:Int)=if(i<0)-i else i
-24 + z

val x=121
val y=121
val z=124
def mul10(i:Int)=10*i
def add1(i:Int)=i+1
def neg(i:Int)= -i
def abs(i:Int)=if(i<0)-i else i
 abs (z) 

val x=123
val y=126
val z=126
def mul10(i:Int)=10*i
def add1(i:Int)=i+1
def neg(i:Int)= -i
def abs(i:Int)=if(i<0)-i else i
 add1 (-62 - 30 * (-68)  /  neg (x - 69 + 33 / 45 + x * x)  -  abs (-18 * (y + x)  /  neg (x)  - y)  *  abs ((61) ) )  + (y) 

Kiểm tra cái dài nhất:

add1 (-62 - 30 * (-68)  /  neg (x - 69 + 33 / 45 + x * x)  -  abs (-18 * (y + x)  /  neg (x)  - y)  *  abs ((61) ) )  + (y) 

res6: Int = -5425


5

Perl -> vỏ: 66 ký tự

@ p = split (':', $ ENV {PATH});
@ c = `ls @p [@ARGV [0]]`;
in @c [rand ($ # c)];

Có thể hơi lạc đề, nhưng có lẽ vậy.

s153254 @ helios: / home / s153254 / lab $ perl code.p 1
điện thoại
s153254 @ helios: / home / s153254 / lab $ perl code.p 2
in.rlogind
s153254 @ helios: / home / s153254 / lab $ perl code.p 2
df
s153254 @ helios: / home / s153254 / lab $ perl code.p 3
svenv



4

Ruby → Brainfuck ( 110 107 ký tự)

s="";m=%w:< > . , + -:;rand(99).downto(r=0){s<<(rand(40)==0? (r+=1)&&'[%s':'%s')%m.shuffle[0]};p(s<<']'*r)

Sử dụng

$ ruby bf.rb

Sản xuất một chương trình brainfuck thực thi.

Sắp xếp một sự lột xác không biết xấu hổ của ESultanik, vì vậy tôi sẽ tin tưởng anh ta cho ý tưởng này.

  • Thay đổi .zero? đến == 0

3

Javascript -> Brainf * ck: 119 ký tự

s=prompt();a=["+","-",">","<",".",",","[-]"];i=0;b="";while(i++<s*s){b+=a[Math.floor(((Math.random()*s)%1)*7)]}alert(b)

Mẫu I / O:

10
.--.+,-><->.<+.[-].->.>[-][-]<+,[-]>><-[-]>,,>>[-].-+<[-]+>,<[-][-]<<[-]<[-]+,+[-][-][-].-[-],[-]>.<<[-]-..<-.->.++,>+-[-],.[-]..+,<-[-].+-[-]
11
,..[-]--,[-].,[-]>[-]->..[-]<,<..>[-]<>++-.[-].,,<[-].<+<[-]>-->[-]+-[-]+>-[-][-]>-,[-]->>-,-..++<+,,-,.,[-]->[-]<,+[-][-]+.,-,>+->.[-],.>..,++,.[-],+[-]-,.,--.--,

Mã chắc chắn có thể ngắn hơn, nhưng một số điều sẽ, IMHO, làm cho nó ít thú vị hơn. Nhưng nếu ai đó nghĩ ra một chương trình ngắn hơn, tôi sẽ cắt giảm nhiều hơn.


2

Python -> Python, 148 ký tự

Dài hơn các mục Python khác với chi phí là (chủ quan) thú vị hơn một chút.

import sys as s,random as r
w,o=s.stdout.write,__builtins__
r.seed(s.argv[1])
w('print\\')
for i in'\n....':n=r.choice(dir(o));o=getattr(o,n);w(i+n)

Điều này in một thuộc tính lồng nhau sâu sắc của một đối tượng tích hợp.

$ python randprog.py 1
print\
round.__setattr__.__delattr__.__init__.__class__

2

PowerShell, tạo PowerShell - 43

Theo tinh thần giải pháp của Keith:

-join(0.."$input"|%{'-','+'|random;random})

tạo các biểu thức ngẫu nhiên của phép cộng và phép trừ:

PS> -join(0..(random 9)|%{'-','+'|random;random 9})
+2-0-0+3-7
PS> -join(0..(random 9)|%{'-','+'|random;random 9})
-7+1+7+1-5+2+8
PS> -join(0..(random 9)|%{'-','+'|random;random 9})
-1+7+7-0-6-0-2
PS> -join(0..(random 9)|%{'-','+'|random;random 9})
+2-6-5+3-2+7
PS> -join(0..(random 9)|%{'-','+'|random;random 9})
-6

Một cách Powershell gcm|random -c @args|% na*:)
mazzy

2

Con trăn -> Fractran (117)

import random as r,sys
r.seed(int(sys.argv[1]))
z=r.randint
print','.join(`z(1,99)`+'/'+`z(1,99)`for q in[0]*z(1,99))

2

Ngôn ngữ nhà sản xuất trò chơi -> Arduino hoặc Ti84-Basic, 6 3 ký tự

a=argument0;if a mod 2{return("void setup(){Serial.begin(9600);}void loop(){Serial.print"+string(a*random(9))+";delay("+string(floor(random(999)))+")}"}else{return(":Lbl A:Horizontal "+string(a*random(9))+":Goto A")}

Giải trình:

a=argument0 Đưa đầu vào thành biến a

if a mod 2 Về cơ bản, một nửa cơ hội chương trình sẽ là Arduino, một nửa Ti-Basic 84

Chương trình Arduino xuất ra các công cụ ngẫu nhiên theo các khoảng thời gian ngẫu nhiên, bỏ qua các điều ngẫu nhiên.

Chương trình Ti-Basic vẽ các đường ngang như điên.

Ngoài ra, có một phần thưởng - các chương trình được tạo đã được đánh gôn! Không chắc điều đó có hữu ích không ...


1

Perl -> HQ9 + (42 ký tự)

$a="HQ9+";for(1..<>%4){chop$a}print chop$a

Ví dụ đầu vào

4264532623562346

Đầu ra

Q

1

JavaScript -> Javascript (44 ký tự)

alert('alert("'+Math.random()*prompt()+'")')

Và với 43 ký tự, nó có thể thực thi chương trình được tạo thay vì hiển thị nguồn của nó:

eval('alert("'+Math.random()*prompt()+'")')

Ví dụ:

Hạt giống: 5
lần thực hiện 3 lần:

alert("2.335241624386981")
alert("0.4577956395223737")
alert("0.8359265828039497")

Hạt giống ở đâu?
Doorknob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.