초기 코드를 복제하여 크기가 커지는 사각형 만들기


45

할당은 짝수 길이 의 프로그램을 작성 하여 ASCII 소스 사각형 (아래 설명 참조)을 인쇄 하여 원본 소스 코드를 현재 코드의 중간에 붙여 넣을 때마다 측면 길이를 1 단위 늘 립니다.

이 작업을 잘 정의하는 것은 매우 어렵 기 때문에 예를 들어 보겠습니다.

  • 초기 코드가 CODE인쇄되어 있다고 가정 해 봅시다 .

    0
    
  • 그런 다음 CODE중간에 삽입 하십시오. 코드가 COCODEDE되고 인쇄해야합니다.

    00
    00
    
  • CODE중간에 다시 삽입 : 코드가 COCOCODEDEDE 인쇄 되고 인쇄되어야합니다.

    000
    000
    000
    
  • 등등. 귀하의 답변은 이론적으로 여러 번 반복 한 후에 작동해야하지만 언어 성능 제한으로 인해 특정 임계 값을 초과하여 합리적으로 실행할 수없는 경우 이해합니다.

몇 가지 규칙 :

  • 당신은 어떤 사용할 수있는 인쇄 가능한 ASCII 스퀘어에 사용할 문자로 (32-127)를. 선택은 일정해야합니다 (각 반복마다 동일한 문자를 사용해야합니다).

  • 초기 출력 제곱은 측면 길이 1 이어야합니다 .

  • ASCII 아트 스퀘어는 N 줄 ( N-1 줄 바꿈 / 개행 문자로 구분)과 각 줄 에 선택한 문자의 N 복사본이 포함 된 문자열로 정의됩니다 .

  • 출력에는 후행 줄 바꿈 이외의 불필요한 공백이 포함될 수 없습니다.

  • 입력 및 출력에 기본값을 사용할 수 있습니다 (프로그램 또는 기능은 허용되지만 스 니펫은 허용되지 않음).

  • 코드 의 중간 은 소스 코드를 두 부분으로 나눌 수있는 지점으로 정의됩니다.

  • 답은 원래 프로그램 의 길이에 따라 바이트 단위로 표시됩니다. 가장 낮은 바이트 수가 이깁니다. 동점이있는 경우, 이전에 제출 된 답변이 우선합니다.

  • 이 프로그램 을 사용 하여 직접 삽입하지 않고도 삽입을 적용 할 수 있습니다 .


1
나는 이전에 게시이 기이 한 질문 에서 영감을 받았다는 것을 인정해야한다 . 사람들이 너무 가까이 있다고 생각하면 행복하게 삭제할 것입니다. 내가 실수 한 경우에도 실례합니다. 여전히 규칙에 익숙하지 않습니다. :)

2
PPCG에 오신 것을 환영합니다! 향후 과제에 샌드 박스 를 사용하는 것이 좋습니다 .
user202729

7
사이트에 오신 것을 환영합니다! 속박 함정에 빠지지 않고 영감에 대한 또 다른 도전의 탁월한 사용 :)
Shaggy

도우미 프로그램은 여러 줄이있는 프로그램에서는 작동하지 않습니다. 다른 질문 에서이 수정 된 버전 은 어떻습니까?
조 왕

1
@ user77954하지만 내 브레인 퍽 코드를 파이썬보다 짧은 :( (? 누구도 그 전에 말했다)
조 왕

답변:


41

Pyth , 2 바이트


5

온라인으로 사용해보십시오! 또한 두 배로 , 배로 해보십시오 !

어떻게 작동합니까?

\n인수를 후행 줄 바꿈과 함께 인쇄하면서 동시에 반환 하는 명령입니다 . 그래서, 당신은 삽입을 할 때마다, 당신은 문자 그대로의 정수를 돌려 5 가 포함 된 숫자로 N의 사본 5 연결된, 그리고 선도적 인 뉴 라인은 기본적으로하여 정사각형을 유지, 확인이 배의 해당 번호를 인쇄되어 있는지 확인하세요.


6
짧은 성스러운 말 ...
ETHproductions

최적 증명 (: P) : 바이트 수는 짝수 여야하며 음수 일 수 없으므로 가능한 최소 바이트 수는 0 바이트입니다. 정확히 1 바이트 의 0 바이트 프로그램이 있어 작업을 수행하지 못합니다. 따라서 2 바이트가 최적입니다.
Mr. Xcoder

10
모든 사람 (특히 HNQ 유권자)은 다른 답변도지지하고 FGITW 효과를 피하십시오.
user202729

25

자바 스크립트 (ES6), 42 32 30 바이트

s=[this.s]+0;  console.log(s);

두 번째 반복 :

s=[this.s]+0;  s=[this.s]+0;  console.log(s);console.log(s);

이것은 코드의 전반이 실행될 때마다 a 0를 추가하고 후반이 실행될 때마다 s인쇄 s합니다. JavaScript의 네 가지 단점을 활용합니다.

  1. 현재 환경은로 참조 할 수 있습니다 this. 이것은 우리를 this.s대신 할 수있게한다 s.
  2. 객체에 정의되지 않은 속성에 액세스하면 오류가 발생하지 않고 JavaScript가 반환 undefined됩니다.
  3. 배열에 숫자를 더한 값은 문자열을 반환합니다. [1,2,3] + 4 === "1,2,34"
  4. 배열을 undefined문자열 화할 때 빈 문자열로 변환됩니다 [undefined] + 0 === "0".

종합하면 이는 첫 번째 절반 (0의 문자열 생성)을 단 13 바이트로 표현할 수 있음을 의미합니다. 사용하는 경우 alert대신이 console.log허용됩니다, 우리는 하반기을 단축하여 4 바이트 이상을 절약 할 수 있습니다.


축하합니다. 제가 만든 테스트를 통과했습니다!

1
... 독창적! :)
Shaggy




9

C (GCC) , 170 (168) 96 80 72 70 바이트

훨씬 더 짧은 버전. 여전히 전 처리기없이 솔루션을 찾을 수 있기를 바랍니다.

i;main(n){for(;i++<n;)printf
#if 0

#endif
(" %*c",n=__LINE__/4, 10);}

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

이전 168 바이트 버전 :

#ifndef A
#define A p(c){putchar(c);}j,n;main(i){for(
#else
#define A n++,
#endif
A



#ifndef B
#define B i=++n;i--;p(10))for(j=n;j--;)p(64);}
#else
#define B
#endif
B

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



@ user202729 아, 예. 오타를 수정했지만 버그가 발생했다고 생각했습니다. 되돌리기.
gastropner

8

파이썬 2 , 30 바이트

False+=1      ;print'*'*False;

온라인으로 사용해보십시오! , 2 차3 차 반복

이것은 파이썬의 부울이 기본적으로 정수이고 이름 False이며 True파이썬 2에서 다시 지정할 수 있다는 사실을 이용합니다 .

파이썬 1 , 32 바이트

exit=exit+'*'  ;print exit[30:];

온라인으로 사용해보십시오! , 2 차3 차 반복

파이썬 (1) 내장 문자열에서 exitquit를 종료하는 방법 대화 형 쉘의 사용자에게 알려 존재했다. 기본값은 "Use Ctrl-D (i.e. EOF) to exit."입니다.


1
나는 제안하려고 n=False+=1;print'*'*n;했지만, 그것이 파이썬 기능이 아니라는 것을 계속 잊고있다.
ETHproductions

6

, 6 바이트

⊞υωLυ⸿

온라인으로 사용해보십시오! 설명:

  ω     Predefined empty string (any variable would do here)
 υ      Predefined initially empty list
⊞       Push

υ 반복 횟수의 길이로 끝납니다.

    υ   List
   L    Length
        Implicitly print as a row of `-`s
     ⸿  Move to start of next line




5

Brain-Flak , 74 바이트

(((((()()()){}){}){}){})((()()()()()<>){})<>([]){({}[()]<(({})<>)<>>)}{}<>

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

이 시도 .

설명

(((((()()()){}){}){}){}) # push 48 ("0") onto first stack
((()()()()()<>){})       # push 10 (\n) onto second stack
<>([]){({}[()]<          # a number of times equal to the height of the first stack:
  (({})<>)<>             #   copy the top of the first stack to the second stack
>)}{}<>                  # cleanup and return to second stack

중단 점은 <>"푸시 10"섹션 의 중간에 있습니다. 이것을 깨면 세 번째 스택에 5를 남겨 두어 해당하는 반쪽에 도달 할 때까지 10을 누르면 중단 된 지점에서 다시 시작합니다.

인쇄 가능한 ASCII 값 (공백)을 22 바이트로 푸시 할 수 있지만을 누르면 중앙 <>이 실행 5됩니다. 2 바이트를 더 추가하여 <>푸시 10를 향한 모든 진행 이 세 번째 스택에 있도록 이동할 수있었습니다 . 보너스로, 결과적으로 정사각형이 더욱 미적으로 즐거워졌습니다.



4

tinylisp , 112 바이트

(load library) (d N((q((x)(i x(inc x)1)))(v(h(t(t(h(t(q())))))))))(join(repeat-val(string(repeat-val 42 N))N)nl)

온라인으로 사용해보십시오! 또한 두 배다섯 배 .

변경 가능한 변수가 없기 때문에 많은 언어가 사용하는 "상반기에 문자열을 작성하고 후반에 인쇄하는"접근 방식은 tinylisp에서 작동하지 않습니다. 대신 심각한 코드 중첩을 수행합니다.

코드의 두 번째 복사본이 삽입되면이 안에 코드가 배치되어 (q())목록에 포함됩니다. 그런 다음 (h(t(t(h(t(...))))))부품 목록으로 드릴 (d N합니다. (v(...))그것을 평가; 그런 다음 이름없는 함수에 전달합니다.이 함수 (q((x)(i x(inc x)1)))는 숫자이면 결과 값을 늘리고 빈 목록이면 1을 반환합니다. 가장 바깥쪽으로 중첩 된 코드 버전의 최종 결과가에 할당됩니다 N. 본질적으로, 중첩 수준의 수를 세는 이상한 종류의 재귀를 설정했습니다.

코드의 후반부에서는 N별표 N문자열을 만든 다음 이러한 문자열 목록을 만든 다음 줄 바꿈으로 목록을 조인합니다. 결과는 후행 줄 바꿈과 함께 표시됩니다.


3

R , 44 바이트

F=F+1;T=TRUE*TRUE+12;
write(strrep(1,F),"");

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

후행 줄 바꿈으로 인쇄합니다. 는 T=TRUE*TRUE+12단지 패드 길이입니다.

이 두 배로 시도 하고 그것이 배보십시오 .


세미콜론을 삭제하여 2 바이트를 제거 할 수 있습니다. 첫 번째 줄 끝에 공백이 있다고 가정하면 #으로 바꿀 수 있습니다. F=F+1;T=TRUE*TRUE+12#<newline>write(strrep(1,F),"")
Andreï Kostyrka

@ AndreïKostyrka는 불행히도 43 바이트가 아닙니다.
주세페


3

SNOBOL4 (CSNOBOL4) , 130 68 바이트

코멘트가 없습니다! 이전 알고리즘에 대한 설명은 편집 기록 을 참조하십시오 .

	X =X + 1
	A =ARRAY(X,DUPL(1,X));
I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

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

시도는

설명:

	X =X + 1		;* increment X
	A =ARRAY(X,DUPL(1,X));	;* create an x-length array with 1 repeated x times for each element
I	I =I + 1		;* for i < x
	OUTPUT =A<I>	:S(I)	;* output a[i]
END

때문에 END라벨이 요구되고 첫 번째 후 어떤 END레이블이 무시됩니다, 우리는이 문제에 대한 두 가지 장점을 얻을 :

  • 프로그램 전반부의 작업은 반복 X에 대해 X반복됩니다
  • (인터프리터에게는) labels를 포함하여 후반부 사본 하나만 존재합니다 .

이는 상반기에 반복을 사용하고보다 전통적인 레이블 방식을 사용하여 출력 X시간 을 반복 할 수 있음을 나타냅니다 .

전반은

	X =X + 1
	A =ARRAY(X,DUPL(1,X));

이는 반복 될 때 X적절한 횟수만큼 증가 하고, 각 요소 가 문자열 반복 횟수 인 ~ ARRAY A까지의 색인을 갖는를 만듭니다 .1XA1X

그런 다음 프로그램이 몇 번이나 반복 되더라도 인터프리터는 다음 만 볼 수 있습니다.

I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

A인덱스가 범위를 벗어날 때까지 한 번 에 하나씩 요소를 인쇄 한 다음 프로그램을 종료 하는 일반적인 SNOBOL 프로그램입니다 .

;선택적 줄 종결자는 일반적으로 바이트 수를 68로 깔끔하게 가져오고 중간 지점을 표시하여 코드를 추가 할 수있는 한 줄 EVAL또는 CODE명령문을 위해 예약되어 있습니다.


3

shortC , 56 44 바이트

-12 바이트 : shortC를 사용하고 있습니다. 짧은 C 항목을 사용하지 않는 이유

s[];A
strcat(s,"@");//
Js);/*filling space*/

표준 C를 사용했지만 }결국에는 복제가 혼란 스러워야합니다. shortC는이를 EOF에 암시 적으로 삽입합니다.



1

Zsh , 10 바이트

s+=0
<<<$s

전체 테스트 스위트를 온라인으로 사용해보십시오!

... 예, 조금 낫습니다. 문자열을 N 번 추가 한 다음 N 번 인쇄하십시오. 알고 보니 <<<foo<<<foo잘 작동합니다.


Zsh , 64 바이트

사용 된 문자 : (공백).

f(){printf '%*s\n' $1}
:<<'E'

E
repeat $[i=LINENO/3];f $i
exit

전체 테스트 스위트를 온라인으로 사용해보십시오!

중간 지점은 두 번째 E줄과 그 다음 줄 바꿈 사이에 있습니다. heredoc은 E자체적으로 한 줄에 있을 때 종료 되며 코드 중간에 발생합니다.


롤 @ "약간"개선. 다음과 같이 표현할 수도 있습니다s+=0;<<<$s
roblogic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.