시 에르 핀 스크 어코드


47

빈 부분에 동일한 크기의 공간 블록을 사용하여 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는 텍스트 블록에서 가장 적은 고유 문자를 사용하는 제출로 이동합니다. 여전히 묶여 있다면, 답변은 첫 승리를 게시했습니다.

답변:


23

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

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


35

piet-32 * 6 = 192

여기에 이미지 설명을 입력하십시오

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

두 번째 반복은 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

원본 : 32 * 7

여기에 이미지 설명을 입력하십시오


19

> <> , 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은 카운트를 추적하는 데 사용됩니다.


13

펄, 26

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

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

구버전 (34) :

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

매우 깔끔합니다!
squeamish ossifrage

10

펄, 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 회 반복에 대한 올바른 결과를 제공 할 수있을 정도로 가깝습니다.


2
OP에 따르면 이론적으로 모든 반복에 작동해야합니다.
Nathan Merrill

2
@NathanMerrill 그래요. 그러나 원래의 스펙을 준수하려면 다른 우주에서도 작동해야했을 것입니다. 그 이후로 질문이 편집되었습니다.
squeamish ossifrage

나는 여기서 좋은 점 때문에 질문을 바꿨다. 나는 자연 로그를 사용하는 것에 동의 입니다 오히려 회색 영역 만이 승리되지 않기 때문에 솔직히 너무 걱정하고 있지 않다.
Calvin 's Hobbies

이러한 제출물의 대부분은 3 ^ nx 1 타일의 최상위 행에서만 제어됩니다. 카펫의 해당 세그먼트를 생성하면 상당히 확장 할 수 있습니다. 반올림 오류가 발생할 수있는 곳은 거의 확실합니다.
captncraig

1
이미 언급했듯이, 원래 질문은 "합리적인"반복 횟수 (최대 2 ^ 32)까지 확장 될 수있는 코드를 요구했습니다 . 수학을 수행하면 단일 반복조차도 많은 반복 후에 10 ^ 4098440370 바이트를 초과하여 확장된다는 것을 알 수 있습니다. 나는 좀 합리적 이라고 생각하는 대답을 제안 했지만 그 이후로 "합리적"이라는 단어가 질문에서 사라졌습니다 :-/. 이봐, 난 끝났어 이 답변이 마음에 들지 않으면 그냥 답하십시오.
squeamish ossifrage

9

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

0+       
,3base,(}

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

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

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


문자열 대신 정수를 사용하여 두 문자를 저장할 수 있으므로 ,두 번째 줄에 문자를 저장하십시오 . 첫 번째 줄 : 0or); 두 번째 줄 3base,(}. 다른 분명한 목표는 (두 번째 줄입니다. 이는 까다 롭지 만 첫 번째 줄을 1+~abs(7 * 2 사각형 으로 바꾸면 제거 할 수도 있습니다 .
피터 테일러

8

C, 12x8 = 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, 11x12

큰 승자는 아니지만 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//__

안녕하세요, 솔루션의 단축 버전을 게시했습니다.
ciamej

그와 함께 좋은 트릭! ;)
ciamej

6

CJam, 9 바이트

사용 아이디어는 ]Optimizer에서 가져온 것이지만 매우 다른 방법을 사용하여 계산합니다.

X~]:X,8mL

온라인으로 사용해보십시오

작동 방식 :

X~          "push X and dump its contents.  On the zeroth iteration, X is a single number, but later is it an array.";
  ]         "wrap everything into an array.  The stack would contain the contents of X plus the result of the previous instance of the code";
   :X       "store this array back into X.  X is now 1 element longer";
     ,      "take the length of X";
      8mL   "do a base-8 logarithm of it";

다른 두 개의 9 바이트 솔루션

]X+:X,8mL

],X+:X8mL

이는 실제로 타이 브레이커와도 옵티 마이저를 연결합니다. : P Tiebreakerbreaker : 이전 게시물이 이깁니다.
Calvin 's Hobbies

나는 그것이 좋은 해결책이라고 생각합니다. 나는 9자를 이길 수 없었다.
PhiNotPi

나는 일반적인 접근 방식이 동일하다고 생각합니다 (그리고 그것이 유일하게 이해되는 유일한 접근 방법입니다)-변수가 있고 어떻게 든 1 씩 증가시킵니다.
Optimizer

4

파이썬 2, 15 * 3 = 45

m=n=0;E=exit  ;
m+=1;n+=m>3**n;
print n;E()   ;

count-first-row-the-log-three-and-exit 아이디어의 다른 구현. 아마 여전히 조금 더 골프를 칠 수 있습니다.


2

bc, 2 * 16 + 1 = 33

점수에서 추가 +1은 -lbc 옵션이 필요 하기 때문 입니다.

a+=1;          
l(a)/l(3);halt;

2

골프 스크립트, 7 * 2 = 14

1+~abs(
3base,}

이것은 Sp3000의 답변 , 특히 긴 두 번째 줄을 최적화하려는 열망에서 영감을 얻었습니다 . 3base,GS에 밑이 3 인 대수를 얻을 수있을 정도로 짧으며 수퍼 코멘트 }가 명확하게 최적입니다.

첫 번째 줄에 필요한 것은 빈 문자열 ''을 초기 stdin에서 0으로 매핑 한 다음 음이 아닌 정수를 각각의 후속 문자에 매핑하는 것입니다. 이러한 방식으로 3^n - 1스택 에서 첫 번째 줄을 끝내고 3base,감소시킬 필요가 없습니다.


2

C, 13x8

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

1

펄, 76

나는 이미 철저히 구타 되었으므로이 글을 올릴 점이 많지 않다는 것을 알고 있지만 어쨌든 내 현재 솔루션이 있습니다.

$_++;                                 
if(not$_&$_-1){print log()/log 8;$_--}

@Alex 첫 번째 반복에서도 작동하지 않는 것 같습니다.
PhiNotPi

예, 그것은 그대로 작동합니다. 분석법을 테스트 했습니까?
PhiNotPi

광산은 ideone : ideone.com/othumP 에서 작동합니다 .
PhiNotPi

알았어 나는 그것이 작동하지 못하게하는 중요한 세부 사항을 놓쳤다. 당신 말이 맞아요, 제 제안은 틀 렸습니다.
Alex A.

1

> <> (물고기), 12 * 3 = 36

보다 간단한> <> 솔루션 :

'v'00p0l1+  
>  :2-?v$1+v
^$+1$,3< ;n<

먼저 상단 블록의 상단 행을 실행합니다. 줄 끝까지 도달 한 후 시작 지점으로 돌아 오면 프로그램 포인터를 아래쪽으로 향하게하는 전체 프로그램의 맨 처음 위치에 'v'00p놓습니다 v. 그 전에 모든 블록은 0과 스택의 길이 + 1을 그 위에 밀어 넣습니다. (스택이 될 것입니다 0 2 0 4 0 6 ...)

두 번째와 세 번째 상반기에는 2를 얻기 전에 맨 위 스택 요소를 몇 번 나눌 수 있는지 계산합니다 (두 번째에서 맨 위 요소에 저장).

마지막으로 스택의 두 번째 요소를 출력합니다.


1

루아, 3 * 17 = 51

대부분의 사람들과 같은 전략 :

x=(x or 0)+1;    
y=math.log(x,3)  
print(y)os.exit()

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