สร้างโปรแกรมสุ่มในภาษาที่คุณชื่นชอบ [ปิด]


21

เราทุกคนได้ยินการทดสอบคอมไพเลอร์โดยใช้อินพุตที่สร้างแบบสุ่ม งานของคุณคือการเขียนโปรแกรมเพื่อสร้างโปรแกรมที่ถูกต้อง (รวมถึงไม่มีพฤติกรรมที่ไม่ได้กำหนด) ในภาษาที่คุณชื่นชอบ ภาษาของโปรแกรมที่สร้างไม่จำเป็นต้องเหมือนกับภาษาของโปรแกรมที่สร้างขึ้น

โปรแกรมของคุณจะได้รับจำนวนเต็มเป็นอาร์กิวเมนต์ที่คุณสามารถใช้เป็นเมล็ดสำหรับตัวสร้างหมายเลขสุ่มของคุณ โปรแกรมที่สร้างขึ้นควรมีโครงสร้างที่แตกต่างกัน (รับเมล็ดที่แตกต่างกัน) ไม่เพียง แต่ชื่อตัวแปรหรือค่าคงที่ที่แตกต่างกัน

ตัวอย่าง:

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

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

โปรดรวมเอาท์พุทสองสามในคำตอบของคุณ

ทางออกที่สั้นที่สุดชนะ ฉันจะให้โบนัสเล็กน้อยตามจำนวนคะแนนดังนั้นโปรดลงคะแนนโซลูชั่นที่สร้างสรรค์ที่สุด


2
งานที่สมบูรณ์แบบสำหรับการพัฒนาอัลกอริธึมทางพันธุกรรมพร้อมวิวัฒนาการปลายเปิด ฉันสงสัยอยู่เสมอว่ามันจะทำได้อย่างไร
mellamokb

1
ฉันคิดว่าการขาดข้อกำหนดที่แน่นอนทำให้นี่เป็นคำถามที่ไม่ดี "โครงสร้างที่แตกต่าง" เปิดให้ตีความและในการตีความบางอย่างนี้เป็นปัญหาที่ง่ายมาก
Peter Taylor

1
สิ่งเดียวที่ต้องทำคือกอล์ฟโปรแกรมที่สามารถสร้างประโยคสุ่มจากไวยากรณ์ BNF ที่กำหนด (นี่เป็นเรื่องเล็กน้อย) จากนั้นเพียงแค่เสียบไวยากรณ์สำหรับภาษาการเขียนโปรแกรมอื่นและpoof : โปรแกรมที่ถูกต้องในภาษานั้น สิ่งนี้จะใช้ได้กับภาษาที่ไม่มีบริบทใด ๆ (ซึ่งน่าเสียดายกฎ Perl)
ESultanik

2
main(seed) { return 4; // Chosen by dice roll - Guaranteed to be random } การอ้างอิง
Neil

1
Neil: เพื่อทราบ: ทุกคนที่นี่อาจรู้จัก xkcd โดยเฉพาะอย่างยิ่งคนที่เชื่อมโยง พวกเขาอาจรู้จักดิลเบิร์ตหนึ่งคนด้วยตัวเลขสุ่ม และมันไม่มีความเกี่ยวข้องที่นี่เพราะมันขอโปรแกรมที่มีโครงสร้างแบบสุ่มไม่ใช่แค่ตัวเลขสุ่ม
Joey

คำตอบ:


18

Python → Brainf * ck (185 223 233 255 285 287 303ตัวอักษร)

รหัส

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 ตัวละคร : ลบออกmath.ceil(ไม่จำเป็นจริงๆ)
  • 287 → 285 ตัวอักษร : เปลี่ยนเป็นสตริงว่างเพื่อแสดงโอเปอเรเตอร์สาขา
  • 285 → 255 ตัวอักษร : ย่อคำสั่ง if ในลูป while
  • 255 → 233 ตัวอักษร : ดำเนินการตามคำแนะนำของJBernardoจากความคิดเห็น
  • 233 → 223 ตัวอักษร : ดำเนินการตามคำแนะนำของtjkoจากความคิดเห็น
  • 223 → 185 ตัวละคร : นำคำแนะนำในการลดช่องว่างจากความคิดเห็น

ตัวอย่าง

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

การหาสิ่งที่โปรแกรม BF ที่เกิดขึ้นจริงจะถูกทิ้งไว้เป็นแบบฝึกหัดให้ผู้อ่าน


คุณสามารถใช้if o: s+=0(NL)else: s+='['+b()+']'
Alexandru

@Alexandru: ขอบคุณ! ฉันคิดถึงสิ่งนั้น ดูเหมือนว่ารหัสของคุณจะทำงานไม่ถูกต้อง แต่มันก็ช่วยให้ฉันสั้นลงได้
ESultanik

3
นี่แปลว่า Brainfuck เป็นภาษาโปรดของคุณหรือไม่?
zneak

1
ไม่ใช่ว่านี่เป็นปัญหา แต่รหัสเอาท์พุทน่าจะทำให้เกิดการวนซ้ำไม่สิ้นสุด
Peter Olson

6
@ ปีเตอร์จริง แต่การหลีกเลี่ยงการใช้วิธีการสร้างแบบสุ่มนี้น่าจะเทียบเท่ากับการแก้ปัญหาการหยุดชะงัก!
ESultanik

17

Python -> Piet, 385 345 char

เป็นไปได้ที่จะสร้างโปรแกรม Piet ด้วยวิธีนี้ ฉันเพิ่งจะหยุดที่พิกเซลสุ่ม แต่ฉันต้องการให้โปรแกรม "น่าสนใจ" ฟังก์ชั่นmวาดพิกเซลสีและทำซ้ำขั้นตอนในแต่ละพิกเซลเพื่อนบ้าน มีวิธีที่ดีกว่าในการวาดแบบสุ่ม blobs แต่นี่คือการปรับเพื่อยุติในจำนวนขั้นตอนที่เหมาะสมดังนั้นจึงดีพอสำหรับการเล่นกอล์ฟ ฟังก์ชั่นR(w,h,n)ดึงn blobs สุ่มบน ( W x H ) ภาพสีขาวและพิมพ์ผลในรูปแบบพีพีเอ็ม

ฉันโดยเฉพาะอย่างยิ่งความภาคภูมิใจของวิธีการที่ฉันสร้างสี - สำหรับทางเลือกสุ่ม0 <= c < 20,

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

เป็นรหัสทศนิยมสำหรับสีที่ถูกต้องในจานปิเอทโดยวิธีการเดียวติดตามรหัสสีเทา นั่นคือแต่ละสีจะถูกแสดงด้วย 3 บิตที่อยู่ติดกันและทุกชิ้นจะ'0003...0'[c:c+3]แสดงสีที่แตกต่างกัน เนื่องจากนี่ไม่ใช่รายการที่สมบูรณ์ของ 27 คำใน 3 ตัวอักษรฉันโชคดีมากที่ได้ค้นหารหัสสีเทา

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])

เอาต์พุตตัวอย่างสร้างโดยคำสั่ง R(30,40,500)

โปรแกรม Piet สุ่ม

หากไม่มีการนำเข้าฉันสามารถเขียนเป็นซับที่เหมาะสม (เซมิโคลอน) 1 ซับได้เช่นกัน:

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)

แต่มันก็ช้าอย่างน่าขัน (และเกือบ 100 ตัวอักษร) ... ถึงแม้ว่าฉันจะไม่แน่ใจว่าทำไม (และไม่อยากจะรู้)


9

Python -> Python, 135 ตัวอักษร

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)

สร้างการประเมินการแสดงออกแบบสุ่มเล็ก ๆ น้อย ๆ เช่นนี้

> ./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 ตัวอักษร

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

6

PHP, 352 ตัวอักษร

สร้างรหัส PHP ใน PHP

ฉันตัดสินใจว่าไม่ได้ใส่ใจเรื่องความยาวมาก แต่ต้องการโซลูชันที่น่าสนใจและหลากหลาย นี่คือคำตอบของฉัน

รหัส

<?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
";

Ungolfed

<?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
";

ตัวอย่าง

> 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
คุณช่วยยกตัวอย่างผลงานออกมาได้ไหม
Alexandru

5

ขนาด: 1543 (scala => scala)

ฉันมีตัวแปร (x, y, z), ฟังก์ชั่น (mul, add, neg, abs), ค่าและวงเล็บที่สมดุล

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

อย่างที่คุณเห็นมันไม่ได้เป็นกอล์ฟมากนัก เพราะมันจะไม่ทำให้ฉันใกล้เคียงกับวิธีแก้ปัญหาอื่น ๆ แต่ปัญหาคือความแปรปรวนมากขึ้นมีค่าใช้จ่ายมากขึ้น 3 ตัวแปรสามารถลดฟังก์ชั่นได้ 4 อย่างถึงสองตัวอย่างเช่น

การสร้างตัวอย่างบางส่วน:

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) 

ทดสอบที่ยาวที่สุด:

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 -> shell: 66 ตัวอักษร

@ p = แยก ( ':', $ ENV {เส้นทาง});
@ c = `ls @p [@ARGV [0]]`;
พิมพ์ @c [rand ($ # c)];

อาจเป็นเรื่องเล็กน้อย แต่อาจเป็นเช่นนั้น

s153254 @ helios: / home / s153254 / ห้องปฏิบัติการ $ perl code.p 1
Telnet
s153254 @ helios: / home / s153254 / ห้องปฏิบัติการ $ perl code.p 2
in.rlogind
s153254 @ helios: / home / s153254 / ห้องปฏิบัติการ $ perl code.p 2
DF
s153254 @ helios: / home / s153254 / ห้องปฏิบัติการ $ perl code.p 3
svenv



4

Ruby → Brainfuck ( 110 107 ตัวอักษร)

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

การใช้

$ ruby bf.rb

สร้างโปรแกรม brainfuck ที่สามารถเรียกทำงานได้

เรียงลำดับจาก ripoff ไร้ยางอายของ ESultanik ดังนั้นฉันจะให้เครดิตเขาสำหรับความคิด

  • เปลี่ยนเป็น .zero หรือไม่ ถึง == 0

3

Javascript -> Brainf * ck: 119 ตัวอักษร

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

ตัวอย่าง I / O:

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

รหัสอาจสั้นลงอย่างแน่นอน แต่บางสิ่งจะทำให้ IMHO น่าสนใจน้อยลง แต่ถ้ามีคนอื่นมากับโปรแกรมที่สั้นกว่านี้ฉันจะตัดทอนอีก


2

Python -> Python, 148 ตัวอักษร

นานกว่ารายการ Python อื่น ๆ ที่น่าสนใจกว่า

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)

สิ่งนี้พิมพ์คุณสมบัติที่ซ้อนกันอย่างลึกซึ้งของวัตถุในตัว

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

2

PowerShell สร้าง PowerShell - 43

ด้วยจิตวิญญาณของการแก้ปัญหาของ Keith:

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

สร้างการแสดงออกที่เพิ่มขึ้นและการลบแบบสุ่ม:

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

วิธี Powershell gcm|random -c @args|% na*:)
mazzy


2

Game Maker Language -> Arduino หรือ Ti84-Basic, 6 3ตัวอักษร

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

คำอธิบาย:

a=argument0 ทำให้การป้อนข้อมูลลงในตัวแปร a

if a mod 2 โดยทั่วไปครึ่งหนึ่งของโอกาสที่โปรแกรมจะเป็น Arduino ครึ่ง Ti-Basic 84

โปรแกรม Arduino เอาท์พุทสิ่งต่าง ๆ แบบสุ่มช่วงสุ่มสุ่มข้ามสิ่งต่าง ๆ

โปรแกรม Ti-Basic ดึงเส้นแนวนอนอย่างบ้าคลั่ง

นอกจากนี้ยังมีโบนัส - รายการที่สร้างขึ้นมีการเล่นกอล์ฟแล้ว! ไม่แน่ใจว่าจะเป็นประโยชน์ ...


1

Perl -> HQ9 + (42 ตัวอักษร)

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

ตัวอย่างเช่นการป้อนข้อมูล

4264532623562346

เอาท์พุต

Q

1

JavaScript -> Javascript (44 ตัวอักษร)

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

และด้วยความยาว43อักขระก็สามารถเรียกใช้งานโปรแกรมที่สร้างขึ้นแทนการแสดงแหล่งที่มา:

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

ตัวอย่าง:

เมล็ดพันธุ์: 5
ดำเนินการ 3 ครั้ง:

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

เมล็ดอยู่ที่ไหน
ลูกบิดประตู
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.