Nhân lên bằng cách tự sửa đổi


33

... ít nhất là đối với một số định nghĩa về "tự sửa đổi".

Nhiệm vụ

Trong thử thách này, nhiệm vụ của bạn là để viết ba chuỗi A, BCđáp ứng các thuộc tính sau.

  • Chuỗi Bcó độ dài ít nhất 1.

  • Đối với mỗi n ≥ 0, chuỗi là một chương trình hợp lệ (có nghĩa là chương trình đầy đủ có thể chạy hoặc định nghĩa hàm) trong ngôn ngữ lập trình bạn chọn. Các biểu superscript lặp lại, vì vậy phương tiện này, chuỗi , , , vv Mỗi chương trình có một chuỗi như là đầu vào, và trả về một chuỗi như đầu ra.ABnCACABCABBCABBBC

  • Đối với bất kỳ m, n ≥ 0, nếu chương trình được chạy với đầu vào , nó sẽ trả về . Đối với các đầu vào không thuộc dạng này, chương trình có thể làm bất cứ điều gì, kể cả sự cố.ABmCABnCABm*n+1C

Một số ví dụ ở định dạng 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

Quy tắc và chấm điểm

Điểm của bạn là tổng chiều dài AC , điểm thấp hơn sẽ tốt hơn. Lưu ý rằng trong khi Bkhông được tính vào điểm số, nó phải được tạo ra bởi ACnhư trong ví dụ đầu tiên.

Sơ hở tiêu chuẩn là không được phép. Các chương trình không được phép truy cập trực tiếp hoặc gián tiếp vào mã nguồn của riêng họ (trừ khi chúng được cung cấp dưới dạng đầu vào). Bạn được yêu cầu để xác định các chuỗi A, BCtrong câu trả lời của bạn một cách nào đó, và khuyến khích để giải thích giải pháp của bạn.

Câu trả lời:


16

CJam, 9 8 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

(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 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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.

Cuối cùng, ngăn xếp chứa mã thông báo được đọc bởi r, không gian được tạo bởi *, không gian và nguồn cấp dữ liệu được đẩy bởi SNvà dòng được đọc bởi q. CJam in tất cả những điều này tự động.


Hah, sử dụng tốt các trích dẫn ở đó: D
Trình tối ưu hóa

9

Bình thường, 10

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

Chúng tôi chia nguồn thành hai dòng. Dòng đầu tiên là A, dòng thứ hai là Bs. Vì A nằm trên dòng đầu tiên, đầu tiên wchỉ cần in A - dễ dàng, được thực hiện.

Trong các số 0 đứng đầu Pyth là các mã thông báo riêng biệt, [00)thực tế là như vậy [0, 0]. Lưu ý rằng dòng đầu tiên kết thúc l[và dòng thứ hai bao gồm 0000.... Vì vậy, l[thực sự đếm số lượng Bs trong chương trình này. Dòng thứ hai wđọc trong dòng thứ hai của đầu vào - đây là số Bs của đầu vào. Từ đây, nó là một phép nhân đơn giản, tăng và xuất ra nhiều số không.


9

Võng mạc , 25 19 byte

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

<LF> stands for newline

ABCMã ví dụ :

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

Mã có hai bước thay thế:

  • thay đổi đầu AB^mCvào thành AB^(m*n)Cbằng cách thay đổi mọi Bthành B^n:

    • ]\]khớp với mọi Bđầu vào và không có gì khác nhờ thoát trong các dòng mẫu
    • ]]...]]B^n
  • thay đổi B^(m*n)để B^(m*n+1)bởi

    • m`^]*$lấy phù hợp với chỉ ]'s
    • ]$0]thêm một cặp bổ sung ]]cho nó theo cách mà dòng này không khớp với regex đầu tiên

Tôi đã thêm 3 byte vào điểm số cho -scờ nhiều dòng cần thiết để toàn bộ mã Retina có thể nằm trong một tệp.

Lưu 2 byte nhờ @ MartinBüttner.


8

Python 3, 51 byte

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

Ví dụ sử dụng:

>>> 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:]'

Hàm tính toán n*m+1với (1+len("xxx")*(len(s)-51))vị trí m xcủa chuỗi trong đó ( xxxmột phần là B^m). Nhân chuỗi "x"với số này sẽ cho B^(n*m+1)và hàm lấy ACra khỏi đầu vào và nối tất cả các chuỗi này để có được AB^(n*m+1)C.

Cách tiếp cận tương tự trong J:

J, 35 byte

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

5

CJam, 22

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

Chạy ví dụ:

ABBC(ABC) -> ABBBC

dịch ra

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

với đầu vào là

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

cung cấp đầu ra sau:

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

Cách thức hoạt động :

Hãy xem chương trình nào ACABCtrông như thế nào:

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

Chúng tôi nhận thấy rằng C=B_~

Hãy nhìn vào những gì Bđang làm:

{])`\,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

Bây giờ hãy xem những gì đang chạy ACmà không có bất kỳ đầu vào nào sẽ làm:

{])`\,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/(*))*"_~"}_~

Wow, đầu ra là ABC.

Về cơ bản chúng tôi đếm có bao nhiêu Btồn tại trong mã. Sau đó, có bao nhiêu trong đầu vào (sử dụng chiều dài). Nhân chúng, tăng hai lần (kể từ khi CB) và nối thêm _~để có đượcC

Dùng thử trực tuyến tại đây


3

Haskell , 50 byte

flà một hàm lấy và trả về a String.

Chuỗi B chỉ là một khoảng trắng, trong khi C bắt đầu bằng một.

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

Hãy thử trực tuyến!

  • _:b=" "gán tất cả trừ khoảng trắng đầu tiên trong chuỗi bằng chữ b, làm cho nó bằng với các bản sao m B của chương trình .
  • slà chuỗi đầu vào. a:c<-words schia nó thành các từ được phân tách bằng dấu cách, để atrở thành A và ctrở thành một danh sách các từ bao gồm C. Các bản sao B bị bỏ qua kể từ khi wordsnén nhiều khoảng trắng (phần còn lại của chương trình tránh).
  • drop 50slà một chuỗi có độ dài bằng số n bản sao B trong đầu vào. drop 50s>>bkết hợp nhiều bản sao của b, cho mn không gian.
  • unwords$a:(drop 50s>>b):cnối tất cả các chuỗi lại với nhau bằng khoảng trắng. Vì có thêm một "từ" (drop 50s>>b)được chèn trong danh sách, nên cũng có thêm một không gian nối, tự động thêm +1 vào phép nhân.

2

Matlab, 85

Lần đầu tiên đối với tôi thực hiện một thử thách trừu tượng như vậy, vì vậy đối với tôi, đó là một thử thách mã hóa hơn là một thử thách chơi gôn!

Ba chuỗi là, không có dấu ngoặc kép:

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

Cách thức hoạt động: Tôi chia đối số đầu vào trên khoảng trắng, do đó ncó thể được xác định từ số phần chuỗi. B hoạt động như một loại bộ đếm để có đượcm . Để xây dựng lại câu trả lời tôi sử dụng A và C từ phần tách, lặp lại B m * n + 1 lần và tôi chèn khoảng trắng bằng cách sử dụng giá trị ASCII của chúng, để không xảy ra sự chia tách không mong muốn nào trong C.

EDIT: Rất tiếc, vô tình đếm A + B


1

C (gcc) , 81 byte

Yêu cầu xác định các chuỗi có vẻ mâu thuẫn với hành vi được phép tùy tiện của chúng tôi đối với đầu vào bất hợp pháp, trừ khi chúng tôi có các tiêu chuẩn khá lỏng lẻo về những gì xác định đòi hỏi. Đương nhiên, tôi lấy cách giải thích làm giảm nhiều byte nhất.

Hãy thử trực tuyến!

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);}

Bằng cách xác định tôi chỉ có nghĩa là nó phải rõ ràng từ câu trả lời của bạn đoạn mã nào A , BC . Đó không phải là một yêu cầu cho chương trình.
Zgarb

1

TI-Basic (sê-ri 83), 65 byte

Phân đoạn A (33 byte):

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

Phân khúc B:

X

Phân đoạn C (32 byte):

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

Tôi thực sự hào hứng với việc tìm kiếm thử thách giống như quine này! Hầu hết các quines không hoạt động trong TI-Basic mà không có ít nhất một chút gian lận, bởi vì không có cách nào để thoát khỏi" biểu tượng. (Theo cả hai nghĩa của từ "thoát".) Nhưng ở đây, chúng ta nhận được một chuỗi đầu vào thông qua Inputlệnh và gõ vào "đó là hoàn toàn tốt.

Vẫn còn một số lượng silliness TI-Basic hoạt động ở đây: một chuỗi rỗng không hợp lệ, vì vậy giải pháp ngây thơ của việc chèn chuỗi "XXX...XX" trong một vòng lặp sẽ không hoạt động khi n = 0. Thay vào đó, chúng tôi tự tính toán giá trị của mn + 1 và chèn chuỗi "X"đó nhiều lần.

Các hằng số kỳ diệu 2728trong chương trình hơi bị sai từ đếm byte 33 và 32, bởi vì Str1, sub(length(hai byte thẻ mà chỉ đóng góp 1 tới chiều dài của một chuỗi.

Nếu chúng tôi sử dụng dòng mới thay vì : , có vẻ như khi nào có thể lưu một vài byte bằng cách bỏ dấu ngoặc kép kết thúc, nhưng điều này không thực sự hoạt động. Trước hết, bạn cần một trình soạn thảo hex trước khi bạn có thể thêm ký tự dòng mới vào một chuỗi: bạn không thể chỉ nhập nó, bởi vì nếu bạn nhấn ENTER trong một Inputlệnh, nó sẽ gửi đầu vào. Khi tôi thử cách tiếp cận trình soạn thảo hex, cuối cùng tôi đã gặp một lỗi tràn bộ đệm kỳ lạ đã sửa đổi nội dung chương trình của tôi, vì vậy đừng thử điều này ở nhà với máy tính đắt tiền của bạn.


0

Java 11, 135 65 + 26 = 91 byte

Một

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

B

B

C

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

Dùng thử trực tuyến tại đây (TIO chưa có Java 11, vì vậy điều này phụ thuộc vào phương thức trợ giúp thay vì String::repeat()).

Ung dung:

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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.