자체 수정에 의한 곱셈


33

... 적어도 "자체 수정"의 일부 정의에 대해서는

작업

이 문제에서, 당신의 작업은 세 개의 문자열을 작성하는 것입니다 A, B그리고 C그 다음 속성을 만족시킨다.

  • 문자열의 B길이는 1 이상입니다.

  • 모든 n ≥ 0경우에, 문자열 은 선택한 프로그래밍 언어의 유효한 프로그램 (전체 실행 가능한 프로그램 또는 함수 정의를 의미 함)입니다. 첨자를 나타낸다 반복이 의미하므로 문자열 , , , 등이 각 프로그램의 입력으로서 하나 개의 스트링을 취하고, 출력으로서 반환 한 문자열.ABnCACABCABBCABBBC

  • 어떤을 위해 m, n ≥ 0프로그램이있는 경우, 입력과 실행 , 그것은 반환합니다 . 이 형식이 아닌 입력의 경우 프로그램은 충돌을 포함하여 모든 작업을 수행 할 수 있습니다.ABmCABnCABm*n+1C

형식의 일부 예 program(input) -> output:

AC(AC) -> ABC
ABC(AC) -> ABC
ABBBBBC(AC) -> ABC
AC(ABC) -> ABC
AC(ABBBBC) -> ABC
ABC(ABC) -> ABBC
ABBC(ABC) -> ABBBC
ABBBBC(ABBBC) -> ABBBBBBBBBBBBBC
ABBBC(ABBBBBBC) -> ABBBBBBBBBBBBBBBBBBBC

규칙과 채점

당신의 점수는 것입니다 전체의 길이 AC 낮은 점수가 더 나은 것. 반면 것을 주 B득점으로 계산되지 않습니다, 그것은 생산해야 A하고 C첫 번째 예에서와 같이.

표준 허점은 허용되지 않습니다. 프로그램은 직접 또는 간접적으로 자체 소스 코드에 액세스 할 수 없습니다 (입력으로 제공된 경우 제외). 당신은 문자열을 식별하는 데 필요한 A, B그리고 C어떤 식 으로든 당신의 대답에, 및 솔루션을 설명하는 것이 좋습니다.

답변:


16

CJam, 9 8 바이트

A: 1
B: 0
C:  r,(#0q

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

(ABcode) e# Push the integer 10 ** len(Bcode).
<SP>     e# Noop. Separates (AB) and C for input reading.
r        e# Read the first whitespace-separated token from STDIN (ABinput).
,(       e# Push the string length minus 1: len(Binput)
#        e# Power operator: 10 ** len(Bcode) len(Binput) # ->
         e#   (10 ** len(Bcode)) ** len(Binput) = 10 ** (len(Bcode) * len(Binput))
0        e# Push an additional 0 to complete len(Bcode) * len(Binput) + 1 zeroes.
q        e# Read the remaining input (C).

12

CJam, 15 13 11 바이트

A: rl"
B: <SP>
C: <LF>",(*SNq

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

e# A

r     e# Read a whitespace-separated token from STDIN.
      e# This reads the input up to the first space, but does not consume it.
l     e# Read the rest of the first line from STDIN.
      e# This reads up to the first linefeed and consumes it.

"     e# Initiate a string.

e# B

<SP>  e# Fill the string with as many spaces as there are copies of B.

e# C

<LF>" e# Terminate the string with a linefeed.
      e# This serves as a delimiter for the `l' command.
,(    e# Compute the length of the string minus 1 (to account for the LF).
*     e# Repeat the string read by `l' that many times.
SN    e# Push a space and a linefeed.
q     e# Read the remaining input (i.e., the second line) from STDIN.

마지막으로 스택에는에 의해 읽은 토큰 r,에 의해 생성 된 *공간,에 의해 밀린 공간 및 줄 바꿈 SN및에 의해 읽힌 행이 포함됩니다 q. CJam은이 모든 것을 자동으로 인쇄합니다.


아, 인용구를 잘 사용 : D
Optimizer

9

피스, 10

A: w*\0hl*w[<newline>
B: 0
C: <empty>

소스를 두 줄로 나눕니다. 첫 번째 줄은 A이고 두 번째 줄은 B입니다. A가 첫 번째 줄에 있기 때문에 첫 번째 줄 w은 A를 쉽게 인쇄합니다.

Pyth에서 선행 0은 별도의 토큰이므로 [00)실제로는 [0, 0]입니다. 첫 번째 줄은로 끝나고 l[두 번째 줄은로 구성됩니다 0000.... 그래서 l[실제로이 프로그램에 조식의 수를 계산합니다. 두 번째 w는 입력의 두 번째 줄에서 읽습니다. 이것은 입력의 B 수입니다. 여기에서 그것은 간단한 곱셈이고, 증가하고 그 많은 0을 출력합니다.


9

망막 , 25 19 바이트

A: ]\]<LF>
B: ]]
C: <LF>m`^]*$<LF>]$0]

<LF> stands for newline

예제 ABC코드 :

]\]
]]
m`^]*$
]$0]

코드에는 두 가지 대체 단계가 있습니다.

  • every 를 다음 AB^mC으로 변경하여 입력 을 변경하십시오 .AB^(m*n)CBB^n

    • ]\]B패턴 라인에서 이스케이프하여 입력의 모든 것과 일치하며 다른 것은 없습니다.
    • ]]...]] 이다 B^n
  • 변화 B^(m*n)B^(m*n+1)의한

    • m`^]*$만에 선을 복용 ]
    • ]$0]]]이 줄이 첫 번째 정규 표현식과 일치하지 않는 방식으로 추가 쌍을 추가

-s전체 Retina 코드가 하나의 파일에있을 수 있도록 필요한 멀티 라인 플래그 의 점수에 3 바이트를 추가했습니다 .

@ MartinBüttner 덕분에 2 바이트가 절약되었습니다.


8

파이썬 3, 51 바이트

A: lambda s:s[:28]+"x"*(1+len("
B: x
C: ")*(len(s)-51))+s[-23:]

사용법 예 :

>>> f=lambda s:s[:28]+"x"*(1+len("xx")*(len(s)-51))+s[-23:]
>>> f('lambda s:s[:28]+"x"*(1+len("xxx")*(len(s)-51))+s[-23:]')
'lambda s:s[:28]+"x"*(1+len("xxxxxxx")*(len(s)-51))+s[-23:]'

함수로 계산 n*m+1(1+len("xxx")*(len(s)-51))이 어디 m x문자열에서의 ( xxx부분이있다 B^m). 문자열 곱 "x"이 번호로하여 제공 B^(n*m+1)하고, 기능이 소요 AC입력 밖으로 얻을 이러한 모든 연결합니다 AB^(n*m+1)C.

J의 동일한 접근 방식 :

J, 35 바이트

A: (19{.]),('x'#~1+(#'
B: x
C: ')*35-~#),_16{.]

5

CJam, 22

A:<empty>
B:{])`\,q,K/(*))*"_~"}
C:{])`\,q,K/(*))*"_~"}_~

예제 실행 :

ABBC(ABC) -> ABBBC

이것은

{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

입력으로

{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

다음과 같은 출력을 제공합니다.

{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

작동 방식 :

어떤 프로그램 ACABC살펴보고 다음과 같이 봅시다 :

AC :{])`\,q,K/(*))*"_~"}_~
ABC:{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

우리는 C=B_~

무엇 B을하고 있는지 살펴 보자 .

{])`\,q,K/(*))*"_~"}

{                  }    e# This is a code block. Alone, this does nothing except
                        e# pushing this block to stack as is
 ]                      e# Wrap everything on stack in an array
  )`                    e# Take out the last part and convert it to its string representation
    \,                  e# Take length of remaining array
      q,K/              e# Read the input, take its length and int divide by K (i.e. 20)
          (*            e# Decrement and multiply by the array length on stack
            ))          e# Add two to the product
              *         e# Repeat the string representation on stack that many times
               "_~"     e# Put this string on stack

이제 AC입력없이 실행하는 것이 무엇을하는지 봅시다 :

{])`\,q,K/(*))*"_~"}_~                      e# Copy the block and run it
{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}~   e# Block is copied, run it
{      ...         } ])                     e# Wrapped array has the block in it.
                       `\,                  e# Stringify it and take length of remaining = 0
                          q,K/              e# No input so 0
                              (*))          e# 0 * -1 = 0. 0 + 2 = 2
                                  *         e# Repeat the stringified block 2 times:
                                            e# "{])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}"
                                   "_~"     e# Put this string. Program ends, so print stack:
                                            e# {])`\,q,K/(*))*"_~"}{])`\,q,K/(*))*"_~"}_~

와우, 출력은 ABC입니다.

우리는 기본적으로 B코드에 몇 개가 있는지 계산합니다 . 그런 다음 입력에 몇 개가 있습니까 (길이 사용). (이후 곱하기 그들, 증가 두 번 C도있다 B및 APPEND)를 _~얻을 수C

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


3

하스켈 , 50 바이트

f를 가져오고 반환하는 함수 String입니다.

문자열 B는 단일 공백이지만 C는 공백으로 시작합니다.

A:_:b="
B: 
C: ";f s|a:c<-words s=unwords$a:(drop 50s>>b):c

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

  • _:b=" "문자열 리터럴의 첫 번째 공백을 제외한 모든 공간을에 할당 b하여 프로그램의 m B 사본 과 동일하게합니다 .
  • s입력 문자열입니다. a:c<-words s공백으로 구분 된 단어로 분할하여 aA c가되고 C를 포함하는 단어의 목록이됩니다. B 사본은 words여러 공백을 압착 하므로 (프로그램의 나머지 부분은 피함) 무시 됩니다.
  • drop 50s입력의 B 사본 수 n 과 동일한 길이의 문자열입니다 . drop 50s>>b의 많은 사본을 연결 b하여 mn 개의 공간을 제공 합니다.
  • unwords$a:(drop 50s>>b):c모든 문자열을 공백과 함께 다시 결합합니다. (drop 50s>>b)목록에 여분의 "단어"가 삽입되어 있으므로 곱하기에 +1을 자동으로 추가하는 추가 결합 공간도 있습니다.

2

MATLAB, 85

처음으로 그런 추상적 인 도전을했기 때문에 코드 골프 도전보다 코딩 도전에 더 가깝습니다!

세 문자열은 따옴표없이

A:    "X=strsplit(input('','s'));m=0 "
B:    "+1 "
C:    ";[X{1},32,repmat(['+1',32],1,m*(length(X)-2)+1),X{end}]"

작동 방식 : 입력 인수를 공백으로 분할하므로 n문자열 부분 수에서 확인할 수 있습니다. B는 일종의 카운터로 작동합니다 m. 대답을 재구성하려면 분할에서 A와 C를 사용하고 B m * n + 1을 반복하고 ASCII 값을 사용하여 공백을 삽입하여 C에서 원하지 않는 분할이 발생하지 않도록하십시오.

편집 : 우연히 실수로 A + B를 세었다.


1

C (gcc) , 81 바이트

문자열을 식별하기위한 요구 사항은 식별이 수반하는 것에 대한 느슨한 표준이 없다면 불법 입력에 대한 임의의 행동이 허용되는 것과 상충되는 것 같습니다. 당연히, 나는 가장 많은 바이트를 흘리는 해석을 취했습니다.

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

A: m;f(char*s){m=strrchr(s+66,32)-s-65;printf("%.66s%*s",s,m*strlen("
B: <SPACE>
C: ")+16,s+m+66);}

식별을 통해 방금 귀하의 답변에서 어떤 코드 스 니펫이 A , BC인지 명확해야 함을 의미했습니다 . 프로그램의 요구 사항은 아닙니다.
Zgarb

1

TI 기본 (83 시리즈), 65 바이트

세그먼트 A (33 바이트) :

Input Str1:sub(Str1,1,27:For(I,0,(length(Str1)-55)(length("

세그먼트 B :

X

세그먼트 C (32 바이트) :

Y")-1:Ans+"X":End:Ans+sub(Str1,length(Str1)-27,28

나는이 퀴니 같은 도전을 찾는 것에 정말로 흥분합니다! "기호 를 벗어날 방법이 없기 때문에 대부분의 quine은 최소한의 부정 행위없이 TI-Basic에서 작동하지 않습니다 . (두 가지 의미에서 "탈출"이라는 단어가 있습니다.) 그러나 여기서는 Input명령을 통해 입력 문자열을 얻습니다 ".

여전히 해결해야 할 TI-Basic 어리 석음이 여전히 남아 있습니다. 빈 문자열은 유효하지 않으므로 "XXX...XX"n = 0 일 때 루프에 문자열을 삽입하는 순진한 솔루션은 작동하지 않습니다. 대신 수동으로 mn + 1의 값을 계산하고 문자열 "X"을 여러 번 삽입합니다 .

마법 상수 2728프로그램에이 바이트 수 (33) 및 (32)에서 약간 떨어져 있습니다 때문에 Str1, sub(그리고 length(단지 문자열의 길이에 1을 기여하는 2 바이트 토큰입니다.

대신에 개행 문자를 사용하면 :끝 따옴표를 생략하여 몇 바이트를 절약 할 수있는 것처럼 보이지만 실제로는 작동하지 않습니다. 우선, 줄 바꿈 문자를 문자열에 추가하기 전에 16 진 편집기가 필요합니다. Input명령 중에 Enter 키를 누르면 입력 을 제출 하기 때문에 입력 할 수 없습니다 . 16 진수 편집기 접근을 시도했을 때 프로그램의 내용을 수정하는 이상한 버퍼 오버플로 오류가 발생했기 때문에 비싼 계산기로 집에서 시도하지 마십시오.


0

자바 11, 135 65 + 26 = 91 바이트

에이

s->{var p=s.split("\\(\"|\"\\.");return p[0]+"(\"B"+p[1].repeat("

B

기음

".length())+'"'+'.'+p[2];}

여기에서 온라인으로 시도 하십시오 (TIO에는 아직 Java 11이 없으므로 이것은 대신 도우미 메소드에 의존합니다 String::repeat()).

언 골프 드 :

s -> { // lambda taking and returning a String
    var p = s.split("\\(\"|\"\\."); // split input into parts A, B^n, C (where n may be 0) at the "(\"" and "\"."
    return p[0] + "(\"B" + // put it back together: A plus the part the split shaved off, plus an extra B ...
    p[1].repeat("BBB".length()) + // ... plus B^(n*m)
    '"' + '.' + p[2]; // plus C, with the part the split shaved off reattached
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.