Hasilkan program acak dalam bahasa favorit Anda [ditutup]

21

Kita semua mendengar tentang pengujian kompiler menggunakan input yang dibuat secara acak. Tugas Anda adalah menulis program untuk menghasilkan program yang valid (termasuk tidak ada perilaku yang tidak ditentukan) dalam bahasa favorit Anda. Bahasa program yang dihasilkan tidak harus sama dengan bahasa program yang dihasilkan.

Program Anda akan menerima integer sebagai argumen yang dapat Anda gunakan sebagai seed untuk generator nomor acak Anda. Program yang dihasilkan harus berbeda secara struktural (diberikan benih yang berbeda) bukan hanya nama variabel atau konstanta yang berbeda.

Contoh:

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

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

Harap sertakan beberapa output dalam jawaban Anda.

Solusi terpendek menang. Saya akan memberikan bonus kecil berdasarkan jumlah suara, jadi silakan pilih solusi paling kreatif.

Alexandru
sumber
2
Tugas sempurna untuk mengembangkan algoritma genetika dengan evolusi terbuka. Saya selalu bertanya-tanya bagaimana itu bisa dilakukan.
mellamokb
1
Saya pikir kurangnya spesifikasi yang tetap membuat ini menjadi pertanyaan yang buruk. "Secara struktural berbeda" terbuka untuk interpretasi, dan dalam beberapa interpretasi ini adalah masalah yang sangat sederhana.
Peter Taylor
1
Yang perlu dilakukan hanyalah golf program yang dapat menghasilkan kalimat acak dari tata bahasa BNF yang diberikan (ini sepele). Kemudian cukup tancapkan tata bahasa untuk bahasa pemrograman lain dan poof : program yang valid dalam bahasa itu. Ini akan berfungsi untuk bahasa bebas konteks apa pun (yang sayangnya menyingkirkan Perl).
ESultanik
2
main(seed) { return 4; // Chosen by dice roll - Guaranteed to be random } Referensi
Neil
1
Neil: Sekadar catatan: Mungkin semua orang di sini tahu xkcd, terutama yang terkait. Mereka mungkin juga tahu yang Dilbert pada nomor acak. Dan tidak ada relevansi di sini karena meminta program dengan struktur acak, bukan hanya angka acak.
Joey

Jawaban:

18

Python → Brainf * ck (185 223 233 255 285 287 303 karakter)

Kode

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 Karakter : Dihapus math.ceil(tidak benar-benar diperlukan).
  • 287 → 285 Karakter : Beralih ke string kosong untuk menunjukkan operator cabang.
  • 285 → 255 Karakter : Mengondensasi pernyataan if di loop while.
  • 255 → 233 Karakter : Menerapkan saran JBernardo dari komentar.
  • 233 → 223 Karakter : Menerapkan saran tjko dari komentar.
  • 223 → 185 Karakter : Diimplementasikan beberapa saran reduksi spasi putih dari komentar.

Contohnya

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

Sebenarnya mencari tahu apa yang dilakukan program BF yang tersisa sebagai latihan untuk pembaca.

ESultanik
sumber
Anda juga dapat menggunakanif o: s+=0(NL)else: s+='['+b()+']'
Alexandru
@Alexandru: Terima kasih! Saya melewatkan itu. Kode Anda tampaknya tidak berfungsi dengan tepat, tetapi itu membantu saya membuatnya lebih pendek.
ESultanik
3
Apakah ini berarti Brainfuck adalah bahasa favorit Anda?
zneak
1
Bukannya ini masalah, tetapi kode yang di-output akan menyebabkan loop tak terbatas.
Peter Olson
6
@ Peter, benar, tetapi menghindari bahwa menggunakan metode generasi acak ini mungkin setara dengan memecahkan Masalah Berhenti!
ESultanik
17

Python -> Piet, 385 345 char

Dimungkinkan untuk menghasilkan program Piet dengan ini. Saya bisa saja berhenti pada piksel acak, tetapi saya ingin membuat program "menarik". Fungsinyam melukis sebuah piksel warna, dan secara rekursif melangkah ke masing-masing tetangga piksel tersebut. Ada cara-cara yang lebih baik untuk menggambar gumpalan acak, tetapi ini disesuaikan untuk mengakhiri dalam sejumlah langkah yang wajar, jadi itu cukup baik untuk golf. Fungsi ini R(w,h,n)menarik n gumpalan acak ke gambar putih ( w x h ), dan mencetak hasilnya dalam format PPM.

Saya terutama bangga dengan cara saya menghasilkan warna - untuk pilihan acak 0 <= c < 20,

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

adalah kode desimal untuk warna yang valid dalam palet Piet dengan cara a kode Gray single-track . Artinya, setiap warna diwakili oleh 3 bit yang berdekatan, dan setiap irisan '0003...0'[c:c+3]mewakili warna yang berbeda. Karena ini bukan daftar lengkap 27 kata pada 3 huruf, saya benar-benar beruntung menemukan kode 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])

Output sampel, dihasilkan oleh perintah R(30,40,500)

Program Piet acak

Tanpa impor, saya dapat menuliskannya sebagai 1-liner yang tepat (bebas koma):

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)

tapi ini sangat lambat (dan hampir 100 karakter lebih lama) ... meskipun saya tidak sepenuhnya yakin mengapa (dan tidak terlalu cenderung untuk mencari tahu).

stan
sumber
9

Python -> Python, 135 karakter

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)

Menghasilkan sedikit evaluasi ekspresi acak, seperti ini:

> ./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
Keith Randall
sumber
8

Python -> HQ9 +: 108 karakter

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

PHP, 352 karakter

Menghasilkan kode PHP dalam PHP.

Saya memutuskan untuk tidak peduli tentang panjang, tetapi sebaliknya menginginkan solusi yang menarik dan beragam. Ini jawaban saya untuk itu.

Kode

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

Tidak disatukan

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

Contoh

> 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);
rintaun
sumber
2
Bisakah Anda memasukkan contoh output?
Alexandru
5

scala: 1543 (scala => scala)

Saya memiliki variabel (x, y, z), fungsi (mul, tambah, neg, abs), nilai, dan tanda kurung seimbang.

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

Seperti yang Anda lihat, ini bukan golf. Karena, itu tidak akan membuat saya dekat dengan solusi lain, tetapi masalahnya adalah, bahwa variasi lebih banyak biaya lebih banyak. 3 variabel, 4 fungsi dapat dengan mudah direduksi menjadi dua, misalnya.

Menghasilkan beberapa sampel:

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) 

Menguji yang terpanjang:

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

res6: Int = -5425

Pengguna tidak diketahui
sumber
5

Perl -> shell: 66 karakter

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

Mungkin sedikit di luar topik, tapi mungkin begitu.

s153254 @ helios: / home / s153254 / lab $ perl code.p 1
telnet
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


Anthony
sumber
4

Ruby → Brainfuck ( 110 107 karakter)

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

Pemakaian

$ ruby bf.rb

Menghasilkan program brainfuck yang dapat dieksekusi.

Semacam penipuan tanpa malu dari ESultanik, jadi saya akan memuji dia untuk ide itu.

  • Berubah. Nol? ke == 0
incluye
sumber
3

Javascript -> Brainf * ck: 119 karakter

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

Sampel I / O:

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

Kode pasti bisa lebih pendek, tetapi beberapa hal akan, IMHO, membuatnya kurang menarik. Tetapi jika orang lain membuat program yang lebih pendek, saya akan mengurangi lebih banyak.

Peter Olson
sumber
2

Python -> Python, 148 karakter

Lebih lama dari entri Python lainnya dengan mengorbankan menjadi (secara subyektif) sedikit lebih menarik.

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)

Ini mencetak atribut yang sangat bersarang dari objek bawaan.

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

PowerShell, menghasilkan PowerShell - 43

Dalam semangat solusi Keith:

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

menghasilkan ekspresi acak dari penambahan dan pengurangan:

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
Joey
sumber
Cara Powershell gcm|random -c @args|% na*:)
mazzy
2

Python -> 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))
kotak kardus
sumber
2

Bahasa Pembuat Game -> Arduino atau Ti84-Basic, 6 3 karakter

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

Penjelasan:

a=argument0 Masukkan input ke dalam variabel a

if a mod 2 Pada dasarnya, separuh kemungkinan programnya adalah Arduino, setengah Ti-Basic 84

Program Arduino mengeluarkan hal-hal acak pada interval acak, melewatkan hal-hal acak secara acak.

Program Ti-Basic menggambar garis horizontal seperti orang gila.

Juga, ada bonus - program yang dihasilkan sudah golf! Tidak yakin apakah itu akan membantu ...

Timtech
sumber
1

Perl -> HQ9 + (42 Karakter)

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

Contoh input

4264532623562346

Keluaran

Q
PhiNotPi
sumber
1

JavaScript -> Javascript (44 karakter)

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

Dan dengan 43 karakter, ia dapat menjalankan program yang dihasilkan alih-alih menampilkan sumbernya:

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

Contoh:

Seed: 5
Eksekusi 3 kali:

alert("2.335241624386981")
alert("0.4577956395223737")
alert("0.8359265828039497")
pengguna1886419
sumber
Di mana benihnya?
Gagang Pintu