스 니펫의 N 개 사본에 가입하여 N ^ 2 자 생성


30

도전

N 개의 복사본이 함께 연결될 때 출력되는 문자 수가 N 2 가되도록 가능한 가장 짧은 코드 스 니펫을 작성하십시오 . N은 양의 정수입니다.

예를 들어 코드 조각이 soln();인 경우 running soln();은 정확히 1자를 soln();soln();인쇄 하고 running 은 정확히 4자를 soln();soln();soln();인쇄 하고 running 은 정확히 9자를 인쇄합니다.

총 문자 수가 올바른 한 모든 문자가 출력 될 수 있습니다. OS 간 혼동을 피하기 위해 줄 \r\n바꿈은 하나의 문자로 계산됩니다.

프로그램은 자체 소스를 읽거나 파일 크기를 읽거나 다른 허점을 사용할 수 없습니다. 이것을 엄격한 도전 처럼 취급하십시오 .

출력은 stdout 또는 파일 또는 유사한 대안으로 갈 수 있습니다. 입력이 없습니다.

코드의 주석은 실행 중이기 때문에 좋습니다.

모든 문자가 프로그램에있을 수 있습니다. 바이트 단위 의 최단 제출 이깁니다.


프로그램을 종료해야합니까?
마틴 엔더

@ MartinBüttner 예
캘빈의 취미

답변:


24

TECO, 4 바이트

V1\V

V텍스트 버퍼에 현재 줄의 내용을 인쇄합니다. 1\현재 위치에 숫자 1의 문자열 표현을 삽입합니다.

따라서 프로그램 의 N 번째 반복에서 첫 번째 V는 문자의 N-1 사본 을 출력 한 다음 텍스트 1에 다른 사본 을 추가 1한 다음 N 을 출력 1합니다.


1
TECO에 대한 링크를 추가 할 수 있습니까?
Outgolfer Erik

22

Brainfuck, 17 16 바이트

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

여기서 테스트 할 수 있습니다 . 그 사실을 사용하십시오 .n2+2n+1=(n+1)2


16
경쟁력있는 바이트 수준에서 BF를보고 있다고 믿을 수 없습니다!
agweber

21

브레인 포트, 11

나는 첫 번째 Brainfuck 답변을보고 너무 길다고 생각했습니다 :)

[.<]>[.>]+.

더하기를 더 많은 더하기로 바꾸면 결과를 쉽게 볼 수 있습니다.

N 번째 반복에서 각 루프는 ASCII 값이 1 인 문자의 N-1 사본을 출력 한 다음 1을 더 출력합니다 +..


N 문자가 아닌 N ^ 2 문자를 인쇄해야합니다. BF 코드를 읽을 수 없으므로 코드가 올바르지 않은지 또는 설명이 잘못된 지 모르겠습니다.
Brian J

@BrianJ N ^ 2자를 출력합니다. 여기서 테스트 할 수 있습니다. copy.sh/brainfuck 출력이 보이지 않으면 플러스를 마이너스로 바꾸 십시오 .
alephalpha

@alephalpha 죄송합니다. 이제 댓글을 잘못 읽었습니다. 내가 생각했던 것처럼 코드는 (N-1) + 1을하지 않습니다.
브라이언 J

16

파이썬 2, 22

a='';print a;a+='xx';a

빈 문자열을 인쇄 한 다음 2 x, x4 , 등을 인쇄합니다 . 각 문자열 뒤에 줄 바꿈이 있으면 n*n문자가 나타납니다.

1 부 : "\n"(1 자)
2 부 : "\nxx\n"(4 자)
3 부 : "\nxx\nxxxx\n"(9 자)

a각 실행마다 초기 변수 가 다시 초기화되는 것을 막기 위해 코드 ;a는 자체적으로 양성이지만 다음 루프와 결합하여 aa대신 할당 할 scapegoat 를 만듭니다 . 이 속임수는 내 것이 아니다. 나는 이전 답변에서 그것을 보았다. 누군가가 나를 가리켜 서 크레딧을 줄 수 있다면 감사하겠습니다.


실제로 마지막 줄 바꿈이 인쇄됩니까?
xnor

아니오 마지막 줄 바꿈이 인쇄 된 것으로 생각하지 않습니다. 그러나 단순히 제거 ,후가 print a작동합니다. print a인쇄 할 때마다 줄 바꿈을 인쇄합니다.
저스틴

@Quincunx 아, 물론 감사합니다!
xnor

이 게시물 에 대해 이야기하고 있습니까?
Sp3000

10

CJam, 6 바이트

LLS+:L

사실을 사용합니다 .n2 + n + (n+1) = (n+1)2

L      "Push L. Initially this is an empty string, but its length increases by 1 with each copy
        of the snippet.";
 L     "Push another L.";
  S+   "Add a space to the second copy.";
    :L "Store the lengthened string in L for the next copy of the snippet.";

:L..1+GolfScript에서도 같은 생각입니다.
피터 테일러

@PeterTaylor 나는 GolfScript에서 생각 ..n+하고 있었지만 그 성가신 개행은 ... :(
Martin Ender

하 맞아. :L사용하지 않기 때문에 필요 하지 않습니다.
피터 테일러

10

/// , 21 바이트

/// 에서 이것을 해결하는 정말 짧고 뒤틀린 방법이 있다고 확신 하지만 "직선"방법 외에는 아무것도 찾을 수 없습니다.

1/1\//112\///2\//1\//

이것은 연속 홀수를 인쇄하는 방식을 기반으로합니다. 스 니펫은 1시작 부분에 인쇄 1되는 스 니펫과 스 니펫의 각 연속 사본의 첫 번째 부분에 두 개를 더 추가하는 두 개의 교체로 구성 됩니다. 에 대해 살펴 보겠습니다 N = 3. 다음은 3 줄 이상의 그룹으로 읽어야합니다. 1. 현재 코드, 2. 처리 된 토큰, 3. (그리고 뒤 따르는) 위의 토큰이하는 일.

1/1\//112\///2\//1\//1/1\//112\///2\//1\//1/1\//112\///2\//1\//
1
is printed
/1\//112\///2\//1\//1/1\//112\///2\//1\//1/1\//112\///2\//1\//
/1\//112\//
replaces all occurrences of 1/ with 112/. This affects the starts of all further snippets
but not the substitution commands, because the slashes in those are always escaped.
It is necessary to put a 2 in there, because otherwise the interpreter goes into an infinite
loop replacing the resulting 1/ again and again.
/2\//1\//112/1\//112\///2\//1\//112/1\//112\///2\//1\//
/2\//1\//
Replace all occurrences of 2/ with 1/, so the the next snippets substitution works again.
111/1\//112\///2\//1\//111/1\//112\///2\//1\//
111
is printed
/1\//112\///2\//1\//111/1\//112\///2\//1\//
/1\//112\//
add two 1s again
/2\//1\//11112/1\//112\///2\//1\//
/2\//1\//
turn the 2 into a 1 again
11111/1\//112\///2\//1\//
11111
print 11111
/1\//112\///2\//1\//
the last two substitutions have nothing to substitute so they do nothing

흥미롭게도, 1끝까지 이동하면 잘 작동합니다 .

/1\//112\///2\//1\//1

7

> <> , 14 바이트

1:na*a*';'10p!

"1부터 시작하는 연속 홀수 정수의 합"아이디어를 사용합니다. 1부터 시작하여 매번 100을 곱하여 출력 길이를 2 씩 증가시킵니다.

예를 들어, 5 부를 추가하면

1100100001000000100000000

출력을 파일로 파이프하여 테스트했지만 후행 줄 바꿈이 표시되지 않았습니다.

고장

1                   Push 1, skipped by ! every time except the first
 :n                 Copy top of stack and output as num                  
   a*a*             Multiply by 10 twice
       ';'10p       Modify the source code so that the first : becomes a ; for termination
             !      Skip the next 1

5

CJam, 10 9 바이트

],)_S*a*~

코드의 사본 수인 N 2 공백을 인쇄 N합니다.

코드 확장 :

],            "Wrap everything on stack and take length";
  )_          "Increment and take copy";
    S*        "Get that length space string";
      a*      "Wrap that space string in an array and create that many copies";
        ~     "Unwrap so that next code can use to get length";

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



5

자바-91 바이트

{String s=System.getProperty("a","");System.out.println(s);System.setProperty("a","xx"+s);}

이 솔루션은 Python의 다른 솔루션과 동일합니다 . 확실히이기는 것은 아니지만 재미있었습니다. :)


당신은 아무것도 실행하기 위해 수업이 필요하지 않습니까?

OP는 코드 스 니펫을 요청했기 때문에 아니요. 예를 들어 이것이 메인 내부에서 실행되고 있다고 가정 할 수 있습니다.
cygnusv

그런 다음 59 또는 44 바이트 솔루션이 있습니다.

쿨 :) 나는 하나의 라이너를 선호하지만, 실제로는 더 짧습니다!
cygnusv

4

펄, 14 바이트

print;s//__/;

이것은 Perl의 -l명령 스위치 로 실행해야하며 , 이로 인해 print새 줄이 추가됩니다.

기본 변수를 인쇄 한 $_다음 대체를 통해 두 개의 밑줄을 추가합니다.

예:

$ perl -le 'print;s//__/;print;s//__/;print;s//__/;print;s//__/;'

__
____
______

플래그는 플래그 당 1 바이트 더 계산
Optimizer

무엇에 대해 say?
hmatt1

@chilemagic 나는 그것을 시도했지만 내 Perl 버전에서 작동시키지 못했습니다.
grc

@grc 버전 5.10 이상이므로 -E대신 필요 합니다.
hmatt1

@ chilemagic 흠, 그것은 5.16에서 나를 위해 작동하지 않는 것 같습니다.
grc

4

Brainfuck, 10 자

모두 이전 브레인 퍽 솔루션이었다 waaay 그래서 여기에 하나 더 짧은 너무 오래 (16, 11 개 문자) :

+[.->+<]>+

n번째 블록은 출력한다 2*n-1(에서 코드 포인트와 문자 2*n-11)


2
셀이 무제한 크기 인 경우에만 표준 brainfuck에서 작동하지 않습니다. 사실, 그것은 전혀 이해가되지 않습니다. 문자 코드 1 조를 어떻게 출력합니까?
feersum

3

전주곡 , 18 12 바이트

^1+(9!1-)#2+

이것은 N을 인쇄합니다 2 탭 됩니다. 숫자 대신 문자를 인쇄하는 표준 호환 인터프리터를 가정하므로 Python 인터프리터 를 사용 하려면로 설정 NUMERIC_OUTPUT해야 False합니다.

아이디어는 단순히 스택의 상단 (처음 0)을 다음과 같이 사용하는 것입니다. 2(N-1) 하고 2N-1탭을 인쇄 한 다음 스택의 상단을 2 씩 증가시키는 것입니다. 따라서 반복 할 때마다 홀수의 탭이 인쇄됩니다.


3

Java-59/44 (요구 사항에 따라 다름)

static String n="1";
static{System.out.print(n);n+="11";}//

분명히 우리는 클래스에서 코드를 실행한다고 가정 할 수 있습니다.

그것이 주요 방법으로 들어갈 수 있다면 :

String n="1";
System.out.print(n);n+="11";//

3

C, 87 바이트

#if!__COUNTER__
#include __FILE__
main(a){a=__COUNTER__-1;printf("%*d",a*a,0);}
#endif

이것은 두 개의 매직 매크로를 사용합니다. __COUNTER__매크로 0는 처음 사용될 때, 1두 번째 등으로 확장되는 매크로입니다 . 컴파일러 확장이지만 적어도 gcc, clang 및 Visual Studio에서 사용할 수 있습니다.__FILE__소스 파일의 이름입니다. C / C ++에 파일을 포함시키는 것은 문자 그대로 소스 코드에 직접 붙여 넣는 것과 동일하므로 사용하기가 약간 까다로 웠습니다.

없이도이 기술을 사용할 수 있습니다 __COUNTER__. 이 경우, 코드를 두 번 사용하지 않는 표준 보호대가 #if명령문에 __LINE__사용될 수 있으며 필요한 문자 수를 계산하는 데 사용될 수 있습니다.


이 솔루션은 C로 작성된 것이 아니라 C 방언으로 작성되었습니다. 언어 이름을 수정하십시오.
FUZxxl

2
@FUZxxl 대부분의 코드 골프 응답은 gcc에서만 작동하도록 설계되었으므로 이것이 왜 문제가 될지 잘 모르겠습니다.
feersum

그렇지는 않지만 실제로 선언해야합니다.
FUZxxl

혼란 스러워요. 이슈가 아닌 것을 왜 선언해야합니까? O_o
corsiKa

@corsiKa 선언하면 문제가 아닙니다. C gcc는 표준 C가 아니라고 말합니다.
FUZxxl

2

Dyalog APL, 20 19 바이트

매트릭스 기반 솔루션.

{⍺≢⍵:⍵⍪⍵,⍺⋄∊⍺}⍨⍪'a'

여기에서 시도하십시오 . 반복 문자열을 반환합니다 . 폭발에 의한 설명 :N2aN = 2

{⍺≢⍵:⍵⍪⍵,⍺⋄∊⍺}⍨⍪'a'{⍺≢⍵:⍵⍪⍵,⍺⋄∊⍺}⍨⍪'a'
                                  ⍪'a'  Wrap 'a' into a 1x1 matrix.
                'a'{            }⍨      Binary function: bind 'a' to ⍵ and the matrix to ⍺.
                    ⍺≢⍵:                The arguments are not identical,
                        ⍵⍪⍵,⍺           so add to the matrix 1 column and 1 row of 'a's.
               ⍪                        Identity function for a matrix.
{            }⍨                         Unary function: bind the matrix to both ⍵ and ⍺.
 ⍺≢⍵:                                   The arguments are identical,
           ∊⍺                           so flatten the matrix into the string 'aaaa'.

2

스타 타 20

di _n($a)
gl a=$a+2

표시 (di) 문이 작동하는지 확인하기 위해 새 행이 있습니다. 먼저 $ a 줄 바꿈으로 현재 번호를 표시하십시오 (디폴트 표시에서 하나 추가). 그런 다음 2를 $ a에 추가하십시오.

매번 여분의 줄 바꿈을 사용하여 짝수 접근 (예 : 홀수 접근-1)을 사용합니다.


2

T-SQL 117

IF OBJECT_ID('tempdb..#')IS NULL CREATE TABLE #(A INT)INSERT INTO # VALUES(1)SELECT REPLICATE('a',COUNT(*)*2-1)FROM #

후행 공백에주의하여 매번 if 조건을 올바르게 점검하십시오.

홀수 접근 방식을 사용합니다. select 문에 줄 바꿈이 있는지 확실하지 않습니다.

테이블이없는 경우 테이블을 만드는 더 짧은 방법이 있는지 확실하지 않습니다.


2
특이한 언어 선택을 위해 당신에게 좋은 제안.
Xynariz

2

포스트 스크립트, 35 자

count dup 2 mul 1 add string print

각 패스는 스택에서 한 가지를 "누설"하므로 count 매번 1 씩 증가합니다. 그런 다음 홀수 수 트릭의 합을 사용합니다.

바이트 출력은 모두 \000문자열의 초기 값이므로 모두 출력 됩니다.


2

하스켈, 72

putStr$let a="1";aputStr=(\n->take(n^2)$show n++cycle" ").(+1).read in a

설명

apply 연산자 $는 나머지 줄 주위에 괄호를 묶는 것처럼 작동합니다 (예외는 있지만이 경우에는 작동합니다). aputStr"abc ..."형식의 문자열을받는 함수입니다. 여기서 "abc"는 abc를 포함하여 문자열 길이의 제곱근입니다. 문자열을 정수로 구문 분석하고 abc + 1로 시작하고 길이가 제곱 인 문자열을 반환합니다. $연산자로 인해 "1"N 회에 재귀 적으로 호출됩니다.


1

Pyth, 8 바이트

*d*2Z~Z1

이것은 N 2N홀수 의 합과 같다는 사실에 의존 합니다. 이제 Pyth 자동 난 그냥 인쇄해야하므로, 새로운 라인을 인쇄하는 Z * 2경우 각 코드의 문자 Z로 간다0N - 1.

코드 확장 :

*d               "Print d whose value is a space character"
  *2Z            "2 * Z times where Z's initial value is 0"
     ~Z1         "Increment the value of Z";

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


1

Golflua, 23 바이트

X=2+(X|-2)w(S.t("&",X))

의 조합을 출력 &\n문자 .

동등한 루아 코드

X = 2 + (X or -2)          -- initialize X to 0 the first time, add 2 ever other time

print(string.rep("&", X))

코드 스 니펫이 실행될 때마다 마지막 문자보다 1 문자로 시작하여 2 문자 이상의 출력이 생성됩니다. 이 print함수는 개행을 추가하므로 X를 1 대신 0으로 초기화합니다.


0

액션 스크립트-27/26 바이트

var n=""
trace(n);n+="11"//

또는

var n=1
trace(n);n+="11"//

작동 방식 :

var n=""
trace(n);n+="11"//var n=""
trace(n);n+="11"//

단순히 첫 번째 줄을 주석 처리합니다. 참고 : trace줄 바꿈을 추가합니다. 또는 내가 사용하는 모든 IDE가 자동으로 수행합니다.


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