더 긴 언어 프로그램 만들기


16

Lenguage 는 소스 제한 문제를 해결하는 것으로 악명 높은 두뇌 방언입니다. Lenguage는 소스의 길이에 대해서만 관심을 가지기 때문에 내용이 아닙니다.

먼저 프로그램 길이가 계산됩니다. 그런 다음,이 길이는 이진수로 변환되고 왼쪽에 0으로 3의 배수로 채워집니다. 결과 이진 문자열은 각각 3 비트의 청크로 분할됩니다. 각 비트는 다음과 같이 brainfuck 명령으로 변환됩니다.

000 -> +
001 -> -
010 -> >
011 -> <
100 -> .
101 -> ,
110 -> [
111 -> ]

마지막으로 프로그램은 brainfuck 1 로 실행됩니다 .

여기에서 문제는 매우 간단합니다. 입력을받지 않고 1 바이트 반복 정수 번 으로 구성된 출력을 생성하는 언어 프로그램을 작성하십시오 . 여기서 은 프로그램 길이보다 엄청나게 큽니다.

더 적은 바이트를 사용하면 답이 바이트 단위로 점수가 매겨집니다.

여기 brainfuck에서 언어를 계산하는 해키 프로그램이 있습니다


1 :이 문제를 해결하기 위해 랩핑 셀과 랩핑되지 않은 테이프를 사용합니다.


3
+[.]내가 이길까? : P
Quintec

3
아마도 출력 길이에서 점수를 매기는 것이 더 흥미로울까요?
조 왕

@JoKing 좋은 생각입니다. 불행히도 그것은 조금 늦게 보입니다.
Post Rock Garf Hunter

2
또한 왜이 태그가 quine입니까?
무지의 구현

1
@ msh210 있습니다 대부분의 시간 트릭을 할,하지만 예를 들어 다른 브레인 퍽 문자에 대한 몇 가지 차이가 서로 다른 양의가 된 비용입니다 ( +가장 저렴한이며 ]프로그램에서 그들이 어디에 물론이 중요한 가장 비싼). 하지만 좋은 추정치가 정확히 같지 않습니다. 2
Post Rock Garf Hunter

답변:


15

8437495638205698686671 바이트

이것은 brainfuck 프로그램으로 번역됩니다 :

-[>>[>]+[->[>]+.[<]+<]<-]

정확히 231584178474632390847141970017375815706539969331281128078915168015826259279614 SOH 바이트를 인쇄 합니다.

이것은 함수에 의해 계산됩니다

f(n)=2*f(n-1)+n
f(0)=0

입력은 255입니다.

설명:

-[         Loop 255 times
  >>[>]    Move to the end of a series of positive cells (initially empty)
  +        Add one cell to the end
  [-       Loop over each cell 
    >[>]+  Add one cell to the end
    .      Print a SOH byte
    [<]+   Restore current cell
  <]       Move to next cell
<-]        Decrement counter

4

9093903938998324939360576240306155985031832511491088836321985855167849863863065731015823 바이트

>>>>>>-[[->>>+<<<]------>>>-]<<<[<<<]+[+[>>>]<<<->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-[<<<].>>>-]

정확히 인쇄

298333629248008269731638612618517353495058861384016275770860733328251135402804732197446995616017112134460464130233444058136509123809012106419446593183683387659250431692751255099808162970657410517657862174602556590616568690423540284801267472920128909691902547970614008613488242333460665145840144517097342073878746293059960326132795671583153307437896728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

250255

크레딧은 이 Brainfuck 답변에서 @hvd 갑니다 . 따라서 그를 찬성 해야합니다!

설명:

나는 내 자신의 설명을 작성하려고했지만 @ hvd 의 설명이 이미 적절 하다는 것을 깨달았 습니다. 대신 여기에 인용하겠습니다.

>>>>>> 약간의 작업 공간을 남겨 두어야합니다.

-255를 생성합니다 ( 셀을 감쌀 때 0-1 = 255부터 ).

[[->>>+<<<]------>>>-] 이것을 250의 255 복사본으로 바꾸어 다음과 같은 테이프를 만듭니다.

0 0 0 0 0 0 250 0 0 250 0 0 ... 250 0 0 [0]

<<<[<<<]+ 데이터 포인터를 뒤로 이동하고 초기 데이터를 마무리합니다.

0 0 0 [1] 0 0 250 0 0 250 0 0 ...

그런 다음 루프가 온다. [+...-]처음에는 1을 2로 설정하고 루프의 끝에서 1로 다시 설정된다. 루프 본문이 이미 2로 1로 설정되면 루프가 종료됩니다.

이제 숫자 2250250250 ... 250은 기준 250의 카운터를 나타내며 각 숫자는 숫자보다 하나 더 큽니다.

  • [>>>]<<<오른쪽으로 끝까지 이동합니다. 각 숫자는 0이 아닌 숫자로 표시되므로 사소합니다.

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-마지막 숫자부터 시작하여 숫자가 감소합니다. 그것이 긍정적이라면, 우리는 끝난 것입니다. 0으로 바뀌면 250으로 설정하고 이전 숫자를 계속하십시오.

  • [<<<].>>>포인터를 맨 왼쪽 자리 뒤로 이동하면 NUL 바이트를 인쇄 할 수 있습니다. 그런 다음 정확히 가장 왼쪽 자리로 재배치하여 완료되었는지 확인하십시오.

초기 변경 정확성을 검증 -하기 +위해 250 출력 1 , NUL 바이트들 ++에 대해 250 (2)


4

19326644346528796447 바이트

Brainfuck 코드 :

>+[+[[+>->-<<]->>+].<]

인쇄물

57896044618658097711785492504343953926634992332820282019728792003956564819967

널 바이트.

다음과 같이 작동합니다.

mem[i]=255;
do
    while(--mem[i]){
        mem[i+1]=mem[i+2]=mem[i];
        mem[i]=1;
        i+=2;
    }
while(mem[--i]);

아주 간단한 재귀.

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