좋아하는 언어로 임의의 프로그램 생성 [닫기]


21

우리는 무작위로 생성 된 입력을 사용하여 컴파일러를 테스트한다고 들었습니다. 당신의 작업은 좋아하는 언어로 유효한 프로그램 (정의되지 않은 동작 포함)을 생성하는 프로그램을 작성하는 것입니다. 생성 프로그램 언어는 생성 된 프로그램 언어와 같을 필요는 없습니다.

프로그램은 난수 생성기의 시드로 사용할 수있는 인수로 정수를받습니다. 생성 된 프로그램은 변수 이름이나 상수가 아니라 구조적으로 달라야합니다 (서로 다른 씨드).

예 :

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

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

답변에 몇 가지 결과를 포함하십시오.

가장 짧은 해결책이 이깁니다. 투표 수에 따라 약간의 보너스를 제공하므로 가장 창의적인 솔루션에 투표하십시오.


2
개방형 진화로 유전자 알고리즘을 개발하기위한 완벽한 작업. 나는 그것이 어떻게 이루어질 수 있는지 항상 궁금했습니다.
mellamokb 2016 년

1
고정 사양이 없으면 이것이 나쁜 질문이라고 생각합니다. "구조적으로 다른"은 해석에 개방적이며 일부 해석에서는 이것은 매우 간단한 문제입니다.
피터 테일러

1
실제로 필요한 것은 주어진 BNF 문법에서 임의의 문장을 생성 할 수있는 프로그램 골프입니다 (사소합니다). 그럼 그냥 다른 프로그래밍 언어에 대한 문법을 연결 : 해당 언어에 유효한 프로그램. 이것은 문맥이없는 언어 (안타깝게도 Perl을 배제하는 언어)에서 작동합니다.
ESultanik

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

1
Neil : 참고 사항 : 아마도 모든 사람들이 xkcd, 특히 연결된 것을 알고있을 것입니다. 그들은 아마도 Dilbert를 임의의 숫자로 알고있을 것입니다. 그리고 난수뿐만 아니라 임의의 구조를 가진 프로그램을 요구하기 때문에 여기에는 관련이 없습니다.
Joey

답변:


18

파이썬 → 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 문자 : while 루프에서 if 문을 압축했습니다.
  • 255 → 233 문자 : 주석에서 JBernardo 의 제안을 구현 했습니다 .
  • 233 → 223 Characters : 댓글에서 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 2016 년

3
이것이 Brainfuck이 가장 좋아하는 언어라는 것을 의미합니까?
zneak

1
이것이 문제는 아니지만 출력 코드로 인해 무한 루프가 발생할 수 있습니다.
피터 올슨

6
@Peter, true, 그러나이 무작위 생성 방법을 사용하지 않는 것이 Halting 문제를 해결하는 것과 같습니다!
ESultanik

17

Python-> Piet, 385345 문자

이것으로 Piet 프로그램을 생성 할 수 있습니다. 난 그냥 임의의 픽셀에서 멈출 수 있었지만 "흥미로운"프로그램을 만들고 싶었습니다. 이 함수 m는 픽셀에 색을 칠하고 각 픽셀 주변에 재귀 적으로 들어갑니다. 임의의 얼룩을 그리는 더 좋은 방법이 있지만 이것은 합리적인 단계로 종료되도록 조정되었으므로 골프에 충분합니다. 이 함수 R(w,h,n)n 개의 랜덤 블롭을 ( w x h ) 흰색 이미지에 그리고 결과를 PPM 형식으로 인쇄합니다.

나는 색상을 생성하는 방법을 특히 자랑스럽게 생각합니다 0 <= c < 20.

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

단일 트랙 회색 코드 를 통해 Piet 팔레트에서 유효한 색상의 10 진수 코드입니다 . 즉, 각 색상은 3 개의 인접한 비트로 표현되며 모든 슬라이스 '0003...0'[c:c+3]는 다른 색상을 나타냅니다. 이것은 3 글자로 된 27 단어의 전체 목록이 아니기 때문에 그레이 코드를 찾는 것이 정말 운이 좋았습니다.

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

파이썬-> 파이썬, 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
";

언 골프

<?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 (스칼라 => 스칼라)

변수 (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 개를 쉽게 2 개로 줄일 수 있습니다.

일부 샘플 생성 :

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 = split ( ':', $ ENV {PATH});
@ c =`ls @p [@ARGV [0]]`;
인쇄 @c [rand ($ # c)];

아마도 약간 벗어난 주제 일지 모르지만 아마도 그렇습니다.

s153254 @ helios : / home / s153254 / lab $ 펄 code.p 1
텔넷
s153254 @ helios : / home / s153254 / lab $ 펄 code.p 2
in.rlogind
s153254 @ helios : / home / s153254 / lab $ 펄 code.p 2
df
s153254 @ helios : / home / s153254 / lab $ 펄 code.p 3
스벤 브



4

루비 → 브레인 퍽 ( 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 프로그램을 생성합니다.

ESultanik의 부끄러운 일이 아니므로, 나는 그 아이디어에 대해 그를 인정할 것입니다.

  • 0으로 변경 되었습니까? ~ = 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

파이썬-> 파이썬, 148 자

조금 더 흥미로운 (주관적으로) 대가로 다른 파이썬 항목보다 길다.

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 way gcm|random -c @args|% na*:)
mazzy


2

게임 메이커 언어-> 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 절반

Arduino 프로그램은 임의의 것을 임의의 간격으로 출력하여 임의의 것을 임의로 건너 뜁니다.

Ti-Basic 프로그램은 미친 것처럼 수평선을 그립니다.

또한 보너스가 있습니다-생성 된 프로그램은 이미 골프입니다! 도움이 될지 확실하지 않습니다 ...


1

Perl-> HQ9 + (42 자)

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

입력 예

4264532623562346

산출

Q

1

자바 스크립트-> 자바 스크립트 (44 자)

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

그리고 43 문자로 소스를 표시하는 대신 생성 된 프로그램을 실행할 수 있습니다.

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

예 :

시드 : 5
3 회 실행 :

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

씨앗은 어디에 있습니까?
Doorknob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.