En sevdiğiniz dilde rastgele bir program oluşturun [kapalı]


21

Hepimiz rastgele oluşturulmuş girdileri kullanarak test derleyicileri duyduk. Göreviniz, favori dilinizde geçerli bir program (tanımlanmamış davranış dahil) oluşturmak için bir program yazmaktır. Üreten program dili, üretilen program dili ile aynı olmak zorunda değildir.

Programınız, rasgele sayı üreticiniz için tohum olarak kullanabileceğiniz argüman olarak bir tamsayı alır. Oluşturulan programlar, sadece farklı değişken isimleri veya sabitleri değil yapısal olarak farklı olmalıdır (farklı tohumlar verilir).

Örnekler:

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

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

Lütfen cevaplarınıza birkaç çıktı ekleyin.

En kısa çözüm kazanır. Oy sayısına göre küçük bir bonus vereceğim, bu yüzden lütfen en yaratıcı çözümleri oylayın.


2
Açık uçlu evrimi olan genetik algoritmalar geliştirmek için mükemmel bir görev. Her zaman nasıl yapılabileceğini merak ettim.
mellamokb

1
Bence, belirli bir şartnamenin olmayışı, bunu kötü bir soru yapıyor. “Yapısal olarak farklı” yorumlamaya açıktır ve bazı yorumlara göre bu son derece basit bir sorundur.
Peter Taylor

1
Gerçekten yapılması gereken tek şey, verilen bir BNF gramerinden rastgele bir cümle oluşturabilecek bir program yapmaktır (bu önemsiz). Sonra başka bir programlama dili ve poofu için gramer bilgisini takın : o dilde geçerli bir program. Bu, herhangi bir bağlamsız dil için çalışacaktır (maalesef Perl'i dışlayan).
ESultanik

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

1
Neil: Sadece not etmek gerekirse: Muhtemelen buradaki herkes xkcd'yi, bilhassa bağlantılı olanı tanır. Muhtemelen Dilbert'i rastgele sayılarla da tanıyorlar. Ve burada rastgele bir sayı değil, rastgele yapıya sahip bir program istediği için ilgisi yoktur.
Joey,

Yanıtlar:


18

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

kod

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 Karakterler : Kaldırıldı math.ceil(gerçekten gerekli değil).
  • 287 → 285 Karakterler : Şube operatörünü belirtmek için boş bir dizgeye geçiş yapılır.
  • 285 → 255 Karakterler : while döngüsü içindeki if ifadesini yoğunlaştırdı.
  • 255 → 233 Karakterler : Yorumlardan JBernardo'nun önerilerini uyguladı .
  • 233 → 223 Karakterler : tjko'nun önerisinden yorum yapıldı.
  • 223 → 185 Karakterler : Yorumlardan bazı boşluk azaltma önerileri uygulandı.

Örnekler

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

Aslında ortaya çıkan BF programları ne bulmaktan yapmak okuyucuya bir alıştırma olarak bırakılmıştır.


ayrıca kullanabilirsinizif o: s+=0(NL)else: s+='['+b()+']'
Alexandru

@Alexandru: Teşekkürler! Onu özledim. Kodunuz tam olarak çalışmıyor gibi görünüyordu, ancak kısaltmamı sağladı.
ESultanik

3
Bu bir şekilde Brainfuck'ın en sevdiğin dil olduğu anlamına mı geliyor?
zneak

1
Bu bir problem değil, fakat çıkan kod muhtemelen sonsuz bir döngüye neden olacak.
Peter Olson

6
@Peter, doğru, ancak bu rastgele üretme yönteminin kullanılmasının önlenmesi, Halting Probleminin çözümüne eşdeğerdir!
ESultanik

17

Python -> Piet, 385 345 karakter

Bununla herhangi bir Piet programı oluşturmak mümkündür. Rasgele piksellerde durabilirdim ama "ilginç" programlar yapmak istedim. Fonksiyon mbir piksele bir renk boyar ve tekrar tekrar bu piksel komşularına girer. Rastgele lekeler çizmenin daha iyi yolları var, ancak bu makul sayıda adımda sona erecek şekilde ayarlandı, bu nedenle golf için yeterince iyi. İşlev R(w,h,n), n rasgele bloğu ( w x s ) beyaz bir görüntünün üzerine çeker ve sonucu PPM formatında yazdırır.

Özellikle renkleri nasıl oluşturduğumla gurur duyuyorum - rastgele bir seçim için 0 <= c < 20,

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

Piet paletindeki geçerli bir rengin ondalık kodudur, tek izli Gray kodu ile . Yani, her renk 3 bitişik bit ile temsil edilir ve her dilim '0003...0'[c:c+3]farklı bir rengi temsil eder. Bu, 3 harften oluşan 27 kelimenin tam listesi olmadığı için Gray kodunu bulma konusunda çok şanslıydım.

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

Komut tarafından oluşturulan örnek çıktı R(30,40,500)

rastgele Piet programı

İçe aktarma olmadan, bunu uygun olarak (noktalı virgül içermeyen) 1 astar olarak da yazabilirim:

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)

ama gülünç derecede yavaş (ve neredeyse 100 karakter daha uzun) ... gerçi neden olduğundan tam olarak emin değilim (ve öğrenmeye meyilli değiller).


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)

Bunun gibi küçük rasgele ifade değerlendirmeleri oluşturur:

> ./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 karakter

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

6

PHP, 352 karakter

PHP'de PHP kodu üretir.

Uzunluğu pek umursamadığıma karar verdim ama bunun yerine ilginç ve çeşitli çözümler istedim. Bu benim cevabım.

kod

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

Örnek

> 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
Lütfen bir çıktı örneği ekler misiniz?
Alexandru

5

scala: 1543 (scala => scala)

Değişkenler (x, y, z), fonksiyonlar (mul, add, neg, abs), değerler ve dengeli parantez var.

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

Gördüğünüz gibi, çok golf değil. Çünkü beni diğer çözümlere yaklaştırmayacak, ama bir sorun daha fazla varyasyonun daha pahalı olması. 3 değişken, 4 işlev, örneğin kolayca ikiye indirilebilir.

Bazı örnekler üretmek:

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) 

En uzun olanı test etmek:

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 -> kabuk: 66 karakter

Rp = bölünmüş ( ':', $ ENV {YOL});
@ c = `ls @p [@ARGV [0]]`;
@c yazdır [rand ($ # c)];

Muhtemelen biraz konu dışı, ama belki de öyle.

s153254 @ helios: / ana sayfa / s153254 / lab $ perl code.p 1
telnet
s153254 @ helios: / ana sayfa / s153254 / lab $ perl kodu.p 2
in.rlogind
s153254 @ helios: / ana sayfa / s153254 / lab $ perl kodu.p 2
df
s153254 @ helios: / ana sayfa / s153254 / lab $ perl kodu.p3
svenv



4

Yakut → 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)

kullanım

$ ruby bf.rb

Yürütülebilir bir beyin fırtınası programı üretir.

ESultanik'in utanmaz bir kopukluğu gibi, bu yüzden ona fikir vereceğim.

  • Değiştirildi. Sıfır? == 0

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)

Örnek I / O:

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

Kod kesinlikle daha kısa olabilirdi, ancak bazı şeyler IMHO'nun daha az ilginç olmasını sağlayacaktı. Ama başka biri daha kısa bir programla gelirse, daha fazlasını keserim.


2

Python -> Python, 148 karakter

Diğer Python girişlerinden daha uzun (öznel) biraz daha ilginç olma pahasına.

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)

Bu, yerleşik bir nesnenin derinden iç içe geçmiş bir niteliğini yazdırır.

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

2

PowerShell, üreten PowerShell - 43

Keith'in çözümünün ruhuna göre:

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

Toplama ve çıkarma rasgele ifadeleri üretir:

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

2

Oyun Makinesi Dili -> Arduino veya 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")}

Açıklama:

a=argument0 Girdiyi değişkene koyar a

if a mod 2 Temel olarak, programın yarısı şansın yarısı Arduino, yarısı Ti-Basic 84

Arduino programı rastgele şeyleri rastgele atlayarak rastgele aralıklarla rastgele şeyler çıkarır.

Ti-Temel Program, deli gibi yatay çizgiler çizer.

Ayrıca, bir bonus var - oluşturulan programlar zaten golf! Bunun faydalı olacağından emin değilim ...


1

Perl -> HQ9 + (42 Karakterler)

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

Örnek giriş

4264532623562346

Çıktı

Q

1

JavaScript -> Javascript (44 karakter)

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

Ve 43 karakter ile, kaynağını görüntülemek yerine, oluşturulan programı çalıştırabilir:

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

Örnekler:

Tohum: 5
3 kez çalıştırıldı:

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

Tohum nerede?
Doorknob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.