시 에르 핀 스크 어코드 BLKBLKBLK TXTTXTTXTTXTTXTTXTTXTTXTTXT BLKBLKBLKBLKBLKBLKBLKBLKBLK TXT

빈 부분에 동일한 크기의 공간 블록을 사용하여 Sierpinski 카펫에 배열 할 때 카펫 의 반복 수를 출력하는 프로그램을 생성 하는 직사각형 텍스트 블록을 작성하십시오.

예를 들어 텍스트 블록이

TXT
BLK

그런 다음 프로그램을 실행

TXTTXTTXT
BLKBLKBLK
TXT   TXT
BLK   BLK
TXTTXTTXT
BLKBLKBLK

1프로그램의 모양이 Sierpinski 카펫의 첫 번째 반복을 나타내므로 출력해야합니다 .

마찬가지로, 달리기

TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT   TXTTXT   TXTTXT   TXT
BLK   BLKBLK   BLKBLK   BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXTTXTTXT         TXTTXTTXT
BLKBLKBLK         BLKBLKBLK
TXT   TXT         TXT   TXT
BLK   BLK         BLK   BLK
TXTTXTTXT         TXTTXTTXT
BLKBLKBLK         BLKBLKBLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT   TXTTXT   TXTTXT   TXT
BLK   BLKBLK   BLKBLK   BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK

이것은 두 번째 Sierpinski 카펫 반복의 모양이므로 2를 출력해야합니다.

텍스트 블록을 그대로 실행

TXT
BLK

00 번째 반복으로 간주 될 수 있으므로 출력해야합니다 .

이것은 모든 추가 반복에서 작동합니다. (적어도 이론적으로는 컴퓨터에 메모리와 모든 메모리가 있다고 가정합니다.)

세부

  • 프로그램은 소스 코드에 대한 정보를 읽거나 액세스 할 수 없습니다. 이것을 엄격한 퀴네 도전처럼 취급하십시오.
  • 출력은 stdout 또는 유사한 대안으로갑니다. 숫자와 선택적 후행 줄 바꿈 만 출력하십시오. 입력이 없습니다.
  • 텍스트 블록에는 줄 종결 자로 간주되지 않는 문자가 포함될 수 있습니다 . 텍스트 블록은 공백을 포함 할 수 있습니다.
  • 카펫의 “빈 공간”은 전체적으로 공백 문자 로 구성되어야합니다 .
  • 선택적으로 모든 프로그램에 후행 줄 바꿈이 있다고 가정 할 수 있습니다.

이 스택 스 니펫을 사용하여 모든 반복에서 지정된 텍스트 블록에 대한 카펫을 생성 할 수 있습니다.

<style>#o,#i{font-family:monospace;}</style><script>function c(e){e=e.split("\n");for(var n=new Array(3*e.length),t=0;t<n.length;t++){var l=t%e.length;n[t]=e[l]+(t>=e.length&&t<2*e.length?e[l].replace(/./g," "):e[l])+e[l]}return n.join("\n")}function f(){for(i=document.getElementById("i").value,n=parseInt(document.getElementById("n").value);n>0;)i=c(i),n--;document.getElementById("o").value=i}</script><textarea id='i'placeholder='code block...'rows='8'cols='32'></textarea><br>Iterations <input id='n'type='text' value='1'><br><br><button type='button'onclick='f()'>Generate</button><br><br><textarea id='o'placeholder='output...'rows='8'cols='32'style='background-color:#eee'readonly></textarea>

채점

면적 (너비 x 높이)별로 초기 텍스트 블록이 가장 작은 제출이 승자입니다. TXT\nBLK예 6의 점수 2 3 (기본적으로 짧은 코드 승 따라서 코드 골프 태그).

Tiebreaker는 텍스트 블록에서 가장 적은 고유 문자를 사용하는 제출로 이동합니다. 여전히 묶여 있다면, 답변은 첫 승리를 게시했습니다.



답변

CJam, 9 바이트

나는 이것이 개선 될 수 있다고 생각하지만, 지금은 함께 가자 …

];U):U8mL

작동 방식 :

];             "Wrap everything on stack in an array and discard it";
               "Before this point, the only thing on array can be the log 8 result of";
               "last updated value of U, or nothing, if its the first code";
  U):U         "Increment by 1 and update the value of U (which is pre initialized to 0)";
      8mL      "Take log base 8 of U. This is the property of Sierpinski carpet that";
               "the occurrence of the code is 8 to the power iteration count, indexed 0";

여기에서 온라인으로 사용해보십시오


답변

piet-32 * 6 = 192

체크 무늬 패턴으로 빈 공간을 채웠습니다. 나는 그것이 Sierpinski를 조금 삼키게한다고 생각합니다.

두 번째 반복은 다음과 같습니다.

원본 : 32 * 7


답변

> <> , 11 * 2 = 22

";n"00pbi1v
+$3*:@3-0.>

여기서 우리는> <>의 jump / teleport 기능을 사용하여 다른 접근 방식을 취합니다.

프로그램은 맨 위 행의 블록 만 실행하여 1/2 블록을 실행 한 다음 3/4/4 블록, 9/10 블록, 27/28 블록 등 (3의 거듭 제곱)을 실행합니다. 상단 행이 갖는 한 3^n블록 만 n프로그램 랩이 시작하기 전에 백 블록이 실행된다 (인해 상기 스택은 정지의 정상 출력 n통해 배치 지시 p).

iEOF가 충족되면 명령이 -1을 스택으로 푸시 하므로 프로그램은 “입력이 없습니다.”규칙을 이용합니다 . 따라서 이것을 테스트하려면 빈 파일로 파이프해야합니다.


이전 제출, 7 * 4 = 28

l"v"10p
v>:1=?v
3  ;n{<
<^}+1{,

첫 번째 줄은 모든 블록의 스택 길이를 계속 "누르고 put 명령을 v사용하여 첫 번째 따옴표를 아래쪽 화살표로 변경합니다 p. 첫 번째 줄이 끝나면 스택은 다음과 같이 보입니다.

[0, 1, 2, .., 3^n]

(이니셜 l은 두 번 사용됩니다.)

그런 다음 마지막 세 줄은 1을 누르기 전에 3으로 나누어야하는 횟수를 계산합니다 (> <>에는 로그 기능이 없기 때문에). 맨 아래 0은 카운트를 추적하는 데 사용됩니다.


답변

펄, 26

$_+=.91/++$n;
die int."\n";

이것은 고조파 계열을 사용하여 밑이 3 인 로그를 근사화합니다. 나는 그것이 효과가 있다고 생각하지만 작은 숫자로만 시도했습니다. 를 사용하는 아이디어에 대한 으스스한 ossifrage 덕분 die입니다.

구버전 (34) :

$n--or$n=3**$s++;
print$s-1if!$o++;

답변

펄, 30 (15 × 2)

우선, 10 반복이 2 32 가 아니라 합리적인 한계라고 주장 할 것입니다 . 10 회 반복 한 후에 N 바이트 로 구성된 프로그램 은 ( N × 3 20 ) 바이트 (줄 바꿈)로 확장되어 N = 1 인 경우에도 3 기가 바이트를 초과 합니다. 32 비트 아키텍처는 11 개의 반복을 완전히 처리 할 수 ​​없습니다. (그리고 분명히 우주에는 2 번의 32 번 반복 할 입자가 충분하지 않습니다 ).

여기 내 해결책이 있습니다.

$n++; $_=log$n;
print int;exit;

$n첫 번째 줄에서 변수 를 증가시키고 각 단계에서 로그를 계산하여 작동합니다. 두 번째 줄은이 로그의 정수 부분을 인쇄하고 종료합니다.

밑수 e (2.718 ..)에 대한 간단한 로그 는 처음 10 회 반복에 대한 올바른 결과를 제공 할 수있을 정도로 가깝습니다.


답변

골프 스크립트, 9 * 2 = 18

0+
,3base,(}

(첫 번째 줄에는 후행 공백이있어 사각형으로 만듭니다.)

Golfscript에 대한 로그 기능을 찾을 수 없으므로 그렇게 base해야했습니다.

Golfscript는 빈 문자열로 시작하므로 문자열 0+길이를 1 씩 증가시킵니다 (강압). 첫 번째 줄이 끝나면 스택은 length의 문자열을 갖게되며 3^n, 우리는 슈퍼 주석을하기 전에 로그베이스 3을 사용합니다. n그런 다음 자동으로 인쇄됩니다.


답변

C, 12×8 = 96

@ciamej에서 영감을 얻어 줄였습니다. 그것은 3의 트릭으로 나누고 카펫이 효과적으로 if 루프를 while 루프로 변환한다는 사실을 사용합니다.

이 코드는 gcc / Ubuntu에서 최대 3 번 반복 테스트되었습니다.

#ifndef A //
#define A //
x;main(a){//
a++;/*    */
if(a/=3)x++;
printf(   //
"%d",x);} //
#endif    //

이전 솔루션 : C, 11×12

큰 승자는 아니지만 C입니다.

비트 시프 팅으로 블록 카운트의 log2를 찾은 다음 매직 넘버와 int truncation을 사용하여 log3을 추정합니다. 수학은 최대 26 개의 반복 (42 비트 숫자)으로 작동해야합니다.

#ifndef A//
#define A//
int n=0;//_
int main//_
(v,c){//___
n+=1;/*..*/
while(n//__
>>=1)v++;//
n=.3+.62*v;
printf(//__
"%d",n);}//
#endif//__